diff --git a/frontend/components/StackModal.tsx b/frontend/components/StackModal.tsx index 4053d21..eb8d845 100644 --- a/frontend/components/StackModal.tsx +++ b/frontend/components/StackModal.tsx @@ -1,4 +1,4 @@ -import React, { createContext, useContext, useState, useCallback, ReactNode, useEffect } from 'react'; +import React, { createContext, useContext, useState, useCallback, ReactNode, useEffect, useRef } from 'react'; import { X, ChevronLeft, Maximize2, Minimize2 } from 'lucide-react'; // Modal em PILHA (estilo navegação iOS): páginas deslizam da direita, com botão voltar. @@ -25,10 +25,24 @@ export const useStackModal = (): StackCtx => { export const StackModal: React.FC<{ isOpen: boolean; onClose: () => void; root: StackPage }> = ({ isOpen, onClose, root }) => { const [stack, setStack] = useState([root]); const [fullscreen, setFullscreen] = useState(false); + const panelRef = useRef(null); // Reabriu → reinicia a pilha. (Use também key={...} no pai p/ forçar remount por entidade.) useEffect(() => { if (isOpen) setStack([root]); /* eslint-disable-line */ }, [isOpen]); + // Não trancar: ESC fecha; clicar FORA do painel fecha (o overlay deixa o clique passar + // pra agenda, então clicar em outro slot/evento fecha este e abre o novo). + useEffect(() => { + if (!isOpen) return; + const onDown = (e: PointerEvent) => { + if (panelRef.current && !panelRef.current.contains(e.target as Node)) onClose(); + }; + const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; + document.addEventListener('pointerdown', onDown, true); + window.addEventListener('keydown', onKey); + return () => { document.removeEventListener('pointerdown', onDown, true); window.removeEventListener('keydown', onKey); }; + }, [isOpen, onClose]); + const push = useCallback((p: StackPage) => setStack(s => [...s, p]), []); const pop = useCallback(() => setStack(s => (s.length > 1 ? s.slice(0, -1) : s)), []); const close = useCallback(() => onClose(), [onClose]); @@ -38,9 +52,10 @@ export const StackModal: React.FC<{ isOpen: boolean; onClose: () => void; root: const canBack = stack.length > 1; return ( -
+