Block editor: - Vanilla JS rendering (renderBlock) — zero Alpine x-for on blocks - 15 block types with Notion placeholders (Heading 1-4, Toggle list, Empty quote, etc.) - Event delegation keydown handler on container - sync() before every render() — content preserved across Enter/Backspace/type changes - Slash menu with event delegation, single innerHTML set, window.E for applySlash - Markdown shortcuts use idx (not bid) to avoid stale references after render - data-bid only on contentEditable (not .block-wrapper) — fixes '+' artifact - .empty class + outline:none on block-content Sidebar: - Notion-style collapsible sections (Recents/Private/Shared/Notion apps) - Workspace header with chevron, Search tab, Home tab - Sticky footer with '+ New page' button - sectionsOpen/toggleSection/toggleWorkspaceMenu/openQuickFind in appState - CSS: uppercase section headers, 240px width, collapsed 56px mode, border-right