diff --git a/examples/svelte/src/routes/examples/+page.svelte b/examples/svelte/src/routes/examples/+page.svelte
new file mode 100644
index 00000000..45db2228
--- /dev/null
+++ b/examples/svelte/src/routes/examples/+page.svelte
@@ -0,0 +1 @@
+
this redirects to /overview
diff --git a/examples/svelte/src/routes/add-node-on-drop/+page.svelte b/examples/svelte/src/routes/examples/add-node-on-drop/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/add-node-on-drop/+page.svelte
rename to examples/svelte/src/routes/examples/add-node-on-drop/+page.svelte
diff --git a/examples/svelte/src/routes/add-node-on-drop/Flow.svelte b/examples/svelte/src/routes/examples/add-node-on-drop/Flow.svelte
similarity index 100%
rename from examples/svelte/src/routes/add-node-on-drop/Flow.svelte
rename to examples/svelte/src/routes/examples/add-node-on-drop/Flow.svelte
diff --git a/examples/svelte/src/routes/custom-connection-line/+page.svelte b/examples/svelte/src/routes/examples/custom-connection-line/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/custom-connection-line/+page.svelte
rename to examples/svelte/src/routes/examples/custom-connection-line/+page.svelte
diff --git a/examples/svelte/src/routes/custom-connection-line/ConnectionLine.svelte b/examples/svelte/src/routes/examples/custom-connection-line/ConnectionLine.svelte
similarity index 100%
rename from examples/svelte/src/routes/custom-connection-line/ConnectionLine.svelte
rename to examples/svelte/src/routes/examples/custom-connection-line/ConnectionLine.svelte
diff --git a/examples/svelte/src/routes/custom-connection-line/CustomNode.svelte b/examples/svelte/src/routes/examples/custom-connection-line/CustomNode.svelte
similarity index 100%
rename from examples/svelte/src/routes/custom-connection-line/CustomNode.svelte
rename to examples/svelte/src/routes/examples/custom-connection-line/CustomNode.svelte
diff --git a/examples/svelte/src/routes/customnode/+page.svelte b/examples/svelte/src/routes/examples/customnode/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/customnode/+page.svelte
rename to examples/svelte/src/routes/examples/customnode/+page.svelte
diff --git a/examples/svelte/src/routes/customnode/CustomNode.svelte b/examples/svelte/src/routes/examples/customnode/CustomNode.svelte
similarity index 100%
rename from examples/svelte/src/routes/customnode/CustomNode.svelte
rename to examples/svelte/src/routes/examples/customnode/CustomNode.svelte
diff --git a/examples/svelte/src/routes/dagre/+page.svelte b/examples/svelte/src/routes/examples/dagre/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/dagre/+page.svelte
rename to examples/svelte/src/routes/examples/dagre/+page.svelte
diff --git a/examples/svelte/src/routes/dagre/nodes-and-edges.ts b/examples/svelte/src/routes/examples/dagre/nodes-and-edges.ts
similarity index 100%
rename from examples/svelte/src/routes/dagre/nodes-and-edges.ts
rename to examples/svelte/src/routes/examples/dagre/nodes-and-edges.ts
diff --git a/examples/svelte/src/routes/drag-n-drop/+page.svelte b/examples/svelte/src/routes/examples/drag-n-drop/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/drag-n-drop/+page.svelte
rename to examples/svelte/src/routes/examples/drag-n-drop/+page.svelte
diff --git a/examples/svelte/src/routes/drag-n-drop/Flow.svelte b/examples/svelte/src/routes/examples/drag-n-drop/Flow.svelte
similarity index 100%
rename from examples/svelte/src/routes/drag-n-drop/Flow.svelte
rename to examples/svelte/src/routes/examples/drag-n-drop/Flow.svelte
diff --git a/examples/svelte/src/routes/drag-n-drop/Sidebar.svelte b/examples/svelte/src/routes/examples/drag-n-drop/Sidebar.svelte
similarity index 100%
rename from examples/svelte/src/routes/drag-n-drop/Sidebar.svelte
rename to examples/svelte/src/routes/examples/drag-n-drop/Sidebar.svelte
diff --git a/examples/svelte/src/routes/edges/+page.svelte b/examples/svelte/src/routes/examples/edges/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/edges/+page.svelte
rename to examples/svelte/src/routes/examples/edges/+page.svelte
diff --git a/examples/svelte/src/routes/figma/+page.svelte b/examples/svelte/src/routes/examples/figma/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/figma/+page.svelte
rename to examples/svelte/src/routes/examples/figma/+page.svelte
diff --git a/examples/svelte/src/routes/interaction/+page.svelte b/examples/svelte/src/routes/examples/interaction/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/interaction/+page.svelte
rename to examples/svelte/src/routes/examples/interaction/+page.svelte
diff --git a/examples/svelte/src/routes/intersections/+page.svelte b/examples/svelte/src/routes/examples/intersections/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/intersections/+page.svelte
rename to examples/svelte/src/routes/examples/intersections/+page.svelte
diff --git a/examples/svelte/src/routes/intersections/+server.ts b/examples/svelte/src/routes/examples/intersections/+server.ts
similarity index 100%
rename from examples/svelte/src/routes/intersections/+server.ts
rename to examples/svelte/src/routes/examples/intersections/+server.ts
diff --git a/examples/svelte/src/routes/intersections/Flow.svelte b/examples/svelte/src/routes/examples/intersections/Flow.svelte
similarity index 100%
rename from examples/svelte/src/routes/intersections/Flow.svelte
rename to examples/svelte/src/routes/examples/intersections/Flow.svelte
diff --git a/examples/svelte/src/routes/intersections/nodes-and-edges.ts b/examples/svelte/src/routes/examples/intersections/nodes-and-edges.ts
similarity index 100%
rename from examples/svelte/src/routes/intersections/nodes-and-edges.ts
rename to examples/svelte/src/routes/examples/intersections/nodes-and-edges.ts
diff --git a/examples/svelte/src/routes/overview/+page.svelte b/examples/svelte/src/routes/examples/overview/+page.svelte
similarity index 93%
rename from examples/svelte/src/routes/overview/+page.svelte
rename to examples/svelte/src/routes/examples/overview/+page.svelte
index 32bef5d0..dddbf398 100644
--- a/examples/svelte/src/routes/overview/+page.svelte
+++ b/examples/svelte/src/routes/examples/overview/+page.svelte
@@ -83,6 +83,12 @@
type: 'custom',
data: { label: 'Custom Node' },
position: { x: 150, y: 300 }
+ },
+ {
+ id: 'hideunhide',
+ data: { label: 'HIDE ME' },
+ position: { x: 300, y: 75 },
+ hidden: true
}
]);
@@ -179,6 +185,13 @@
+
diff --git a/examples/svelte/src/routes/overview/CustomEdge.svelte b/examples/svelte/src/routes/examples/overview/CustomEdge.svelte
similarity index 100%
rename from examples/svelte/src/routes/overview/CustomEdge.svelte
rename to examples/svelte/src/routes/examples/overview/CustomEdge.svelte
diff --git a/examples/svelte/src/routes/overview/CustomNode.svelte b/examples/svelte/src/routes/examples/overview/CustomNode.svelte
similarity index 100%
rename from examples/svelte/src/routes/overview/CustomNode.svelte
rename to examples/svelte/src/routes/examples/overview/CustomNode.svelte
diff --git a/examples/svelte/src/routes/overview/CustomNodeDragHandle.svelte b/examples/svelte/src/routes/examples/overview/CustomNodeDragHandle.svelte
similarity index 100%
rename from examples/svelte/src/routes/overview/CustomNodeDragHandle.svelte
rename to examples/svelte/src/routes/examples/overview/CustomNodeDragHandle.svelte
diff --git a/examples/svelte/src/routes/stress/+page.svelte b/examples/svelte/src/routes/examples/stress/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/stress/+page.svelte
rename to examples/svelte/src/routes/examples/stress/+page.svelte
diff --git a/examples/svelte/src/routes/subflows/+page.svelte b/examples/svelte/src/routes/examples/subflows/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/subflows/+page.svelte
rename to examples/svelte/src/routes/examples/subflows/+page.svelte
diff --git a/examples/svelte/src/routes/subflows/DebugNode.svelte b/examples/svelte/src/routes/examples/subflows/DebugNode.svelte
similarity index 100%
rename from examples/svelte/src/routes/subflows/DebugNode.svelte
rename to examples/svelte/src/routes/examples/subflows/DebugNode.svelte
diff --git a/examples/svelte/src/routes/two-way-viewport/+page.svelte b/examples/svelte/src/routes/examples/two-way-viewport/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/two-way-viewport/+page.svelte
rename to examples/svelte/src/routes/examples/two-way-viewport/+page.svelte
diff --git a/examples/svelte/src/routes/two-way-viewport/Flow.svelte b/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte
similarity index 100%
rename from examples/svelte/src/routes/two-way-viewport/Flow.svelte
rename to examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte
diff --git a/examples/svelte/src/routes/usesvelteflow/+page.svelte b/examples/svelte/src/routes/examples/usesvelteflow/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/usesvelteflow/+page.svelte
rename to examples/svelte/src/routes/examples/usesvelteflow/+page.svelte
diff --git a/examples/svelte/src/routes/usesvelteflow/Flow.svelte b/examples/svelte/src/routes/examples/usesvelteflow/Flow.svelte
similarity index 100%
rename from examples/svelte/src/routes/usesvelteflow/Flow.svelte
rename to examples/svelte/src/routes/examples/usesvelteflow/Flow.svelte
diff --git a/examples/svelte/src/routes/usesvelteflow/Sidebar.svelte b/examples/svelte/src/routes/examples/usesvelteflow/Sidebar.svelte
similarity index 100%
rename from examples/svelte/src/routes/usesvelteflow/Sidebar.svelte
rename to examples/svelte/src/routes/examples/usesvelteflow/Sidebar.svelte
diff --git a/examples/svelte/src/routes/useupdatenodeinternals/+page.svelte b/examples/svelte/src/routes/examples/useupdatenodeinternals/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/useupdatenodeinternals/+page.svelte
rename to examples/svelte/src/routes/examples/useupdatenodeinternals/+page.svelte
diff --git a/examples/svelte/src/routes/useupdatenodeinternals/CustomNode.svelte b/examples/svelte/src/routes/examples/useupdatenodeinternals/CustomNode.svelte
similarity index 100%
rename from examples/svelte/src/routes/useupdatenodeinternals/CustomNode.svelte
rename to examples/svelte/src/routes/examples/useupdatenodeinternals/CustomNode.svelte
diff --git a/examples/svelte/src/routes/useupdatenodeinternals/Flow.svelte b/examples/svelte/src/routes/examples/useupdatenodeinternals/Flow.svelte
similarity index 100%
rename from examples/svelte/src/routes/useupdatenodeinternals/Flow.svelte
rename to examples/svelte/src/routes/examples/useupdatenodeinternals/Flow.svelte
diff --git a/examples/svelte/src/routes/validation/+page.svelte b/examples/svelte/src/routes/examples/validation/+page.svelte
similarity index 100%
rename from examples/svelte/src/routes/validation/+page.svelte
rename to examples/svelte/src/routes/examples/validation/+page.svelte
diff --git a/examples/svelte/src/routes/validation/style.css b/examples/svelte/src/routes/examples/validation/style.css
similarity index 100%
rename from examples/svelte/src/routes/validation/style.css
rename to examples/svelte/src/routes/examples/validation/style.css
diff --git a/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.svelte b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.svelte
new file mode 100644
index 00000000..8d75afb8
--- /dev/null
+++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.svelte
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts
new file mode 100644
index 00000000..193516c1
--- /dev/null
+++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts
@@ -0,0 +1,19 @@
+import { error } from '@sveltejs/kit';
+
+const flowConfigs = import.meta.glob
('/src/generic-tests/**/*.ts', {
+ eager: true,
+ import: 'default'
+});
+
+/** @type {import('./$types').PageLoad} */
+export function load({ params }) {
+ const flowConfig = flowConfigs[`/src/generic-tests/${params.topic}/${params.example}.ts`];
+
+ if (!flowConfig) {
+ throw error(404, 'Not found');
+ }
+
+ return {
+ flowConfig
+ };
+}
diff --git a/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte
new file mode 100644
index 00000000..44965e2e
--- /dev/null
+++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/examples/svelte/static/favicon.ico b/examples/svelte/static/favicon.ico
new file mode 100644
index 00000000..9ef0fbfd
Binary files /dev/null and b/examples/svelte/static/favicon.ico differ
diff --git a/examples/svelte/static/favicon.png b/examples/svelte/static/favicon.png
deleted file mode 100644
index 825b9e65..00000000
Binary files a/examples/svelte/static/favicon.png and /dev/null differ
diff --git a/examples/svelte/svelte.config.js b/examples/svelte/svelte.config.js
index 1cf26a00..80719d79 100644
--- a/examples/svelte/svelte.config.js
+++ b/examples/svelte/svelte.config.js
@@ -11,7 +11,10 @@ const config = {
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
// If your environment is not supported or you settled on a specific environment, switch out the adapter.
// See https://kit.svelte.dev/docs/adapters for more information about adapters.
- adapter: adapter()
+ adapter: adapter(),
+ alias: {
+ $components: './src/components'
+ }
}
};
diff --git a/package.json b/package.json
index f0e22afe..4411e137 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,10 @@
"dev": "turbo run dev --parallel --concurrency 12",
"dev:svelte": "turbo run dev --filter=svelte --filter=system",
"dev:react": "turbo run dev --filter=react",
+ "test:svelte": "pnpm --filter=playwright run test:svelte",
+ "test:svelte:ui": "pnpm --filter=playwright run test:svelte:ui",
+ "test:react": "pnpm --filter=playwright run test:react",
+ "test:react:ui": "pnpm --filter=playwright run test:react:ui",
"build": "turbo run build",
"test": "turbo run test",
"lint": "turbo run lint",
diff --git a/packages/react/src/components/Edges/wrapEdge.tsx b/packages/react/src/components/Edges/wrapEdge.tsx
index ad1d8f2a..750254ff 100644
--- a/packages/react/src/components/Edges/wrapEdge.tsx
+++ b/packages/react/src/components/Edges/wrapEdge.tsx
@@ -213,6 +213,7 @@ export default (EdgeComponent: ComponentType) => {
onKeyDown={isFocusable ? onKeyDown : undefined}
tabIndex={isFocusable ? 0 : undefined}
role={isFocusable ? 'button' : 'img'}
+ data-id={id}
data-testid={`rf__edge-${id}`}
aria-label={ariaLabel === null ? undefined : ariaLabel ? ariaLabel : `Edge from ${source} to ${target}`}
aria-describedby={isFocusable ? `${ARIA_EDGE_DESC_KEY}-${rfId}` : undefined}
diff --git a/packages/react/src/components/SelectionListener/index.tsx b/packages/react/src/components/SelectionListener/index.tsx
index c26888b8..b71231f6 100644
--- a/packages/react/src/components/SelectionListener/index.tsx
+++ b/packages/react/src/components/SelectionListener/index.tsx
@@ -32,8 +32,9 @@ const SelectionListener = memo(({ onSelectionChange }: SelectionListenerProps) =
useEffect(() => {
const params = { nodes: selectedNodes, edges: selectedEdges };
+
onSelectionChange?.(params);
- store.getState().onSelectionChange.forEach((fn) => fn(params));
+ store.getState().onSelectionChangeHandlers.forEach((fn) => fn(params));
}, [selectedNodes, selectedEdges, onSelectionChange]);
return null;
@@ -41,12 +42,12 @@ const SelectionListener = memo(({ onSelectionChange }: SelectionListenerProps) =
SelectionListener.displayName = 'SelectionListener';
-const changeSelector = (s: ReactFlowState) => !!s.onSelectionChange;
+const changeSelector = (s: ReactFlowState) => !!s.onSelectionChangeHandlers;
function Wrapper({ onSelectionChange }: SelectionListenerProps) {
- const storeHasSelectionChange = useStore(changeSelector);
+ const storeHasSelectionChangeHandlers = useStore(changeSelector);
- if (onSelectionChange || storeHasSelectionChange) {
+ if (onSelectionChange || storeHasSelectionChangeHandlers) {
return ;
}
diff --git a/packages/react/src/hooks/useOnSelectionChange.ts b/packages/react/src/hooks/useOnSelectionChange.ts
index 8ac71464..51df3ddb 100644
--- a/packages/react/src/hooks/useOnSelectionChange.ts
+++ b/packages/react/src/hooks/useOnSelectionChange.ts
@@ -11,11 +11,12 @@ function useOnSelectionChange({ onChange }: UseOnSelectionChangeOptions) {
const store = useStoreApi();
useEffect(() => {
- const addedOnSelectionChange = [...store.getState().onSelectionChange, onChange];
- store.setState({ onSelectionChange: addedOnSelectionChange });
+ const nextOnSelectionChangeHandlers = [...store.getState().onSelectionChangeHandlers, onChange];
+ store.setState({ onSelectionChangeHandlers: nextOnSelectionChangeHandlers });
+
return () => {
- const removedOnSelectionChange = store.getState().onSelectionChange.filter((fn) => fn !== onChange);
- store.setState({ onSelectionChange: removedOnSelectionChange });
+ const nextHandlers = store.getState().onSelectionChangeHandlers.filter((fn) => fn !== onChange);
+ store.setState({ onSelectionChangeHandlers: nextHandlers });
};
}, [onChange]);
}
diff --git a/packages/react/src/store/initialState.ts b/packages/react/src/store/initialState.ts
index 3bbd8053..156d8d76 100644
--- a/packages/react/src/store/initialState.ts
+++ b/packages/react/src/store/initialState.ts
@@ -92,7 +92,7 @@ const getInitialState = ({
connectionRadius: 20,
onError: () => null,
isValidConnection: undefined,
- onSelectionChange: [],
+ onSelectionChangeHandlers: [],
lib: 'react',
};
diff --git a/packages/react/src/types/store.ts b/packages/react/src/types/store.ts
index 47ffd28b..3662f862 100644
--- a/packages/react/src/types/store.ts
+++ b/packages/react/src/types/store.ts
@@ -123,8 +123,8 @@ export type ReactFlowStore = {
onViewportChangeStart?: OnViewportChange;
onViewportChange?: OnViewportChange;
onViewportChangeEnd?: OnViewportChange;
-
- onSelectionChange: OnSelectionChangeFunc[];
+
+ onSelectionChangeHandlers: OnSelectionChangeFunc[];
ariaLiveMessage: string;
autoPanOnConnect: boolean;
diff --git a/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte b/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte
index e53bd7c1..4e5b39d1 100644
--- a/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte
+++ b/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte
@@ -24,7 +24,6 @@