docs/solutions/logic-errors/2026-04-04-slate-v2-no-feff-line-break-placeholders-need-dom-owned-br-interiors.md
The next honest slate-v2 proof after the FEFF-backed placeholder path was the
real question:
The first no-FEFF proof did not just fail selection or text. It blew up the editor surface with:
NotFoundError: Failed to execute 'removeChild' on 'Node'React lost the editable entirely.
” problem.compositionend did not save the no-FEFF path while React
still owned the inner child.The working renderer boundary was:
as DOM-owned interior, not as a
React child fiberIn the proof surface that meant:
'\uFEFF' plus comes from
dangerouslySetInnerHTMLWith that boundary in place, the no-FEFF Chromium proof passed:
{ hasBr: true, hasFEFF: false, kind: 'n' }すし0.0:2|0.0:2slate-react-v2The shared v2 component now lives in:
Its current policy is intentionally split:
interiorThe browser matrix that pins that split lives in:
The browser mutates the empty line-break placeholder subtree during IME.
If React owns the exact child the browser rewrites, React later tries
to reconcile stale child bookkeeping against a subtree the browser has already
changed.
That is where the removeChild crash came from.
Once React ownership stops at the wrapper boundary, the browser can mutate the interior during composition and React can still replace the whole empty branch cleanly when the committed text arrives.
So the important distinction is:
For slate-v2 line-break placeholder paths that drop FEFF:
interior DOM-owned if the browser rewrites itIf a no-FEFF path crashes with a React removeChild error, do not immediately
conclude that FEFF is mandatory.
First check whether React is owning the wrong DOM node.