# Manual Testing Checklist

Comprehensive manual test scenarios organized by functional area. Each test targets either a feature not covered by automated tests, a cross-component interaction that is hard to isolate, or a visual/rendering concern requiring human inspection.

---

## 1. Block Management (Multi-Block Editor)

- [ ] **1.1 Block creation** — Type in an empty block; verify new paragraph block appears
- [ ] **1.2 Insertion zones** — Click between blocks; verify zone activates, typing creates a new block
- [ ] **1.3 Insertion zone keyboard** — ArrowUp/Down into zone, Enter to create block, character key to create block with typed text
- [ ] **1.4 Paste into insertion zone** — Paste multi-line content into an insertion zone; verify one block per line is created
- [ ] **1.5 Block split (Enter)** — Press Enter mid-paragraph; verify block splits with cursor in new block
- [ ] **1.6 Block split with Shift+Enter** — Press Shift+Enter; verify soft line break within same paragraph (not a block split)
- [ ] **1.7 Block split (multi-paragraph)** — Type two paragraphs in one block, press Enter; verify only current paragraph splits
- [ ] **1.8 Merge with Backspace** — Press Backspace at start of block; verify merges into previous block
- [ ] **1.9 Delete-if-empty** — Press Backspace in an empty block; verify block is deleted
- [ ] **1.10 Delete last remaining block** — Verify last block cannot be deleted (stays as empty paragraph)
- [ ] **1.11 ArrowUp from first block** — Press ArrowUp at block start; verify no crash (emits boundary event)
- [ ] **1.12 ArrowDown from last block** — Press ArrowDown at block end; verify no crash (emits boundary event)
- [ ] **1.13 Drag bullet visible** — Verify each block has a visible bullet dot (always shown, not hidden)
- [ ] **1.14 Bullet hover feedback** — Hover over a bullet; verify color changes from muted to primary
- [ ] **1.15 Bullet drag feedback** — Start dragging a bullet; verify it turns primary color and grows slightly (size-6 → size-7)
- [ ] **1.16 Drag-to-reorder** — Grab the bullet dot, drag to a zone line between two other blocks; verify block order changes
- [ ] **1.17 Drop zone indicator** — During a drag, hover over an insertion zone; verify the zone shows a primary-colored bar
- [ ] **1.18 Drop zone between blocks** — Drop a block into a zone between two blocks; verify it lands in between
- [ ] **1.19 Drop zone at top/bottom** — Drop a block into the zone before the first block or after the last block; verify it lands at the edge
- [ ] **1.20 Drag reorder undo** — Drag reorder, then undo; verify block order restores
- [ ] **1.21 Indent (Tab)** — Press Tab; verify block indents (depth++)
- [ ] **1.22 Outdent (Shift+Tab)** — Press Shift+Tab; verify block outdents (depth--)
- [ ] **1.23 Indent cascade** — Indent a parent block; verify all child blocks also indent
- [ ] **1.24 Outdent cascade** — Outdent; verify children follow
- [ ] **1.25 Indent max depth** — Indent repeatedly to depth 10; verify clamped
- [ ] **1.26 Outdent min depth** — Outdent at depth 0; verify stays at depth 0

---

## 2. Inline Formatting (Markdown Decorations)

- [ ] **2.1 Bold `**text**`** — Type `**bold**`; verify bold text rendered with hidden markers
- [ ] **2.2 Italic `*text*`** — Type `*italic*`; verify italic rendered
- [ ] **2.3 Strikethrough `~~text~~`** — Type `~~strike~~`; verify strikethrough rendered
- [ ] **2.4 Highlight `^^text^^`** — Type `^^highlight^^`; verify highlight rendered
- [ ] **2.5 Inline Code `` `code` ``** — Type `` `code` ``; verify inline code rendered
- [ ] **2.6 Nested formatting** — Type `***italicbold***`, `**bold `code`**`; verify both formats apply
- [ ] **2.7 Link `[text](url)`** — Type `[link](https://example.com)`; verify link rendered, URL hidden
- [ ] **2.8 Unmatched delimiters** — Type `**unmatched`; verify renders as literal text
- [ ] **2.9 Combined bold+link** — Type `**[text](url)**`; verify bold linked text

---

## 3. References & Tags

- [ ] **3.1 Page ref `[[Name]]`** — Type `[[Page Name]]`; verify rendered as page reference
- [ ] **3.2 Page ref with alias `[[Real|Display]]`** — Type `[[Real Page|Display Name]]`; verify alias rendered
- [ ] **3.3 Block ref `((block-id))`** — Type `((block-id-1234))`; verify block reference rendered
- [ ] **3.4 Tag `#tag` at word boundary** — Type `#tag` after space; verify tag rendered
- [ ] **3.5 Tag NOT in middle of word** — Type `some#tag`; verify NOT rendered as tag

