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'; 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) { function tryToMount(node: Element, domNode: Element | null, target: Portal | undefined) {
if (!target || !domNode) { if (!target || !domNode) {
return; return;
} }
const targetEl = target === 'root' ? domNode : domNode.querySelector('.svelte-flow__viewport'); const targetEl = target === 'root' ? domNode : domNode.querySelector(`.svelte-flow__${target}`);
if (targetEl) { if (targetEl) {
targetEl.appendChild(node); targetEl.appendChild(node);
@@ -28,7 +28,7 @@
</script> </script>
<div <div
use:portal={'viewport'} use:portal={'edge-labels'}
class={['svelte-flow__edge-label', { transparent }, className]} class={['svelte-flow__edge-label', { transparent }, className]}
style:cursor={selectEdgeOnClick ? 'pointer' : undefined} style:cursor={selectEdgeOnClick ? 'pointer' : undefined}
style:transform="translate(-50%, -50%) translate({x}px,{y}px)" style:transform="translate(-50%, -50%) translate({x}px,{y}px)"
@@ -2,9 +2,9 @@
import { portal } from '$lib/actions/portal'; import { portal } from '$lib/actions/portal';
import type { ViewportPortalProps } from './types'; import type { ViewportPortalProps } from './types';
let { children, ...rest }: ViewportPortalProps = $props(); let { moveTo = 'front', children, ...rest }: ViewportPortalProps = $props();
</script> </script>
<div use:portal={'viewport'} {...rest}> <div use:portal={`viewport-${moveTo}`} {...rest}>
{@render children?.()} {@render children?.()}
</div> </div>
@@ -2,5 +2,6 @@ import type { Snippet } from 'svelte';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
export type ViewportPortalProps = { export type ViewportPortalProps = {
moveTo: 'front' | 'back';
children?: Snippet; children?: Snippet;
} & HTMLAttributes<HTMLDivElement>; } & HTMLAttributes<HTMLDivElement>;
@@ -13,17 +13,19 @@
}: { store: SvelteFlowStore<NodeType, EdgeType> } & EdgeEvents<EdgeType> = $props(); }: { store: SvelteFlowStore<NodeType, EdgeType> } & EdgeEvents<EdgeType> = $props();
</script> </script>
<svg class="svelte-flow__marker"> <div class="svelte-flow__edges">
<MarkerDefinition /> <svg class="svelte-flow__marker">
</svg> <MarkerDefinition />
</svg>
{#each store.visible.edges.values() as edge (edge.id)} {#each store.visible.edges.values() as edge (edge.id)}
<EdgeWrapper <EdgeWrapper
bind:store bind:store
{edge} {edge}
{onedgeclick} {onedgeclick}
{onedgecontextmenu} {onedgecontextmenu}
{onedgepointerenter} {onedgepointerenter}
{onedgepointerleave} {onedgepointerleave}
/> />
{/each} {/each}
</div>
@@ -46,19 +46,21 @@
}); });
</script> </script>
{#each store.visible.nodes.values() as node (node.id)} <div class="svelte-flow__nodes">
<NodeWrapper {#each store.visible.nodes.values() as node (node.id)}
bind:store <NodeWrapper
{node} bind:store
{resizeObserver} {node}
{nodeClickDistance} {resizeObserver}
{onnodeclick} {nodeClickDistance}
{onnodepointerenter} {onnodeclick}
{onnodepointermove} {onnodepointerenter}
{onnodepointerleave} {onnodepointermove}
{onnodedrag} {onnodepointerleave}
{onnodedragstart} {onnodedrag}
{onnodedragstop} {onnodedragstart}
{onnodecontextmenu} {onnodedragstop}
/> {onnodecontextmenu}
{/each} />
{/each}
</div>
@@ -149,6 +149,7 @@
> >
<Pane bind:store {onpaneclick} {onpanecontextmenu} {panOnDrag} {selectionOnDrag}> <Pane bind:store {onpaneclick} {onpanecontextmenu} {panOnDrag} {selectionOnDrag}>
<ViewportComponent bind:store> <ViewportComponent bind:store>
<div class="svelte-flow__viewport-back svelte-flow__container"></div>
<EdgeRenderer <EdgeRenderer
bind:store bind:store
{onedgeclick} {onedgeclick}
@@ -156,6 +157,7 @@
{onedgepointerenter} {onedgepointerenter}
{onedgepointerleave} {onedgepointerleave}
/> />
<div class="svelte-flow__edge-labels svelte-flow__container"></div>
<ConnectionLine <ConnectionLine
bind:store bind:store
type={connectionLineType} type={connectionLineType}
@@ -183,6 +185,7 @@
{onnodedragstart} {onnodedragstart}
{onnodedragstop} {onnodedragstop}
/> />
<div class="svelte-flow__viewport-front svelte-flow__container"></div>
</ViewportComponent> </ViewportComponent>
<Selection <Selection
isVisible={!!(store.selectionRect && store.selectionRectMode === 'user')} 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) { 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>( function calculateChildXYZ<NodeType extends NodeBase>(