Remove unused React Flow components, simplify for funnel viz

- Remove FlowCanvas, node components, edge components
- Remove @xyflow/react and d3 dependencies
- Clean up CSS (remove React Flow styles)
- Leaner build focused on FundingFunnel component

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-01-29 18:10:51 +00:00
parent 4b0491e999
commit 2ffeb9120a
9 changed files with 1 additions and 1273 deletions

View File

@ -12,47 +12,6 @@ body {
background: rgb(var(--background-rgb));
}
/* Flow Animation */
@keyframes flowAnimation {
from {
stroke-dashoffset: 16;
}
to {
stroke-dashoffset: 0;
}
}
/* React Flow Customization */
.react-flow__node {
cursor: grab;
}
.react-flow__node:active {
cursor: grabbing;
}
.react-flow__controls {
background: #1e293b !important;
border: 1px solid #334155 !important;
border-radius: 8px !important;
}
.react-flow__controls-button {
background: #1e293b !important;
border-bottom: 1px solid #334155 !important;
fill: #94a3b8 !important;
}
.react-flow__controls-button:hover {
background: #334155 !important;
}
.react-flow__minimap {
background: #0f172a !important;
border: 1px solid #334155 !important;
border-radius: 8px !important;
}
/* Scrollbar */
::-webkit-scrollbar {
width: 8px;

View File

@ -1,246 +0,0 @@
'use client'
import { useCallback, useState, useEffect } from 'react'
import {
ReactFlow,
MiniMap,
Controls,
Background,
BackgroundVariant,
useNodesState,
useEdgesState,
addEdge,
type Connection,
type Node,
type Edge,
} from '@xyflow/react'
import '@xyflow/react/dist/style.css'
import SourceNode from './nodes/SourceNode'
import RecipientNode from './nodes/RecipientNode'
import ThresholdGate from './nodes/ThresholdGate'
import AnimatedFlowEdge from './edges/AnimatedFlowEdge'
const nodeTypes = {
source: SourceNode,
recipient: RecipientNode,
threshold: ThresholdGate,
}
const edgeTypes = {
animated: AnimatedFlowEdge,
}
// Demo initial nodes
const initialNodes: Node[] = [
{
id: 'treasury',
type: 'source',
position: { x: 50, y: 200 },
data: {
label: 'Community Treasury',
balance: 50000,
flowRate: 100,
isActive: true,
},
},
{
id: 'gate1',
type: 'threshold',
position: { x: 300, y: 100 },
data: {
threshold: 5000,
currentValue: 8000,
label: 'Project Gate',
},
},
{
id: 'gate2',
type: 'threshold',
position: { x: 300, y: 300 },
data: {
threshold: 10000,
currentValue: 7500,
label: 'Research Gate',
},
},
{
id: 'project-a',
type: 'recipient',
position: { x: 550, y: 50 },
data: {
label: 'Project Alpha',
received: 12340,
incomingRate: 85,
threshold: 15000,
isReceiving: true,
},
},
{
id: 'project-b',
type: 'recipient',
position: { x: 550, y: 200 },
data: {
label: 'Project Beta',
received: 8200,
incomingRate: 50,
threshold: 20000,
isReceiving: true,
},
},
{
id: 'project-c',
type: 'recipient',
position: { x: 550, y: 350 },
data: {
label: 'Research Fund',
received: 3100,
incomingRate: 0,
threshold: 10000,
isReceiving: false,
},
},
]
const initialEdges: Edge[] = [
{
id: 'e-treasury-gate1',
source: 'treasury',
target: 'gate1',
type: 'animated',
data: { flowRate: 100, isActive: true, color: '#3B82F6' },
},
{
id: 'e-treasury-gate2',
source: 'treasury',
target: 'gate2',
type: 'animated',
data: { flowRate: 75, isActive: true, color: '#3B82F6' },
},
{
id: 'e-gate1-projecta',
source: 'gate1',
target: 'project-a',
type: 'animated',
data: { flowRate: 85, isActive: true, color: '#10B981' },
},
{
id: 'e-gate1-projectb',
source: 'gate1',
target: 'project-b',
type: 'animated',
data: { flowRate: 50, isActive: true, color: '#10B981' },
},
{
id: 'e-gate2-projectc',
source: 'gate2',
target: 'project-c',
type: 'animated',
data: { flowRate: 0, isActive: false, color: '#F43F5E' },
},
]
export default function FlowCanvas() {
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes)
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges)
const onConnect = useCallback(
(params: Connection) => setEdges((eds) => addEdge({
...params,
type: 'animated',
data: { flowRate: 50, isActive: true, color: '#8B5CF6' },
}, eds)),
[setEdges]
)
// Simulate flow updates
useEffect(() => {
const interval = setInterval(() => {
setNodes((nds) =>
nds.map((node) => {
if (node.type === 'recipient' && node.data.isReceiving) {
const hourlyRate = node.data.incomingRate / 3600 // per second
return {
...node,
data: {
...node.data,
received: node.data.received + hourlyRate,
},
}
}
if (node.type === 'source' && node.data.isActive) {
const hourlyRate = node.data.flowRate / 3600
return {
...node,
data: {
...node.data,
balance: Math.max(0, node.data.balance - hourlyRate),
},
}
}
return node
})
)
}, 1000)
return () => clearInterval(interval)
}, [setNodes])
return (
<div className="w-full h-full">
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
nodeTypes={nodeTypes}
edgeTypes={edgeTypes}
fitView
className="bg-slate-950"
>
<Controls className="bg-slate-800 border-slate-700" />
<MiniMap
className="bg-slate-800 border-slate-700"
nodeColor={(node) => {
switch (node.type) {
case 'source':
return '#3B82F6'
case 'recipient':
return '#8B5CF6'
case 'threshold':
return '#F59E0B'
default:
return '#64748B'
}
}}
/>
<Background variant={BackgroundVariant.Dots} gap={20} size={1} color="#1E293B" />
</ReactFlow>
{/* Stats Bar */}
<div className="absolute bottom-0 left-0 right-0 bg-slate-900/90 backdrop-blur border-t border-slate-700 px-6 py-3">
<div className="flex items-center justify-between text-sm">
<div className="flex items-center gap-6">
<div className="flex items-center gap-2">
<div className="w-2 h-2 rounded-full bg-blue-500 animate-pulse" />
<span className="text-slate-400">Total Flowing:</span>
<span className="text-white font-mono">$175/hr</span>
</div>
<div className="flex items-center gap-2">
<span className="text-slate-400">Active Flows:</span>
<span className="text-emerald-400 font-mono">4</span>
</div>
<div className="flex items-center gap-2">
<span className="text-slate-400">Blocked:</span>
<span className="text-rose-400 font-mono">1</span>
</div>
</div>
<div className="text-slate-500 text-xs">
Drag nodes to rearrange Click to inspect Connect nodes to create flows
</div>
</div>
</div>
</div>
)
}

