export interface Vec2 { x: number; y: number; } export type DeepPartial = T extends Element ? T : T extends readonly unknown[] ? T : T extends object ? { [K in keyof T]?: DeepPartial; } : T; export type PresetName = 'gentle-snow' | 'winter-magic' | 'snowstorm' | 'frosted-glass' | 'christmas-classic' | 'christmas-night' | 'north-pole' | 'minimal' | 'playful' | 'cinematic'; export type Layer = 'background' | 'content' | 'foreground'; export type Material = 'flat' | 'slippery' | 'sticky' | 'no-accumulation'; export interface WeatherConfig { preset: PresetName; autoStart: boolean; seed: number; container?: HTMLElement | undefined; snow: { enabled: boolean; intensity: number; particleCount: number; flakeStyle: 'soft' | 'dot' | 'crystal'; texture?: string | null | undefined; color: string; minSize: number; maxSize: number; gravity: number; turbulence: number; glow: boolean; parallax: boolean; wind: { base: number; gusts: boolean; variability: number; }; accumulation: { enabled: boolean; maxDepth: number; growthRate: number; softness: number; sliding: boolean; transferToLowerSurfaces: boolean; meltRate: number; }; }; dom: { detection: 'auto' | 'explicit'; respectLayers: boolean; observeMutations: boolean; include: string[]; exclude: string[]; maxSurfaces: number; removedSurface: 'shed' | 'dispose'; }; interactions: { brush: { enabled: boolean; radius: number; strength: number; activation: 'hover' | 'press'; }; snowballs: { enabled: boolean; activation: 'press-and-drag' | 'hover-circle'; minRadius: number; maxRadius: number; maxCount: number; }; snowman: { enabled: boolean; requiredBalls: number; }; pointerVortex: { enabled: boolean; }; }; performance: { adaptive: boolean; maxFPS: number; preferredQuality: 'auto' | 'low' | 'medium' | 'high'; maxDPR: number; }; accessibility: { reducedMotion: 'respect' | 'reduce' | 'ignore'; controls: boolean; }; debug: boolean; } export type WeatherOptions = DeepPartial; export interface SurfaceOptions { priority?: number | undefined; accumulation?: boolean | undefined; material?: Material | undefined; edge?: 'top' | 'bottom' | undefined; layer?: Layer | undefined; clip?: boolean | undefined; maxSnowDepth?: number | undefined; } export interface ClipRect { x: number; y: number; width: number; height: number; radius: number; } export interface Surface { id: string; element: Element; x: number; y: number; width: number; height: number; angle: number; normal: Vec2; velocity: Vec2; previousVelocity?: Vec2; acceleration: Vec2; profile: Float32Array; packing?: Float32Array; binSize: number; layer: Layer; paintOrder: number; clipRegions: ClipRect[]; radius: number; material: Material; maxDepth: number; accumulation: boolean; visible: boolean; opaque?: boolean; exposed?: Uint8Array; occluded?: boolean; confidence: 'high' | 'medium' | 'low'; options: SurfaceOptions; } export interface Particle { x: number; y: number; previousX: number; previousY: number; vx: number; vy: number; radius: number; mass: number; opacity: number; phase: number; depth: number; kind: 'flake' | 'clump' | 'sparkle'; age: number; layer: Layer; } export type WeatherState = 'idle' | 'running' | 'paused' | 'stopped' | 'destroyed'; export interface WeatherMetrics { textureStatus: 'idle' | 'loading' | 'ready' | 'error' | 'destroyed'; state: WeatherState; fps: number; frameTime: number; simTime: number; renderTime: number; geometryScanTime: number; particleCount: number; particleBudget: number; surfaceCount: number; collisionChecks: number; droppedFrames: number; quality: number; snowMass: number; snowballCount: number; snowmanCount: number; approximateMemory: number; } export type WeatherEventName = 'ready' | 'start' | 'pause' | 'resume' | 'stop' | 'destroy' | 'error' | 'surface:added' | 'surface:removed' | 'surface:updated' | 'snow:deposit' | 'snow:slide' | 'snow:brush' | 'snow:transfer' | 'snowball:created' | 'snowball:thrown' | 'snowball:stacked' | 'snowman:created' | 'snowman:removed' | 'plough:start' | 'plough:complete' | 'quality:changed'; export type TriggerType = 'plough' | 'gust' | 'snowburst' | 'sparkle' | 'snowman' | 'snowball'; export interface TriggerOptions { selector?: string; surface?: Element; direction?: 'left' | 'right'; x?: number; y?: number; radius?: number; speed?: number; style?: 'classic' | 'minimal' | 'festive'; } export interface PluginContext { trigger?(type: TriggerType, options?: TriggerOptions): void; getConfig(): WeatherConfig; getSurfaces(): readonly Surface[]; emit(event: WeatherEventName, data?: unknown): void; spawnClump(x: number, y: number, mass: number, vx: number, vy: number): void; } export interface WeatherPlugin { name: string; setup?(context: PluginContext): void | (() => void); update?(dt: number, time: number): void; render?(ctx: CanvasRenderingContext2D, time: number): void; trigger?(type: TriggerType, options: TriggerOptions): void; destroy?(): void; } export interface WeatherController { start(): void; pause(): void; resume(): void; stop(): void; destroy(): void; updateConfig(patch: WeatherOptions): void; getConfig(): WeatherConfig; setPreset(name: PresetName, overrides?: WeatherOptions): void; setIntensity(amount: number): void; clearAccumulation(selector?: string): void; addSnow(amount: number, selector?: string): void; registerSurface(element: Element, options?: SurfaceOptions): () => void; unregisterSurface(element: Element): void; trigger(type: TriggerType, options?: TriggerOptions): void; getMetrics(): WeatherMetrics; on(event: WeatherEventName, callback: (data: unknown) => void): () => void; use(plugin: WeatherPlugin): () => void; } //# sourceMappingURL=types.d.ts.map