diff --git a/frontend/console/package.json b/frontend/console/package.json index eccdc2e8bd..619e4d4b91 100644 --- a/frontend/console/package.json +++ b/frontend/console/package.json @@ -26,9 +26,13 @@ "find-deadcode": "npx ts-prune --project tsconfig.json" }, "lint-staged": { - "*.(js|cjs|tsx|ts)": ["pnpm run lint:fix"] + "*.(js|cjs|tsx|ts)": [ + "pnpm run lint:fix" + ] }, - "browserslist": ["> 2%"], + "browserslist": [ + "> 2%" + ], "source": "index.html", "dependencies": { "@bufbuild/protobuf": "^1.10.0", @@ -48,6 +52,7 @@ "@uiw/codemirror-theme-atomone": "^4.22.0", "@uiw/codemirror-theme-github": "^4.22.0", "@vitejs/plugin-react": "^4.0.4", + "@xyflow/react": "^12.4.2", "codemirror-json-schema": "0.7.0", "codemirror-json5": "^1.0.3", "dagre": "^0.8.5", @@ -60,7 +65,6 @@ "react-dom": "19.0.0", "react-router-dom": "7.1.3", "react-use": "^17.5.0", - "reactflow": "11.11.4", "tailwindcss": "^3.3.3", "type-fest": "^4.18.2" }, diff --git a/frontend/console/src/features/graph/DeclNode.tsx b/frontend/console/src/features/graph/DeclNode.tsx index 338a2f3f94..a222144244 100644 --- a/frontend/console/src/features/graph/DeclNode.tsx +++ b/frontend/console/src/features/graph/DeclNode.tsx @@ -1,3 +1,4 @@ +import { Handle, type NodeProps, Position } from '@xyflow/react' import { BubbleChatIcon, CodeCircleIcon, @@ -8,7 +9,6 @@ import { Settings02Icon, SquareLock02Icon, } from 'hugeicons-react' -import { Handle, type NodeProps, Position } from 'reactflow' interface Props extends NodeProps { data: { diff --git a/frontend/console/src/features/graph/GraphPane.tsx b/frontend/console/src/features/graph/GraphPane.tsx index 2b34c22947..892b267af6 100644 --- a/frontend/console/src/features/graph/GraphPane.tsx +++ b/frontend/console/src/features/graph/GraphPane.tsx @@ -1,13 +1,14 @@ +import { Background, BackgroundVariant, Controls, type Edge, ReactFlow as Flow, type Node, ReactFlowProvider } from '@xyflow/react' import dagre from 'dagre' import { useCallback, useMemo, useState } from 'react' import type React from 'react' -import ReactFlow, { Background, Controls, type Edge, type Node } from 'reactflow' import { useUserPreferences } from '../../shared/providers/user-preferences-provider' import { useStreamModules } from '../modules/hooks/use-stream-modules' import { DeclNode } from './DeclNode' import { GroupNode } from './GroupNode' import { type FTLNode, getGraphData } from './graph-utils' -import 'reactflow/dist/style.css' +import '@xyflow/react/dist/style.css' +import './graph.css' const NODE_TYPES = { groupNode: GroupNode, @@ -48,10 +49,10 @@ const getLayoutedElements = (nodes: Node[], edges: Edge[], direction = 'LR') => // Group nodes by their parent module const nodesByModule = new Map() for (const node of nonGroupNodes) { - if (node.parentNode) { - const nodes = nodesByModule.get(node.parentNode) || [] + if (node.parentId) { + const nodes = nodesByModule.get(node.parentId) || [] nodes.push(node) - nodesByModule.set(node.parentNode, nodes) + nodesByModule.set(node.parentId, nodes) } } @@ -61,8 +62,8 @@ const getLayoutedElements = (nodes: Node[], edges: Edge[], direction = 'LR') => // First, assign ranks to modules based on their connections for (const edge of edges) { - const sourceModule = nonGroupNodes.find((n) => n.id === edge.source)?.parentNode - const targetModule = nonGroupNodes.find((n) => n.id === edge.target)?.parentNode + const sourceModule = nonGroupNodes.find((n) => n.id === edge.source)?.parentId + const targetModule = nonGroupNodes.find((n) => n.id === edge.target)?.parentId if (sourceModule && targetModule && sourceModule !== targetModule) { if (!moduleRanks.has(sourceModule)) { @@ -122,8 +123,8 @@ const getLayoutedElements = (nodes: Node[], edges: Edge[], direction = 'LR') => // Add edges with increased weight for vertical separation for (const edge of edges) { - const sourceModule = nonGroupNodes.find((n) => n.id === edge.source)?.parentNode - const targetModule = nonGroupNodes.find((n) => n.id === edge.target)?.parentNode + const sourceModule = nonGroupNodes.find((n) => n.id === edge.source)?.parentId + const targetModule = nonGroupNodes.find((n) => n.id === edge.target)?.parentId // If edge crosses module boundaries, give it more weight const weight = sourceModule && targetModule && sourceModule !== targetModule ? 5 : 2 @@ -260,7 +261,7 @@ export const GraphPane: React.FC = ({ onTapped }) => { const onNodeClick = useCallback( (_event: React.MouseEvent, node: Node) => { setSelectedNodeId(node.id) - onTapped?.(node.data.item, node.id) + onTapped?.(node.data?.item as FTLNode, node.id) }, [onTapped], ) @@ -278,7 +279,7 @@ export const GraphPane: React.FC = ({ onTapped }) => { } else { // Otherwise select the source node setSelectedNodeId(sourceNode?.id || null) - onTapped?.(sourceNode?.data?.item || null, sourceNode?.id || null) + onTapped?.((sourceNode?.data?.item as FTLNode) || null, sourceNode?.id || null) } }, [onTapped, layoutedNodes, selectedNodeId], @@ -290,24 +291,27 @@ export const GraphPane: React.FC = ({ onTapped }) => { }, [onTapped]) return ( -
- - - - -
+ +
+ + + + +
+
) } diff --git a/frontend/console/src/features/graph/GroupNode.tsx b/frontend/console/src/features/graph/GroupNode.tsx index 1af78330a3..a9e8b5a336 100644 --- a/frontend/console/src/features/graph/GroupNode.tsx +++ b/frontend/console/src/features/graph/GroupNode.tsx @@ -1,4 +1,4 @@ -import type { NodeProps } from 'reactflow' +import type { NodeProps } from '@xyflow/react' interface Props extends NodeProps { data: { diff --git a/frontend/console/src/features/graph/graph-utils.ts b/frontend/console/src/features/graph/graph-utils.ts index f9f68e1cd2..5f99436d88 100644 --- a/frontend/console/src/features/graph/graph-utils.ts +++ b/frontend/console/src/features/graph/graph-utils.ts @@ -1,4 +1,4 @@ -import type { Edge, Node } from 'reactflow' +import type { Edge, Node } from '@xyflow/react' import type { Config, Data, Database, Enum, Module, Secret, Topic, Verb } from '../../protos/xyz/block/ftl/console/v1/console_pb' import type { StreamModulesResult } from '../modules/hooks/use-stream-modules' import { getNodeBackgroundColor } from './graph-styles' @@ -16,7 +16,7 @@ const createNode = ( type: 'groupNode' | 'declNode', nodeType: string, position: { x: number; y: number } | undefined, - parentNode: string | undefined, + parentId: string | undefined, item: FTLNode, isDarkMode: boolean, isSelected: boolean, @@ -24,7 +24,7 @@ const createNode = ( id, type, position: position || { x: 0, y: 0 }, - ...(parentNode && { parentNode }), + ...(parentId && { parentId }), data: { title: label, selected: isSelected, diff --git a/frontend/console/src/features/graph/graph.css b/frontend/console/src/features/graph/graph.css new file mode 100644 index 0000000000..91dde89b07 --- /dev/null +++ b/frontend/console/src/features/graph/graph.css @@ -0,0 +1,10 @@ +.react-flow.dark { + --xy-background-color-default: #1f2937; /* Tailwind gray-800 */ + --xy-background-pattern-dots-color-default: #4b5563; /* Tailwind gray-600 for better contrast */ + + /* Controls styling */ + --xy-controls-button-background-color-default: #374151; /* Tailwind gray-700 */ + --xy-controls-button-background-color-hover-default: #4b5563; /* Tailwind gray-600 */ + --xy-controls-button-color-default: #f3f4f6; /* Tailwind gray-100 */ + --xy-controls-button-border-color-default: #4b5563; /* Tailwind gray-600 */ +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ea8e6b20a..5da1f19254 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,6 +59,9 @@ importers: '@vitejs/plugin-react': specifier: ^4.0.4 version: 4.3.4(vite@6.0.11(@types/node@22.10.7)(jiti@1.21.7)(less@4.2.0)(terser@5.37.0)(yaml@2.6.1)) + '@xyflow/react': + specifier: ^12.4.2 + version: 12.4.2(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) codemirror-json-schema: specifier: 0.7.0 version: 0.7.0(@codemirror/language@6.10.8)(@codemirror/lint@6.8.4)(@codemirror/state@6.5.1)(@codemirror/view@6.36.2)(@lezer/common@1.2.3) @@ -95,9 +98,6 @@ importers: react-use: specifier: ^17.5.0 version: 17.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - reactflow: - specifier: 11.11.4 - version: 11.11.4(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tailwindcss: specifier: ^3.3.3 version: 3.4.17 @@ -1581,42 +1581,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@reactflow/background@11.3.14': - resolution: {integrity: sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - - '@reactflow/controls@11.2.14': - resolution: {integrity: sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - - '@reactflow/core@11.11.4': - resolution: {integrity: sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - - '@reactflow/minimap@11.7.14': - resolution: {integrity: sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - - '@reactflow/node-resizer@2.2.14': - resolution: {integrity: sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - - '@reactflow/node-toolbar@1.3.14': - resolution: {integrity: sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} @@ -2102,99 +2066,24 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/d3-array@3.2.1': - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - - '@types/d3-axis@3.0.6': - resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} - - '@types/d3-brush@3.0.6': - resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} - - '@types/d3-chord@3.0.6': - resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} - '@types/d3-color@3.1.3': resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - '@types/d3-contour@3.0.6': - resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} - - '@types/d3-delaunay@6.0.4': - resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} - - '@types/d3-dispatch@3.0.6': - resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} - '@types/d3-drag@3.0.7': resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} - '@types/d3-dsv@3.0.7': - resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-fetch@3.0.7': - resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} - - '@types/d3-force@3.0.10': - resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} - - '@types/d3-format@3.0.4': - resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - - '@types/d3-geo@3.1.0': - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} - - '@types/d3-hierarchy@3.1.7': - resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} - '@types/d3-interpolate@3.0.4': resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - '@types/d3-path@3.1.0': - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - - '@types/d3-polygon@3.0.2': - resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} - - '@types/d3-quadtree@3.0.6': - resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - - '@types/d3-random@3.0.3': - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} - - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - '@types/d3-selection@3.0.11': resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} - '@types/d3-shape@3.1.6': - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} - - '@types/d3-time-format@4.0.3': - resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - '@types/d3-transition@3.0.9': resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} '@types/d3-zoom@3.0.8': resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} - '@types/d3@7.4.3': - resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - '@types/dagre@0.7.52': resolution: {integrity: sha512-XKJdy+OClLk3hketHi9Qg6gTfe1F3y+UFnHxKA2rn9Dw+oXa4Gb378Ztz9HlMgZKSxpPmn4BNVh9wgkpvrK1uw==} @@ -2219,9 +2108,6 @@ packages: '@types/find-cache-dir@3.2.1': resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} - '@types/geojson@7946.0.14': - resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} - '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} @@ -2526,6 +2412,15 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@xyflow/react@12.4.2': + resolution: {integrity: sha512-AFJKVc/fCPtgSOnRst3xdYJwiEcUN9lDY7EO/YiRvFHYCJGgfzg+jpvZjkTOnBLGyrMJre9378pRxAc3fsR06A==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + + '@xyflow/system@0.0.50': + resolution: {integrity: sha512-HVUZd4LlY88XAaldFh2nwVxDOcdIBxGpQ5txzwfJPf+CAjj2BfYug1fHs2p4yS7YO8H6A3EFJQovBE8YuHkAdg==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -4654,12 +4549,6 @@ packages: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} - reactflow@11.11.4: - resolution: {integrity: sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -5788,7 +5677,7 @@ snapshots: '@babel/traverse': 7.26.5 '@babel/types': 7.26.5 convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5871,7 +5760,7 @@ snapshots: '@babel/parser': 7.26.5 '@babel/template': 7.25.9 '@babel/types': 7.26.5 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6257,7 +6146,7 @@ snapshots: '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.5 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -6271,7 +6160,7 @@ snapshots: '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -6858,84 +6747,6 @@ snapshots: dependencies: react: 19.0.0 - '@reactflow/background@11.3.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - classcat: 5.0.5 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - zustand: 4.5.5(@types/react@19.0.7)(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/controls@11.2.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - classcat: 5.0.5 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - zustand: 4.5.5(@types/react@19.0.7)(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/core@11.11.4(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@types/d3': 7.4.3 - '@types/d3-drag': 3.0.7 - '@types/d3-selection': 3.0.11 - '@types/d3-zoom': 3.0.8 - classcat: 5.0.5 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - zustand: 4.5.5(@types/react@19.0.7)(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/minimap@11.7.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@types/d3-selection': 3.0.11 - '@types/d3-zoom': 3.0.8 - classcat: 5.0.5 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - zustand: 4.5.5(@types/react@19.0.7)(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/node-resizer@2.2.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - classcat: 5.0.5 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - zustand: 4.5.5(@types/react@19.0.7)(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - immer - - '@reactflow/node-toolbar@1.3.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@reactflow/core': 11.11.4(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - classcat: 5.0.5 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - zustand: 4.5.5(@types/react@19.0.7)(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - immer - '@rollup/pluginutils@5.1.4(rollup@4.31.0)': dependencies: '@types/estree': 1.0.6 @@ -7622,81 +7433,18 @@ snapshots: '@types/cookie@0.6.0': {} - '@types/d3-array@3.2.1': {} - - '@types/d3-axis@3.0.6': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-brush@3.0.6': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-chord@3.0.6': {} - '@types/d3-color@3.1.3': {} - '@types/d3-contour@3.0.6': - dependencies: - '@types/d3-array': 3.2.1 - '@types/geojson': 7946.0.14 - - '@types/d3-delaunay@6.0.4': {} - - '@types/d3-dispatch@3.0.6': {} - '@types/d3-drag@3.0.7': dependencies: '@types/d3-selection': 3.0.11 - '@types/d3-dsv@3.0.7': {} - - '@types/d3-ease@3.0.2': {} - - '@types/d3-fetch@3.0.7': - dependencies: - '@types/d3-dsv': 3.0.7 - - '@types/d3-force@3.0.10': {} - - '@types/d3-format@3.0.4': {} - - '@types/d3-geo@3.1.0': - dependencies: - '@types/geojson': 7946.0.14 - - '@types/d3-hierarchy@3.1.7': {} - '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 - '@types/d3-path@3.1.0': {} - - '@types/d3-polygon@3.0.2': {} - - '@types/d3-quadtree@3.0.6': {} - - '@types/d3-random@3.0.3': {} - - '@types/d3-scale-chromatic@3.0.3': {} - - '@types/d3-scale@4.0.8': - dependencies: - '@types/d3-time': 3.0.3 - '@types/d3-selection@3.0.11': {} - '@types/d3-shape@3.1.6': - dependencies: - '@types/d3-path': 3.1.0 - - '@types/d3-time-format@4.0.3': {} - - '@types/d3-time@3.0.3': {} - - '@types/d3-timer@3.0.2': {} - '@types/d3-transition@3.0.9': dependencies: '@types/d3-selection': 3.0.11 @@ -7706,39 +7454,6 @@ snapshots: '@types/d3-interpolate': 3.0.4 '@types/d3-selection': 3.0.11 - '@types/d3@7.4.3': - dependencies: - '@types/d3-array': 3.2.1 - '@types/d3-axis': 3.0.6 - '@types/d3-brush': 3.0.6 - '@types/d3-chord': 3.0.6 - '@types/d3-color': 3.1.3 - '@types/d3-contour': 3.0.6 - '@types/d3-delaunay': 6.0.4 - '@types/d3-dispatch': 3.0.6 - '@types/d3-drag': 3.0.7 - '@types/d3-dsv': 3.0.7 - '@types/d3-ease': 3.0.2 - '@types/d3-fetch': 3.0.7 - '@types/d3-force': 3.0.10 - '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 - '@types/d3-hierarchy': 3.1.7 - '@types/d3-interpolate': 3.0.4 - '@types/d3-path': 3.1.0 - '@types/d3-polygon': 3.0.2 - '@types/d3-quadtree': 3.0.6 - '@types/d3-random': 3.0.3 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 - '@types/d3-selection': 3.0.11 - '@types/d3-shape': 3.1.6 - '@types/d3-time': 3.0.3 - '@types/d3-time-format': 4.0.3 - '@types/d3-timer': 3.0.2 - '@types/d3-transition': 3.0.9 - '@types/d3-zoom': 3.0.8 - '@types/dagre@0.7.52': {} '@types/doctrine@0.0.9': {} @@ -7771,8 +7486,6 @@ snapshots: '@types/find-cache-dir@3.2.1': {} - '@types/geojson@7946.0.14': {} - '@types/http-errors@2.0.4': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -7848,7 +7561,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.21.0 '@typescript-eslint/visitor-keys': 8.21.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -7876,7 +7589,7 @@ snapshots: '@typescript/vfs@1.6.0(typescript@4.5.2)': dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 typescript: 4.5.2 transitivePeerDependencies: - supports-color @@ -8176,6 +7889,27 @@ snapshots: '@xtuc/long@4.2.2': {} + '@xyflow/react@12.4.2(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@xyflow/system': 0.0.50 + classcat: 5.0.5 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + zustand: 4.5.5(@types/react@19.0.7)(react@19.0.0) + transitivePeerDependencies: + - '@types/react' + - immer + + '@xyflow/system@0.0.50': + dependencies: + '@types/d3-drag': 3.0.7 + '@types/d3-selection': 3.0.11 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -8677,6 +8411,10 @@ snapshots: dataloader@1.4.0: {} + debug@4.4.0: + dependencies: + ms: 2.1.3 + debug@4.4.0(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -8828,14 +8566,14 @@ snapshots: esbuild-register@3.6.0(esbuild@0.18.20): dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 esbuild: 0.18.20 transitivePeerDependencies: - supports-color esbuild-register@3.6.0(esbuild@0.24.2): dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 esbuild: 0.24.2 transitivePeerDependencies: - supports-color @@ -8956,7 +8694,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 @@ -9289,14 +9027,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -9675,7 +9413,7 @@ snapshots: dependencies: chalk: 5.4.1 commander: 12.1.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 execa: 8.0.1 lilconfig: 3.1.3 listr2: 8.2.5 @@ -10402,20 +10140,6 @@ snapshots: react@19.0.0: {} - reactflow@11.11.4(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@reactflow/background': 11.3.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@reactflow/controls': 11.2.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@reactflow/core': 11.11.4(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@reactflow/minimap': 11.7.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@reactflow/node-resizer': 2.2.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@reactflow/node-toolbar': 1.3.14(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - immer - read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -11131,7 +10855,7 @@ snapshots: vite-node@2.1.8(@types/node@22.10.7)(less@4.2.0)(terser@5.37.0): dependencies: cac: 6.7.14 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 es-module-lexer: 1.5.4 pathe: 1.1.2 vite: 5.4.14(@types/node@22.10.7)(less@4.2.0)(terser@5.37.0) @@ -11180,7 +10904,7 @@ snapshots: '@vitest/spy': 2.1.8 '@vitest/utils': 2.1.8 chai: 5.1.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 expect-type: 1.1.0 magic-string: 0.30.17 pathe: 1.1.2