View File

@ -1,110 +0,0 @@
'use client'
import { memo } from 'react'
import { BaseEdge, EdgeProps, getBezierPath } from '@xyflow/react'
export interface AnimatedFlowEdgeData {
flowRate: number
isActive: boolean
color?: string
}
function AnimatedFlowEdge({
id,
sourceX,
sourceY,
targetX,
targetY,
sourcePosition,
targetPosition,
data,
style = {},
}: EdgeProps<AnimatedFlowEdgeData>) {
const { flowRate = 0, isActive = false, color = '#3B82F6' } = (data || {}) as AnimatedFlowEdgeData
const [edgePath] = getBezierPath({
sourceX,
sourceY,
targetX,
targetY,
sourcePosition,
targetPosition,
})
// Calculate animation speed based on flow rate
const animationDuration = Math.max(2 - (flowRate / 100), 0.5)
return (
<>
{/* Background path */}
<BaseEdge
id={id}
path={edgePath}
style={{
...style,
stroke: isActive ? color : '#475569',
strokeWidth: isActive ? 3 : 2,
strokeOpacity: isActive ? 0.3 : 0.5,
}}
/>
{/* Animated dashed overlay when active */}
{isActive && (
<path
d={edgePath}
fill="none"
stroke={color}
strokeWidth={3}
strokeDasharray="8 8"
style={{
animation: `flowAnimation ${animationDuration}s linear infinite`,
}}
/>
)}
{/* Flow particles */}
{isActive && (
<>
<circle r="4" fill={color}>
<animateMotion
dur={`${animationDuration}s`}
repeatCount="indefinite"
path={edgePath}
/>
</circle>
<circle r="4" fill={color}>
<animateMotion
dur={`${animationDuration}s`}
repeatCount="indefinite"
path={edgePath}
begin={`${animationDuration / 3}s`}
/>
</circle>
<circle r="4" fill={color}>
<animateMotion
dur={`${animationDuration}s`}
repeatCount="indefinite"
path={edgePath}
begin={`${(animationDuration / 3) * 2}s`}
/>
</circle>
</>
)}
{/* Flow rate label */}
{isActive && flowRate > 0 && (
<text
x={(sourceX + targetX) / 2}
y={(sourceY + targetY) / 2 - 10}
textAnchor="middle"
className="text-xs fill-slate-400 font-mono"
style={{ fontSize: '10px' }}
>
${flowRate}/hr
</text>
)}
</>
)
}
export default memo(AnimatedFlowEdge)

