"use client"; import React from "react"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Checkbox } from "@/components/ui/checkbox"; import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; import { Slider } from "@/components/ui/slider"; import { Grid3X3, RotateCcw, Eye, EyeOff, Zap, RefreshCw } from "lucide-react"; import { GridSettings, ScreenResolution } from "@/types/screen"; import { calculateGridInfo } from "@/lib/utils/gridUtils"; interface GridPanelProps { gridSettings: GridSettings; onGridSettingsChange: (settings: GridSettings) => void; onResetGrid: () => void; onForceGridUpdate?: () => void; // 강제 격자 재조정 추가 screenResolution?: ScreenResolution; // 해상도 정보 추가 } export const GridPanel: React.FC = ({ gridSettings, onGridSettingsChange, onResetGrid, onForceGridUpdate, screenResolution, }) => { const updateSetting = (key: keyof GridSettings, value: any) => { onGridSettingsChange({ ...gridSettings, [key]: value, }); }; // 최대 컬럼 수 계산 (최소 컬럼 너비 30px 기준) const MIN_COLUMN_WIDTH = 30; const maxColumns = screenResolution ? Math.floor((screenResolution.width - gridSettings.padding * 2 + gridSettings.gap) / (MIN_COLUMN_WIDTH + gridSettings.gap)) : 24; const safeMaxColumns = Math.max(1, Math.min(maxColumns, 100)); // 최대 100개로 제한 // 실제 격자 정보 계산 const actualGridInfo = screenResolution ? calculateGridInfo(screenResolution.width, screenResolution.height, { columns: gridSettings.columns, gap: gridSettings.gap, padding: gridSettings.padding, snapToGrid: gridSettings.snapToGrid || false, }) : null; // 실제 표시되는 컬럼 수 계산 (항상 설정된 개수를 표시하되, 너비가 너무 작으면 경고) const actualColumns = gridSettings.columns; // 컬럼이 너무 작은지 확인 const isColumnsTooSmall = screenResolution && actualGridInfo ? actualGridInfo.columnWidth < MIN_COLUMN_WIDTH : false; return (
{/* 헤더 */}

격자 설정

{onForceGridUpdate && ( )}
{/* 주요 토글들 */}
{gridSettings.showGrid ? ( ) : ( )}
updateSetting("showGrid", checked)} />
updateSetting("snapToGrid", checked)} />
{/* 설정 영역 */}
{/* 격자 구조 - 10px 단위 */}

격자 크기 (10px 단위)

모든 컴포넌트는 10px 단위로 배치되고 크기가 조정됩니다.

updateSetting("gap", value)} className="w-full" />
0px 40px
updateSetting("padding", value)} className="w-full" />
0px 60px
{/* 격자 스타일 */}

격자 스타일

updateSetting("gridColor", e.target.value)} className="h-8 w-12 rounded border p-1" /> updateSetting("gridColor", e.target.value)} placeholder="#d1d5db" className="flex-1" />
updateSetting("gridOpacity", value)} className="w-full" />
10% 100%
{/* 미리보기 */}

미리보기

컴포넌트 예시
{/* 푸터 */}
💡 격자 설정은 실시간으로 캔버스에 반영됩니다
{/* 해상도 정보 */} {screenResolution && ( <>

화면 정보

해상도: {screenResolution.width} × {screenResolution.height}
격자 단위: 10px
)}
); }; export default GridPanel;