Rewrote the drag reorder system from scratch.
Previously, every cursor movement during a drag ran a full layout simulation to check if the swap was valid🤢, double the computation, and rejected positions stayed locked for the entire drag session. Now, all valid layouts are pre-computed when the drag starts. While dragging, the cursor just looks up ready-made positions.
🤝 
