diff --git a/frontend/components/pop/viewer/PopViewerWithModals.tsx b/frontend/components/pop/viewer/PopViewerWithModals.tsx index 3e6a92a1..7e75672d 100644 --- a/frontend/components/pop/viewer/PopViewerWithModals.tsx +++ b/frontend/components/pop/viewer/PopViewerWithModals.tsx @@ -91,9 +91,9 @@ export default function PopViewerWithModals({ }; }, [subscribe, layout.modals]); - // 특정 인덱스의 모달 닫기 - const handleCloseModal = useCallback((index: number) => { - setModalStack(prev => prev.slice(0, index)); + // 최상위 모달만 닫기 (X 버튼, overlay 클릭, ESC) + const handleCloseTopModal = useCallback(() => { + setModalStack(prev => prev.slice(0, -1)); }, []); return ( @@ -112,10 +112,10 @@ export default function PopViewerWithModals({ {/* 모달 스택 렌더링 */} {modalStack.map((modal, index) => { const { definition } = modal; + const isTopModal = index === modalStack.length - 1; const closeOnOverlay = definition.frameConfig?.closeOnOverlay !== false; const closeOnEsc = definition.frameConfig?.closeOnEsc !== false; - // 모달의 layout 구성 (모달 자체를 하나의 레이아웃으로) const modalLayout: PopLayoutDataV5 = { ...layout, gridConfig: definition.gridConfig, @@ -123,7 +123,6 @@ export default function PopViewerWithModals({ overrides: definition.overrides, }; - // sizeConfig 기반 모달 너비 계산 const detectedMode = currentMode || detectGridMode(viewportWidth); const modalWidth = resolveModalWidth(definition.sizeConfig, detectedMode, viewportWidth); const isFull = modalWidth >= viewportWidth; @@ -134,7 +133,7 @@ export default function PopViewerWithModals({ key={`${definition.id}-${index}`} open={true} onOpenChange={(open) => { - if (!open) handleCloseModal(index); + if (!open && isTopModal) handleCloseTopModal(); }} > { - if (!closeOnOverlay) e.preventDefault(); + // 최상위 모달이 아니면 overlay 클릭 무시 (하위 모달이 먼저 닫히는 것 방지) + if (!isTopModal || !closeOnOverlay) e.preventDefault(); }} onEscapeKeyDown={(e) => { - if (!closeOnEsc) e.preventDefault(); + if (!isTopModal || !closeOnEsc) e.preventDefault(); }} >