@primer/react
Version:
An implementation of GitHub's Primer Design System using React
37 lines (36 loc) • 1.72 kB
JavaScript
//#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 };