react-weather-effects 0.0.0-stage → 0.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/LICENSE +21 -0
- package/README.md +470 -2
- package/dist/index.cjs +1232 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +101 -0
- package/dist/index.d.mts +101 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.mjs +1223 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +59 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/budget.ts","../../core/src/motion.ts","../../core/src/random.ts","../../core/src/scheduler.ts","../../core/src/TickerContext.ts","../../core/src/WeatherCanvas.tsx","../../core/src/pool.ts","../../effects/src/transition.ts","../../effects/src/Rain.tsx","../../effects/src/Snow.tsx","../../effects/src/Fog.tsx"],"names":["React","useState","useRef","useCallback","useContext","useId","useEffect","useMemo","jsx","jsxs","PARTICLE_STRIDE","TickerCtx","createParticlePool","LAYER","growParticlePool"],"mappings":"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","file":"index.cjs","sourcesContent":["export type Quality = 'low' | 'medium' | 'high';\nexport type DPRWeight = 'light' | 'normal' | 'heavy';\n\nexport interface RenderBudget {\n readonly maxParticles: number;\n readonly dpr: number;\n readonly quality: Quality;\n}\n\nexport const QUALITY_LIMITS = {\n low: { maxParticles: 150, dprCap: 1 },\n medium: { maxParticles: 300, dprCap: 2 },\n high: { maxParticles: 600, dprCap: 2 },\n} as const;\n\nexport function clampDPR(weight: DPRWeight = 'normal'): number {\n if (typeof window === 'undefined') return 1;\n const raw = window.devicePixelRatio ?? 1;\n const caps: Record<DPRWeight, number> = { light: 2, normal: 2, heavy: 1.5 };\n return Math.min(raw, caps[weight]);\n}\n\nexport function resolveRenderBudget(\n quality: Quality = 'medium',\n dprWeight: DPRWeight = 'normal',\n): RenderBudget {\n const limits = QUALITY_LIMITS[quality];\n const dpr = Math.min(clampDPR(dprWeight), limits.dprCap);\n return {\n maxParticles: limits.maxParticles,\n dpr,\n quality,\n };\n}\n","export type ReducedMotionProp = 'auto' | 'animated' | 'static' | 'off';\nexport type MotionMode = 'animated' | 'static' | 'off';\n\nexport function resolveMotion(\n prop: ReducedMotionProp = 'auto',\n osPreference: boolean | null,\n): MotionMode {\n if (prop === 'auto') {\n // If osPreference is false (prefers-reduced-motion does NOT match), we animate.\n // If osPreference is true (prefers-reduced-motion matches), we use static.\n // If osPreference is null (SSR/unknown initial), we resolve conservatively to static.\n return osPreference === false ? 'animated' : 'static';\n }\n return prop;\n}\n","export function hashString(str: string): number {\n let hash = 2166136261 >>> 0;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nexport function createSeededRandom(seed: string | number): () => number {\n let state = (typeof seed === 'string' ? hashString(seed) : seed) >>> 0;\n return () => {\n state |= 0;\n state = (state + 0x6d2b79f5) | 0;\n let t = Math.imul(state ^ (state >>> 15), 1 | state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n","import React from 'react';\n\nexport interface FrameScheduler {\n request: (callback: (timestamp: number) => void) => number;\n cancel: (id: number) => void;\n}\n\nexport const defaultScheduler: FrameScheduler = {\n request: (cb) => {\n if (typeof window !== 'undefined' && typeof window.requestAnimationFrame === 'function') {\n return window.requestAnimationFrame(cb);\n }\n return setTimeout(() => cb(Date.now()), 16) as unknown as number;\n },\n cancel: (id) => {\n if (typeof window !== 'undefined' && typeof window.cancelAnimationFrame === 'function') {\n window.cancelAnimationFrame(id);\n } else {\n clearTimeout(id);\n }\n },\n};\n\nexport const SchedulerCtx = React.createContext<FrameScheduler | null>(null);\n","import React from 'react';\nimport type { RenderBudget } from './budget';\n\nexport interface FrameState {\n ctx: CanvasRenderingContext2D;\n dt: number; // seconds; capped at 0.1s; 0 on first frame after pause\n isAnimating: boolean; // false for static/paused rendering; animated frames may have dt = 0\n width: number; // CSS pixels\n height: number; // CSS pixels\n dpr: number; // clamped DPR applied by engine\n budget: Readonly<RenderBudget>; // current per-canvas quality settings\n wind: Readonly<{ x: number; y: number }>;\n pointer: Readonly<{ x: number; y: number }> | null; // null in v0.1\n timestamp: number; // simulation ms since scene start; excludes paused time\n random: () => number; // seeded PRNG — never use Math.random() in effects\n}\n\nexport type DrawFn = (state: Readonly<FrameState>) => void;\n\nexport interface TickerContext {\n /**\n * Register a draw function at a given layer priority.\n * Returns an idempotent cleanup function that unregisters it.\n */\n register: (layer: number, fn: DrawFn) => () => void;\n\n /** Mark the scene dirty; coalesce render-only updates without stepping simulation. */\n invalidate: () => void;\n\n /** Read this canvas's latest budget during effect setup; stable getter identity. */\n getBudget: () => Readonly<RenderBudget>;\n\n /** Track async texture initialization for the internal capture-readiness barrier. */\n trackAsset: (task: Promise<void>) => () => void;\n}\n\nexport const LAYER = {\n BACKGROUND: 0,\n MIDGROUND: 100,\n FOREGROUND: 200,\n} as const;\n\nexport const TickerCtx = React.createContext<TickerContext | null>(null);\n","import React, {\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n type DPRWeight,\n type Quality,\n type RenderBudget,\n resolveRenderBudget,\n} from './budget';\nimport { type MotionMode, type ReducedMotionProp, resolveMotion } from './motion';\nimport { createSeededRandom } from './random';\nimport { defaultScheduler, SchedulerCtx } from './scheduler';\nimport {\n type DrawFn,\n type FrameState,\n type TickerContext,\n TickerCtx,\n} from './TickerContext';\n\nconst __DEV__ =\n typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production';\n\nexport interface WeatherCanvasProps {\n children?: React.ReactNode;\n mode?: 'fullscreen' | 'contained';\n wind?: { x: number; y: number };\n dpr?: DPRWeight;\n quality?: Quality;\n reducedMotion?: ReducedMotionProp;\n paused?: boolean;\n seed?: string | number;\n zIndex?: number;\n onContextLost?: () => void;\n}\n\ninterface Registration {\n id: number;\n layer: number;\n fn: DrawFn;\n seq: number;\n}\n\nexport function WeatherCanvas({\n children,\n mode = 'fullscreen',\n wind = { x: 0, y: 0 },\n dpr = 'normal',\n quality = 'medium',\n reducedMotion = 'auto',\n paused = false,\n seed,\n zIndex = 1,\n onContextLost,\n}: WeatherCanvasProps) {\n const [canvasNode, setCanvasNode] = useState<HTMLCanvasElement | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const setCanvasRef = useCallback((node: HTMLCanvasElement | null) => {\n canvasRef.current = node;\n setCanvasNode(node);\n }, []);\n\n // Injected scheduler for deterministic test harness or default RAF\n const injectedScheduler = useContext(SchedulerCtx);\n const scheduler = injectedScheduler ?? defaultScheduler;\n\n // Stable seed across re-renders\n const autoSeed = useId();\n const effectiveSeed = seed ?? autoSeed;\n const randomFnRef = useRef<() => number>(createSeededRandom(effectiveSeed));\n\n // Reset PRNG if seed changes\n useEffect(() => {\n randomFnRef.current = createSeededRandom(effectiveSeed);\n }, [effectiveSeed]);\n\n // Context & canvas state\n const [contextAvailable, setContextAvailable] = useState<boolean>(true);\n const ctxRef = useRef<CanvasRenderingContext2D | null>(null);\n\n // Dimensions in CSS pixels\n const [dimensions, setDimensions] = useState<{ width: number; height: number }>({\n width: 0,\n height: 0,\n });\n\n // OS Reduced Motion preference\n const [osPreference, setOsPreference] = useState<boolean | null>(null);\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n setOsPreference(mq.matches);\n\n const handler = (e: MediaQueryListEvent) => setOsPreference(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n\n const motionMode: MotionMode = resolveMotion(reducedMotion, osPreference);\n\n // Visibility and viewport tracking\n const [pageVisible, setPageVisible] = useState<boolean>(() => {\n if (typeof document === 'undefined') return true;\n return document.visibilityState === 'visible';\n });\n\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const handleVisibility = () => {\n setPageVisible(document.visibilityState === 'visible');\n };\n document.addEventListener('visibilitychange', handleVisibility);\n return () => document.removeEventListener('visibilitychange', handleVisibility);\n }, []);\n\n const [inViewport, setInViewport] = useState<boolean>(true);\n useEffect(() => {\n const el = canvasNode;\n if (!el || typeof IntersectionObserver === 'undefined') return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry) {\n setInViewport(entry.isIntersecting);\n }\n },\n { threshold: 0 },\n );\n\n observer.observe(el);\n return () => observer.disconnect();\n }, [canvasNode]);\n\n // Budget management: state + ref for synchronous access\n const [budget, setBudget] = useState<RenderBudget>(() => resolveRenderBudget(quality, dpr));\n const budgetRef = useRef<RenderBudget>(budget);\n\n // Registrations registry\n const nextRegId = useRef<number>(1);\n const nextSeq = useRef<number>(1);\n const registrationsRef = useRef<Registration[]>([]);\n const orderedSnapshotRef = useRef<Registration[]>([]);\n const [effectCount, setEffectCount] = useState<number>(0);\n\n // Wind and settings refs\n const windRef = useRef<{ x: number; y: number }>(wind);\n\n // Simulation time tracking\n const simulationTime = useRef<number>(0);\n const lastTimestamp = useRef<number | null>(null);\n const rafId = useRef<number | null>(null);\n\n // Asset tracking for deterministic capture readiness\n const pendingAssetsRef = useRef<Set<Promise<void>>>(new Set());\n\n // Invalidation microtask scheduling\n const isMicrotaskScheduled = useRef<boolean>(false);\n const isDirtyRef = useRef<boolean>(true);\n\n // Derived eligibility\n const canPresent =\n contextAvailable &&\n dimensions.width > 0 &&\n dimensions.height > 0 &&\n pageVisible &&\n inViewport &&\n motionMode !== 'off';\n\n const shouldAnimate =\n canPresent && effectCount > 0 && !paused && motionMode === 'animated';\n\n const canPresentRef = useRef(canPresent);\n canPresentRef.current = canPresent;\n\n const shouldAnimateRef = useRef(shouldAnimate);\n shouldAnimateRef.current = shouldAnimate;\n\n const motionModeRef = useRef(motionMode);\n motionModeRef.current = motionMode;\n\n const onContextLostRef = useRef(onContextLost);\n onContextLostRef.current = onContextLost;\n\n // Frame drawing implementation\n const drawFrame = useCallback((dt: number, timestamp: number) => {\n const canvas = canvasRef.current;\n const ctx = ctxRef.current;\n if (!canvas || !ctx || canvas.width === 0 || canvas.height === 0) return;\n\n const snapshot = orderedSnapshotRef.current;\n const currentBudget = budgetRef.current;\n const currentDpr = currentBudget.dpr;\n\n isDirtyRef.current = false;\n\n const frameState: FrameState = {\n ctx,\n dt,\n isAnimating: shouldAnimateRef.current,\n width: dimensions.width,\n height: dimensions.height,\n dpr: currentDpr,\n budget: currentBudget,\n wind: windRef.current,\n pointer: null,\n timestamp,\n random: randomFnRef.current,\n };\n\n ctx.save();\n try {\n // Clear in backing-store pixels, then set scale to CSS pixels\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.setTransform(currentDpr, 0, 0, currentDpr, 0, 0);\n\n // If off or no effects registered, clearing is all that is needed\n if (motionModeRef.current === 'off' || snapshot.length === 0) {\n return;\n }\n\n for (const reg of snapshot) {\n ctx.save();\n ctx.beginPath();\n try {\n reg.fn(frameState);\n } catch (err) {\n if (__DEV__) {\n console.error('Weather effect draw error:', err);\n }\n } finally {\n ctx.restore();\n ctx.beginPath();\n }\n }\n } finally {\n ctx.restore();\n ctx.beginPath();\n }\n }, [dimensions.width, dimensions.height]);\n\n const drawFrameRef = useRef(drawFrame);\n drawFrameRef.current = drawFrame;\n\n // Invalidate handler\n const invalidate = useCallback(() => {\n isDirtyRef.current = true;\n\n // If currently animating, the next RAF tick will consume the update\n if (shouldAnimateRef.current) {\n return;\n }\n\n // Static, paused, or stopped: coalesce into a single microtask\n if (!isMicrotaskScheduled.current) {\n isMicrotaskScheduled.current = true;\n queueMicrotask(() => {\n isMicrotaskScheduled.current = false;\n if (!canPresentRef.current) return;\n drawFrameRef.current(0, simulationTime.current);\n });\n }\n }, []);\n\n // Update budget when quality or dpr prop changes, and invalidate\n useEffect(() => {\n const nextBudget = resolveRenderBudget(quality, dpr);\n budgetRef.current = nextBudget;\n setBudget(nextBudget);\n invalidate();\n }, [quality, dpr, invalidate]);\n\n // DPR change media query\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n let mql: MediaQueryList | undefined;\n\n const updateDpr = () => {\n if (mql) mql.removeEventListener('change', updateDpr);\n const nextBudget = resolveRenderBudget(quality, dpr);\n budgetRef.current = nextBudget;\n setBudget(nextBudget);\n invalidate();\n\n const currentDppx = window.devicePixelRatio ?? 1;\n mql = window.matchMedia(`(resolution: ${currentDppx}dppx)`);\n mql.addEventListener('change', updateDpr, { once: true });\n };\n\n updateDpr();\n return () => mql?.removeEventListener('change', updateDpr);\n }, [quality, dpr, invalidate]);\n\n // Update wind and invalidate static/paused scenes\n useEffect(() => {\n windRef.current = wind;\n invalidate();\n }, [wind.x, wind.y, invalidate]);\n\n // When canPresent becomes true (e.g. visibility or viewport returned),\n // redraw any pending dirty state if not currently animating\n useEffect(() => {\n if (canPresent && isDirtyRef.current && !shouldAnimate) {\n invalidate();\n }\n }, [canPresent, shouldAnimate, invalidate]);\n\n // Update sorted snapshot helper\n const updateSnapshot = useCallback(() => {\n const sorted = [...registrationsRef.current].sort((a, b) => {\n if (a.layer !== b.layer) return a.layer - b.layer;\n return a.seq - b.seq;\n });\n orderedSnapshotRef.current = sorted;\n setEffectCount(sorted.length);\n }, []);\n\n // TickerContext methods\n const register = useCallback(\n (layer: number, fn: DrawFn) => {\n const id = nextRegId.current++;\n const seq = nextSeq.current++;\n const reg: Registration = { id, layer, fn, seq };\n\n registrationsRef.current.push(reg);\n updateSnapshot();\n invalidate();\n\n let unregistered = false;\n return () => {\n if (unregistered) return;\n unregistered = true;\n registrationsRef.current = registrationsRef.current.filter((r) => r.id !== id);\n updateSnapshot();\n invalidate();\n };\n },\n [updateSnapshot, invalidate],\n );\n\n const getBudget = useCallback(() => budgetRef.current, []);\n\n const trackAsset = useCallback(\n (task: Promise<void>) => {\n pendingAssetsRef.current.add(task);\n let settled = false;\n\n const finish = () => {\n if (!settled) {\n settled = true;\n pendingAssetsRef.current.delete(task);\n }\n };\n\n task.then(\n () => {\n finish();\n invalidate();\n },\n () => {\n finish();\n invalidate();\n },\n );\n\n return () => {\n finish();\n };\n },\n [invalidate],\n );\n\n // Stable TickerContext object\n const tickerContext = useMemo<TickerContext>(\n () => ({\n register,\n invalidate,\n getBudget,\n trackAsset,\n }),\n [register, invalidate, getBudget, trackAsset],\n );\n\n // Canvas context initialization & loss handling\n useEffect(() => {\n const canvas = canvasNode;\n if (!canvas) return;\n\n let ctx: CanvasRenderingContext2D | null = null;\n try {\n ctx = canvas.getContext('2d');\n } catch {\n ctx = null;\n }\n\n if (!ctx) {\n if (__DEV__) {\n console.warn('WeatherCanvas: Failed to acquire 2D rendering context.');\n }\n setContextAvailable(false);\n onContextLostRef.current?.();\n return;\n }\n\n ctxRef.current = ctx;\n setContextAvailable(true);\n invalidate();\n\n const handleContextLost = (e: Event) => {\n e.preventDefault();\n setContextAvailable(false);\n ctxRef.current = null;\n onContextLostRef.current?.();\n };\n\n const handleContextRestored = () => {\n const restoredCtx = canvas.getContext('2d');\n if (restoredCtx) {\n ctxRef.current = restoredCtx;\n setContextAvailable(true);\n invalidate();\n }\n };\n\n canvas.addEventListener('contextlost', handleContextLost);\n canvas.addEventListener('contextrestored', handleContextRestored);\n\n return () => {\n canvas.removeEventListener('contextlost', handleContextLost);\n canvas.removeEventListener('contextrestored', handleContextRestored);\n };\n }, [canvasNode, invalidate]);\n\n // ResizeObserver for element dimensions\n useEffect(() => {\n const target = mode === 'fullscreen' ? canvasNode : (containerRef.current ?? canvasNode);\n if (!target) return;\n\n if (mode === 'fullscreen') {\n const updateFullscreenSize = () => {\n const w = typeof window !== 'undefined' ? window.innerWidth : 0;\n const h = typeof window !== 'undefined' ? window.innerHeight : 0;\n setDimensions((prev) => {\n if (prev.width === w && prev.height === h) return prev;\n return { width: w, height: h };\n });\n };\n updateFullscreenSize();\n window.addEventListener('resize', updateFullscreenSize);\n return () => window.removeEventListener('resize', updateFullscreenSize);\n }\n\n if (typeof ResizeObserver === 'undefined') return;\n\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n const { width, height } = entry.contentRect;\n setDimensions((prev) => {\n if (prev.width === width && prev.height === height) return prev;\n return { width, height };\n });\n });\n\n ro.observe(target);\n return () => ro.disconnect();\n }, [mode, canvasNode]);\n\n // Adjust canvas backing store dimensions when CSS dimensions or DPR changes\n useEffect(() => {\n const canvas = canvasNode;\n if (!canvas) return;\n\n const currentDpr = budget.dpr;\n const backingWidth = Math.round(dimensions.width * currentDpr);\n const backingHeight = Math.round(dimensions.height * currentDpr);\n\n if (canvas.width !== backingWidth || canvas.height !== backingHeight) {\n canvas.width = backingWidth;\n canvas.height = backingHeight;\n invalidate();\n }\n }, [dimensions, budget.dpr, canvasNode, invalidate]);\n\n // Handle immediate clear on motionMode === 'off'\n useEffect(() => {\n if (motionMode === 'off') {\n const canvas = canvasRef.current;\n const ctx = ctxRef.current;\n if (canvas && ctx && canvas.width > 0 && canvas.height > 0) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n }\n } else {\n invalidate();\n }\n }, [motionMode, invalidate]);\n\n // Main animation lifecycle loop\n useEffect(() => {\n if (!shouldAnimate) {\n if (rafId.current !== null) {\n scheduler.cancel(rafId.current);\n rafId.current = null;\n }\n return;\n }\n\n let stopped = false;\n lastTimestamp.current = null;\n\n function tick(now: number) {\n rafId.current = null;\n if (stopped || !shouldAnimateRef.current) return;\n\n const dt =\n lastTimestamp.current === null\n ? 0\n : Math.min(Math.max((now - lastTimestamp.current) / 1000, 0), 0.1);\n\n lastTimestamp.current = now;\n simulationTime.current += dt * 1000;\n\n drawFrameRef.current(dt, simulationTime.current);\n\n if (!stopped && shouldAnimateRef.current) {\n rafId.current = scheduler.request(tick);\n }\n }\n\n rafId.current = scheduler.request(tick);\n\n return () => {\n stopped = true;\n if (rafId.current !== null) {\n scheduler.cancel(rafId.current);\n rafId.current = null;\n }\n };\n }, [shouldAnimate, scheduler]);\n\n // Container style preserves the canvas DOM node across mode changes\n const containerStyle: React.CSSProperties =\n mode === 'fullscreen'\n ? {\n position: 'fixed',\n top: 0,\n left: 0,\n width: '100vw',\n height: '100vh',\n pointerEvents: 'none',\n zIndex,\n }\n : {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex,\n };\n\n const canvasStyle: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n };\n\n return (\n <TickerCtx.Provider value={tickerContext}>\n <div ref={containerRef} style={containerStyle}>\n <canvas ref={setCanvasRef} aria-hidden=\"true\" style={canvasStyle} />\n {children}\n </div>\n </TickerCtx.Provider>\n );\n}\n","// Layout per particle: [x, y, vx, vy, alpha, life, maxLife] — 7 floats\nexport const PARTICLE_STRIDE = 7;\n\nexport function createParticlePool(count: number): Float32Array {\n return new Float32Array(count * PARTICLE_STRIDE);\n}\n\nexport function growParticlePool(pool: Float32Array, count: number): Float32Array {\n if (pool.length >= count * PARTICLE_STRIDE) return pool;\n const next = createParticlePool(count);\n next.set(pool);\n return next;\n}\n\n// Zero-allocation: explicit scalar params + indexed writes\nexport function resetParticle(\n pool: Float32Array,\n i: number,\n x: number,\n y: number,\n vx: number,\n vy: number,\n life: number,\n): void {\n const base = i * PARTICLE_STRIDE;\n pool[base] = x;\n pool[base + 1] = y;\n pool[base + 2] = vx;\n pool[base + 3] = vy;\n pool[base + 4] = 1; // alpha\n pool[base + 5] = 0; // life elapsed\n pool[base + 6] = life; // maxLife\n}\n","import type { FrameState } from '@react-weather-effects/core';\n\ninterface Transition {\n target: number;\n duration: number;\n remaining: number;\n}\n\nfunction resolveDuration(duration: number): number {\n return Number.isFinite(duration) ? Math.max(0, duration) : 0;\n}\n\nexport function createTransition(target: number, duration: number): Transition {\n return { target, duration: resolveDuration(duration), remaining: 0 };\n}\n\n/** Blend from the current value so interrupted transitions never restart visually. */\nexport function stepTransition(\n transition: Transition,\n target: number,\n duration: number,\n state: Readonly<FrameState>,\n): number {\n const nextDuration = resolveDuration(duration);\n if (target !== transition.target || nextDuration !== transition.duration) {\n transition.target = target;\n transition.duration = nextDuration;\n transition.remaining = nextDuration;\n }\n\n if (!state.isAnimating || nextDuration === 0) {\n transition.remaining = 0;\n return 1;\n }\n if (transition.remaining === 0) return 1;\n\n const elapsed = state.dt * 1000;\n const step = elapsed + 1e-6 >= transition.remaining ? 1 : elapsed / transition.remaining;\n transition.remaining = step === 1 ? 0 : transition.remaining - elapsed;\n return step;\n}\n\ninterface ParticleTransition {\n transition: Transition;\n visibility: Float32Array;\n count: number;\n}\n\nexport function createParticleTransition(\n count: number,\n capacity: number,\n duration: number,\n): ParticleTransition {\n const visibility = new Float32Array(capacity);\n visibility.fill(1, 0, count);\n return { transition: createTransition(count, duration), visibility, count };\n}\n\nexport function updateParticleTransition(\n particles: ParticleTransition,\n targetCount: number,\n duration: number,\n state: Readonly<FrameState>,\n): void {\n const capacity = state.budget.maxParticles;\n if (particles.visibility.length < capacity) {\n const visibility = new Float32Array(capacity);\n visibility.set(particles.visibility);\n particles.visibility = visibility;\n }\n\n // A quality downgrade remains a hard cap, including particles fading out.\n if (particles.count > capacity) particles.visibility.fill(0, capacity, particles.count);\n const count = Math.min(capacity, Math.max(particles.count, targetCount));\n const step = stepTransition(particles.transition, targetCount, duration, state);\n for (let i = 0; i < count; i++) {\n const target = i < targetCount ? 1 : 0;\n particles.visibility[i] = step === 1\n ? target\n : particles.visibility[i] + (target - particles.visibility[i]) * step;\n }\n particles.count = step === 1 ? targetCount : count;\n}\n","import { useContext, useEffect, useRef } from 'react';\nimport {\n createParticlePool,\n type FrameState,\n growParticlePool,\n LAYER,\n PARTICLE_STRIDE,\n TickerCtx,\n} from '@react-weather-effects/core';\nimport { createParticleTransition, updateParticleTransition } from './transition';\n\nexport interface RainProps {\n intensity?: number;\n /** Intensity fade duration in milliseconds; 0 (default) applies changes immediately. */\n transitionDuration?: number;\n angle?: number; // degrees from vertical\n color?: string;\n speed?: number;\n /**\n * Multiplier for raindrop trail length.\n * Defaults to 1. Values < 1 produce fine drizzle; values > 1 produce longer downpour streaks.\n */\n dropLength?: number;\n length?: number;\n /**\n * Multiplier for raindrop stroke thickness.\n * Defaults to 1. Values < 1 produce delicate droplets; values > 1 produce thick heavy drops.\n */\n dropThickness?: number;\n thickness?: number;\n /**\n * Enable animated splashes along the bottom edge of the canvas.\n * Ideal for contained cards, heroes, or window widgets where raindrops hit the ground.\n * Defaults to false.\n */\n splashes?: boolean;\n splash?: boolean;\n}\n\ninterface RainSettings {\n intensity: number;\n transitionDuration: number;\n angle: number;\n color: string;\n speed: number;\n dropLength: number;\n dropThickness: number;\n splashes: boolean;\n}\n\nconst SPLASH_STRIDE = 7;\n\nfunction seedParticle(\n pool: Float32Array,\n i: number,\n state: FrameState,\n settings: RainSettings,\n isInitial: boolean,\n): void {\n const base = i * PARTICLE_STRIDE;\n const angleRad = (settings.angle * Math.PI) / 180;\n const depth = state.random();\n const fallSpeed = 550 + depth * 650;\n const speed = fallSpeed * settings.speed;\n\n const vx = Math.sin(angleRad) * speed + state.wind.x * (140 + depth * 150);\n const vy = Math.cos(angleRad) * speed + state.wind.y * (60 + depth * 50);\n\n // Initial seeding spreads particles across full viewport\n const x = state.random() * (state.width + 200) - 100;\n const y = isInitial\n ? state.random() * (state.height + 100) - 50\n : -50 - state.random() * 100;\n\n pool[base] = x;\n pool[base + 1] = y;\n pool[base + 2] = vx;\n pool[base + 3] = vy;\n pool[base + 4] = 0.3 + depth * 0.6; // alpha\n pool[base + 5] = fallSpeed; // intrinsic speed, retained through wind changes\n pool[base + 6] = depth;\n}\n\nfunction seedParticleRange(\n pool: Float32Array,\n startIndex: number,\n endIndex: number,\n state: FrameState,\n settings: RainSettings,\n): void {\n for (let i = startIndex; i < endIndex; i++) {\n seedParticle(pool, i, state, settings, true);\n }\n}\n\nfunction updatePool(\n pool: Float32Array,\n count: number,\n state: FrameState,\n settings: RainSettings,\n visibility: Float32Array,\n splashPool: Float32Array,\n maxSplashes: number,\n splashState: { head: number; active: boolean },\n): void {\n const dt = state.dt;\n const width = state.width;\n const height = state.height;\n const wrapWidth = width + 200;\n const angleRad = (settings.angle * Math.PI) / 180;\n const sinAngle = Math.sin(angleRad);\n const cosAngle = Math.cos(angleRad);\n const response = 1 - Math.exp(-dt * 5);\n\n // Age existing impacts first; newly spawned splashes only age after their hit time.\n if (splashState.active) {\n splashState.active = false;\n for (let s = 0; s < maxSplashes; s++) {\n const sBase = s * SPLASH_STRIDE;\n if (splashPool[sBase + 5] === 0 || splashPool[sBase + 2] >= 1) continue;\n splashPool[sBase + 2] = Math.min(1, splashPool[sBase + 2] + dt * splashPool[sBase + 3]);\n if (splashPool[sBase + 2] < 1) splashState.active = true;\n }\n }\n\n for (let i = 0; i < count; i++) {\n const base = i * PARTICLE_STRIDE;\n let x = pool[base];\n let y = pool[base + 1];\n let vx = pool[base + 2];\n let vy = pool[base + 3];\n const depth = pool[base + 6];\n const speed = pool[base + 5] * settings.speed;\n\n // Smoothly apply wind influence\n const targetVx = sinAngle * speed + state.wind.x * (140 + depth * 150);\n const targetVy = cosAngle * speed + state.wind.y * (60 + depth * 50);\n vx += (targetVx - vx) * response;\n vy += (targetVy - vy) * response;\n\n const prevY = y;\n x += vx * dt;\n y += vy * dt;\n\n if (settings.splashes && prevY < height && y >= height && visibility[i] > 0.05) {\n const elapsed = (y - height) / vy;\n const impactX = x - vx * elapsed;\n if (impactX >= 0 && impactX <= width) {\n const sBase = splashState.head * SPLASH_STRIDE;\n splashState.head = (splashState.head + 1) % maxSplashes;\n // At capacity, skip extra impacts rather than cutting an active splash short.\n if (splashPool[sBase + 5] === 0 || splashPool[sBase + 2] >= 1) {\n const duration = 0.3 + depth * 0.18;\n splashState.active = true;\n splashPool[sBase] = impactX;\n splashPool[sBase + 1] = Math.max(-40, Math.min(40, vx * 0.04)); // impact momentum\n splashPool[sBase + 2] = elapsed / duration; // progress since crossing the edge\n splashPool[sBase + 3] = 1 / duration;\n splashPool[sBase + 4] = (2.8 + depth * 4.6) * Math.sqrt(Math.max(0.4, Math.min(3, settings.dropThickness)));\n splashPool[sBase + 5] = (0.25 + depth * 0.45) * visibility[i];\n splashPool[sBase + 6] = (depth + i * 0.618) % 1; // stable variation; no redraw randomness\n }\n }\n }\n\n // Re-enter from the upwind side at the same height, outside the visible canvas.\n if (x > width + 100 || x < -100) {\n x = ((x + 100) % wrapWidth + wrapWidth) % wrapWidth - 100;\n }\n\n if (y > height + 60) {\n seedParticle(pool, i, state, settings, false);\n } else {\n pool[base] = x;\n pool[base + 1] = y;\n pool[base + 2] = vx;\n pool[base + 3] = vy;\n }\n }\n}\n\nfunction drawPool(\n pool: Float32Array,\n count: number,\n state: FrameState,\n settings: RainSettings,\n visibility: Float32Array,\n splashPool: Float32Array,\n maxSplashes: number,\n): void {\n if (count === 0 && (!settings.splashes || maxSplashes === 0)) return;\n\n const ctx = state.ctx;\n ctx.strokeStyle = settings.color;\n ctx.lineCap = 'round';\n\n if (count > 0) {\n for (let i = 0; i < count; i++) {\n if (visibility[i] === 0) continue;\n const base = i * PARTICLE_STRIDE;\n const x = pool[base];\n const y = pool[base + 1];\n const vx = pool[base + 2];\n const vy = pool[base + 3];\n const depth = pool[base + 6];\n const trailFactor = (0.012 + depth * 0.025) * settings.dropLength;\n const fade = Math.max(0, Math.min(1, (y + 25) / 45, (state.height + 35 - y) / 80));\n\n // Short tapered segments approximate a fading trail without per-frame gradients.\n for (let segment = 0; segment < 3; segment++) {\n const start = (segment / 3) * trailFactor;\n const end = ((segment + 1) / 3) * trailFactor;\n ctx.globalAlpha = pool[base + 4] * fade * visibility[i] * Math.pow(1 - segment / 3, 2);\n ctx.lineWidth = (0.6 + depth * 1.1) * (1 - segment * 0.2) * settings.dropThickness;\n ctx.beginPath();\n ctx.moveTo(x - vx * start, y - vy * start);\n ctx.lineTo(x - vx * end, y - vy * end);\n ctx.stroke();\n }\n }\n }\n\n if (settings.splashes) {\n ctx.fillStyle = settings.color;\n const thickness = Math.max(0.4, Math.min(3, settings.dropThickness));\n\n for (let s = 0; s < maxSplashes; s++) {\n const sBase = s * SPLASH_STRIDE;\n const progress = splashPool[sBase + 2];\n if (progress >= 1 || splashPool[sBase + 5] === 0) continue;\n\n const x = splashPool[sBase];\n const y = state.height;\n const size = splashPool[sBase + 4];\n const alpha = splashPool[sBase + 5];\n const elapsed = progress / splashPool[sBase + 3];\n const drift = splashPool[sBase + 1] * elapsed;\n\n ctx.globalAlpha = alpha * 0.45 * Math.pow(1 - progress, 1.5);\n ctx.lineWidth = Math.max(0.35, 0.6 * thickness * (1 - progress * 0.4));\n\n // A shallow ground ripple expands quickly, then slows as it dissipates.\n const rx = size * (0.25 + 1.9 * (1 - Math.pow(1 - progress, 3)));\n const ry = Math.max(0.25, rx * 0.19);\n ctx.beginPath();\n ctx.ellipse(x, y, rx, ry, 0, Math.PI, Math.PI * 2);\n ctx.stroke();\n\n // Each bead has its own ballistic arc and landing time, rather than one rigid bounce.\n for (let bead = 0; bead < 5; bead++) {\n const variation = (splashPool[sBase + 6] + bead * 0.37) % 1;\n const beadProgress = progress / (0.72 + variation * 0.28);\n if (beadProgress >= 1) continue;\n const direction = (bead - 2) * 0.5;\n const peak = size * (0.9 + (1 - Math.abs(direction)) * 1.1 + variation * 0.4);\n const beadX = x + drift + direction * size * (1.5 + variation * 0.7) * beadProgress;\n const beadY = y - peak * 4 * beadProgress * (1 - beadProgress);\n const radius = Math.max(0.3, (0.4 + thickness * 0.35) * (1 - beadProgress * 0.45));\n ctx.globalAlpha = alpha * Math.pow(1 - beadProgress, 1.25);\n ctx.beginPath();\n ctx.arc(beadX, beadY, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n\nexport function Rain({\n intensity = 0.7,\n transitionDuration = 0,\n angle = 10,\n color = 'rgba(190, 215, 245, 0.8)',\n speed = 1,\n dropLength,\n length,\n dropThickness,\n thickness,\n splashes,\n splash,\n}: RainProps) {\n const ticker = useContext(TickerCtx);\n\n if (!ticker) {\n throw new Error('<Rain /> must be used inside <WeatherCanvas>');\n }\n\n const effectiveDropLength = dropLength ?? length ?? 1;\n const effectiveDropThickness = dropThickness ?? thickness ?? 1;\n const effectiveSplashes = splashes ?? splash ?? false;\n\n const settingsRef = useRef<RainSettings>({\n intensity,\n transitionDuration,\n angle,\n color,\n speed,\n dropLength: effectiveDropLength,\n dropThickness: effectiveDropThickness,\n splashes: effectiveSplashes,\n });\n\n useEffect(() => {\n settingsRef.current = {\n intensity,\n transitionDuration,\n angle,\n color,\n speed,\n dropLength: effectiveDropLength,\n dropThickness: effectiveDropThickness,\n splashes: effectiveSplashes,\n };\n ticker.invalidate();\n }, [\n ticker,\n intensity,\n transitionDuration,\n angle,\n color,\n speed,\n effectiveDropLength,\n effectiveDropThickness,\n effectiveSplashes,\n ]);\n\n useEffect(() => {\n const capacity = ticker.getBudget().maxParticles;\n let pool = createParticlePool(capacity);\n const particles = createParticleTransition(\n Math.round(Math.max(0, Math.min(1, settingsRef.current.intensity)) * capacity),\n capacity,\n settingsRef.current.transitionDuration,\n );\n let initializedCount = 0;\n const maxSplashes = Math.min(128, Math.max(32, Math.round(capacity * 0.5)));\n const splashPool = new Float32Array(maxSplashes * SPLASH_STRIDE);\n const splashState = { head: 0, active: false };\n\n const unregister = ticker.register(LAYER.MIDGROUND, (state) => {\n const settings = settingsRef.current;\n const targetCount = Math.round(\n Math.max(0, Math.min(1, settings.intensity)) * state.budget.maxParticles,\n );\n updateParticleTransition(particles, targetCount, settings.transitionDuration, state);\n const count = particles.count;\n\n pool = growParticlePool(pool, state.budget.maxParticles);\n if (count > initializedCount) {\n seedParticleRange(pool, initializedCount, count, state, settings);\n initializedCount = count;\n }\n\n if (state.dt > 0) {\n updatePool(\n pool,\n count,\n state,\n settings,\n particles.visibility,\n splashPool,\n maxSplashes,\n splashState,\n );\n }\n drawPool(pool, count, state, settings, particles.visibility, splashPool, maxSplashes);\n });\n\n return unregister;\n }, [ticker]);\n\n return null;\n}\n","import { useContext, useEffect, useRef } from 'react';\nimport {\n createParticlePool,\n type FrameState,\n growParticlePool,\n LAYER,\n PARTICLE_STRIDE,\n TickerCtx,\n} from '@react-weather-effects/core';\nimport { createParticleTransition, updateParticleTransition } from './transition';\n\nexport interface SnowProps {\n intensity?: number;\n /** Intensity fade duration in milliseconds; 0 (default) applies changes immediately. */\n transitionDuration?: number;\n speed?: number;\n color?: string;\n /**\n * Static image URL with original colors preserved. Remote images must allow CORS.\n * Cached as a raster texture up to 1024px per side; animated images use a snapshot.\n */\n sprite?: string;\n /** Radius in CSS pixels; defaults to 6 for sprites, 1.5 for built-in flakes. */\n minSize?: number;\n /** Radius in CSS pixels; defaults to 18 for sprites, 4 for built-in flakes. */\n maxSize?: number;\n /** Enable animated sideways sway and fall flutter. Defaults to true. */\n wobble?: boolean;\n /**\n * Enable sprite rotation / spinning.\n * Defaults to `wobble` (enabled when wobble is enabled).\n * Set to `false` to let sprites drift without rotating, or `true` with `wobble={false}` to rotate without swaying.\n */\n rotation?: boolean;\n /**\n * Multiplier for sprite rotation / spinning speed.\n * Defaults to 1. Set to 0 to freeze rotation.\n */\n rotationSpeed?: number;\n}\n\ninterface SnowSettings {\n intensity: number;\n transitionDuration: number;\n speed: number;\n color: string;\n minSize: number;\n maxSize: number;\n wobble: boolean;\n rotation: boolean;\n rotationSpeed: number;\n}\n\ninterface SnowSprite {\n image: HTMLImageElement;\n texture: HTMLCanvasElement;\n aspect: number;\n requestedSize: number;\n}\n\nfunction getSnowSpriteSize(settings: SnowSettings, dpr: number): number {\n const diameter = Math.max(0, settings.minSize, settings.maxSize) * 2 * dpr;\n // Buckets avoid tiny resize rebuilds; 1024 squared RGBA pixels need at most 4 MiB.\n return Math.min(1024, Math.max(64, 2 ** Math.ceil(Math.log2(diameter || 1))));\n}\n\nfunction createSnowSprite(image: HTMLImageElement, size: number): SnowSprite | null {\n if (typeof document === 'undefined') return null;\n\n try {\n const aspect = image.naturalWidth / image.naturalHeight;\n const texture = document.createElement('canvas');\n texture.width = Math.max(1, Math.ceil(size * Math.min(1, aspect)));\n texture.height = Math.max(1, Math.ceil(size / Math.max(1, aspect)));\n const ctx = texture.getContext('2d');\n if (!ctx) return null;\n\n // Render vectors and filters once, rather than for every flake on every frame.\n ctx.drawImage(image, 0, 0, texture.width, texture.height);\n return { image, texture, aspect, requestedSize: size };\n } catch {\n return null;\n }\n}\n\nfunction createSnowTexture(color: string): HTMLCanvasElement | null {\n if (typeof document === 'undefined') return null;\n\n const surface = document.createElement('canvas');\n surface.width = surface.height = 64;\n const ctx = surface.getContext('2d');\n if (!ctx) return null;\n\n const gradient = ctx.createRadialGradient(32, 32, 0, 32, 32, 32);\n gradient.addColorStop(0, 'rgba(255, 255, 255, 1)');\n gradient.addColorStop(0.25, 'rgba(255, 255, 255, 0.95)');\n gradient.addColorStop(0.5, 'rgba(255, 255, 255, 0.55)');\n gradient.addColorStop(0.75, 'rgba(255, 255, 255, 0.15)');\n gradient.addColorStop(1, 'rgba(255, 255, 255, 0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 64, 64);\n ctx.globalCompositeOperation = 'source-in';\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 64, 64);\n return surface;\n}\n\nfunction seedSnowflake(\n pool: Float32Array,\n i: number,\n state: FrameState,\n isInitial: boolean,\n): void {\n const base = i * PARTICLE_STRIDE;\n // Smaller, distant flakes drift more slowly than foreground flakes.\n const depth = Math.pow(state.random(), 1.5);\n const fallSpeed = 22 + depth * 54 + state.random() * 12;\n\n let x: number;\n let y: number;\n\n if (isInitial) {\n x = state.random() * (state.width + 100) - 50;\n y = state.random() * (state.height + 50) - 25;\n } else {\n const windX = state.wind.x;\n const vFlux = Math.max(20, fallSpeed) * state.width;\n const hFlux = Math.abs(windX * 90) * state.height;\n const sideRatio = hFlux / (vFlux + hFlux);\n\n if (state.random() < sideRatio) {\n x = windX > 0 ? -20 - state.random() * 30 : state.width + 20 + state.random() * 30;\n y = state.random() * (state.height + 50) - 25;\n } else {\n x = state.random() * (state.width + 100) - 50;\n y = -20 - state.random() * 50;\n }\n }\n\n const phase = state.random() * Math.PI * 2;\n\n pool[base] = x;\n pool[base + 1] = y;\n pool[base + 2] = phase; // rotation angle\n pool[base + 3] = fallSpeed; // intrinsic fall speed\n pool[base + 4] = 0.3 + depth * 0.6; // alpha\n pool[base + 5] = phase; // wobble phase\n pool[base + 6] = depth;\n}\n\nfunction seedSnowRange(\n pool: Float32Array,\n startIndex: number,\n endIndex: number,\n state: FrameState,\n): void {\n for (let i = startIndex; i < endIndex; i++) {\n seedSnowflake(pool, i, state, true);\n }\n}\n\nfunction updateSnow(\n pool: Float32Array,\n count: number,\n state: FrameState,\n settings: SnowSettings,\n): void {\n const dt = state.dt;\n const width = state.width;\n const height = state.height;\n const wrapWidth = width + 100;\n const gust = 1 + Math.sin(state.timestamp * 0.0004) * 0.2;\n\n for (let i = 0; i < count; i++) {\n const base = i * PARTICLE_STRIDE;\n let x = pool[base];\n let y = pool[base + 1];\n let angle = pool[base + 2];\n let phase = pool[base + 5];\n const baseVy = pool[base + 3];\n const depth = pool[base + 6];\n\n if (settings.wobble) {\n phase += dt * (0.65 + depth * 1.4) * settings.speed;\n pool[base + 5] = phase;\n }\n\n if (settings.rotation && settings.rotationSpeed !== 0) {\n const spinDir = i % 2 === 0 ? 1 : -1;\n const spinRate = (0.65 + depth * 1.4) * spinDir;\n angle += dt * spinRate * settings.rotationSpeed;\n }\n\n const sway = settings.wobble\n ? (Math.sin(phase) * (10 + depth * 22) + Math.sin(phase * 0.5) * 8) * settings.speed\n : 0;\n const vx = sway + state.wind.x * (50 + depth * 80) * gust;\n const flutter = settings.wobble ? 1 + Math.sin(phase * 0.8) * 0.12 : 1;\n const vy = baseVy * settings.speed * flutter;\n\n x += vx * dt;\n y += (vy + state.wind.y * 30) * dt;\n\n // Preserve horizontal coverage without restarting flakes at the top.\n if (x > width + 50 || x < -50) {\n x = ((x + 50) % wrapWidth + wrapWidth) % wrapWidth - 50;\n }\n\n if (y > height + 30) {\n seedSnowflake(pool, i, state, false);\n } else {\n pool[base] = x;\n pool[base + 1] = y;\n pool[base + 2] = angle;\n }\n }\n}\n\nfunction drawSnow(\n pool: Float32Array,\n count: number,\n state: FrameState,\n settings: SnowSettings,\n texture: CanvasImageSource | null,\n sprite: SnowSprite | null,\n visibility: Float32Array,\n): void {\n if (count === 0) return;\n\n const ctx = state.ctx;\n const aspect = sprite ? sprite.aspect : 1;\n ctx.fillStyle = settings.color;\n\n for (let i = 0; i < count; i++) {\n if (visibility[i] === 0) continue;\n const base = i * PARTICLE_STRIDE;\n const x = pool[base];\n const y = pool[base + 1];\n const depth = pool[base + 6];\n const r = Math.max(0, settings.minSize + depth * (settings.maxSize - settings.minSize));\n if (r === 0) continue;\n\n const fade = Math.max(0, Math.min(1, (y + 20) / 45, (state.height + 20 - y) / 55));\n ctx.globalAlpha = pool[base + 4] * fade * visibility[i];\n if (sprite) {\n const halfWidth = r * Math.min(1, aspect);\n const halfHeight = r / Math.max(1, aspect);\n ctx.save();\n try {\n ctx.translate(x, y);\n if (settings.rotation) ctx.rotate(pool[base + 2]);\n ctx.drawImage(sprite.texture, -halfWidth, -halfHeight, halfWidth * 2, halfHeight * 2);\n } finally {\n ctx.restore();\n }\n } else if (texture) {\n const radius = r * 1.55;\n ctx.drawImage(texture, x - radius, y - radius, radius * 2, radius * 2);\n } else {\n ctx.beginPath();\n ctx.arc(x, y, r, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.globalAlpha = 1;\n}\n\nexport function Snow({\n intensity = 0.5,\n transitionDuration = 0,\n speed = 1,\n color = 'rgba(255, 255, 255, 0.85)',\n sprite,\n minSize = sprite ? 6 : 1.5,\n maxSize = sprite ? 18 : 4,\n wobble = true,\n rotation,\n rotationSpeed,\n}: SnowProps) {\n const ticker = useContext(TickerCtx);\n\n if (!ticker) {\n throw new Error('<Snow /> must be used inside <WeatherCanvas>');\n }\n\n const effectiveRotation = rotation ?? (rotationSpeed !== undefined ? true : wobble);\n const effectiveRotationSpeed = rotationSpeed ?? 1;\n\n const settingsRef = useRef<SnowSettings>({\n intensity,\n transitionDuration,\n speed,\n color,\n minSize,\n maxSize,\n wobble,\n rotation: effectiveRotation,\n rotationSpeed: effectiveRotationSpeed,\n });\n const textureRef = useRef<CanvasImageSource | null>(null);\n const spriteRef = useRef<SnowSprite | null>(null);\n\n useEffect(() => {\n settingsRef.current = {\n intensity,\n transitionDuration,\n speed,\n color,\n minSize,\n maxSize,\n wobble,\n rotation: effectiveRotation,\n rotationSpeed: effectiveRotationSpeed,\n };\n ticker.invalidate();\n }, [\n ticker,\n intensity,\n transitionDuration,\n speed,\n color,\n minSize,\n maxSize,\n wobble,\n effectiveRotation,\n effectiveRotationSpeed,\n ]);\n\n useEffect(() => {\n textureRef.current = createSnowTexture(color);\n ticker.invalidate();\n return () => {\n textureRef.current = null;\n };\n }, [ticker, color]);\n\n useEffect(() => {\n if (!sprite || typeof Image === 'undefined') return;\n\n let isMounted = true;\n let settle!: () => void;\n const image = new Image();\n image.crossOrigin = 'anonymous';\n const task = new Promise<void>((resolve) => {\n settle = resolve;\n image.onload = () => {\n if (isMounted && image.naturalWidth > 0 && image.naturalHeight > 0) {\n spriteRef.current = createSnowSprite(\n image,\n getSnowSpriteSize(settingsRef.current, ticker.getBudget().dpr),\n );\n ticker.invalidate();\n }\n resolve();\n };\n image.onerror = () => { resolve(); };\n });\n const releaseTask = ticker.trackAsset(task);\n image.src = sprite;\n\n return () => {\n isMounted = false;\n image.onload = null;\n image.onerror = null;\n image.removeAttribute('src');\n spriteRef.current = null;\n settle();\n releaseTask();\n };\n }, [ticker, sprite]);\n\n useEffect(() => {\n const capacity = ticker.getBudget().maxParticles;\n let pool = createParticlePool(capacity);\n const particles = createParticleTransition(\n Math.round(Math.max(0, Math.min(1, settingsRef.current.intensity)) * capacity),\n capacity,\n settingsRef.current.transitionDuration,\n );\n let initializedCount = 0;\n\n const unregister = ticker.register(LAYER.MIDGROUND, (state) => {\n const settings = settingsRef.current;\n const targetCount = Math.round(\n Math.max(0, Math.min(1, settings.intensity)) * state.budget.maxParticles,\n );\n updateParticleTransition(particles, targetCount, settings.transitionDuration, state);\n const count = particles.count;\n\n pool = growParticlePool(pool, state.budget.maxParticles);\n if (count > initializedCount) {\n seedSnowRange(pool, initializedCount, count, state);\n initializedCount = count;\n }\n\n if (state.dt > 0) {\n updateSnow(pool, count, state, settings);\n }\n\n const cachedSprite = spriteRef.current;\n if (cachedSprite && count > 0) {\n const size = getSnowSpriteSize(settings, state.dpr);\n if (size > cachedSprite.requestedSize) {\n // Remember failed upgrades too, so allocation failures aren't retried every frame.\n cachedSprite.requestedSize = size;\n spriteRef.current = createSnowSprite(cachedSprite.image, size) ?? cachedSprite;\n }\n }\n drawSnow(pool, count, state, settings, textureRef.current, spriteRef.current, particles.visibility);\n });\n\n return unregister;\n }, [ticker]);\n\n return null;\n}\n","import { useContext, useEffect, useRef } from 'react';\nimport {\n type FrameState,\n LAYER,\n TickerCtx,\n} from '@react-weather-effects/core';\nimport { createTransition, stepTransition } from './transition';\n\nexport interface FogProps {\n density?: number;\n /** Density fade duration in milliseconds; 0 (default) applies changes immediately. */\n transitionDuration?: number;\n speed?: number;\n color?: string;\n layers?: number;\n}\n\ninterface FogSettings {\n density: number;\n transitionDuration: number;\n speed: number;\n color: string;\n layers: number;\n}\n\ninterface FogPuff {\n x: number;\n y: number;\n scaleX: number;\n scaleY: number;\n baseSpeed: number;\n alpha: number;\n phase: number;\n}\n\nfunction createOffscreenSurface(size: number): HTMLCanvasElement | OffscreenCanvas | null {\n if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(size, size);\n }\n if (typeof document !== 'undefined') {\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n return canvas;\n }\n return null;\n}\n\nfunction renderRadialGradient(\n surface: HTMLCanvasElement | OffscreenCanvas,\n size: number,\n color: string,\n): void {\n const ctx = surface.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!ctx) return;\n\n ctx.clearRect(0, 0, size, size);\n for (let i = 0; i < 6; i++) {\n const x = size * (0.22 + i * 0.112);\n const y = size * (0.48 + Math.sin(i * 2.4) * 0.09);\n const radius = size * (0.18 + Math.sin(i * 1.7) * 0.03);\n const grad = ctx.createRadialGradient(x, y, 0, x, y, radius);\n grad.addColorStop(0, 'rgba(255, 255, 255, 0.85)');\n grad.addColorStop(0.4, 'rgba(255, 255, 255, 0.5)');\n grad.addColorStop(0.75, 'rgba(255, 255, 255, 0.1)');\n grad.addColorStop(1, 'rgba(255, 255, 255, 0)');\n ctx.fillStyle = grad;\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n\n // Tint the feathered mask without parsing CSS colors or introducing opaque rings.\n ctx.globalCompositeOperation = 'source-in';\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, size, size);\n}\n\nexport function Fog({\n density = 0.4,\n transitionDuration = 0,\n speed = 1,\n color = 'rgba(220, 225, 235, 0.35)',\n layers = 3,\n}: FogProps) {\n const ticker = useContext(TickerCtx);\n\n if (!ticker) {\n throw new Error('<Fog /> must be used inside <WeatherCanvas>');\n }\n\n const settingsRef = useRef<FogSettings>({ density, transitionDuration, speed, color, layers });\n\n useEffect(() => {\n settingsRef.current = { density, transitionDuration, speed, color, layers };\n ticker.invalidate();\n }, [ticker, density, transitionDuration, speed, color, layers]);\n\n // Cached texture\n const textureRef = useRef<CanvasImageSource | null>(null);\n const imageBitmapRef = useRef<ImageBitmap | null>(null);\n\n // Regenerate texture whenever ticker or color changes\n useEffect(() => {\n let isMounted = true;\n const budget = ticker.getBudget();\n const textureSize = budget.quality === 'low' ? 256 : budget.quality === 'high' ? 512 : 384;\n\n const surface = createOffscreenSurface(textureSize);\n if (!surface) return;\n\n renderRadialGradient(surface, textureSize, color);\n textureRef.current = surface;\n ticker.invalidate();\n\n // Optional ImageBitmap conversion with asset tracking\n if (typeof createImageBitmap === 'function') {\n const assetTask = (async () => {\n try {\n const bitmap = await createImageBitmap(surface);\n if (!isMounted) {\n bitmap.close();\n return;\n }\n if (imageBitmapRef.current) {\n imageBitmapRef.current.close();\n }\n imageBitmapRef.current = bitmap;\n textureRef.current = bitmap;\n ticker.invalidate();\n } catch {\n // Graceful fallback: retain usable offscreen canvas surface\n }\n })();\n\n const releaseTask = ticker.trackAsset(assetTask);\n\n return () => {\n isMounted = false;\n releaseTask();\n if (imageBitmapRef.current) {\n imageBitmapRef.current.close();\n imageBitmapRef.current = null;\n }\n textureRef.current = null;\n };\n }\n\n return () => {\n isMounted = false;\n textureRef.current = null;\n };\n }, [ticker, color]);\n\n useEffect(() => {\n const puffs: FogPuff[] = [];\n let currentDensity = Math.max(0, Math.min(1, settingsRef.current.density));\n const transition = createTransition(currentDensity, settingsRef.current.transitionDuration);\n const unregister = ticker.register(LAYER.BACKGROUND, (state: FrameState) => {\n const texture = textureRef.current;\n if (!texture) return;\n\n const settings = settingsRef.current;\n const numLayers = Math.round(Math.max(1, Math.min(6, settings.layers)));\n const count = numLayers * 3;\n const targetDensity = Math.max(0, Math.min(1, settings.density));\n const step = stepTransition(transition, targetDensity, settings.transitionDuration, state);\n currentDensity = step === 1 ? targetDensity : currentDensity + (targetDensity - currentDensity) * step;\n const baseAlpha = currentDensity;\n if (baseAlpha === 0) return;\n\n // Normalized positions resize with the canvas; new layers retain existing wisps.\n for (let i = puffs.length; i < count; i++) {\n const layer = Math.floor(i / 3);\n puffs.push({\n x: (i % 3) * 0.55 - 0.05 + (state.random() - 0.5) * 0.25,\n y: 0.15 + (layer / numLayers) * 0.72 + (state.random() - 0.5) * 0.12,\n scaleX: 1 + state.random() * 0.7,\n scaleY: 0.65 + state.random() * 0.55,\n baseSpeed: 8 + (layer + 1) * 7,\n alpha: 0.5 + state.random() * 0.4,\n phase: state.random() * Math.PI * 2,\n });\n }\n\n const dt = state.dt;\n\n // Update positions applying live settings.speed\n if (dt > 0) {\n for (let i = 0; i < count; i++) {\n const puff = puffs[i];\n const vx = puff.baseSpeed * settings.speed + state.wind.x * 35;\n puff.x += (vx * dt) / state.width;\n puff.phase += dt * 0.12 * settings.speed;\n const margin = Math.max(320 / state.width, 0.65) * puff.scaleX * 0.55;\n const totalWidth = 1 + margin * 2;\n\n if (puff.x > 1 + margin || puff.x < -margin) {\n puff.x = ((puff.x + margin) % totalWidth + totalWidth) % totalWidth - margin;\n }\n }\n }\n\n // Draw fog puffs\n const ctx = state.ctx;\n\n for (let i = 0; i < count; i++) {\n const puff = puffs[i];\n const drawW = Math.max(320, state.width * 0.65) * puff.scaleX * (1 + Math.sin(puff.phase) * 0.03);\n const drawH = Math.max(160, state.height * 0.55) * puff.scaleY;\n const y = puff.y * state.height + Math.sin(puff.phase) * drawH * 0.08;\n\n ctx.globalAlpha = baseAlpha * puff.alpha * (0.9 + Math.sin(puff.phase * 0.7) * 0.1);\n ctx.drawImage(texture, puff.x * state.width - drawW / 2, y - drawH / 2, drawW, drawH);\n }\n\n ctx.globalAlpha = 1.0;\n });\n\n return unregister;\n }, [ticker]);\n\n return null;\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
type Quality = 'low' | 'medium' | 'high';
|
|
4
|
+
type DPRWeight = 'light' | 'normal' | 'heavy';
|
|
5
|
+
interface RenderBudget {
|
|
6
|
+
readonly maxParticles: number;
|
|
7
|
+
readonly dpr: number;
|
|
8
|
+
readonly quality: Quality;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type ReducedMotionProp = 'auto' | 'animated' | 'static' | 'off';
|
|
12
|
+
type MotionMode = 'animated' | 'static' | 'off';
|
|
13
|
+
|
|
14
|
+
interface WeatherCanvasProps {
|
|
15
|
+
children?: React.ReactNode;
|
|
16
|
+
mode?: 'fullscreen' | 'contained';
|
|
17
|
+
wind?: {
|
|
18
|
+
x: number;
|
|
19
|
+
y: number;
|
|
20
|
+
};
|
|
21
|
+
dpr?: DPRWeight;
|
|
22
|
+
quality?: Quality;
|
|
23
|
+
reducedMotion?: ReducedMotionProp;
|
|
24
|
+
paused?: boolean;
|
|
25
|
+
seed?: string | number;
|
|
26
|
+
zIndex?: number;
|
|
27
|
+
onContextLost?: () => void;
|
|
28
|
+
}
|
|
29
|
+
declare function WeatherCanvas({ children, mode, wind, dpr, quality, reducedMotion, paused, seed, zIndex, onContextLost, }: WeatherCanvasProps): React.JSX.Element;
|
|
30
|
+
|
|
31
|
+
interface RainProps {
|
|
32
|
+
intensity?: number;
|
|
33
|
+
/** Intensity fade duration in milliseconds; 0 (default) applies changes immediately. */
|
|
34
|
+
transitionDuration?: number;
|
|
35
|
+
angle?: number;
|
|
36
|
+
color?: string;
|
|
37
|
+
speed?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Multiplier for raindrop trail length.
|
|
40
|
+
* Defaults to 1. Values < 1 produce fine drizzle; values > 1 produce longer downpour streaks.
|
|
41
|
+
*/
|
|
42
|
+
dropLength?: number;
|
|
43
|
+
length?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Multiplier for raindrop stroke thickness.
|
|
46
|
+
* Defaults to 1. Values < 1 produce delicate droplets; values > 1 produce thick heavy drops.
|
|
47
|
+
*/
|
|
48
|
+
dropThickness?: number;
|
|
49
|
+
thickness?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Enable animated splashes along the bottom edge of the canvas.
|
|
52
|
+
* Ideal for contained cards, heroes, or window widgets where raindrops hit the ground.
|
|
53
|
+
* Defaults to false.
|
|
54
|
+
*/
|
|
55
|
+
splashes?: boolean;
|
|
56
|
+
splash?: boolean;
|
|
57
|
+
}
|
|
58
|
+
declare function Rain({ intensity, transitionDuration, angle, color, speed, dropLength, length, dropThickness, thickness, splashes, splash, }: RainProps): null;
|
|
59
|
+
|
|
60
|
+
interface SnowProps {
|
|
61
|
+
intensity?: number;
|
|
62
|
+
/** Intensity fade duration in milliseconds; 0 (default) applies changes immediately. */
|
|
63
|
+
transitionDuration?: number;
|
|
64
|
+
speed?: number;
|
|
65
|
+
color?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Static image URL with original colors preserved. Remote images must allow CORS.
|
|
68
|
+
* Cached as a raster texture up to 1024px per side; animated images use a snapshot.
|
|
69
|
+
*/
|
|
70
|
+
sprite?: string;
|
|
71
|
+
/** Radius in CSS pixels; defaults to 6 for sprites, 1.5 for built-in flakes. */
|
|
72
|
+
minSize?: number;
|
|
73
|
+
/** Radius in CSS pixels; defaults to 18 for sprites, 4 for built-in flakes. */
|
|
74
|
+
maxSize?: number;
|
|
75
|
+
/** Enable animated sideways sway and fall flutter. Defaults to true. */
|
|
76
|
+
wobble?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Enable sprite rotation / spinning.
|
|
79
|
+
* Defaults to `wobble` (enabled when wobble is enabled).
|
|
80
|
+
* Set to `false` to let sprites drift without rotating, or `true` with `wobble={false}` to rotate without swaying.
|
|
81
|
+
*/
|
|
82
|
+
rotation?: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Multiplier for sprite rotation / spinning speed.
|
|
85
|
+
* Defaults to 1. Set to 0 to freeze rotation.
|
|
86
|
+
*/
|
|
87
|
+
rotationSpeed?: number;
|
|
88
|
+
}
|
|
89
|
+
declare function Snow({ intensity, transitionDuration, speed, color, sprite, minSize, maxSize, wobble, rotation, rotationSpeed, }: SnowProps): null;
|
|
90
|
+
|
|
91
|
+
interface FogProps {
|
|
92
|
+
density?: number;
|
|
93
|
+
/** Density fade duration in milliseconds; 0 (default) applies changes immediately. */
|
|
94
|
+
transitionDuration?: number;
|
|
95
|
+
speed?: number;
|
|
96
|
+
color?: string;
|
|
97
|
+
layers?: number;
|
|
98
|
+
}
|
|
99
|
+
declare function Fog({ density, transitionDuration, speed, color, layers, }: FogProps): null;
|
|
100
|
+
|
|
101
|
+
export { type DPRWeight, Fog, type FogProps, type MotionMode, type Quality, Rain, type RainProps, type ReducedMotionProp, type RenderBudget, Snow, type SnowProps, WeatherCanvas, type WeatherCanvasProps };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
type Quality = 'low' | 'medium' | 'high';
|
|
4
|
+
type DPRWeight = 'light' | 'normal' | 'heavy';
|
|
5
|
+
interface RenderBudget {
|
|
6
|
+
readonly maxParticles: number;
|
|
7
|
+
readonly dpr: number;
|
|
8
|
+
readonly quality: Quality;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type ReducedMotionProp = 'auto' | 'animated' | 'static' | 'off';
|
|
12
|
+
type MotionMode = 'animated' | 'static' | 'off';
|
|
13
|
+
|
|
14
|
+
interface WeatherCanvasProps {
|
|
15
|
+
children?: React.ReactNode;
|
|
16
|
+
mode?: 'fullscreen' | 'contained';
|
|
17
|
+
wind?: {
|
|
18
|
+
x: number;
|
|
19
|
+
y: number;
|
|
20
|
+
};
|
|
21
|
+
dpr?: DPRWeight;
|
|
22
|
+
quality?: Quality;
|
|
23
|
+
reducedMotion?: ReducedMotionProp;
|
|
24
|
+
paused?: boolean;
|
|
25
|
+
seed?: string | number;
|
|
26
|
+
zIndex?: number;
|
|
27
|
+
onContextLost?: () => void;
|
|
28
|
+
}
|
|
29
|
+
declare function WeatherCanvas({ children, mode, wind, dpr, quality, reducedMotion, paused, seed, zIndex, onContextLost, }: WeatherCanvasProps): React.JSX.Element;
|
|
30
|
+
|
|
31
|
+
interface RainProps {
|
|
32
|
+
intensity?: number;
|
|
33
|
+
/** Intensity fade duration in milliseconds; 0 (default) applies changes immediately. */
|
|
34
|
+
transitionDuration?: number;
|
|
35
|
+
angle?: number;
|
|
36
|
+
color?: string;
|
|
37
|
+
speed?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Multiplier for raindrop trail length.
|
|
40
|
+
* Defaults to 1. Values < 1 produce fine drizzle; values > 1 produce longer downpour streaks.
|
|
41
|
+
*/
|
|
42
|
+
dropLength?: number;
|
|
43
|
+
length?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Multiplier for raindrop stroke thickness.
|
|
46
|
+
* Defaults to 1. Values < 1 produce delicate droplets; values > 1 produce thick heavy drops.
|
|
47
|
+
*/
|
|
48
|
+
dropThickness?: number;
|
|
49
|
+
thickness?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Enable animated splashes along the bottom edge of the canvas.
|
|
52
|
+
* Ideal for contained cards, heroes, or window widgets where raindrops hit the ground.
|
|
53
|
+
* Defaults to false.
|
|
54
|
+
*/
|
|
55
|
+
splashes?: boolean;
|
|
56
|
+
splash?: boolean;
|
|
57
|
+
}
|
|
58
|
+
declare function Rain({ intensity, transitionDuration, angle, color, speed, dropLength, length, dropThickness, thickness, splashes, splash, }: RainProps): null;
|
|
59
|
+
|
|
60
|
+
interface SnowProps {
|
|
61
|
+
intensity?: number;
|
|
62
|
+
/** Intensity fade duration in milliseconds; 0 (default) applies changes immediately. */
|
|
63
|
+
transitionDuration?: number;
|
|
64
|
+
speed?: number;
|
|
65
|
+
color?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Static image URL with original colors preserved. Remote images must allow CORS.
|
|
68
|
+
* Cached as a raster texture up to 1024px per side; animated images use a snapshot.
|
|
69
|
+
*/
|
|
70
|
+
sprite?: string;
|
|
71
|
+
/** Radius in CSS pixels; defaults to 6 for sprites, 1.5 for built-in flakes. */
|
|
72
|
+
minSize?: number;
|
|
73
|
+
/** Radius in CSS pixels; defaults to 18 for sprites, 4 for built-in flakes. */
|
|
74
|
+
maxSize?: number;
|
|
75
|
+
/** Enable animated sideways sway and fall flutter. Defaults to true. */
|
|
76
|
+
wobble?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Enable sprite rotation / spinning.
|
|
79
|
+
* Defaults to `wobble` (enabled when wobble is enabled).
|
|
80
|
+
* Set to `false` to let sprites drift without rotating, or `true` with `wobble={false}` to rotate without swaying.
|
|
81
|
+
*/
|
|
82
|
+
rotation?: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Multiplier for sprite rotation / spinning speed.
|
|
85
|
+
* Defaults to 1. Set to 0 to freeze rotation.
|
|
86
|
+
*/
|
|
87
|
+
rotationSpeed?: number;
|
|
88
|
+
}
|
|
89
|
+
declare function Snow({ intensity, transitionDuration, speed, color, sprite, minSize, maxSize, wobble, rotation, rotationSpeed, }: SnowProps): null;
|
|
90
|
+
|
|
91
|
+
interface FogProps {
|
|
92
|
+
density?: number;
|
|
93
|
+
/** Density fade duration in milliseconds; 0 (default) applies changes immediately. */
|
|
94
|
+
transitionDuration?: number;
|
|
95
|
+
speed?: number;
|
|
96
|
+
color?: string;
|
|
97
|
+
layers?: number;
|
|
98
|
+
}
|
|
99
|
+
declare function Fog({ density, transitionDuration, speed, color, layers, }: FogProps): null;
|
|
100
|
+
|
|
101
|
+
export { type DPRWeight, Fog, type FogProps, type MotionMode, type Quality, Rain, type RainProps, type ReducedMotionProp, type RenderBudget, Snow, type SnowProps, WeatherCanvas, type WeatherCanvasProps };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
type Quality = 'low' | 'medium' | 'high';
|
|
4
|
+
type DPRWeight = 'light' | 'normal' | 'heavy';
|
|
5
|
+
interface RenderBudget {
|
|
6
|
+
readonly maxParticles: number;
|
|
7
|
+
readonly dpr: number;
|
|
8
|
+
readonly quality: Quality;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type ReducedMotionProp = 'auto' | 'animated' | 'static' | 'off';
|
|
12
|
+
type MotionMode = 'animated' | 'static' | 'off';
|
|
13
|
+
|
|
14
|
+
interface WeatherCanvasProps {
|
|
15
|
+
children?: React.ReactNode;
|
|
16
|
+
mode?: 'fullscreen' | 'contained';
|
|
17
|
+
wind?: {
|
|
18
|
+
x: number;
|
|
19
|
+
y: number;
|
|
20
|
+
};
|
|
21
|
+
dpr?: DPRWeight;
|
|
22
|
+
quality?: Quality;
|
|
23
|
+
reducedMotion?: ReducedMotionProp;
|
|
24
|
+
paused?: boolean;
|
|
25
|
+
seed?: string | number;
|
|
26
|
+
zIndex?: number;
|
|
27
|
+
onContextLost?: () => void;
|
|
28
|
+
}
|
|
29
|
+
declare function WeatherCanvas({ children, mode, wind, dpr, quality, reducedMotion, paused, seed, zIndex, onContextLost, }: WeatherCanvasProps): React.JSX.Element;
|
|
30
|
+
|
|
31
|
+
interface RainProps {
|
|
32
|
+
intensity?: number;
|
|
33
|
+
/** Intensity fade duration in milliseconds; 0 (default) applies changes immediately. */
|
|
34
|
+
transitionDuration?: number;
|
|
35
|
+
angle?: number;
|
|
36
|
+
color?: string;
|
|
37
|
+
speed?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Multiplier for raindrop trail length.
|
|
40
|
+
* Defaults to 1. Values < 1 produce fine drizzle; values > 1 produce longer downpour streaks.
|
|
41
|
+
*/
|
|
42
|
+
dropLength?: number;
|
|
43
|
+
length?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Multiplier for raindrop stroke thickness.
|
|
46
|
+
* Defaults to 1. Values < 1 produce delicate droplets; values > 1 produce thick heavy drops.
|
|
47
|
+
*/
|
|
48
|
+
dropThickness?: number;
|
|
49
|
+
thickness?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Enable animated splashes along the bottom edge of the canvas.
|
|
52
|
+
* Ideal for contained cards, heroes, or window widgets where raindrops hit the ground.
|
|
53
|
+
* Defaults to false.
|
|
54
|
+
*/
|
|
55
|
+
splashes?: boolean;
|
|
56
|
+
splash?: boolean;
|
|
57
|
+
}
|
|
58
|
+
declare function Rain({ intensity, transitionDuration, angle, color, speed, dropLength, length, dropThickness, thickness, splashes, splash, }: RainProps): null;
|
|
59
|
+
|
|
60
|
+
interface SnowProps {
|
|
61
|
+
intensity?: number;
|
|
62
|
+
/** Intensity fade duration in milliseconds; 0 (default) applies changes immediately. */
|
|
63
|
+
transitionDuration?: number;
|
|
64
|
+
speed?: number;
|
|
65
|
+
color?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Static image URL with original colors preserved. Remote images must allow CORS.
|
|
68
|
+
* Cached as a raster texture up to 1024px per side; animated images use a snapshot.
|
|
69
|
+
*/
|
|
70
|
+
sprite?: string;
|
|
71
|
+
/** Radius in CSS pixels; defaults to 6 for sprites, 1.5 for built-in flakes. */
|
|
72
|
+
minSize?: number;
|
|
73
|
+
/** Radius in CSS pixels; defaults to 18 for sprites, 4 for built-in flakes. */
|
|
74
|
+
maxSize?: number;
|
|
75
|
+
/** Enable animated sideways sway and fall flutter. Defaults to true. */
|
|
76
|
+
wobble?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Enable sprite rotation / spinning.
|
|
79
|
+
* Defaults to `wobble` (enabled when wobble is enabled).
|
|
80
|
+
* Set to `false` to let sprites drift without rotating, or `true` with `wobble={false}` to rotate without swaying.
|
|
81
|
+
*/
|
|
82
|
+
rotation?: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Multiplier for sprite rotation / spinning speed.
|
|
85
|
+
* Defaults to 1. Set to 0 to freeze rotation.
|
|
86
|
+
*/
|
|
87
|
+
rotationSpeed?: number;
|
|
88
|
+
}
|
|
89
|
+
declare function Snow({ intensity, transitionDuration, speed, color, sprite, minSize, maxSize, wobble, rotation, rotationSpeed, }: SnowProps): null;
|
|
90
|
+
|
|
91
|
+
interface FogProps {
|
|
92
|
+
density?: number;
|
|
93
|
+
/** Density fade duration in milliseconds; 0 (default) applies changes immediately. */
|
|
94
|
+
transitionDuration?: number;
|
|
95
|
+
speed?: number;
|
|
96
|
+
color?: string;
|
|
97
|
+
layers?: number;
|
|
98
|
+
}
|
|
99
|
+
declare function Fog({ density, transitionDuration, speed, color, layers, }: FogProps): null;
|
|
100
|
+
|
|
101
|
+
export { type DPRWeight, Fog, type FogProps, type MotionMode, type Quality, Rain, type RainProps, type ReducedMotionProp, type RenderBudget, Snow, type SnowProps, WeatherCanvas, type WeatherCanvasProps };
|