"use client"; import React, { useState, createContext, useContext } from "react"; import { ResizableDialog, ResizableDialogContent, ResizableDialogHeader, DialogTitle } from "@/components/ui/resizable-dialog"; import { Button } from "@/components/ui/button"; import { Monitor, Tablet, Smartphone } from "lucide-react"; import { ComponentData } from "@/types/screen"; import { ResponsiveLayoutEngine } from "./ResponsiveLayoutEngine"; import { Breakpoint } from "@/types/responsive"; // 미리보기 모달용 브레이크포인트 Context const PreviewBreakpointContext = createContext(null); // 미리보기 모달 내에서 브레이크포인트를 가져오는 훅 export const usePreviewBreakpoint = (): Breakpoint | null => { return useContext(PreviewBreakpointContext); }; interface ResponsivePreviewModalProps { isOpen: boolean; onClose: () => void; components: ComponentData[]; screenWidth: number; } type DevicePreset = { name: string; width: number; height: number; icon: React.ReactNode; breakpoint: Breakpoint; }; const DEVICE_PRESETS: DevicePreset[] = [ { name: "데스크톱", width: 1920, height: 1080, icon: , breakpoint: "desktop", }, { name: "태블릿", width: 768, height: 1024, icon: , breakpoint: "tablet", }, { name: "모바일", width: 375, height: 667, icon: , breakpoint: "mobile", }, ]; export const ResponsivePreviewModal: React.FC = ({ isOpen, onClose, components, screenWidth, }) => { const [selectedDevice, setSelectedDevice] = useState(DEVICE_PRESETS[0]); const [scale, setScale] = useState(1); // 스케일 계산: 모달 내에서 디바이스가 잘 보이도록 React.useEffect(() => { // 모달 내부 너비를 1400px로 가정하고 여백 100px 제외 const maxWidth = 1300; const calculatedScale = Math.min(1, maxWidth / selectedDevice.width); setScale(calculatedScale); }, [selectedDevice]); return ( 반응형 미리보기 {/* 디바이스 선택 버튼들 */}
{DEVICE_PRESETS.map((device) => ( ))}
{/* 미리보기 영역 - Context Provider로 감싸서 브레이크포인트 전달 */}
{/* 디바이스 프레임 헤더 (선택사항) */}
{selectedDevice.name} - {selectedDevice.width}×{selectedDevice.height}
스케일: {Math.round(scale * 100)}%
{/* 실제 컴포넌트 렌더링 */}
{/* 푸터 정보 */}
💡 Tip: 각 디바이스 버튼을 클릭하여 다양한 화면 크기에서 레이아웃을 확인할 수 있습니다.
); };