diff --git a/src/components/Nodes/CustomNode.tsx b/src/components/Nodes/CustomNode.tsx index 820302d..8b76947 100644 --- a/src/components/Nodes/CustomNode.tsx +++ b/src/components/Nodes/CustomNode.tsx @@ -82,10 +82,13 @@ const CustomNode = ({ data, selected }: NodeProps) => { }} > {/* Invisible handles positioned around edges - center remains free for dragging */} - {/* Top edge handle */} + {/* Bidirectional handles (source + target overlapping at each edge) */} + + {/* Top edge handles */} ) => { cursor: "crosshair", }} /> - {/* Right edge handle */} + + {/* Right edge handles */} + ) => { cursor: "crosshair", }} /> - {/* Bottom edge handle */} + + {/* Bottom edge handles */} + ) => { cursor: "crosshair", }} /> - {/* Left edge handle */} + + + {/* Left edge handles */} + ) => { }} > {/* Invisible handles positioned around edges - center remains free for dragging */} - {/* Top edge handle */} + {/* Bidirectional handles (source + target overlapping at each edge) */} + + {/* Top edge handles */} ) => { cursor: 'crosshair', }} /> - {/* Right edge handle */} + + {/* Right edge handles */} + ) => { cursor: 'crosshair', }} /> - {/* Bottom edge handle */} + + {/* Bottom edge handles */} + ) => { cursor: 'crosshair', }} /> - {/* Left edge handle */} + + + {/* Left edge handles */} + 0.001 + let intersectX = Math.abs(dy) > 0.001 ? centerX + dx * (intersectY - centerY) / dy : centerX; + // Clamp intersection to the straight horizontal segment between the caps + intersectX = Math.min(Math.max(intersectX, leftCapX), rightCapX); + const normalAngle = side < 0 ? -Math.PI / 2 : Math.PI / 2; return { @@ -164,10 +177,13 @@ function getPillIntersection( // Calculate y position where line from target to center intersects the vertical edge // Line equation: (y - centerY) / (x - centerX) = dy / dx // Solving for y when x = intersectX: y = centerY + dy * (intersectX - centerX) / dx - const intersectY = Math.abs(dx) > 0.001 + let intersectY = Math.abs(dx) > 0.001 ? centerY + dy * (intersectX - centerX) / dx : centerY; + // Clamp intersection to the straight vertical segment between the caps + intersectY = Math.min(Math.max(intersectY, topCapY), bottomCapY); + const normalAngle = side < 0 ? Math.PI : 0; return {