Generate web slides from Comark

feat(core): pre-render mermaid diagrams to inline SVG master

Replaces the client-side mermaid runtime with a build-time renderer that runs mermaid inside a headless Chromium (via @astral/astral) and inlines the resulting SVG into the static HTML. The audience never loads mermaid; every viewer gets identical pixels. - Headless renderer is a lazy singleton: launches on the first diagram, reuses the same page for every subsequent render, closes cleanly in the build CLI's finally block. - Prefers an installed Chrome/Edge over Astral's bundled snapshot (the snapshot fails to start on machines missing the matching VC++ side-by-side runtime). MORKDECK_CHROME_PATH overrides. - Per-machine cache at %LOCALAPPDATA%\morkdeck\mermaid (with XDG / ~/.cache fallbacks). SHA-256 over format | theme version | mermaid version | source — cache hit skips Chrome entirely, so rebuilds with unchanged diagrams finish in well under a second. - Error policy: bail the build on MermaidRenderError; in dev mode emit the source + message inline so authoring stays interactive. - Renderer page typography matches the audience's body exactly (font-family, weight, feature settings, size). Recursive is loaded with display=block and explicitly awaited via document.fonts.load for each weight mermaid will measure — font-display=swap + document.fonts.ready alone was racing the swap, leaving mermaid to measure narrower fallback glyphs and the audience to paint wider Recursive ones into the resulting too-small foreignObjects. - slide-styles resets typography rules inside mermaid foreignObjects so morkdeck-slide p / ul / ol selectors don't leak slide body font-size, 56ch max-width, or margins into mermaid's label HTML. - Drops the partials/mermaid.eta runtime, the "mermaid" Includes entry, and the __morkdeckMermaidReady await in the presentation component. The presenter-mode-must-wait-for-mermaid guard disappears with the runtime that needed it. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>