UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

37 lines (36 loc) 1.72 kB
//#region src/Portal/portalRoot.ts const PRIMER_PORTAL_ROOT_ID = "__primerPortalRoot__"; const DEFAULT_PORTAL_CONTAINER_NAME = "__default__"; const portalRootRegistry = {}; /** * Register a container to serve as a portal root. * @param root The element that will be the root for portals created in this container * @param name The name of the container, to be used with the `containerName` prop on the Portal Component. * If name is not specified, registers the default portal root. */ function registerPortalRoot(root, name = DEFAULT_PORTAL_CONTAINER_NAME) { portalRootRegistry[name] = root; } function ensureDefaultPortal() { const existingDefaultPortalContainer = portalRootRegistry[DEFAULT_PORTAL_CONTAINER_NAME]; if (!existingDefaultPortalContainer || !document.body.contains(existingDefaultPortalContainer)) { let defaultPortalContainer = document.getElementById(PRIMER_PORTAL_ROOT_ID); if (!(defaultPortalContainer instanceof Element)) { defaultPortalContainer = document.createElement("div"); defaultPortalContainer.setAttribute("id", PRIMER_PORTAL_ROOT_ID); defaultPortalContainer.style.position = "absolute"; defaultPortalContainer.style.top = "0"; defaultPortalContainer.style.left = "0"; defaultPortalContainer.style.width = "100%"; const suitablePortalRoot = document.querySelector("[data-portal-root]"); if (suitablePortalRoot) suitablePortalRoot.appendChild(defaultPortalContainer); else document.body.appendChild(defaultPortalContainer); } registerPortalRoot(defaultPortalContainer); } } function getPortalRoot(name) { return portalRootRegistry[name]; } //#endregion export { DEFAULT_PORTAL_CONTAINER_NAME, ensureDefaultPortal, getPortalRoot, registerPortalRoot };