ADR-003: Notion-like Email Builder
Why Owlat replaced the traditional 3-panel email editor with a Notion-like single-column canvas for inline WYSIWYG editing.
- Status: Accepted
- Date: 2025-01-10
Context
The original email builder used a traditional 3-panel layout: a block palette on the left, a canvas in the center, and a property panel on the right. This is the standard approach used by most email editors (Mailchimp, Beehiiv, etc.).
User feedback and internal testing revealed problems:
- Cognitive overhead — users constantly context-switched between the palette, canvas, and property panel. Editing a block required: (1) click the block on canvas, (2) look right to find settings, (3) make changes, (4) look back to canvas to see the result.
- Wasted space — the palette and property panel consumed screen width even when not in use, leaving a narrow canvas that didn't represent the actual email width.
- Drag-and-drop friction — dragging blocks from a palette into a specific position was imprecise, especially for reordering existing blocks.
Notion, Linear, and modern document editors solve this with inline editing: content is edited where it lives, and tools appear contextually.
Decision
Replace the 3-panel layout with a single-column document canvas (Notion-like editor). Blocks are edited inline. Settings appear in a floating popover anchored to the selected block. New blocks are inserted via a slash command menu or a horizontal toolbar.
Key components:
DocumentCanvas.vuereplacesCanvasArea.vueBlockSettingsPopover.vuereplacesPropertyPanel.vueFloatingFormatBar.vuefor text formattingBlockInsertToolbar.vuefor quick block insertion- Slash command menu (
/) for keyboard-first block insertion
Consequences
Enables:
- WYSIWYG editing — what you see on canvas is what the email looks like
- Keyboard-first workflow — slash commands, arrow key navigation, Enter to add blocks
- Full-width canvas that matches email rendering width
- Simpler mental model — "click to edit, type to write"
- Mobile-friendly editing (no multi-panel layout to squeeze)
Trade-offs:
- More complex component architecture — floating popovers need anchor management (
useBlockSettingsPopover.ts) - Layout blocks (Columns, Container, Hero) use
defineAsyncComponentto break circular imports - Old 3-panel components are kept for backward compatibility but no longer used by
EmailBuilder.vue - Some power-user features (bulk property editing, block tree view) are harder to surface without a persistent side panel