---

## 4. Suggestion Menu (Pattern Plugin)

- [ ] **4.1 Slash `/` menu opens** — Type `/`; verify suggestion menu appears at cursor position
- [ ] **4.2 Slash menu filters by query** — Type `/he`; verify menu filters to heading options
- [ ] **4.3 Slash menu keyboard nav** — ArrowDown/ArrowUp through items; verify highlight moves and wraps at ends
- [ ] **4.4 Slash menu Enter selects** — Select "Heading 1"; verify `# ` inserted
- [ ] **4.5 Slash menu Escape cancels** — Press Escape; verify menu closes with no text change
- [ ] **4.6 `[[` menu opens** — Type `[[`; verify page reference menu appears
- [ ] **4.7 `[[` menu Enter selects** — Select a page; verify `[[Page Name]]` inserted
- [ ] **4.8 `((` menu opens** — Type `((`; verify block embed menu appears
- [ ] **4.9 `((` menu completion** — Select a block; verify `((block-id))` inserted
- [ ] **4.10 `#` tag menu** — Type `#`; verify tag completion menu appears
- [ ] **4.11 Menu position on scroll** — Scroll the page; verify menu repositions to follow cursor
- [ ] **4.12 Menu closes on completion** — After selecting an item; verify menu closes

---

## 5. Toolbar

- [ ] **5.1 Toolbar disabled without focus** — No block focused; verify toolbar buttons disabled
- [ ] **5.2 Bold button** — Select text, click Bold; verify `**text**` wraps selection
- [ ] **5.3 Italic button** — Select text, click Italic; verify `*text*` wraps
- [ ] **5.4 Code button** — Select text, click Code; verify `` `text` `` wraps
- [ ] **5.5 Strikethrough button** — Select text, click Strike; verify `~~text~~` wraps
- [ ] **5.6 Highlight button** — Select text, click Highlight; verify `^^text^^` wraps
- [ ] **5.7 Heading dropdown** — Select heading level; verify `# ` prefix inserted
- [ ] **5.8 Link button** — Click link, modal opens, enter URL, Enter; verify `[selected](url)`
- [ ] **5.9 Page ref button** — Click, modal, enter name, Enter; verify `[[name]]`
- [ ] **5.10 Block ref button** — Click, modal, enter ID, Enter; verify `((id))`
- [ ] **5.11 Tag button** — Click, modal, enter tag, Enter; verify `#tag`
- [ ] **5.12 Inline math button** — Click; verify `$ $` inserted with cursor inside
- [ ] **5.13 Block math button** — Click; verify `$$\n\n$$` inserted with cursor between
- [ ] **5.14 Escape closes toolbar modal** — Open any modal, press Escape; verify modal closes

---

## 6. Auto-Close Plugin

- [ ] **6.1 Parentheses** — Type `(`; verify `()` with cursor between
- [ ] **6.2 Square brackets** — Type `[`; verify `[]` with cursor between
- [ ] **6.3 Curly braces** — Type `{`; verify `{}` with cursor between
- [ ] **6.4 Double quotes** — Type `"` after space; verify `""` with cursor between
- [ ] **6.5 Double quotes mid-word** — Type `"` in middle of word; verify NOT auto-closed
- [ ] **6.6 Single quotes** — Type `'` after space; verify `''`
- [ ] **6.7 Wrap selection in parens** — Select text, type `(`; verify `(selected)`
- [ ] **6.8 Skip-over close** — Cursor between `()`, type `)`; verify cursor moves past `)`
- [ ] **6.9 Delete pair (Backspace)** — Cursor between `()`, press Backspace; verify both parens removed
- [ ] **6.10 Bold auto-close `**`** — Type `*` then `*` after word; verify `****` with cursor between
- [ ] **6.11 Strike auto-close `~~`** — Type `~~`; verify `~~~~` with cursor between
- [ ] **6.12 Highlight auto-close `^^`** — Type `^^`; verify `^^^^` with cursor between
- [ ] **6.13 Inline math auto-close `$`** — Type `$` at word boundary; verify `$$` with cursor between
- [ ] **6.14 Block math `$$` conversion** — Type `$$` at line start; verify converts to math_block
- [ ] **6.15 Code fence `` ``` ``** — Type `` ``` `` at line start; verify converts to code_block
- [ ] **6.16 Underscore italic `_`** — Type `_` at word boundary; verify `__` with cursor between; NOT mid-word

---

## 7. Headings

- [ ] **7.1 H1 through H6** — Type `#` through `######`; verify heading rendered with correct level
- [ ] **7.2 Leading whitespace before `#`** — Type ` # heading`; verify heading still recognized
- [ ] **7.3 Heading in middle of paragraph** — Type `text # not heading`; verify NOT rendered as heading
- [ ] **7.4 Heading live preview** — Focus on a heading; verify hash marks hidden/faded; blur, verify hash marks visible

