38 lines
867 B
TypeScript
38 lines
867 B
TypeScript
import { useStore } from '$lib/store';
|
|
|
|
type Portal = 'viewport' | 'root';
|
|
|
|
function tryToMount(node: Element, domNode: Element | null, target: Portal | undefined) {
|
|
if (!target || !domNode) {
|
|
return;
|
|
}
|
|
|
|
const targetEl = target === 'root' ? domNode : domNode.querySelector('.svelte-flow__viewport');
|
|
|
|
if (targetEl) {
|
|
targetEl.appendChild(node);
|
|
}
|
|
}
|
|
|
|
export default function (node: Element, target: Portal | undefined) {
|
|
const { domNode } = $derived(useStore());
|
|
|
|
let previousTarget: Portal | undefined = target;
|
|
|
|
tryToMount(node, domNode, target);
|
|
|
|
return {
|
|
async update(target: Portal) {
|
|
if (target !== previousTarget) {
|
|
node.parentNode?.removeChild(node);
|
|
}
|
|
tryToMount(node, domNode, target);
|
|
},
|
|
destroy() {
|
|
if (node.parentNode) {
|
|
node.parentNode.removeChild(node);
|
|
}
|
|
}
|
|
};
|
|
}
|