Block Editing Paradigm
Comparing block-based, inline, and hybrid approaches to rich text editing. Understanding the architectural tradeoffs.
Three Paradigms
Inline / Document Model
ProseMirror, Tiptap, SlateThe document is a tree of nodes with inline marks. Text runs freely across the document with marks (bold, italic, etc.) applied as ranges. Maximum flexibility for inline formatting.
Block-Based
Editor.jsEach block is independent with its own type, data, and rendering. Blocks are the atomic units β you can't have inline content spanning blocks. Clean JSON output.
Hybrid (Block + Inline)
BlockNote, Notion, AFFiNEBlocks are the container units, but each block contains rich inline content. Combines block-level structure (drag, reorder, nest) with inline-level formatting (bold, italic, links).
Data Model Comparison
Inline Model (ProseMirror/Tiptap)
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{ "type": "text", "text": "Hello " },
{ "type": "text", "text": "world", "marks": [{ "type": "bold" }] },
{ "type": "text", "text": "!" }
]
}
]
}Block Model (Editor.js)
{
"blocks": [
{
"type": "paragraph",
"data": { "text": "Hello <b>world</b>!" }
},
{
"type": "heading",
"data": { "text": "Title", "level": 2 }
},
{
"type": "image",
"data": { "url": "photo.jpg", "caption": "A photo" }
}
]
}Hybrid Model (BlockNote)
// Hybrid approach (BlockNote, Notion)
// Blocks contain inline content with marks
{
"type": "paragraph",
"content": [
{ "type": "text", "text": "Hello ", "styles": {} },
{ "type": "text", "text": "world", "styles": { "bold": true } }
],
"props": { "backgroundColor": "yellow" }
}Feature Comparison
| Feature | Inline (ProseMirror) | Block (Editor.js) | Hybrid (BlockNote) |
|---|---|---|---|
| Inline formatting | Full (marks system) | Limited (HTML in blocks) | Full (styled text) |
| Block drag & drop | Plugin needed | Built-in | Built-in |
| Nested blocks | Via schema | No | Yes |
| Custom blocks | NodeViews | Tool plugins | Custom types |
| Cross-block selection | Yes | No | Limited |
| Collaboration | OT / CRDT | Not built-in | Yjs (CRDT) |
| Data format | JSON tree | Flat JSON blocks | Nested JSON |
| Learning curve | Steep | Easy | Moderate |
| Markdown support | Via serializer | No | Built-in |
Ecosystem
ProseMirror
The gold standard for inline document editing. Powers Atlassian, NYT, Tiptap, Milkdown.
InlineEditor.js
Simple block editor by CodeX. Clean JSON output, easy custom blocks. Good for CMS.
BlockBlockNote
Modern hybrid editor built on ProseMirror + Tiptap. React-focused, Notion-like UX.
HybridBlockSuite / AFFiNE
Next-gen block editor framework. CRDT-native, supports canvas + doc modes.
HybridLexical (Meta)
React-focused editor with its own document model. Hybrid approach, extensible nodes.
HybridSlate
React-only editor framework. Custom rendering, plugin-based. Flexible but React-locked.
InlineRecommendation
- Content writing / docs: Inline (ProseMirror/Tiptap) β maximum formatting flexibility
- CMS / structured content: Block (Editor.js) β clean data model, easy custom types
- Notion-clone / knowledge base: Hybrid (BlockNote) β best UX for drag-and-drop + rich text
- Markdown-first: CodeMirror 6 or Milkdown β markdown as source of truth