@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
79 lines (75 loc) • 2.81 kB
JavaScript
'use client';
;
var jsxRuntime = require('react/jsx-runtime');
var React = require('react');
var ReactDOM = require('react-dom');
var hooks = require('@mantine/hooks');
require('clsx');
require('../../core/MantineProvider/Mantine.context.cjs');
require('../../core/MantineProvider/default-theme.cjs');
require('../../core/MantineProvider/MantineProvider.cjs');
require('../../core/MantineProvider/MantineThemeProvider/MantineThemeProvider.cjs');
var useProps = require('../../core/MantineProvider/use-props/use-props.cjs');
require('../../core/MantineProvider/MantineCssVariables/MantineCssVariables.cjs');
require('../../core/Box/Box.cjs');
var factory = require('../../core/factory/factory.cjs');
require('../../core/DirectionProvider/DirectionProvider.cjs');
function createPortalNode(props) {
const node = document.createElement("div");
node.setAttribute("data-portal", "true");
typeof props.className === "string" && node.classList.add(...props.className.split(" ").filter(Boolean));
typeof props.style === "object" && Object.assign(node.style, props.style);
typeof props.id === "string" && node.setAttribute("id", props.id);
return node;
}
function getTargetNode({
target,
reuseTargetNode,
...others
}) {
if (target) {
if (typeof target === "string") {
return document.querySelector(target) || createPortalNode(others);
}
return target;
}
if (reuseTargetNode) {
const existingNode = document.querySelector("[data-mantine-shared-portal-node]");
if (existingNode) {
return existingNode;
}
const node = createPortalNode(others);
node.setAttribute("data-mantine-shared-portal-node", "true");
document.body.appendChild(node);
return node;
}
return createPortalNode(others);
}
const defaultProps = {
reuseTargetNode: true
};
const Portal = factory.factory((props, ref) => {
const { children, target, reuseTargetNode, ...others } = useProps.useProps("Portal", defaultProps, props);
const [mounted, setMounted] = React.useState(false);
const nodeRef = React.useRef(null);
hooks.useIsomorphicEffect(() => {
setMounted(true);
nodeRef.current = getTargetNode({ target, reuseTargetNode, ...others });
hooks.assignRef(ref, nodeRef.current);
if (!target && !reuseTargetNode && nodeRef.current) {
document.body.appendChild(nodeRef.current);
}
return () => {
if (!target && !reuseTargetNode && nodeRef.current) {
document.body.removeChild(nodeRef.current);
}
};
}, [target]);
if (!mounted || !nodeRef.current) {
return null;
}
return ReactDOM.createPortal(/* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children }), nodeRef.current);
});
Portal.displayName = "@mantine/core/Portal";
exports.Portal = Portal;
//# sourceMappingURL=Portal.cjs.map