docs/solutions/logic-errors/2026-04-06-v2-read-only-should-stay-app-level-until-the-editor-surface-owns-it.md
While widening the editorial family in the replacement matrix, plaintext
proved quickly.
read-only did not.
The tempting move was to force a readOnly prop onto the current Editable
surface and call the family covered.
That would have been a lie.
read-only matrix row still saw contenteditable="true".role="textbox".readOnly as a tiny prop-threading change.
The public contract looked small, but the behavior was not honestly packaged.Remove the fake package contract and keep the current read-only surface app-level.
The winning move was:
Editable and EditableBlocks as active editing surfacesread-only example surface built from existing render
primitivesThat keeps the replacement story honest:
This preserves the real package boundary.
The current slate-react editor-facing surface is still optimized around
active editing:
If a supposedly read-only option still exposes the active editing DOM contract, the package is claiming more than it owns.
An app-level current surface is better than a lying package prop.