* fix(web): make mermaid sanitizer quote-aware and detect parens in bracket labels
Two diagrams failed to render because sanitizeMermaidCode injected nested
quotes into already-quoted labels and missed parens-as-stadium-opener inside
bracket labels. Skip ranges already inside `"..."` (recomputed between
passes) and add `(`/`)` to the bracket-pass trigger set.
* refactor(web): drop dead text.startsWith('"') guards in mermaid sanitizer
The regex character classes [^\]"], [^|"], [^)"] already exclude `"`,
so the guards were unreachable.
* fix(web): stop unterminated quote bleeding across lines in mermaid sanitizer
findQuotedRanges now stops scanning at newline; an unterminated `"` is
discarded rather than paired with a `"` on a later line where it would
silently suppress sanitization of unrelated content. Add tests for the
cross-line guard and for a bracket-with-parens adjacent to a real
stadium node on the same line.
* fix(web): replace mermaid bomb-icon error flood with toast notifications
mermaid.render() called without a container leaves orphaned error
elements (with bomb icons) in document.body on parse failures. Clean up
these orphans after every render and show an error toast instead.
* fix(web): address PR review — prevent toast flooding, include error detail, add hook tests
- Add latestRenderId guard in TipTap MermaidNodeView to skip stale
renders, preventing toast spam on every keystroke
- Include mermaid error message in toast description via CustomEvent detail
- Add useMermaidErrorToast hook tests (event listener + cleanup)
* style(web): format mermaid-error-toast test with prettier
* fix(web): include error message in MermaidBlock toast description