A schema-enforced, block-based editor engine inspired by Notion — built from first principles.
Not a UI experiment. An editor engine.
Notes-It is a custom block editor engine built without ProseMirror, Lexical, Slate, or TipTap.
It focuses on:
- Schema guarantees
- Deterministic state
- Correct cursor behavior
- Block-level correctness
- Editor-engine architecture, not hacks
This project explores how modern editors actually work — not just how they look.
Each block is a real semantic node with enforced behavior:
- Paragraph
- Heading (level-based)
- List (bullet & numbered)
- Code block (atomic)
- Quote
- Divider (atomic)
- Image (atomic, planned)
- Draw.io diagram (planned)
No block is “just CSS”.
Invalid document states are unrepresentable by design.
- Divider blocks can never contain text
- Code blocks cannot contain formatting
- Empty documents always normalize to a paragraph
- Lists normalize safely when exited
- Blocks auto-recover via global normalization
This eliminates entire classes of editor bugs.
Inline content is stored as structured nodes:
InlineNode {
id: string
text: string
marks: Mark[]
}