added Edge Reconnection

This commit is contained in:
peterkogo
2025-04-11 15:32:07 +02:00
parent d94f3f490a
commit a3e3055186
17 changed files with 314 additions and 165 deletions
@@ -1,31 +1 @@
type PortalOptions = {
target?: string;
domNode: Element | null;
};
function tryToMount(node: Element, domNode: Element | null, target: string | undefined) {
if (!domNode) {
return;
}
const targetEl = target ? domNode.querySelector(target) : domNode;
if (targetEl) {
targetEl.appendChild(node);
}
}
export default function (node: Element, { target, domNode }: PortalOptions) {
tryToMount(node, domNode, target);
return {
async update({ target, domNode }: PortalOptions) {
tryToMount(node, domNode, target);
},
destroy() {
if (node.parentNode) {
node.parentNode.removeChild(node);
}
}
};
}
export { default as portal } from './portal.svelte';
@@ -0,0 +1,42 @@
import { useStore } from '$lib/store';
type Portal = 'viewport' | 'edgelabel' | 'root';
const selector: Record<Exclude<Portal, 'root'>, string> = {
viewport: '.svelte-flow__viewport-portal',
edgelabel: '.svelte-flow__edgelabel-renderer'
};
function tryToMount(node: Element, domNode: Element | null, target: Portal | undefined) {
if (!target || !domNode) {
return;
}
const targetEl = target === 'root' ? domNode : domNode.querySelector(selector[target]);
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);
}
}
};
}