import React, { useEffect, useState } from "react"; import { motion } from "framer-motion"; const Background = () => { const [gridSize, setGridSize] = useState({ cols: 12, rows: 6 }); const [mousePos, setMousePos] = useState({ x: 0, y: 0 }); const [path, setPath] = useState([]); useEffect(() => { const updateGrid = () => { const width = window.innerWidth; const height = window.innerHeight; const cols = Math.max(8, Math.floor(width / 100)); // 100px-es cellák const rows = Math.max(5, Math.floor(height / 100)); // 100px-es cellák setGridSize({ cols, rows }); }; const handleMouseMove = (e) => { setMousePos({ x: e.clientX, y: e.clientY }); }; updateGrid(); window.addEventListener("resize", updateGrid); window.addEventListener("mousemove", handleMouseMove); return () => { window.removeEventListener("resize", updateGrid); window.removeEventListener("mousemove", handleMouseMove); }; }, []); useEffect(() => { const interval = setInterval(() => { const newCol = Math.floor(Math.random() * gridSize.cols); const newRow = Math.floor(Math.random() * gridSize.rows); setPath((prevPath) => { const newPath = [...prevPath, { col: newCol, row: newRow, opacity: 1 }]; // Új pont hozzáadása if (newPath.length > 10) { newPath.shift(); // Max 10 pont az útvonalon } return newPath; }); }, 500); // Új pont hozzáadása minden 500ms-ben // Az útvonal pontjainak fokozatos eltűnése const fadeInterval = setInterval(() => { setPath((prevPath) => prevPath.map((point) => ({ ...point, opacity: Math.max(0, point.opacity - 0.05), // Fokozatosan csökkentjük az opacity-t })).filter((point) => point.opacity > 0) // Eltávolítjuk a teljesen eltűnt pontokat ); }, 100); // Opacity frissítése minden 100ms-ben return () => { clearInterval(interval); clearInterval(fadeInterval); }; }, [gridSize]); return (
{[...Array(gridSize.cols * gridSize.rows)].map((_, i) => { const col = i % gridSize.cols; const row = Math.floor(i / gridSize.cols); const cellX = (col + 0.5) * (window.innerWidth / gridSize.cols); const cellY = (row + 0.5) * (window.innerHeight / gridSize.rows); const dx = cellX - mousePos.x; const dy = cellY - mousePos.y; const distance = Math.sqrt(dx * dx + dy * dy); const distanceFactor = Math.max(0, 1 - distance / 300); // Egér hatótávolsága // Az útvonalban lévő pontok opacitása const pathPoint = path.find((p) => p.col === col && p.row === row); const pathOpacity = pathPoint ? pathPoint.opacity : 0; return ( ); })}
); }; export default Background;