@@ -252,6 +252,8 @@ export default function ProofSearchCanvas({
252252 const maxY = minY + viewH ;
253253 const centerX = minX + viewW * 0.5 ;
254254 const centerY = minY + viewH * 0.5 ;
255+ const dragState = dragRef . current ;
256+ const grabbedId = dragState && dragState . type === 'node' ? dragState . id : null ;
255257
256258 // Subtle grid (world space)
257259 ctx . strokeStyle = palette . grid ;
@@ -293,10 +295,18 @@ export default function ProofSearchCanvas({
293295 const force = 60 / dist2 ;
294296 const fx = force * dx ;
295297 const fy = force * dy ;
296- a . vx += fx ;
297- a . vy += fy ;
298- b . vx -= fx ;
299- b . vy -= fy ;
298+ if ( grabbedId && String ( a . id ) === String ( grabbedId ) ) {
299+ b . vx -= fx ;
300+ b . vy -= fy ;
301+ } else if ( grabbedId && String ( b . id ) === String ( grabbedId ) ) {
302+ a . vx += fx ;
303+ a . vy += fy ;
304+ } else {
305+ a . vx += fx ;
306+ a . vy += fy ;
307+ b . vx -= fx ;
308+ b . vy -= fy ;
309+ }
300310 }
301311 }
302312 } else {
@@ -310,8 +320,8 @@ export default function ProofSearchCanvas({
310320
311321 for ( let i = 0 ; i < count ; i += 1 ) {
312322 const node = nodes [ i ] ;
313- const dragState = dragRef . current ;
314- const dragging = dragState && dragState . type === 'node' && dragState . id === node . id && dragState . dragging ;
323+ const grabbed = grabbedId && String ( node . id ) === String ( grabbedId ) ;
324+ const dragging = grabbed && dragState ? .dragging ;
315325 if ( ! dragging ) {
316326 const target = targets . get ( String ( node . id ) ) ;
317327 if ( target ) {
@@ -324,9 +334,14 @@ export default function ProofSearchCanvas({
324334 }
325335 node . vx *= 0.78 ;
326336 node . vy *= 0.78 ;
337+ } else {
338+ node . vx = 0 ;
339+ node . vy = 0 ;
340+ }
341+ if ( ! grabbed ) {
342+ node . x += node . vx ;
343+ node . y += node . vy ;
327344 }
328- node . x += node . vx ;
329- node . y += node . vy ;
330345
331346 const pad = 28 ;
332347 node . x = clamp ( node . x , minX + pad , maxX - pad ) ;
0 commit comments