View File

@ -1,101 +0,0 @@
'use client'
import { memo } from 'react'
import { Handle, Position, type NodeProps } from '@xyflow/react'
export interface RecipientNodeData {
label: string
received: number
incomingRate: number
threshold: number
isReceiving: boolean
}
function RecipientNode({ data }: NodeProps<RecipientNodeData>) {
const { label, received, incomingRate, threshold, isReceiving } = data as RecipientNodeData
const progress = Math.min((received / threshold) * 100, 100)
const thresholdMet = received >= threshold
return (
<div className={`
px-6 py-4 rounded-xl border-2 min-w-[200px]
bg-gradient-to-br from-slate-800 to-slate-900
${thresholdMet ? 'border-emerald-500 shadow-lg shadow-emerald-500/20' :
isReceiving ? 'border-purple-500 shadow-lg shadow-purple-500/20' : 'border-slate-600'}
transition-all duration-300
`}>
<Handle
type="target"
position={Position.Left}
className="w-3 h-3 bg-purple-500 border-2 border-slate-900"
/>
<div className="flex items-center gap-3 mb-3">
<div className={`
w-10 h-10 rounded-full flex items-center justify-center text-xl
${thresholdMet ? 'bg-emerald-500/20' : isReceiving ? 'bg-purple-500/20' : 'bg-slate-700'}
`}>
🎯
</div>
<div>
<div className="font-semibold text-white">{label}</div>
<div className="text-xs text-slate-400">Recipient</div>
</div>
</div>
<div className="space-y-2 text-sm">
<div className="flex justify-between">
<span className="text-slate-400">Received</span>
<span className="text-white font-mono">
${received.toLocaleString()}
</span>
</div>
<div className="flex justify-between">
<span className="text-slate-400">Rate</span>
<span className={`font-mono ${isReceiving ? 'text-purple-400' : 'text-slate-500'}`}>
+${incomingRate}/hr
</span>
</div>
</div>
{/* Threshold Progress Bar */}
<div className="mt-4">
<div className="flex justify-between text-xs mb-1">
<span className="text-slate-400">Threshold</span>
<span className={thresholdMet ? 'text-emerald-400' : 'text-slate-400'}>
{progress.toFixed(0)}%
</span>
</div>
<div className="h-2 bg-slate-700 rounded-full overflow-hidden">
<div
className={`h-full transition-all duration-500 ${
thresholdMet ? 'bg-emerald-500' :
progress > 75 ? 'bg-amber-500' : 'bg-purple-500'
}`}
style={{ width: `${progress}%` }}
/>
</div>
<div className="flex justify-between text-xs mt-1 text-slate-500">
<span>${received.toLocaleString()}</span>
<span>${threshold.toLocaleString()}</span>
</div>
</div>
{thresholdMet && (
<div className="mt-3 flex items-center gap-2 text-emerald-400 text-sm">
<span></span>
<span>Threshold Met!</span>
</div>
)}
{/* Optional: outgoing handle for cascading flows */}
<Handle
type="source"
position={Position.Right}
className="w-3 h-3 bg-emerald-500 border-2 border-slate-900"
/>
</div>
)
}
export default memo(RecipientNode)

