From 39f19ecd1e2f145f05d3c6d3a6ce54022b6d32ae Mon Sep 17 00:00:00 2001 From: Ryan Mitts Date: Sat, 12 Mar 2022 00:29:16 -0800 Subject: [PATCH] When resolving a slate Point from a DOM selection (toSlatePoint), consider that a node is only void if it's within the same editor that is resolving the Point. If you have a nested editor setup. For example, one editor has a void node that contains another editor. In this case, a resolution of a selection by the nested editor previously would consider that the selection is for a void node since an ancestor void node does exist. However, this selection is only a void node in the context of this editor if the ancestor void node is contained in the editor. --- packages/slate-react/src/plugin/react-editor.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/slate-react/src/plugin/react-editor.ts b/packages/slate-react/src/plugin/react-editor.ts index 83f2f2edaf3..83a429f99e6 100644 --- a/packages/slate-react/src/plugin/react-editor.ts +++ b/packages/slate-react/src/plugin/react-editor.ts @@ -484,7 +484,16 @@ export const ReactEditor = { let offset = 0 if (parentNode) { - const voidNode = parentNode.closest('[data-slate-void="true"]') + const editorEl = ReactEditor.toDOMNode(editor, editor) + const potentialVoidNode = parentNode.closest('[data-slate-void="true"]') + // Need to ensure that the closest void node is actually a void node + // within this editor, and not a void node within some parent editor. This can happen + // if this editor is within a void node of another editor ("nested editors", like in + // the "Editable Voids" example on the docs site). + const voidNode = + potentialVoidNode && editorEl.contains(potentialVoidNode) + ? potentialVoidNode + : null let leafNode = parentNode.closest('[data-slate-leaf]') let domNode: DOMElement | null = null