import React, {FC, useCallback, useEffect} from "react"; import {createPortal} from "react-dom"; import {AnimatePresence, motion} from "motion/react"; import {useAtomValue, useSetAtom} from "jotai"; import {HoveredTestableCompositeIDAtom, OverlayOpenCompositeAtom} from "./atoms"; import {TestableComposite, InsideOverlayContext} from "./TestableComposite"; import {colors} from "./Colors"; import {TestableCompositeRemoveButton} from "./TestableCompositeRemoveButton"; const SPRING = {type: 'spring', stiffness: 380, damping: 32, mass: 0.8} as const; const BACKDROP_TRANSITION = {duration: 0.28, ease: [0.22, 1, 0.36, 1]} as const; export const TestableCompositeOverlay: FC = () => { const overlayState = useAtomValue(OverlayOpenCompositeAtom); const setOverlayState = useSetAtom(OverlayOpenCompositeAtom); const setHoveredTestableCompositeID = useSetAtom(HoveredTestableCompositeIDAtom); const close = useCallback(() => { setOverlayState(null); setHoveredTestableCompositeID(null); }, [setOverlayState, setHoveredTestableCompositeID]); useEffect(() => { if (!overlayState) return; const onKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { close(); } }; document.addEventListener('keydown', onKeyDown); return () => document.removeEventListener('keydown', onKeyDown); }, [overlayState, close]); const viewportCenterX = typeof window !== 'undefined' ? window.innerWidth / 2 : 0; const viewportCenterY = typeof window !== 'undefined' ? window.innerHeight / 2 : 0; const sourceCenter = overlayState ? { x: overlayState.rect.left + overlayState.rect.width / 2, y: overlayState.rect.top + overlayState.rect.height / 2, } : {x: 0, y: 0}; const offsetX = sourceCenter.x - viewportCenterX; const offsetY = sourceCenter.y - viewportCenterY; return createPortal( {overlayState && ( {/* Backdrop */} {/* Scrollable overlay that keeps the card centered when it fits */}
e.stopPropagation()} > {}} onRequestToUnHighlight={() => {}} onRemove={close} />
)}
, document.body ); };