Skip to content

Fix caret jumping to wrong position when decorations restructure DOM #5987#6033

Open
dannelundqvist wants to merge 4 commits intoianstormtaylor:mainfrom
dotvoid:fix/decorate-caret-jump-5987
Open

Fix caret jumping to wrong position when decorations restructure DOM #5987#6033
dannelundqvist wants to merge 4 commits intoianstormtaylor:mainfrom
dotvoid:fix/decorate-caret-jump-5987

Conversation

@dannelundqvist
Copy link
Copy Markdown

Description

When decorate changes asynchronously, the caret jumps to the wrong position.

Root cause: Text components re-render in a separate React commit from Editable. When decorations restructure the DOM, Editable's selection-restoration useLayoutEffect has already run and never re-fires, leaving the browser selection pointing at a stale node.

A forceUpdate() in useDecorateContext forces Editable to re-render in the same commit as the Text components, so the layout effect runs after the updated DOM is in place.

Example and integration test added: Decorations Async — an editor where duplicate words are highlighted 600 ms after each edit, demonstrating that the caret stays put when the async decoration update fires.

Closes #5987

Checks

  • [x ] The new code matches the existing patterns and styles.
  • [ x] The tests pass with yarn test.
  • [ x] The linter passes with yarn lint. (Fix errors with yarn fix.)
  • [ x] The relevant examples still work. (Run examples with yarn start.)
  • [x ] You've added a changeset if changing functionality. (Add one with yarn changeset add.)

…hat the selection restoration layout effect runs after the decoration-induced DOM changes are committed. Without this, text components re-render and restructure the DOM in a separate pass where Editable's layout effect never fires, leaving the caret at a wrong position.
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 27, 2026

🦋 Changeset detected

Latest commit: 072cd7b

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
slate-react Patch

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Caret jumps to wrong position when decorate callback changes from async state update

1 participant