"use client"; import React, { useMemo, useRef, useState } from "react"; import { cn } from "@/lib/utils"; export const BackgroundRippleEffect = ({ rows = 8, cols = 27, cellSize = 56, }: { rows?: number; cols?: number; cellSize?: number; }) => { const [clickedCell, setClickedCell] = useState<{ row: number; col: number; } | null>(null); const [rippleKey, setRippleKey] = useState(0); const ref = useRef(null); return (
{ setClickedCell({ row, col }); setRippleKey((k) => k + 1); }} interactive />
); }; type DivGridProps = { className?: string; rows: number; cols: number; cellSize: number; // in pixels borderColor: string; fillColor: string; clickedCell: { row: number; col: number } | null; onCellClick?: (row: number, col: number) => void; interactive?: boolean; }; type CellStyle = React.CSSProperties & { ["--delay"]?: string; ["--duration"]?: string; }; const DivGrid = ({ className, rows = 7, cols = 30, cellSize = 56, borderColor = "#3f3f46", fillColor = "rgba(14,165,233,0.3)", clickedCell = null, onCellClick = () => {}, interactive = true, }: DivGridProps) => { const cells = useMemo( () => Array.from({ length: rows * cols }, (_, idx) => idx), [rows, cols] ); const gridStyle: React.CSSProperties = { display: "grid", gridTemplateColumns: `repeat(${cols}, ${cellSize}px)`, gridTemplateRows: `repeat(${rows}, ${cellSize}px)`, width: cols * cellSize, height: rows * cellSize, marginInline: "auto", }; return (
{cells.map((idx) => { const rowIdx = Math.floor(idx / cols); const colIdx = idx % cols; const distance = clickedCell ? Math.hypot(clickedCell.row - rowIdx, clickedCell.col - colIdx) : 0; const delay = clickedCell ? Math.max(0, distance * 55) : 0; // ms const duration = 200 + distance * 80; // ms const style: CellStyle = clickedCell ? { "--delay": `${delay}ms`, "--duration": `${duration}ms`, } : {}; return (
onCellClick?.(rowIdx, colIdx) : undefined } /> ); })}
); };