View File

@ -1,66 +0,0 @@
'use client'
import { memo } from 'react'
import { Handle, Position, type NodeProps } from '@xyflow/react'
export interface SourceNodeData {
label: string
balance: number
flowRate: number
isActive: boolean
}
function SourceNode({ data }: NodeProps<SourceNodeData>) {
const { label, balance, flowRate, isActive } = data as SourceNodeData
return (
<div className={`
px-6 py-4 rounded-xl border-2 min-w-[180px]
bg-gradient-to-br from-slate-800 to-slate-900
${isActive ? 'border-blue-500 shadow-lg shadow-blue-500/20' : 'border-slate-600'}
transition-all duration-300
`}>
<div className="flex items-center gap-3 mb-3">
<div className={`
w-10 h-10 rounded-full flex items-center justify-center text-xl
${isActive ? 'bg-blue-500/20' : 'bg-slate-700'}
`}>
💰
</div>
<div>
<div className="font-semibold text-white">{label}</div>
<div className="text-xs text-slate-400">Source</div>
</div>
</div>
<div className="space-y-2 text-sm">
<div className="flex justify-between">
<span className="text-slate-400">Balance</span>
<span className="text-white font-mono">
${balance.toLocaleString()}
</span>
</div>
<div className="flex justify-between">
<span className="text-slate-400">Flow Rate</span>
<span className={`font-mono ${isActive ? 'text-blue-400' : 'text-slate-500'}`}>
${flowRate}/hr
</span>
</div>
<div className="flex items-center gap-2">
<div className={`w-2 h-2 rounded-full ${isActive ? 'bg-emerald-400 animate-pulse' : 'bg-slate-600'}`} />
<span className={isActive ? 'text-emerald-400' : 'text-slate-500'}>
{isActive ? 'Flowing' : 'Inactive'}
</span>
</div>
</div>
<Handle
type="source"
position={Position.Right}
className="w-3 h-3 bg-blue-500 border-2 border-slate-900"
/>
</div>
)
}
export default memo(SourceNode)

View File

