diff --git a/packages/svelte/src/lib/components/Attribution/Attribution.svelte b/packages/svelte/src/lib/components/Attribution/Attribution.svelte index bb7041d7..3f83683f 100644 --- a/packages/svelte/src/lib/components/Attribution/Attribution.svelte +++ b/packages/svelte/src/lib/components/Attribution/Attribution.svelte @@ -2,13 +2,10 @@ import { Panel } from '$lib/container/Panel'; import type { AttributionProps } from './types'; - type $$Props = AttributionProps; - - export let proOptions: $$Props['proOptions'] = undefined; - export let position: $$Props['position'] = 'bottom-right'; + let { proOptions, position = 'bottom-right' }: AttributionProps = $props(); -{#if !proOptions?.hideAttribution} +{#if proOptions?.hideAttribution} -{#if interactionWidthValue} +{#if interactionWidth > 0} diff --git a/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte b/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte index 71e3f2c9..9a487427 100644 --- a/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte +++ b/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte @@ -1,7 +1,6 @@ {#if $connection.inProgress} - - - {#if !isCustomComponent} + {#if connectionLine} + {@render connectionLine()} + {:else} {/if} diff --git a/packages/svelte/src/lib/components/EdgeLabel/EdgeLabel.svelte b/packages/svelte/src/lib/components/EdgeLabel/EdgeLabel.svelte index 9ab028c0..4c0be0c0 100644 --- a/packages/svelte/src/lib/components/EdgeLabel/EdgeLabel.svelte +++ b/packages/svelte/src/lib/components/EdgeLabel/EdgeLabel.svelte @@ -1,13 +1,20 @@
- + {@render children?.()}
diff --git a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte index 02401f61..fd4090fb 100644 --- a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte +++ b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte @@ -40,6 +40,8 @@ export let ariaLabel: $$Props['ariaLabel'] = undefined; export let interactionWidth: $$Props['interactionWidth'] = undefined; + // TODO SVELTE5 + // @ todo: support edge updates let className: string = ''; export { className as class }; diff --git a/packages/svelte/src/lib/components/Handle/Handle.svelte b/packages/svelte/src/lib/components/Handle/Handle.svelte index 45f70fb2..cb9b5c7d 100644 --- a/packages/svelte/src/lib/components/Handle/Handle.svelte +++ b/packages/svelte/src/lib/components/Handle/Handle.svelte @@ -1,4 +1,5 @@ - import { createEventDispatcher } from 'svelte'; import { getInternalNodesBounds, isNumeric, type Rect } from '@xyflow/system'; import { useStore } from '$lib/store'; import { Selection } from '$lib/components/Selection'; import drag from '$lib/actions/drag'; - import type { Node, NodeEventMap } from '$lib/types'; + + import type { NodeSelectionProps } from './types'; + + let { + onnodedrag, + onnodedragstart, + onnodedragstop, + onselectionclick, + onselectioncontextmenu + }: NodeSelectionProps = $props(); const store = useStore(); const { selectionRectMode, nodes, nodeLookup } = store; - const dispatch = createEventDispatcher< - NodeEventMap & { - selectioncontextmenu: { nodes: Node[]; event: MouseEvent | TouchEvent }; - selectionclick: { nodes: Node[]; event: MouseEvent | TouchEvent }; + let bounds: Rect | null = $derived.by(() => { + if ($selectionRectMode === 'nodes') { + $nodes; + return getInternalNodesBounds($nodeLookup, { filter: (node) => !!node.selected }); } - >(); + return null; + }); - let bounds: Rect | null = null; - - $: if ($selectionRectMode === 'nodes') { - bounds = getInternalNodesBounds($nodeLookup, { filter: (node) => !!node.selected }); - $nodes; + function oncontextmenu(event: MouseEvent | TouchEvent) { + const selectedNodes = $nodes.filter((n) => n.selected); + onselectioncontextmenu?.({ nodes: selectedNodes, event }); } - function onContextMenu(event: MouseEvent | TouchEvent) { + function onclick(event: MouseEvent | TouchEvent) { const selectedNodes = $nodes.filter((n) => n.selected); - dispatch('selectioncontextmenu', { nodes: selectedNodes, event }); - } - - function onClick(event: MouseEvent | TouchEvent) { - const selectedNodes = $nodes.filter((n) => n.selected); - dispatch('selectionclick', { nodes: selectedNodes, event }); + onselectionclick?.({ nodes: selectedNodes, event }); } @@ -43,20 +45,20 @@ disabled: false, store, onDrag: (event, _, __, nodes) => { - dispatch('nodedrag', { event, targetNode: null, nodes }); + onnodedrag?.({ event, targetNode: null, nodes }); }, onDragStart: (event, _, __, nodes) => { - dispatch('nodedragstart', { event, targetNode: null, nodes }); + onnodedragstart?.({ event, targetNode: null, nodes }); }, onDragStop: (event, _, __, nodes) => { - dispatch('nodedragstop', { event, targetNode: null, nodes }); + onnodedragstop?.({ event, targetNode: null, nodes }); } }} - on:contextmenu={onContextMenu} - on:click={onClick} + {oncontextmenu} + {onclick} role="button" tabindex="-1" - on:keyup={() => {}} + onkeyup={() => {}} > diff --git a/packages/svelte/src/lib/components/NodeSelection/types.ts b/packages/svelte/src/lib/components/NodeSelection/types.ts new file mode 100644 index 00000000..12419d6f --- /dev/null +++ b/packages/svelte/src/lib/components/NodeSelection/types.ts @@ -0,0 +1,4 @@ +import type { NodeEvents, NodeSelectionEvents } from '$lib/types'; + +export type NodeSelectionProps = NodeSelectionEvents & + Pick; diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte index dc571ec2..7d559f3e 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte +++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte @@ -1,7 +1,5 @@ - - - - + + {#if !hidden}
{ - dispatchNodeEvent('nodedrag', { event, targetNode, nodes }); + onnodedrag?.({ event, targetNode, nodes }); }, onDragStart: (event, _, targetNode, nodes) => { - dispatchNodeEvent('nodedragstart', { event, targetNode, nodes }); + onnodedragstart?.({ event, targetNode, nodes }); }, onDragStop: (event, _, targetNode, nodes) => { - dispatchNodeEvent('nodedragstop', { event, targetNode, nodes }); + onnodedragstop?.({ event, targetNode, nodes }); }, store }} bind:this={nodeRef} data-id={id} - class={cc(['svelte-flow__node', `svelte-flow__node-${nodeType}`, className])} + class={cc(['svelte-flow__node', `svelte-flow__node-${type}`, className])} class:dragging class:selected class:draggable @@ -184,14 +195,13 @@ style:transform="translate({positionX}px, {positionY}px)" style:visibility={initialized ? 'visible' : 'hidden'} style="{style ?? ''};{inlineStyleDimensions.width}{inlineStyleDimensions.height}" - on:click={onSelectNodeHandler} - on:mouseenter={(event) => dispatchNodeEvent('nodemouseenter', { node, event })} - on:mouseleave={(event) => dispatchNodeEvent('nodemouseleave', { node, event })} - on:mousemove={(event) => dispatchNodeEvent('nodemousemove', { node, event })} - on:contextmenu={(event) => dispatchNodeEvent('nodecontextmenu', { node, event })} + onclick={onSelectNodeHandler} + onmouseenter={onnodemouseenter ? (event) => onnodemouseenter({ node, event }) : undefined} + onmouseleave={onnodemouseleave ? (event) => onnodemouseleave({ node, event }) : undefined} + onmousemove={onnodemousemove ? (event) => onnodemousemove({ node, event }) : undefined} + oncontextmenu={onnodecontextmenu ? (event) => onnodecontextmenu({ node, event }) : undefined} > - - export let x: number | null = 0; - export let y: number | null = 0; - export let width: number | string | null = 0; - export let height: number | string | null = 0; - export let isVisible: boolean = true; + let { + x = 0, + y = 0, + width = 0, + height = 0, + isVisible = true + }: { + x?: number | null; + y?: number | null; + width?: number | string | null; + height?: number | string | null; + isVisible?: boolean; + } = $props(); {#if isVisible} @@ -12,7 +20,7 @@ style:width={typeof width === 'string' ? width : `${width}px`} style:height={typeof height === 'string' ? height : `${height}px`} style:transform={`translate(${x}px, ${y}px)`} - /> + >
{/if}