introduce divs for nodes, edges, edge labels and viewport front & back to simplify z-index ordering

This commit is contained in:
peterkogo
2025-04-29 20:15:23 +02:00
parent fddd4be6f8
commit 472ef21c62
8 changed files with 44 additions and 37 deletions
@@ -1,13 +1,13 @@
import { useStore } from '$lib/store';
type Portal = 'viewport' | 'root';
type Portal = 'viewport-back' | 'viewport-front' | 'root' | 'edge-labels';
function tryToMount(node: Element, domNode: Element | null, target: Portal | undefined) {
if (!target || !domNode) {
return;
}
const targetEl = target === 'root' ? domNode : domNode.querySelector('.svelte-flow__viewport');
const targetEl = target === 'root' ? domNode : domNode.querySelector(`.svelte-flow__${target}`);
if (targetEl) {
targetEl.appendChild(node);
@@ -28,7 +28,7 @@
</script>
<div
use:portal={'viewport'}
use:portal={'edge-labels'}
class={['svelte-flow__edge-label', { transparent }, className]}
style:cursor={selectEdgeOnClick ? 'pointer' : undefined}
style:transform="translate(-50%, -50%) translate({x}px,{y}px)"
@@ -2,9 +2,9 @@
import { portal } from '$lib/actions/portal';
import type { ViewportPortalProps } from './types';
let { children, ...rest }: ViewportPortalProps = $props();
let { moveTo = 'front', children, ...rest }: ViewportPortalProps = $props();
</script>
<div use:portal={'viewport'} {...rest}>
<div use:portal={`viewport-${moveTo}`} {...rest}>
{@render children?.()}
</div>
@@ -2,5 +2,6 @@ import type { Snippet } from 'svelte';
import type { HTMLAttributes } from 'svelte/elements';
export type ViewportPortalProps = {
moveTo: 'front' | 'back';
children?: Snippet;
} & HTMLAttributes<HTMLDivElement>;
@@ -13,17 +13,19 @@
}: { store: SvelteFlowStore<NodeType, EdgeType> } & EdgeEvents<EdgeType> = $props();
</script>
<svg class="svelte-flow__marker">
<MarkerDefinition />
</svg>
<div class="svelte-flow__edges">
<svg class="svelte-flow__marker">
<MarkerDefinition />
</svg>
{#each store.visible.edges.values() as edge (edge.id)}
<EdgeWrapper
bind:store
{edge}
{onedgeclick}
{onedgecontextmenu}
{onedgepointerenter}
{onedgepointerleave}
/>
{/each}
{#each store.visible.edges.values() as edge (edge.id)}
<EdgeWrapper
bind:store
{edge}
{onedgeclick}
{onedgecontextmenu}
{onedgepointerenter}
{onedgepointerleave}
/>
{/each}
</div>
@@ -46,19 +46,21 @@
});
</script>
{#each store.visible.nodes.values() as node (node.id)}
<NodeWrapper
bind:store
{node}
{resizeObserver}
{nodeClickDistance}
{onnodeclick}
{onnodepointerenter}
{onnodepointermove}
{onnodepointerleave}
{onnodedrag}
{onnodedragstart}
{onnodedragstop}
{onnodecontextmenu}
/>
{/each}
<div class="svelte-flow__nodes">
{#each store.visible.nodes.values() as node (node.id)}
<NodeWrapper
bind:store
{node}
{resizeObserver}
{nodeClickDistance}
{onnodeclick}
{onnodepointerenter}
{onnodepointermove}
{onnodepointerleave}
{onnodedrag}
{onnodedragstart}
{onnodedragstop}
{onnodecontextmenu}
/>
{/each}
</div>
@@ -149,6 +149,7 @@
>
<Pane bind:store {onpaneclick} {onpanecontextmenu} {panOnDrag} {selectionOnDrag}>
<ViewportComponent bind:store>
<div class="svelte-flow__viewport-back svelte-flow__container"></div>
<EdgeRenderer
bind:store
{onedgeclick}
@@ -156,6 +157,7 @@
{onedgepointerenter}
{onedgepointerleave}
/>
<div class="svelte-flow__edge-labels svelte-flow__container"></div>
<ConnectionLine
bind:store
type={connectionLineType}
@@ -183,6 +185,7 @@
{onnodedragstart}
{onnodedragstop}
/>
<div class="svelte-flow__viewport-front svelte-flow__container"></div>
</ViewportComponent>
<Selection
isVisible={!!(store.selectionRect && store.selectionRectMode === 'user')}
+2 -3
View File
@@ -195,10 +195,9 @@ function updateChildNode<NodeType extends NodeBase>(
});
}
}
const DEFAULT_NODE_Z = 1;
``;
function calculateZ(node: NodeBase, selectedNodeZ: number) {
return (isNumeric(node.zIndex) ? node.zIndex : DEFAULT_NODE_Z) + (node.selected ? selectedNodeZ : DEFAULT_NODE_Z);
return (isNumeric(node.zIndex) ? node.zIndex : 0) + (node.selected ? selectedNodeZ : 0);
}
function calculateChildXYZ<NodeType extends NodeBase>(