"use client"; import type React from "react"; import { type CSSProperties, useEffect, useRef } from "react"; interface MagnetLinesProps { rows?: number; columns?: number; containerSize?: string; lineColor?: string; lineWidth?: string; lineHeight?: string; baseAngle?: number; className?: string; style?: CSSProperties; disabled?: boolean; } const MagnetLines: React.FC = ({ rows = 9, columns = 9, containerSize = "80vmin", lineColor = "#efefef", lineWidth = "1vmin", lineHeight = "6vmin", baseAngle = -10, className = "", style = {}, disabled = false, }) => { const containerRef = useRef(null); // Se magnetlines estiver desabilitado, não renderiza nada if (disabled) { return null; } useEffect(() => { const container = containerRef.current; if (!container) return; const items = container.querySelectorAll("span"); const onPointerMove = (pointer: { x: number; y: number }) => { items.forEach((item) => { const rect = item.getBoundingClientRect(); const centerX = rect.x + rect.width / 2; const centerY = rect.y + rect.height / 2; const b = pointer.x - centerX; const a = pointer.y - centerY; const c = Math.sqrt(a * a + b * b) || 1; const r = ((Math.acos(b / c) * 180) / Math.PI) * (pointer.y > centerY ? 1 : -1); item.style.setProperty("--rotate", `${r}deg`); }); }; const handlePointerMove = (e: PointerEvent) => { onPointerMove({ x: e.x, y: e.y }); }; window.addEventListener("pointermove", handlePointerMove); if (items.length) { const middleIndex = Math.floor(items.length / 2); const rect = items[middleIndex].getBoundingClientRect(); onPointerMove({ x: rect.x, y: rect.y }); } return () => { window.removeEventListener("pointermove", handlePointerMove); }; }, []); const total = rows * columns; const spans = Array.from({ length: total }, (_, i) => ( )); return (
{spans}
); }; export default MagnetLines;