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';
|
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')}
|
||||||
|
|||||||
@@ -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>(
|
||||||
|
|||||||
Reference in New Issue
Block a user