"use client"; import { useEffect, useRef, useState } from "react"; import { LayoutGrid } from "lucide-react"; import clsx from "clsx"; interface GridLayoutSelectorProps { isEn: boolean; cols: number; rows: number; onSelectGrid: (cols: number, rows: number) => void; } export function GridLayoutSelector({ isEn, cols, rows, onSelectGrid, }: GridLayoutSelectorProps) { const [isOpen, setIsOpen] = useState(false); const [hoveredCols, setHoveredCols] = useState(0); const [hoveredRows, setHoveredRows] = useState(0); const containerRef = useRef(null); // Handle click outside to close dropdown useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(event.target as Node)) { setIsOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); const handleCellClick = (c: number, r: number) => { onSelectGrid(c, r); setIsOpen(false); }; const previewCols = hoveredCols > 0 ? hoveredCols : cols; const previewRows = hoveredRows > 0 ? hoveredRows : rows; return (
{isOpen && (
{ setHoveredCols(0); setHoveredRows(0); }} > {[1, 2, 3].map((r) => [1, 2, 3].map((c) => { const isHighlighted = c <= previewCols && r <= previewRows; return (
{ setHoveredCols(c); setHoveredRows(r); }} onClick={() => handleCellClick(c, r)} className={clsx( "h-6 w-6 rounded-sm border cursor-pointer transition-colors", isHighlighted ? "bg-blue-500 border-blue-600" : "bg-slate-100 border-slate-200 hover:bg-slate-200" )} /> ); }) )}
{previewCols} × {previewRows}{" "} {isEn ? previewCols * previewRows === 1 ? "Chart" : "Charts" : "图表"}
)}
); }