@yamada-ui/portal
Version:
Yamada UI portal component
40 lines (38 loc) • 1.31 kB
JavaScript
"use client"
import {
PortalProvider,
usePortal
} from "./chunk-KRSUD7HN.mjs";
// src/default-portal.tsx
import { useSafeLayoutEffect } from "@yamada-ui/utils";
import { useEffect, useRef, useState } from "react";
import { createPortal } from "react-dom";
import { jsx } from "react/jsx-runtime";
var DefaultPortal = ({ appendToParentPortal, children }) => {
const [node, setNode] = useState(null);
const el = useRef(null);
const [, forceUpdate] = useState({});
useEffect(() => forceUpdate({}), []);
const parent = usePortal();
useSafeLayoutEffect(() => {
if (!node) return;
const { ownerDocument } = node;
const host = appendToParentPortal ? parent != null ? parent : ownerDocument.body : ownerDocument.body;
el.current = ownerDocument.createElement("div");
el.current.className = "ui-portal";
host.appendChild(el.current);
forceUpdate({});
const portalNode = el.current;
return () => {
if (host.contains(portalNode)) host.removeChild(portalNode);
};
}, [node]);
return el.current ? createPortal(
/* @__PURE__ */ jsx(PortalProvider, { value: el.current, children }),
el.current
) : /* @__PURE__ */ jsx("span", { ref: (el2) => el2 ? setNode(el2) : void 0 });
};
export {
DefaultPortal
};
//# sourceMappingURL=chunk-RDVM2NYN.mjs.map