introduce divs for nodes, edges, edge labels and viewport front & back to simplify z-index ordering
This commit is contained in:
@@ -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')}
|
||||
|
||||
@@ -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>(
|
||||
|
||||
Reference in New Issue
Block a user