fix: cross-track drag computes target from mouse Y position

Replace hoveredTrackIdRef with Y-position calculation through
track heights from prev state. Works reliably during drag.
This commit is contained in:
2026-07-29 11:03:30 +07:00
parent 6c6a326b7d
commit 9abb0e6a50
3 changed files with 19 additions and 6 deletions
+11 -4
View File
@@ -12049,15 +12049,22 @@ const App = () => {
wrapper.scrollLeft = Math.max(0, itemPx - keepMargin);
setCanvasRedrawCount(n => n + 1);
}
var targetTrackId = hoveredTrackIdRef.current || drag.trackId;
updateActiveTracks(prev => {
// Build trackId->index map from live prev state
// Compute target track from mouse Y position relative to timeline wrapper
var trkIds = prev.map(function(tr) { return tr.id; });
var baseIdx = trkIds.indexOf(drag.trackId);
if (baseIdx < 0) baseIdx = 0;
var targetIdx = trkIds.indexOf(targetTrackId);
if (targetIdx < 0) targetIdx = prev.length - 1;
var trackTop = 0;
var targetIdx = -1;
var mouseY = e.clientY - rect.top;
for (var ti = 0; ti < prev.length; ti++) {
var tH = prev[ti].height || (prev[ti].isArmed ? 164 : 140);
if (mouseY >= trackTop && mouseY < trackTop + tH) { targetIdx = ti; break; }
trackTop += tH;
}
if (targetIdx < 0) targetIdx = mouseY < trackTop ? 0 : prev.length - 1;
if (targetIdx < 0) targetIdx = 0;
var targetTrackId = prev[targetIdx].id;
var crossOffset = targetIdx - baseIdx;
let movedItem = null;
for (let track of prev) {