---

## 8. Tasks

- [ ] **8.1 Task state TODO** — Type `TODO task text`; verify task rendered with TODO indicator
- [ ] **8.2 Task state DOING** — Type `DOING task`; verify DOING indicator
- [ ] **8.3 Task state DONE** — Type `DONE task`; verify DONE indicator
- [ ] **8.4 Task state LATER** — Type `LATER task`; verify LATER indicator
- [ ] **8.5 Task state NOW** — Type `NOW task`; verify NOW indicator
- [ ] **8.6 Task state WAITING** — Type `WAITING task`; verify WAITING indicator
- [ ] **8.7 Task state CANCELLED** — Type `CANCELLED task`; verify CANCELLED indicator
- [ ] **8.8 Task toggle via toolbar** — Click task toggle button; verify state cycles through TODO → DOING → DONE

---

## 9. Blockquotes & Callouts

- [ ] **9.1 Blockquote `> text`** — Type `> quote`; verify blockquote rendered
- [ ] **9.2 Callout `> [!NOTE]`** — Type `> [!NOTE] Description`; verify callout with NOTE style
- [ ] **9.3 Callout `> [!WARNING]`** — Verify WARNING style
- [ ] **9.4 Callout `> [!TIP]`** — Verify TIP style
- [ ] **9.5 Callout `> [!DANGER]`** — Verify DANGER style
- [ ] **9.6 Callout `> [!INFO]`** — Verify INFO style
- [ ] **9.7 Callout continuation lines** — Type two lines: `> [!NOTE] header` then `> continuation`; verify both styled as callout
- [ ] **9.8 Blockquote continuation** — Multiple `> ` lines; verify they merge into one blockquote

---

## 10. Tables

- [ ] **10.1 Simple table rendering** — Type `| A | B |\n|---|---|\n| 1 | 2 |`; verify rendered as table when blurred
- [ ] **10.2 Click to focus and edit** — Click rendered table; verify block focuses, pipe syntax becomes editable
- [ ] **10.3 Table in live preview** — Verify pipes hidden/faded when focused, fully visible when blurred
- [ ] **10.4 Table header row** — Verify header row recognized and styled differently

---

## 11. Horizontal Rules

- [ ] **11.1 HR `---`** — Type `---` on its own line; verify horizontal rule rendered
- [ ] **11.2 HR `***`** — Type `***`; verify horizontal rule rendered (odd-length `***`)
- [ ] **11.3 HR `----`** — Type `----`; verify HR (even-length also valid)
- [ ] **11.4 NOT HR `*****`** — Type `*****`; verify NOT HR (recognized as bold)

---

## 12. Properties

- [ ] **12.1 Property at line start** — Type `key:: value`; verify key styled as property, value visible
- [ ] **12.2 Property NOT mid-line** — Type `not a key:: value`; verify NOT rendered as property
- [ ] **12.3 Multiple properties** — Multiple `key:: value` lines; verify each styled correctly

---

## 13. Code Blocks