@ -1,85 +0,0 @@
'use client'
import { memo } from 'react'
import { Handle, Position, type NodeProps } from '@xyflow/react'
export interface ThresholdGateData {
threshold: number
currentValue: number
label?: string
}
function ThresholdGate({ data }: NodeProps<ThresholdGateData>) {
const { threshold, currentValue, label } = data as ThresholdGateData
const isOpen = currentValue >= threshold
const progress = Math.min((currentValue / threshold) * 100, 100)
return (
<div className={`
relative px-4 py-3 rounded-lg border-2 min-w-[120px]
bg-slate-900/90 backdrop-blur
${isOpen ? 'border-emerald-500' : progress > 75 ? 'border-amber-500' : 'border-rose-500'}
transition-all duration-300
`}>
<Handle
type="target"
position={Position.Left}
className="w-3 h-3 bg-blue-500 border-2 border-slate-900"
/>
{/* Gate Icon */}
<div className="flex flex-col items-center">
<div className={`
text-2xl mb-1 transition-transform duration-300
${isOpen ? 'scale-110' : 'scale-100'}
`}>
{isOpen ? '🔓' : progress > 75 ? '⚠️' : '🔒'}
</div>
{label && (
<div className="text-xs text-slate-400 mb-2">{label}</div>
)}
{/* Mini threshold meter */}
<div className="w-full">
<div className="h-1.5 bg-slate-700 rounded-full overflow-hidden">
<div
className={`h-full transition-all duration-300 ${
isOpen ? 'bg-emerald-500' :
progress > 75 ? 'bg-amber-500' : 'bg-rose-500'
}`}
style={{ width: `${progress}%` }}
/>
</div>
</div>
<div className="mt-2 text-center">
<div className={`text-xs font-mono ${
isOpen ? 'text-emerald-400' : 'text-slate-400'
}`}>
${currentValue.toLocaleString()}
</div>
<div className="text-xs text-slate-500">
/ ${threshold.toLocaleString()}
</div>
</div>
<div className={`
mt-2 text-xs px-2 py-0.5 rounded-full
${isOpen ? 'bg-emerald-500/20 text-emerald-400' :
progress > 75 ? 'bg-amber-500/20 text-amber-400' : 'bg-rose-500/20 text-rose-400'}
`}>
{isOpen ? 'OPEN' : progress > 75 ? 'NEAR' : 'LOCKED'}
</div>
</div>
<Handle
type="source"
position={Position.Right}
className="w-3 h-3 bg-emerald-500 border-2 border-slate-900"
/>
</div>
)
}
export default memo(ThresholdGate)

View File

@ -1,7 +0,0 @@
export { default as SourceNode } from './SourceNode'
export { default as RecipientNode } from './RecipientNode'
export { default as ThresholdGate } from './ThresholdGate'
export type { SourceNodeData } from './SourceNode'
export type { RecipientNodeData } from './RecipientNode'
export type { ThresholdGateData } from './ThresholdGate'

View File

