diff --git a/src/index.html b/src/index.html index 80da329..d7d1e38 100644 --- a/src/index.html +++ b/src/index.html @@ -20255,16 +20255,21 @@ const ang = Math.atan2(e.clientY - cyPx, e.clientX - cxPx) * 180 / Math.PI; let next = rot0 + (ang - ang0); if (e.shiftKey) next = Math.round(next / 15) * 15; - // Normalize to (-180, 180] for cleaner numeric display. next = ((next + 540) % 360) - 180; layer.rotate = next; - render(); + // Update the freeLayer's transform in place — calling render() + // here would tear down the handle the user is dragging and + // break pointer capture, so the drag would "let go" after one + // tick. The transform style is what renderLayers writes too. + el.style.transform = `rotate(${next}deg)`; + syncLayerInputs?.(); }; const up = () => { document.body.classList.remove('dragging-layer'); handle.removeEventListener('pointermove', move); handle.removeEventListener('pointerup', up); handle.removeEventListener('pointercancel', up); + if (snapshotted) render(); }; handle.addEventListener('pointermove', move); handle.addEventListener('pointerup', up); @@ -20323,14 +20328,20 @@ s.layer.x = nx - w / 2; s.layer.y = ny - h / 2; s.layer.rotate = ((s.rot + delta + 540) % 360) - 180; + // Update each affected freeLayer in place — render() inside + // the drag tears down the handle and breaks pointer capture. + updateLayerElementBox(s.layer, isDesignerLayer); + const layerEl = document.querySelector(`.freeLayer[data-layer-id="${s.layer.id}"]`); + if (layerEl) layerEl.style.transform = `rotate(${s.layer.rotate}deg)`; } - render(); + syncLayerInputs?.(); }; const up = () => { document.body.classList.remove('dragging-layer'); handle.removeEventListener('pointermove', move); handle.removeEventListener('pointerup', up); handle.removeEventListener('pointercancel', up); + if (snapshotted) render(); }; handle.addEventListener('pointermove', move); handle.addEventListener('pointerup', up);