From 2ca682c6f291d503bc5b3b0371ff551e0e9c5d94 Mon Sep 17 00:00:00 2001 From: peterkogo Date: Mon, 14 Apr 2025 18:59:31 +0200 Subject: [PATCH] export htmlattributes as props where possible --- .../routes/examples/edges/ButtonEdge.svelte | 74 ++++++++----------- .../examples/overview/CustomEdge.svelte | 22 +----- packages/svelte/package.json | 2 +- .../lib/components/EdgeLabel/EdgeLabel.svelte | 56 +++++++------- .../src/lib/components/EdgeLabel/index.ts | 1 + .../src/lib/components/EdgeLabel/types.ts | 12 +++ .../EdgeReconnectAnchor.svelte | 31 +++----- .../components/EdgeReconnectAnchor/index.ts | 1 + .../components/EdgeReconnectAnchor/types.ts | 13 ++++ .../src/lib/components/Handle/Handle.svelte | 9 ++- .../svelte/src/lib/components/Handle/index.ts | 1 + .../svelte/src/lib/components/Handle/types.ts | 10 +++ .../ViewportPortal/ViewportPortal.svelte | 7 +- .../lib/components/ViewportPortal/index.ts | 1 + .../lib/components/ViewportPortal/types.ts | 6 ++ .../src/lib/components/edges/BaseEdge.svelte | 5 +- .../svelte/src/lib/container/Pane/Pane.svelte | 12 +-- .../svelte/src/lib/container/Pane/index.ts | 1 + .../src/lib/container/Panel/Panel.svelte | 10 +-- .../svelte/src/lib/container/Panel/index.ts | 2 +- .../lib/container/Viewport/Viewport.svelte | 12 +-- .../svelte/src/lib/container/Zoom/Zoom.svelte | 13 +--- packages/svelte/src/lib/index.ts | 2 +- .../lib/plugins/Background/Background.svelte | 12 +-- .../src/lib/plugins/Controls/Controls.svelte | 4 +- .../svelte/src/lib/plugins/Controls/types.ts | 4 +- .../src/lib/plugins/Minimap/Minimap.svelte | 2 - .../plugins/NodeToolbar/NodeToolbar.svelte | 8 +- .../src/lib/plugins/NodeToolbar/types.ts | 3 +- packages/svelte/src/lib/types/edges.ts | 4 +- packages/svelte/src/lib/types/general.ts | 13 +--- packages/svelte/src/styles/base.css | 12 +++ packages/svelte/src/styles/style.css | 5 +- 33 files changed, 173 insertions(+), 197 deletions(-) create mode 100644 packages/svelte/src/lib/components/EdgeLabel/types.ts create mode 100644 packages/svelte/src/lib/components/EdgeReconnectAnchor/types.ts create mode 100644 packages/svelte/src/lib/components/Handle/types.ts create mode 100644 packages/svelte/src/lib/components/ViewportPortal/types.ts diff --git a/examples/svelte/src/routes/examples/edges/ButtonEdge.svelte b/examples/svelte/src/routes/examples/edges/ButtonEdge.svelte index e02f25a4..0c858af7 100644 --- a/examples/svelte/src/routes/examples/edges/ButtonEdge.svelte +++ b/examples/svelte/src/routes/examples/edges/ButtonEdge.svelte @@ -3,10 +3,10 @@ getBezierPath, BaseEdge, type EdgeProps, - EdgeLabelRenderer, useSvelteFlow, MarkerType, - EdgeReconnectAnchor + EdgeReconnectAnchor, + EdgeLabel } from '@xyflow/svelte'; let { @@ -39,39 +39,34 @@ {#if !reconnecting} - -
+ -
-
+ × + + {/if} {#if selected} @@ -80,14 +75,6 @@ {/if} diff --git a/packages/svelte/src/lib/components/EdgeLabel/index.ts b/packages/svelte/src/lib/components/EdgeLabel/index.ts index 2e0a457c..bd3bb47f 100644 --- a/packages/svelte/src/lib/components/EdgeLabel/index.ts +++ b/packages/svelte/src/lib/components/EdgeLabel/index.ts @@ -1 +1,2 @@ export { default as EdgeLabel } from './EdgeLabel.svelte'; +export * from './types'; diff --git a/packages/svelte/src/lib/components/EdgeLabel/types.ts b/packages/svelte/src/lib/components/EdgeLabel/types.ts new file mode 100644 index 00000000..a7473d9a --- /dev/null +++ b/packages/svelte/src/lib/components/EdgeLabel/types.ts @@ -0,0 +1,12 @@ +import type { Snippet } from 'svelte'; +import type { ClassValue, HTMLAttributes } from 'svelte/elements'; + +export type EdgeLabelProps = { + x?: number; + y?: number; + selectEdgeOnClick?: boolean; + transparent?: boolean; + style?: string; + class?: ClassValue; + children?: Snippet; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/components/EdgeReconnectAnchor/EdgeReconnectAnchor.svelte b/packages/svelte/src/lib/components/EdgeReconnectAnchor/EdgeReconnectAnchor.svelte index 7ea58db5..7fc410d6 100644 --- a/packages/svelte/src/lib/components/EdgeReconnectAnchor/EdgeReconnectAnchor.svelte +++ b/packages/svelte/src/lib/components/EdgeReconnectAnchor/EdgeReconnectAnchor.svelte @@ -4,7 +4,8 @@ import { XYHandle, type HandleType, type XYPosition } from '@xyflow/system'; import { getContext, type Snippet } from 'svelte'; import type { ClassValue } from 'svelte/elements'; - import { portal } from '$lib/actions/portal'; + import EdgeLabel from '../EdgeLabel/EdgeLabel.svelte'; + import type { EdgeReconnectAnchorProps } from './types'; let { type, @@ -13,16 +14,9 @@ class: className, size = 25, style, - children - }: { - type: HandleType; - reconnecting?: boolean; - style?: string; - class?: ClassValue; - position?: XYPosition; - size?: number; - children?: Snippet; - } = $props(); + children, + ...rest + }: EdgeReconnectAnchorProps = $props(); const store = useStore(); @@ -110,17 +104,16 @@ }; -
{#if !reconnecting && children} {@render children()} {/if} -
+ diff --git a/packages/svelte/src/lib/components/EdgeReconnectAnchor/index.ts b/packages/svelte/src/lib/components/EdgeReconnectAnchor/index.ts index ca115963..5c3ad2c7 100644 --- a/packages/svelte/src/lib/components/EdgeReconnectAnchor/index.ts +++ b/packages/svelte/src/lib/components/EdgeReconnectAnchor/index.ts @@ -1 +1,2 @@ export { default as EdgeReconnectAnchor } from './EdgeReconnectAnchor.svelte'; +export * from './types'; diff --git a/packages/svelte/src/lib/components/EdgeReconnectAnchor/types.ts b/packages/svelte/src/lib/components/EdgeReconnectAnchor/types.ts new file mode 100644 index 00000000..74ed6d6d --- /dev/null +++ b/packages/svelte/src/lib/components/EdgeReconnectAnchor/types.ts @@ -0,0 +1,13 @@ +import type { HandleType, XYPosition } from '@xyflow/system'; +import type { Snippet } from 'svelte'; +import type { ClassValue, HTMLAttributes } from 'svelte/elements'; + +export type EdgeReconnectAnchorProps = { + type: HandleType; + reconnecting?: boolean; + style?: string; + class?: ClassValue; + position?: XYPosition; + size?: number; + children?: Snippet; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/components/Handle/Handle.svelte b/packages/svelte/src/lib/components/Handle/Handle.svelte index be39857c..5c4a4cd4 100644 --- a/packages/svelte/src/lib/components/Handle/Handle.svelte +++ b/packages/svelte/src/lib/components/Handle/Handle.svelte @@ -4,19 +4,20 @@ Position, XYHandle, isMouseEvent, - type HandleConnection, areConnectionMapsEqual, handleConnectionChange, ConnectionMode, getHostForElement, + type HandleConnection, type Optional, type ConnectionState, type Connection } from '@xyflow/system'; import { useStore } from '$lib/store'; - import type { HandleProps } from '$lib/types'; + import type { ConnectableContext } from '../NodeWrapper/types'; + import type { HandleProps } from './types'; let { id: handleId = null, @@ -30,7 +31,8 @@ isValidConnection, onconnect, ondisconnect, - children + children, + ...rest }: HandleProps = $props(); const nodeId = getContext('svelteflow__node_id'); @@ -226,6 +228,7 @@ The Handle component is the part of a node that can be used to connect nodes. {style} role="button" tabindex="-1" + {...rest} > {@render children?.()} diff --git a/packages/svelte/src/lib/components/Handle/index.ts b/packages/svelte/src/lib/components/Handle/index.ts index 162ffba0..76ec4741 100644 --- a/packages/svelte/src/lib/components/Handle/index.ts +++ b/packages/svelte/src/lib/components/Handle/index.ts @@ -1 +1,2 @@ export { default as Handle } from './Handle.svelte'; +export * from './types'; diff --git a/packages/svelte/src/lib/components/Handle/types.ts b/packages/svelte/src/lib/components/Handle/types.ts new file mode 100644 index 00000000..ac85ec1f --- /dev/null +++ b/packages/svelte/src/lib/components/Handle/types.ts @@ -0,0 +1,10 @@ +import type { Connection, HandleProps as HandlePropsSystem } from '@xyflow/system'; +import type { Snippet } from 'svelte'; +import type { ClassValue, HTMLAttributes } from 'svelte/elements'; + +export type HandleProps = HandlePropsSystem & { + class?: ClassValue; + onconnect?: (connections: Connection[]) => void; + ondisconnect?: (connections: Connection[]) => void; + children?: Snippet; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/components/ViewportPortal/ViewportPortal.svelte b/packages/svelte/src/lib/components/ViewportPortal/ViewportPortal.svelte index e86cb51c..45adcffd 100644 --- a/packages/svelte/src/lib/components/ViewportPortal/ViewportPortal.svelte +++ b/packages/svelte/src/lib/components/ViewportPortal/ViewportPortal.svelte @@ -1,11 +1,10 @@ -
+
{@render children?.()}
diff --git a/packages/svelte/src/lib/components/ViewportPortal/index.ts b/packages/svelte/src/lib/components/ViewportPortal/index.ts index 12da71c8..ccc3ba6f 100644 --- a/packages/svelte/src/lib/components/ViewportPortal/index.ts +++ b/packages/svelte/src/lib/components/ViewportPortal/index.ts @@ -1 +1,2 @@ export { default as ViewportPortal } from './ViewportPortal.svelte'; +export * from './types'; diff --git a/packages/svelte/src/lib/components/ViewportPortal/types.ts b/packages/svelte/src/lib/components/ViewportPortal/types.ts new file mode 100644 index 00000000..14b3e817 --- /dev/null +++ b/packages/svelte/src/lib/components/ViewportPortal/types.ts @@ -0,0 +1,6 @@ +import type { Snippet } from 'svelte'; +import type { HTMLAttributes } from 'svelte/elements'; + +export type ViewportPortalProps = { + children?: Snippet; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/components/edges/BaseEdge.svelte b/packages/svelte/src/lib/components/edges/BaseEdge.svelte index 3e17e7cb..3c843925 100644 --- a/packages/svelte/src/lib/components/edges/BaseEdge.svelte +++ b/packages/svelte/src/lib/components/edges/BaseEdge.svelte @@ -1,5 +1,4 @@ + {label} {/if} diff --git a/packages/svelte/src/lib/container/Pane/Pane.svelte b/packages/svelte/src/lib/container/Pane/Pane.svelte index 51d85e8c..d7a6fa14 100644 --- a/packages/svelte/src/lib/container/Pane/Pane.svelte +++ b/packages/svelte/src/lib/container/Pane/Pane.svelte @@ -218,7 +218,7 @@
{@render children()}
- - diff --git a/packages/svelte/src/lib/container/Pane/index.ts b/packages/svelte/src/lib/container/Pane/index.ts index 2161528c..ddbb36e5 100644 --- a/packages/svelte/src/lib/container/Pane/index.ts +++ b/packages/svelte/src/lib/container/Pane/index.ts @@ -1 +1,2 @@ export { default as Pane } from './Pane.svelte'; +export * from './types'; diff --git a/packages/svelte/src/lib/container/Panel/Panel.svelte b/packages/svelte/src/lib/container/Panel/Panel.svelte index bbdc4b9b..81a3796d 100644 --- a/packages/svelte/src/lib/container/Panel/Panel.svelte +++ b/packages/svelte/src/lib/container/Panel/Panel.svelte @@ -2,13 +2,7 @@ import type { PanelProps } from './types'; import { useStore } from '$lib/store'; - let { - position = 'top-right', - style, - class: className, - children, - ...restProps - }: PanelProps = $props(); + let { position = 'top-right', style, class: className, children, ...rest }: PanelProps = $props(); const store = useStore(); @@ -19,7 +13,7 @@ class={['svelte-flow__panel', className, ...positionClasses]} {style} style:pointer-events={store.selectionRectMode ? 'none' : ''} - {...restProps} + {...rest} > {@render children?.()}
diff --git a/packages/svelte/src/lib/container/Panel/index.ts b/packages/svelte/src/lib/container/Panel/index.ts index aa07206d..bc926449 100644 --- a/packages/svelte/src/lib/container/Panel/index.ts +++ b/packages/svelte/src/lib/container/Panel/index.ts @@ -1,2 +1,2 @@ export { default as Panel } from './Panel.svelte'; -export type { PanelProps } from './types'; +export * from './types'; diff --git a/packages/svelte/src/lib/container/Viewport/Viewport.svelte b/packages/svelte/src/lib/container/Viewport/Viewport.svelte index d04e84eb..e9570f7f 100644 --- a/packages/svelte/src/lib/container/Viewport/Viewport.svelte +++ b/packages/svelte/src/lib/container/Viewport/Viewport.svelte @@ -6,19 +6,9 @@
{@render children()}
- - diff --git a/packages/svelte/src/lib/container/Zoom/Zoom.svelte b/packages/svelte/src/lib/container/Zoom/Zoom.svelte index 37014040..23619cf6 100644 --- a/packages/svelte/src/lib/container/Zoom/Zoom.svelte +++ b/packages/svelte/src/lib/container/Zoom/Zoom.svelte @@ -37,7 +37,7 @@
{@render children()}
- - diff --git a/packages/svelte/src/lib/index.ts b/packages/svelte/src/lib/index.ts index a2683fee..7462661f 100644 --- a/packages/svelte/src/lib/index.ts +++ b/packages/svelte/src/lib/index.ts @@ -55,7 +55,7 @@ export type { EdgeTypes, DefaultEdgeOptions } from '$lib/types/edges'; -export type { HandleProps, FitViewOptions, OnBeforeDelete } from '$lib/types/general'; +export type { FitViewOptions, OnBeforeDelete } from '$lib/types/general'; export type { Node, NodeTypes, BuiltInNode, NodeProps, InternalNode } from '$lib/types/nodes'; export type { SvelteFlowStore } from '$lib/store/types'; export * from '$lib/types/events'; diff --git a/packages/svelte/src/lib/plugins/Background/Background.svelte b/packages/svelte/src/lib/plugins/Background/Background.svelte index e24fa669..9d6aa38a 100644 --- a/packages/svelte/src/lib/plugins/Background/Background.svelte +++ b/packages/svelte/src/lib/plugins/Background/Background.svelte @@ -47,7 +47,7 @@ - - diff --git a/packages/svelte/src/lib/plugins/Controls/Controls.svelte b/packages/svelte/src/lib/plugins/Controls/Controls.svelte index bd332c63..035fc93c 100644 --- a/packages/svelte/src/lib/plugins/Controls/Controls.svelte +++ b/packages/svelte/src/lib/plugins/Controls/Controls.svelte @@ -27,7 +27,8 @@ fitViewOptions, children, before, - after + after, + ...rest }: ControlsProps = $props(); const store = useStore(); @@ -74,6 +75,7 @@ data-testid="svelte-flow__controls" aria-label={ariaLabel ?? 'Svelte Flow controls'} {style} + {...rest} > {#if before} {@render before()} diff --git a/packages/svelte/src/lib/plugins/Controls/types.ts b/packages/svelte/src/lib/plugins/Controls/types.ts index 2ee4b055..7b011a22 100644 --- a/packages/svelte/src/lib/plugins/Controls/types.ts +++ b/packages/svelte/src/lib/plugins/Controls/types.ts @@ -1,5 +1,5 @@ import type { Snippet } from 'svelte'; -import type { ClassValue, HTMLButtonAttributes } from 'svelte/elements'; +import type { ClassValue, HTMLAttributes, HTMLButtonAttributes } from 'svelte/elements'; import type { PanelPosition } from '@xyflow/system'; import type { FitViewOptions } from '$lib/types'; @@ -29,7 +29,7 @@ export type ControlsProps = { before?: Snippet; after?: Snippet; fitViewOptions?: FitViewOptions; -}; +} & HTMLAttributes; export type ControlButtonProps = HTMLButtonAttributes & { class?: ClassValue; diff --git a/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte b/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte index 7aac953c..37283e55 100644 --- a/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte +++ b/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte @@ -43,8 +43,6 @@ let store = useStore(); - // let nodes = $derived(store.nodes); - const nodeColorFunc = nodeColor === undefined ? undefined : getAttrFunction(nodeColor); const nodeStrokeColorFunc = getAttrFunction(nodeStrokeColor); const nodeClassFunc = getAttrFunction(nodeClass); diff --git a/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte b/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte index 64acaeab..65a5c2d3 100644 --- a/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte +++ b/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte @@ -15,7 +15,8 @@ align = 'center', offset = 10, isVisible, - children + children, + ...rest }: NodeToolbarProps = $props(); const store = useStore(); @@ -66,12 +67,13 @@ {#if store.domNode && isActive && toolbarNodes}
`${acc}${node.id} `, '').trim()} - class="svelte-flow__node-toolbar" use:portal={'root'} + class="svelte-flow__node-toolbar" + data-id={toolbarNodes.reduce((acc, node) => `${acc}${node.id} `, '').trim()} style:position="absolute" style:transform style:z-index={zIndex} + {...rest} > {@render children?.()}
diff --git a/packages/svelte/src/lib/plugins/NodeToolbar/types.ts b/packages/svelte/src/lib/plugins/NodeToolbar/types.ts index 0f192d4b..704a0d83 100644 --- a/packages/svelte/src/lib/plugins/NodeToolbar/types.ts +++ b/packages/svelte/src/lib/plugins/NodeToolbar/types.ts @@ -1,5 +1,6 @@ import type { Position, Align } from '@xyflow/system'; import type { Snippet } from 'svelte'; +import type { HTMLAttributes } from 'svelte/elements'; export type NodeToolbarProps = { /** The id of the node, or array of ids the toolbar should be displayed at */ @@ -18,4 +19,4 @@ export type NodeToolbarProps = { /** If true, node toolbar is visible even if node is not selected */ isVisible?: boolean; children?: Snippet; -}; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/types/edges.ts b/packages/svelte/src/lib/types/edges.ts index 4994c948..941a16e1 100644 --- a/packages/svelte/src/lib/types/edges.ts +++ b/packages/svelte/src/lib/types/edges.ts @@ -9,7 +9,7 @@ import type { } from '@xyflow/system'; import type { Node } from '$lib/types'; -import type { ClassValue } from 'svelte/elements'; +import type { ClassValue, HTMLAttributes } from 'svelte/elements'; /** * An `Edge` is the complete description with everything Svelte Flow needs to know in order to @@ -46,7 +46,7 @@ export type BaseEdgeProps = Pick< */ markerEnd?: string; class?: ClassValue; -}; +} & HTMLAttributes; type SmoothStepEdge = Record> = Edge< EdgeData, diff --git a/packages/svelte/src/lib/types/general.ts b/packages/svelte/src/lib/types/general.ts index 9d1141fa..27129228 100644 --- a/packages/svelte/src/lib/types/general.ts +++ b/packages/svelte/src/lib/types/general.ts @@ -1,13 +1,10 @@ -import type { Snippet } from 'svelte'; -import type { ClassValue } from 'svelte/elements'; import type { ShortcutModifierDefinition } from '@svelte-put/shortcut'; import type { FitViewOptionsBase, XYPosition, Handle, Connection, - OnBeforeDeleteBase, - HandleProps as HandlePropsSystem + OnBeforeDeleteBase } from '@xyflow/system'; import type { Node } from './nodes'; @@ -24,14 +21,6 @@ export type ConnectionData = { connectionStatus: string | null; }; -export type HandleProps = HandlePropsSystem & { - class?: ClassValue; - style?: string; - onconnect?: (connections: Connection[]) => void; - ondisconnect?: (connections: Connection[]) => void; - children?: Snippet; -}; - export type FitViewOptions = FitViewOptionsBase; export type OnDelete = (params: { nodes: Node[]; edges: Edge[] }) => void; diff --git a/packages/svelte/src/styles/base.css b/packages/svelte/src/styles/base.css index a0cf3040..9886d598 100644 --- a/packages/svelte/src/styles/base.css +++ b/packages/svelte/src/styles/base.css @@ -7,3 +7,15 @@ text-align: center; position: absolute; } + +.svelte-flow__nodes { + z-index: 0; +} + +.svelte-flow__edgelabel-renderer { + z-index: 0; +} + +.svelte-flow__zoom { + z-index: 4; +} diff --git a/packages/svelte/src/styles/style.css b/packages/svelte/src/styles/style.css index 981bc92e..9dd0a652 100644 --- a/packages/svelte/src/styles/style.css +++ b/packages/svelte/src/styles/style.css @@ -8,7 +8,6 @@ position: absolute; padding: 2px; font-size: 10px; - cursor: pointer; color: var(--xy-edge-label-color, var(--xy-edge-label-color-default)); background: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default)); } @@ -20,3 +19,7 @@ .svelte-flow__edgelabel-renderer { z-index: 0; } + +.svelte-flow__zoom { + z-index: 4; +}