fix: refresh internalDrag.origin on every dragstart#2557
Merged
christianhg merged 1 commit intoeditor-v6.xfrom Apr 29, 2026
Merged
fix: refresh internalDrag.origin on every dragstart#2557christianhg merged 1 commit intoeditor-v6.xfrom
christianhg merged 1 commit intoeditor-v6.xfrom
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
🦋 Changeset detectedLatest commit: f04ee37 The changes in this PR will be included in the next version bump. This PR includes changesets to release 11 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Contributor
📦 Bundle Stats —
|
| Metric | Value | vs editor-v6.x (5454335) |
|---|---|---|
| Internal (raw) | 747.4 KB | +267 B, +0.0% |
| Internal (gzip) | 140.8 KB | +5 B, +0.0% |
| Bundled (raw) | 1.34 MB | +269 B, +0.0% |
| Bundled (gzip) | 301.2 KB | +4 B, +0.0% |
| Import time | 95ms | -0ms, -0.0% |
@portabletext/editor/behaviors
| Metric | Value | vs editor-v6.x (5454335) |
|---|---|---|
| Internal (raw) | 467 B | - |
| Internal (gzip) | 207 B | - |
| Bundled (raw) | 424 B | - |
| Bundled (gzip) | 171 B | - |
| Import time | 2ms | +0ms, +2.4% |
@portabletext/editor/plugins
| Metric | Value | vs editor-v6.x (5454335) |
|---|---|---|
| Internal (raw) | 2.5 KB | - |
| Internal (gzip) | 910 B | - |
| Bundled (raw) | 2.3 KB | - |
| Bundled (gzip) | 839 B | - |
| Import time | 8ms | +0ms, +1.6% |
@portabletext/editor/selectors
| Metric | Value | vs editor-v6.x (5454335) |
|---|---|---|
| Internal (raw) | 60.5 KB | - |
| Internal (gzip) | 9.5 KB | - |
| Bundled (raw) | 56.9 KB | - |
| Bundled (gzip) | 8.7 KB | - |
| Import time | 6ms | -0ms, -0.9% |
@portabletext/editor/utils
| Metric | Value | vs editor-v6.x (5454335) |
|---|---|---|
| Internal (raw) | 24.2 KB | - |
| Internal (gzip) | 4.7 KB | - |
| Bundled (raw) | 22.2 KB | - |
| Bundled (gzip) | 4.4 KB | - |
| Import time | 6ms | -0ms, -0.2% |
🗺️ . · ./behaviors · ./plugins · ./selectors · ./utils · Artifacts
Details
- Import time regressions over 10% are flagged with
⚠️ - Sizes shown as raw / gzip 🗜️. Internal bytes = own code only. Total bytes = with all dependencies. Import time = Node.js cold-start median.
af8c731 to
1f25e40
Compare
When 'dragend' was missed after a successful drop, the editor machine stayed in 'dragging internally' and ignored subsequent 'dragstart' events. Any later drop then read the previous gesture's drag origin while 'dataTransfer' carried the new gesture's content, so the drop handler deleted the wrong block and duplicated the new one. 'dragstart' now re-assigns 'internalDrag.origin' even when the machine has not returned to 'idle'. Includes a regression test that drives the actor directly to capture the stale-origin state.
1f25e40 to
f04ee37
Compare
Merged
This was referenced Apr 29, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The bug
In Sanity Studio, dragging block objects between each other sometimes resulted in two copies of the second block appearing in the document, with the first block deleted. The captured event log showed the failing drop carried
dragOrigin._key = imageAwhiledataTransfercontained image B's content. The drop handler deleted the block referenced bydragOriginand inserted the block carried bydataTransfer, so image B ended up duplicated and image A was lost.How
dragOriginanddataTransfergot out of syncdragOriginis read frominternalDrag.originin the editor machine. Before this fix, the machine only assignedinternalDrag.originwhile in theidlestate, and only returned toidlewhen the document received adropordragendevent.dataTransferis overwritten by the LATESTdragstartin the behavior pipeline, which always re-runs the dragstart serializer regardless of machine state.In some browsers (and consistently in Studio under specific layouts),
dragenddoes not fire on the document after a successful drop. The machine stayed indragging internally, the nextdragstartwas ignored, andinternalDrag.originkept pointing at the previous gesture's source whiledataTransferwas freshly serialized from the new gesture. On drop, the two inputs disagreed and the drop handler corrupted the document.The fix
dragstartnow re-assignsinternalDrag.originwhile indragging internally, in addition to the existing assignment on theidle → dragging internallytransition. The behavior layer continues to trust its inputs unchanged.Regression test
packages/editor/tests/event.drag.drop.duplication.test.tsxdrives the actor directly: it dispatches two consecutivedragstartevents without an interveningdragendand asserts thatinternalDrag.originreflects the LATESTdragstart's origin, not the first.