@ -11,12 +11,9 @@
"dependencies": {
"next": "^14.2.0",
"react": "^18.3.0",
"react-dom": "^18.3.0",
"@xyflow/react": "^12.0.0",
"d3": "^7.9.0"
"react-dom": "^18.3.0"
},
"devDependencies": {
"@types/d3": "^7.4.0",
"@types/node": "^20.0.0",
"@types/react": "^18.3.0",
"@types/react-dom": "^18.3.0",

View File

@ -8,12 +8,6 @@ importers:
.:
dependencies:
'@xyflow/react':
specifier: ^12.0.0
version: 12.10.0(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
d3:
specifier: ^7.9.0
version: 7.9.0
next:
specifier: ^14.2.0
version: 14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@ -24,9 +18,6 @@ importers:
specifier: ^18.3.0
version: 18.3.1(react@18.3.1)
devDependencies:
'@types/d3':
specifier: ^7.4.0
version: 7.4.3
'@types/node':
specifier: ^20.0.0
version: 20.19.30
@ -143,102 +134,6 @@ packages:
'@swc/helpers@0.5.5':
resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==}
'@types/d3-array@3.2.2':
resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
'@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.7':
resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==}
'@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.1':
resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
'@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.1.0':
resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
'@types/d3-scale@4.0.9':
resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
'@types/d3-selection@3.0.11':
resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
'@types/d3-shape@3.1.8':
resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==}
'@types/d3-time-format@4.0.3':
resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
'@types/d3-time@3.0.4':
resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
'@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/geojson@7946.0.16':
resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
'@types/node@20.19.30':
resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==}
@ -253,15 +148,6 @@ packages:
'@types/react@18.3.27':
resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==}
'@xyflow/react@12.10.0':
resolution: {integrity: sha512-eOtz3whDMWrB4KWVatIBrKuxECHqip6PfA8fTpaS2RUGVpiEAe+nqDKsLqkViVWxDGreq0lWX71Xth/SPAzXiw==}
peerDependencies:
react: '>=17'
react-dom: '>=17'
'@xyflow/system@0.0.74':
resolution: {integrity: sha512-7v7B/PkiVrkdZzSbL+inGAo6tkR/WQHHG0/jhSvLQToCsfa8YubOGmBYd1s08tpKpihdHDZFwzQZeR69QSBb4Q==}
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
@ -311,9 +197,6 @@ packages:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
classcat@5.0.5:
resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==}
client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
@ -321,10 +204,6 @@ packages:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
commander@7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
@ -333,136 +212,6 @@ packages:
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
d3-array@3.2.4:
resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
engines: {node: '>=12'}
d3-axis@3.0.0:
resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==}
engines: {node: '>=12'}
d3-brush@3.0.0:
resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==}
engines: {node: '>=12'}
d3-chord@3.0.1:
resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==}
engines: {node: '>=12'}
d3-color@3.1.0:
resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
engines: {node: '>=12'}
d3-contour@4.0.2:
resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
engines: {node: '>=12'}
d3-delaunay@6.0.4:
resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==}
engines: {node: '>=12'}
d3-dispatch@3.0.1:
resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
engines: {node: '>=12'}
d3-drag@3.0.0:
resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
engines: {node: '>=12'}
d3-dsv@3.0.1:
resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
engines: {node: '>=12'}
hasBin: true
d3-ease@3.0.1:
resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
engines: {node: '>=12'}
d3-fetch@3.0.1:
resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
engines: {node: '>=12'}
d3-force@3.0.0:
resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
engines: {node: '>=12'}
d3-format@3.1.2:
resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==}
engines: {node: '>=12'}
d3-geo@3.1.1:
resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
engines: {node: '>=12'}
d3-hierarchy@3.1.2:
resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
engines: {node: '>=12'}
d3-interpolate@3.0.1:
resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
engines: {node: '>=12'}
d3-path@3.1.0:
resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
engines: {node: '>=12'}
d3-polygon@3.0.1:
resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==}
engines: {node: '>=12'}
d3-quadtree@3.0.1:
resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
engines: {node: '>=12'}
d3-random@3.0.1:
resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
engines: {node: '>=12'}
d3-scale-chromatic@3.1.0:
resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
engines: {node: '>=12'}
d3-scale@4.0.2:
resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
engines: {node: '>=12'}
d3-selection@3.0.0:
resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
engines: {node: '>=12'}
d3-shape@3.2.0:
resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
engines: {node: '>=12'}
d3-time-format@4.1.0:
resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
engines: {node: '>=12'}
d3-time@3.1.0:
resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
engines: {node: '>=12'}
d3-timer@3.0.1:
resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
engines: {node: '>=12'}
d3-transition@3.0.1:
resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
engines: {node: '>=12'}
peerDependencies:
d3-selection: 2 - 3
d3-zoom@3.0.0:
resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
engines: {node: '>=12'}
d3@7.9.0:
resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
engines: {node: '>=12'}
delaunator@5.0.1:
resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
@ -522,14 +271,6 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
internmap@2.0.3:
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
engines: {node: '>=12'}
is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
@ -718,18 +459,9 @@ packages:
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
robust-predicates@3.0.2:
resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
rw@1.3.3:
resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
@ -803,29 +535,9 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
use-sync-external-store@1.6.0:
resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
zustand@4.5.7:
resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==}
engines: {node: '>=12.7.0'}
peerDependencies:
'@types/react': '>=16.8'
immer: '>=9.0.6'
react: '>=16.8'
peerDependenciesMeta:
'@types/react':
optional: true
immer:
optional: true
react:
optional: true
snapshots:
'@alloc/quick-lru@5.2.0': {}
@ -892,125 +604,6 @@ snapshots:
'@swc/counter': 0.1.3
tslib: 2.8.1
'@types/d3-array@3.2.2': {}
'@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.2
'@types/geojson': 7946.0.16
'@types/d3-delaunay@6.0.4': {}
'@types/d3-dispatch@3.0.7': {}
'@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.16
'@types/d3-hierarchy@3.1.7': {}
'@types/d3-interpolate@3.0.4':
dependencies:
'@types/d3-color': 3.1.3
'@types/d3-path@3.1.1': {}
'@types/d3-polygon@3.0.2': {}
'@types/d3-quadtree@3.0.6': {}
'@types/d3-random@3.0.3': {}
'@types/d3-scale-chromatic@3.1.0': {}
'@types/d3-scale@4.0.9':
dependencies:
'@types/d3-time': 3.0.4
'@types/d3-selection@3.0.11': {}
'@types/d3-shape@3.1.8':
dependencies:
'@types/d3-path': 3.1.1
'@types/d3-time-format@4.0.3': {}
'@types/d3-time@3.0.4': {}
'@types/d3-timer@3.0.2': {}
'@types/d3-transition@3.0.9':
dependencies:
'@types/d3-selection': 3.0.11
'@types/d3-zoom@3.0.8':
dependencies:
'@types/d3-interpolate': 3.0.4
'@types/d3-selection': 3.0.11
'@types/d3@7.4.3':
dependencies:
'@types/d3-array': 3.2.2
'@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.7
'@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.1
'@types/d3-polygon': 3.0.2
'@types/d3-quadtree': 3.0.6
'@types/d3-random': 3.0.3
'@types/d3-scale': 4.0.9
'@types/d3-scale-chromatic': 3.1.0
'@types/d3-selection': 3.0.11
'@types/d3-shape': 3.1.8
'@types/d3-time': 3.0.4
'@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/geojson@7946.0.16': {}
'@types/node@20.19.30':
dependencies:
undici-types: 6.21.0
@ -1026,29 +619,6 @@ snapshots:
'@types/prop-types': 15.7.15
csstype: 3.2.3
'@xyflow/react@12.10.0(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@xyflow/system': 0.0.74
classcat: 5.0.5
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
zustand: 4.5.7(@types/react@18.3.27)(react@18.3.1)
transitivePeerDependencies:
- '@types/react'
- immer
'@xyflow/system@0.0.74':
dependencies:
'@types/d3-drag': 3.0.7
'@types/d3-interpolate': 3.0.4
'@types/d3-selection': 3.0.11
'@types/d3-transition': 3.0.9
'@types/d3-zoom': 3.0.8
d3-drag: 3.0.0
d3-interpolate: 3.0.1
d3-selection: 3.0.0
d3-zoom: 3.0.0
any-promise@1.3.0: {}
anymatch@3.1.3:
@ -1103,174 +673,14 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
classcat@5.0.5: {}
client-only@0.0.1: {}
commander@4.1.1: {}
commander@7.2.0: {}
cssesc@3.0.0: {}
csstype@3.2.3: {}
d3-array@3.2.4:
dependencies:
internmap: 2.0.3
d3-axis@3.0.0: {}
d3-brush@3.0.0:
dependencies:
d3-dispatch: 3.0.1
d3-drag: 3.0.0
d3-interpolate: 3.0.1
d3-selection: 3.0.0
d3-transition: 3.0.1(d3-selection@3.0.0)
d3-chord@3.0.1:
dependencies:
d3-path: 3.1.0
d3-color@3.1.0: {}
d3-contour@4.0.2:
dependencies:
d3-array: 3.2.4
d3-delaunay@6.0.4:
dependencies:
delaunator: 5.0.1
d3-dispatch@3.0.1: {}
d3-drag@3.0.0:
dependencies:
d3-dispatch: 3.0.1
d3-selection: 3.0.0
d3-dsv@3.0.1:
dependencies:
commander: 7.2.0
iconv-lite: 0.6.3
rw: 1.3.3
d3-ease@3.0.1: {}
d3-fetch@3.0.1:
dependencies:
d3-dsv: 3.0.1
d3-force@3.0.0:
dependencies:
d3-dispatch: 3.0.1
d3-quadtree: 3.0.1
d3-timer: 3.0.1
d3-format@3.1.2: {}
d3-geo@3.1.1:
dependencies:
d3-array: 3.2.4
d3-hierarchy@3.1.2: {}
d3-interpolate@3.0.1:
dependencies:
d3-color: 3.1.0
d3-path@3.1.0: {}
d3-polygon@3.0.1: {}
d3-quadtree@3.0.1: {}
d3-random@3.0.1: {}
d3-scale-chromatic@3.1.0:
dependencies:
d3-color: 3.1.0
d3-interpolate: 3.0.1
d3-scale@4.0.2:
dependencies:
d3-array: 3.2.4
d3-format: 3.1.2
d3-interpolate: 3.0.1
d3-time: 3.1.0
d3-time-format: 4.1.0
d3-selection@3.0.0: {}
d3-shape@3.2.0:
dependencies:
d3-path: 3.1.0
d3-time-format@4.1.0:
dependencies:
d3-time: 3.1.0
d3-time@3.1.0:
dependencies:
d3-array: 3.2.4
d3-timer@3.0.1: {}
d3-transition@3.0.1(d3-selection@3.0.0):
dependencies:
d3-color: 3.1.0
d3-dispatch: 3.0.1
d3-ease: 3.0.1
d3-interpolate: 3.0.1
d3-selection: 3.0.0
d3-timer: 3.0.1
d3-zoom@3.0.0:
dependencies:
d3-dispatch: 3.0.1
d3-drag: 3.0.0
d3-interpolate: 3.0.1
d3-selection: 3.0.0
d3-transition: 3.0.1(d3-selection@3.0.0)
d3@7.9.0:
dependencies:
d3-array: 3.2.4
d3-axis: 3.0.0
d3-brush: 3.0.0
d3-chord: 3.0.1
d3-color: 3.1.0
d3-contour: 4.0.2
d3-delaunay: 6.0.4
d3-dispatch: 3.0.1
d3-drag: 3.0.0
d3-dsv: 3.0.1
d3-ease: 3.0.1
d3-fetch: 3.0.1
d3-force: 3.0.0
d3-format: 3.1.2
d3-geo: 3.1.1
d3-hierarchy: 3.1.2
d3-interpolate: 3.0.1
d3-path: 3.1.0
d3-polygon: 3.0.1
d3-quadtree: 3.0.1
d3-random: 3.0.1
d3-scale: 4.0.2
d3-scale-chromatic: 3.1.0
d3-selection: 3.0.0
d3-shape: 3.2.0
d3-time: 3.1.0
d3-time-format: 4.1.0
d3-timer: 3.0.1
d3-transition: 3.0.1(d3-selection@3.0.0)
d3-zoom: 3.0.0
delaunator@5.0.1:
dependencies:
robust-predicates: 3.0.2
didyoumean@1.2.2: {}
dlv@1.1.3: {}
@ -1320,12 +730,6 @@ snapshots:
dependencies:
function-bind: 1.1.2
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
internmap@2.0.3: {}
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.3.0
@ -1485,16 +889,10 @@ snapshots:
reusify@1.1.0: {}
robust-predicates@3.0.2: {}
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
rw@1.3.3: {}
safer-buffer@2.1.2: {}
scheduler@0.23.2:
dependencies:
loose-envify: 1.4.0
@ -1579,15 +977,4 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
use-sync-external-store@1.6.0(react@18.3.1):
dependencies:
react: 18.3.1
util-deprecate@1.0.2: {}
zustand@4.5.7(@types/react@18.3.27)(react@18.3.1):
dependencies:
use-sync-external-store: 1.6.0(react@18.3.1)
optionalDependencies:
'@types/react': 18.3.27
react: 18.3.1