UNPKG

@lobehub/ui

Version:

Lobe UI is an open-source UI component library for building AIGC web apps

45 lines (42 loc) 1.57 kB
'use client'; import { LOBE_THEME_APP_ID } from "../ThemeProvider/constants.mjs"; import { useEffect, useState } from "react"; //#region src/Tooltip/TooltipPortal.tsx const PORTAL_ATTR = "data-lobe-ui-tooltip-portal"; const TOOLTIP_CONTAINER_ATTR = "data-lobe-ui-tooltip-container"; const containerMap = /* @__PURE__ */ new WeakMap(); const getOrCreateContainer = (root) => { const resolvedRoot = (() => { if (typeof document === "undefined") return root; if (typeof ShadowRoot !== "undefined" && root instanceof ShadowRoot) return root; if (!(root === document.body)) return root; const themeApp = document.querySelector(`#${LOBE_THEME_APP_ID}`); if (themeApp) return themeApp; const tooltipContainer = document.querySelector(`[${TOOLTIP_CONTAINER_ATTR}="true"]`); if (tooltipContainer) return tooltipContainer; return root; })(); const cached = containerMap.get(resolvedRoot); if (cached && cached.isConnected) return cached; const el = document.createElement("div"); el.setAttribute(PORTAL_ATTR, "true"); resolvedRoot.append(el); containerMap.set(resolvedRoot, el); return el; }; const resolveRoot = (root) => { if (root) return root; return document.body; }; const useTooltipPortalContainer = (root) => { const [container, setContainer] = useState(null); useEffect(() => { const resolved = resolveRoot(root); if (!resolved) return; setContainer(getOrCreateContainer(resolved)); }, [root, container?.isConnected]); return container; }; //#endregion export { useTooltipPortalContainer }; //# sourceMappingURL=TooltipPortal.mjs.map