"use client" import { useEffect, useRef } from "react" interface Snowflake { x: number y: number radius: number speed: number opacity: number drift: number } export function SnowEffect() { const canvasRef = useRef(null) useEffect(() => { const canvas = canvasRef.current if (!canvas) return const ctx = canvas.getContext("2d") if (!ctx) return let animationFrameId: number let snowflakes: Snowflake[] = [] const resizeCanvas = () => { canvas.width = window.innerWidth canvas.height = window.innerHeight } const createSnowflakes = () => { const count = Math.floor(window.innerWidth / 4) snowflakes = [] for (let i = 0; i < count; i++) { snowflakes.push({ x: Math.random() * canvas.width, y: Math.random() * canvas.height, radius: Math.random() * 3 + 1, speed: Math.random() * 2 + 0.5, opacity: Math.random() * 0.5 + 0.3, drift: Math.random() * 1 - 0.5 }) } } const drawSnowflakes = () => { if (!ctx || !canvas) return ctx.clearRect(0, 0, canvas.width, canvas.height) snowflakes.forEach((flake) => { ctx.beginPath() ctx.arc(flake.x, flake.y, flake.radius, 0, Math.PI * 2) ctx.fillStyle = `rgba(255, 255, 255, ${ flake.opacity })` ctx.fill() flake.y += flake.speed flake.x += flake.drift if (flake.y > canvas.height) { flake.y = -flake.radius flake.x = Math.random() * canvas.width } if (flake.x > canvas.width) { flake.x = 0 } else if (flake.x < 0) { flake.x = canvas.width } }) animationFrameId = requestAnimationFrame(drawSnowflakes) } resizeCanvas() createSnowflakes() drawSnowflakes() window.addEventListener("resize", () => { resizeCanvas() createSnowflakes() }) return () => { cancelAnimationFrame(animationFrameId) window.removeEventListener("resize", resizeCanvas) } }, []) return ( ) }