- [ ] **13.1 Create via triple backtick** — Type `` ``` `` at line start; verify code block created
- [ ] **13.2 Language detection** — Type `` ```typescript ``; verify language detected with correct syntax highlighting
- [ ] **13.3 Language switching** — Click language dropdown, change from JS to Python; verify highlighting updates
- [ ] **13.4 Typing inside code block** — Type code; verify CM6 editor handles keystrokes, PM sees fence-wrapped content
- [ ] **13.5 ArrowUp at code block start** — Cursor at first line, press ArrowUp; verify exits to previous block
- [ ] **13.6 ArrowDown at code block end** — Cursor at last line, press ArrowDown; verify exits to next block
- [ ] **13.7 Backspace empty code block** — Delete all content, press Backspace; verify block removed
- [ ] **13.8 Shift+Enter in code block** — Press Shift+Enter; verify new paragraph inserted after code block
- [ ] **13.9 Code block with no language** — Type `` ``` `` alone; verify code block with no syntax highlighting
- [ ] **13.10 Tilde fences `~~~`** — Type `~~~js`; verify code block created with tilde fences

---

## 14. Math Blocks

- [ ] **14.1 Create via `$$`** — Type `$$` at line start; verify math_block created
- [ ] **14.2 KaTeX rendering** — Type `$$\nE=mc^2\n$$`; verify rendered LaTeX preview
- [ ] **14.3 Inline math `$x^2$`** — Type `$x^2+1$`; verify inline KaTeX rendered when blurred
- [ ] **14.4 Inline math editing** — Focus on inline math; verify raw `$math$` visible and editable
- [ ] **14.5 Math block empty** — Create empty math block; verify no render errors
- [ ] **14.6 Navigation at math block boundaries** — ArrowUp/Down at math block edges; verify focus moves correctly

---

## 15. Undo / Redo

- [ ] **15.1 Typing undo** — Type text, press Ctrl+Z (or ⌘Z); verify text reverted
- [ ] **15.2 Typing redo** — After undo, press Ctrl+Shift+Z; verify text restored
- [ ] **15.3 Block split undo** — Split a block with Enter, then undo; verify blocks merge back
- [ ] **15.4 Block merge undo** — Merge with backspace, then undo; verify split restored
- [ ] **15.5 Block indent undo** — Indent with Tab, then undo; verify depth restored
- [ ] **15.6 Block delete undo** — Delete an empty block, undo; verify block reappears
- [ ] **15.7 History coalescing** — Type rapidly; verify single undo step reverts all, not character-by-character
- [ ] **15.8 History separate for pause** — Type, pause >500ms, type more; verify two separate undo steps
- [ ] **15.9 Toolbar undo/redo buttons** — Click undo/redo buttons; verify same behavior as keyboard

---

## 16. Live Preview & Marker Visibility

- [ ] **16.1 Markers hidden when blurred** — Click outside editor; verify `**`, `*`, `` ` ``, `~~`, `^^` markers are hidden
- [ ] **16.2 Markers visible near cursor** — Click inside formatted text; verify markers fade or show near cursor
- [ ] **16.3 `always-visible` mode** — Set `markerMode="always-visible"`; verify markers never hide
- [ ] **16.4 `live-preview` mode default** — Default mode; verify markers hide on blur
- [ ] **16.5 Table source hidden on blur** — Blur a table block; verify raw pipe syntax hidden, rendered table shown
- [ ] **16.6 Inline math KaTeX on blur** — Blur inline math; verify rendered math shown, `$` hidden

---

## 17. Paste Handling

- [ ] **17.1 Single-line paste** — Paste one line of text; verify it stays in current block
- [ ] **17.2 Multi-line paste (same type)** — Paste multiple paragraphs; verify they stay in current block
- [ ] **17.3 Multi-line paste (mixed types)** — Paste `para\npara\n> blockquote`; verify block splits with each type in own block
- [ ] **17.4 Paste with code fences** — Paste text containing `` ``` ``; verify code block created correctly

---

## 18. Focus Management

- [ ] **18.1 Focus one block at a time** — Click different blocks; verify only one block has focus
- [ ] **18.2 Focus registry tracking** — Check focusedId updates as different blocks are clicked
- [ ] **18.3 Column-preserving navigation** — ArrowUp/Down between blocks; verify cursor aligns to same X coordinate
- [ ] **18.4 Programmatic focus** — Set cursorPosition prop; verify block focuses at correct position

---

## 19. Extensibility & Plugins

- [ ] **19.1 Custom pattern triggers** — Add `extraPatterns` prop; verify custom trigger opens suggestion menu
- [ ] **19.2 Custom inline rules** — Register `extraInlineRules`; verify new syntax is decorated
- [ ] **19.3 Custom NodeViews** — Register custom nodeView; verify it renders correctly

---

## 20. Theme System

- [ ] **20.1 Default theme** — Verify default CSS variables applied
- [ ] **20.2 Kanagawa theme** — Apply kanagawa preset; verify colors change
- [ ] **20.3 Custom theme** — Provide custom ThemeInput; verify CSS variables override
- [ ] **20.4 Theme switching at runtime** — Switch themes; verify all components update instantly

---

## 21. Debug Logging

- [ ] **21.1 Global debug `*`** — Set `localStorage.setItem("editor:debug", "*")`; verify all namespaces logged
- [ ] **21.2 Filtered namespaces** — Set `"Block,ParseEngine"`; verify only those namespaces logged
- [ ] **21.3 Per-component debug** — Set `debug` prop on EditorBlock; verify scoped filtering

---

## 22. Error Recovery

- [ ] **22.1 EditorBlock mount failure** — Deliberately break state; verify block falls back to textarea
- [ ] **22.2 Invalid markdown** — Type extremely malformed markdown; verify no crash
- [ ] **22.3 Empty document** — Start with empty markdown; verify editor renders one empty paragraph block

---

## 23. Edge Cases & Cross-Cutting

- [ ] **23.1 Unicode/emoji in content** — Type emoji and CJK characters; verify roundtrip through parse/serialize
- [ ] **23.2 Very long content in a block** — Type >1000 characters in one block; verify no performance regression
- [ ] **23.3 Rapid typing** — Type very fast; verify coalescing works with no duplicate blocks
- [ ] **23.4 Keyboard shortcut collision** — Verify Mod+b (bold) does not conflict with browser behavior
- [ ] **23.5 Vim keybindings** — Switch to vim bindings; verify `h/j/k/l` navigation within block
