"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, }); }; // 실제 격자 정보 계산 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 < 30 // 30px 미만이면 너무 작다고 판단 : false; return (
{/* 헤더 */}

격자 설정

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

격자 구조

updateSetting("columns", value)} className="w-full" />
1 24
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 && actualGridInfo && ( <>

격자 정보

해상도: {screenResolution.width} × {screenResolution.height}
컬럼 너비: {actualGridInfo.columnWidth.toFixed(1)}px {isColumnsTooSmall && " (너무 작음)"}
사용 가능 너비: {(screenResolution.width - gridSettings.padding * 2).toLocaleString()}px
{isColumnsTooSmall && (
💡 컬럼이 너무 작습니다. 컬럼 수를 줄이거나 간격을 줄여보세요.
)}
)}
); }; export default GridPanel;