import { useEffect, useState } from "preact/hooks"; import { createPortal } from "preact/compat"; import type { ComponentChildren } from "preact"; type PortalProps = { into?: string | HTMLElement; children: ComponentChildren; }; export function Portal({ into = "body", children }: PortalProps) { const [host, setHost] = useState(null); useEffect(() => { if (typeof document === "undefined") return; let target: HTMLElement | null = null; if (typeof into === "string") { target = into === "body" ? document.body : document.querySelector(into); } else { target = into; } if (!target) target = document.body; const wrapper = document.createElement("div"); wrapper.className = "preact-portal-root"; target.appendChild(wrapper); setHost(wrapper); return () => { if (wrapper.parentNode) wrapper.parentNode.removeChild(wrapper); setHost(null); }; }, [into]); if (!host) return null; return createPortal(children, host); }