react-super-mermaid 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/env.ts","../src/core/load-mermaid.ts","../src/core/load-svg-pan-zoom.ts","../src/core/styles.css.ts","../src/core/ensure-styles.ts","../src/core/themes/colorize.ts","../src/core/themes/sketch.ts","../src/core/resolve-theme.ts","../src/core/render-pipeline.ts","../src/core/pan-zoom.ts","../src/core/search.ts","../src/core/export.ts","../src/react/useMermaidViewer.ts","../src/react/Toolbar.tsx","../src/react/MermaidViewer.tsx","../src/react/MermaidDiagram.tsx"],"names":["cached","resolve","SVG_NS","useState","useRef","useCallback","useMemo","useEffect","jsxs","jsx","forwardRef","MermaidViewer","useImperativeHandle","MermaidDiagram"],"mappings":"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","file":"index.cjs","sourcesContent":["// SSR 安全:本套件可被 Next.js 等 server 端 import,故任何 DOM 存取都必須在\n// 執行階段(函式被呼叫時)才發生,且先經過這裡的瀏覽器環境判斷。\n\nexport function isBrowser(): boolean {\n return typeof document !== 'undefined' && typeof window !== 'undefined';\n}\n\n/** 在需要 DOM 的進入點呼叫;非瀏覽器環境拋出明確錯誤而非無聲失敗。 */\nexport function assertBrowser(api: string): void {\n if (!isBrowser()) {\n throw new Error(`[react-super-mermaid] ${api} 需要瀏覽器 DOM(document / window)。`);\n }\n}\n","// 「載入外部 mermaid」解析器。\n// 解析順序:(a) 注入實例 > (b) peer 動態 import('mermaid') > (c) CDN ESM import。\n// 模組級 memoize,讓笨重的 mermaid 模組整頁只載入一次。\n// 全程無頂層 DOM 存取,SSR 安全(快取初始為 null)。\n\nimport { assertBrowser } from '../env';\nimport type { LoadMermaidOptions, MermaidLike } from '../types';\n\nlet cached: Promise<MermaidLike> | null = null;\n\nexport function loadMermaid(opts: LoadMermaidOptions = {}): Promise<MermaidLike> {\n const source = opts.source ?? {};\n\n // (a) 注入實例 — 同步、不觸網、不打包。\n if (source.instance) {\n cached = Promise.resolve(normalize(source.instance));\n return cached;\n }\n\n if (opts.fresh) {\n cached = null;\n }\n if (cached) {\n return cached;\n }\n\n cached = resolve(source).catch((err) => {\n cached = null; // 暫時性失敗後允許重試。\n throw err;\n });\n return cached;\n}\n\nasync function resolve(source: { cdnUrl?: string }): Promise<MermaidLike> {\n // (c) 明確指定 CDN → 直接動態 import 該 ESM 網址,完全不碰 peer 'mermaid'。\n // ignore 註解只加在「執行階段 URL」這條,讓 Vite/webpack 不要嘗試靜態打包它。\n if (source.cdnUrl) {\n assertBrowser('loadMermaid({ cdnUrl })');\n const mod = (await import(/* @vite-ignore */ /* webpackIgnore: true */ source.cdnUrl)) as {\n default?: MermaidLike;\n };\n return normalize(mod.default ?? (mod as unknown as MermaidLike));\n }\n // (b) peer 動態 import('mermaid')。保留為可被 bundler 解析的 bare specifier,\n // 故 host 安裝了 mermaid 時 Vite/webpack 會正確處理。未安裝則拋出明確指引。\n try {\n const mod = (await import('mermaid')) as { default?: MermaidLike };\n return normalize(mod.default ?? (mod as unknown as MermaidLike));\n } catch (peerErr) {\n throw new Error(\n '[react-super-mermaid] 找不到 mermaid。請安裝 mermaid(peer dependency)、' +\n '傳入 { instance },或傳入 { cdnUrl }。\\n' +\n `原始錯誤:${peerErr instanceof Error ? peerErr.message : String(peerErr)}`,\n );\n }\n}\n\nfunction normalize(m: MermaidLike): MermaidLike {\n if (typeof m.render !== 'function' || typeof m.initialize !== 'function') {\n throw new Error('[react-super-mermaid] 解析到的物件不是有效的 mermaid 實例。');\n }\n return m;\n}\n","// svg-pan-zoom 解析器,與 load-mermaid 同模式但為 optional:\n// 解析不到(host 未安裝、未提供 CDN)時回傳 null,呼叫端據此略過 pan/zoom,\n// render 與後處理仍可正常運作 → 維持「靜態顯示也零相依」。\n\nimport { assertBrowser } from '../env';\nimport type { SvgPanZoomFactory, SvgPanZoomSource } from '../types';\n\nlet cached: Promise<SvgPanZoomFactory | null> | null = null;\n\nexport function loadSvgPanZoom(source: SvgPanZoomSource = {}): Promise<SvgPanZoomFactory | null> {\n if (source.instance) {\n cached = Promise.resolve(source.instance);\n return cached;\n }\n if (cached) {\n return cached;\n }\n cached = resolve(source).catch(() => {\n cached = null;\n return null; // optional:失敗就當沒有 pan/zoom。\n });\n return cached;\n}\n\nasync function resolve(source: { cdnUrl?: string }): Promise<SvgPanZoomFactory | null> {\n // CDN 明確指定 → 直接載入該 URL,不碰 peer。\n if (source.cdnUrl) {\n assertBrowser('loadSvgPanZoom({ cdnUrl })');\n const mod = (await import(/* @vite-ignore */ /* webpackIgnore: true */ source.cdnUrl)) as {\n default?: SvgPanZoomFactory;\n };\n return mod.default ?? (mod as unknown as SvgPanZoomFactory);\n }\n // peer 動態 import('svg-pan-zoom');未安裝則回 null(optional,靜默略過 pan/zoom)。\n try {\n const mod = (await import('svg-pan-zoom')) as { default?: SvgPanZoomFactory };\n return mod.default ?? (mod as unknown as SvgPanZoomFactory);\n } catch {\n return null;\n }\n}\n","// 套件內建樣式(無 Tailwind),由 ensure-styles 一次性注入 <head>。\n// 全部 scope 在 .rsm-root 之下,避免污染 host 頁面;顏色用 CSS 變數,host 可覆寫。\n\nexport const RSM_STYLE_ID = 'react-super-mermaid-styles';\n\nexport const RSM_CSS = `\n.rsm-root {\n --rsm-border: #e5e7eb;\n --rsm-fg: #374151;\n --rsm-muted: #6b7280;\n --rsm-accent: #2563eb;\n --rsm-hover: #f3f4f6;\n --rsm-surface: #ffffff;\n --rsm-canvas-bg: transparent;\n --rsm-radius: 8px;\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--rsm-border);\n border-radius: var(--rsm-radius);\n background: var(--rsm-surface);\n color: var(--rsm-fg);\n font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n overflow: hidden;\n}\n.rsm-root *, .rsm-root *::before, .rsm-root *::after { box-sizing: border-box; }\n\n.rsm-toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-bottom: 1px solid var(--rsm-border);\n}\n.rsm-toolbar-spacer { margin-left: auto; }\n.rsm-toolbar-group { display: inline-flex; align-items: center; gap: 6px; }\n\n.rsm-label { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--rsm-muted); }\n\n.rsm-select {\n border: 1px solid var(--rsm-border);\n background: var(--rsm-surface);\n color: var(--rsm-fg);\n border-radius: 6px;\n padding: 4px 8px;\n font-size: 13px;\n cursor: pointer;\n}\n.rsm-select:focus { outline: none; border-color: var(--rsm-accent); }\n\n.rsm-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n border: 1px solid var(--rsm-border);\n background: var(--rsm-surface);\n color: var(--rsm-fg);\n border-radius: 6px;\n padding: 4px 10px;\n font-size: 13px;\n line-height: 1.4;\n cursor: pointer;\n transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;\n}\n.rsm-btn:hover { background: var(--rsm-hover); }\n.rsm-btn[aria-pressed=\"true\"] {\n border-color: var(--rsm-accent);\n color: var(--rsm-accent);\n background: color-mix(in srgb, var(--rsm-accent) 10%, transparent);\n}\n.rsm-btn:disabled { opacity: 0.6; cursor: default; }\n\n.rsm-zoom {\n display: inline-flex;\n align-items: stretch;\n border: 1px solid var(--rsm-border);\n border-radius: 6px;\n overflow: hidden;\n}\n.rsm-zoom > button {\n border: 0;\n background: var(--rsm-surface);\n color: var(--rsm-fg);\n padding: 4px 10px;\n font-size: 13px;\n cursor: pointer;\n}\n.rsm-zoom > button:hover { background: var(--rsm-hover); }\n.rsm-zoom > button + button { border-left: 1px solid var(--rsm-border); }\n.rsm-zoom-percent { min-width: 52px; text-align: center; font-variant-numeric: tabular-nums; font-size: 12px; }\n\n.rsm-searchbar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-bottom: 1px solid var(--rsm-border);\n background: var(--rsm-hover);\n}\n.rsm-input {\n flex: 0 1 320px;\n border: 1px solid var(--rsm-border);\n background: var(--rsm-surface);\n color: var(--rsm-fg);\n border-radius: 6px;\n padding: 5px 10px;\n font-size: 13px;\n}\n.rsm-input:focus { outline: none; border-color: var(--rsm-accent); }\n.rsm-count { min-width: 48px; font-size: 12px; color: var(--rsm-muted); font-variant-numeric: tabular-nums; }\n.rsm-searchbar-spacer { margin-left: auto; }\n\n.rsm-canvas {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n overflow: hidden;\n background: var(--rsm-canvas-bg);\n}\n.rsm-stage { width: 100%; height: 100%; }\n.rsm-root svg { cursor: grab; user-select: none; }\n.rsm-root svg.rsm-grabbing { cursor: grabbing; }\n\n.rsm-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 16px;\n text-align: center;\n font-size: 13px;\n color: var(--rsm-muted);\n pointer-events: none;\n}\n.rsm-overlay.rsm-error { color: #dc2626; }\n\n/* 搜尋:命中以外的節點變暗,當前命中加暖色光暈。 */\n.rsm-root .rsm-dim { opacity: 0.22; transition: opacity 0.15s ease; }\n.rsm-root .rsm-hit { filter: drop-shadow(0 0 5px #f59e0b) drop-shadow(0 0 1.5px #f59e0b); }\n\n.rsm-root.rsm-dark {\n --rsm-border: #374151;\n --rsm-fg: #e5e7eb;\n --rsm-muted: #9ca3af;\n --rsm-accent: #60a5fa;\n --rsm-hover: #1f2937;\n --rsm-surface: #111827;\n}\n`;\n","// 一次性把套件內建 CSS 注入 <head>(以 id 去重)。SSR 安全:非瀏覽器直接略過。\n\nimport { RSM_CSS, RSM_STYLE_ID } from './styles.css';\n\nexport function ensureStyles(): void {\n if (typeof document === 'undefined') {\n return;\n }\n if (document.getElementById(RSM_STYLE_ID)) {\n return;\n }\n const style = document.createElement('style');\n style.id = RSM_STYLE_ID;\n style.textContent = RSM_CSS;\n document.head.appendChild(style);\n}\n","// Colorful 樣式的後處理上色器:在 mermaid 輸出的 SVG 上重新套用現代調色盤\n// (Tailwind 100 底色 / 500 邊框) + 圓角 + 軟陰影 + slate 邊線。\n// 純 DOM 操作,需在瀏覽器端執行;每個 pass 在零命中時自動跳過,\n// 故 mermaid 的 DOM 結構變動不會讓渲染中斷。\n\nexport interface ColorizeOptions {\n dark?: boolean;\n}\n\ninterface PaletteEntry {\n fill: string;\n stroke: string;\n}\n\nconst NODE_PALETTE: PaletteEntry[] = [\n { fill: '#DBEAFE', stroke: '#3B82F6' }, // blue\n { fill: '#DCFCE7', stroke: '#22C55E' }, // green\n { fill: '#FFEDD5', stroke: '#F97316' }, // orange\n { fill: '#F3E8FF', stroke: '#A855F7' }, // purple\n { fill: '#FEE2E2', stroke: '#EF4444' }, // red\n { fill: '#CFFAFE', stroke: '#06B6D4' }, // cyan\n { fill: '#FEF9C3', stroke: '#EAB308' }, // yellow\n { fill: '#EDE9FE', stroke: '#8B5CF6' }, // violet\n];\n\nconst CLUSTER_PALETTE: PaletteEntry[] = [\n { fill: 'rgba(59, 130, 246, 0.07)', stroke: '#93C5FD' },\n { fill: 'rgba(34, 197, 94, 0.07)', stroke: '#86EFAC' },\n { fill: 'rgba(249, 115, 22, 0.07)', stroke: '#FDBA74' },\n { fill: 'rgba(168, 85, 247, 0.07)', stroke: '#D8B4FE' },\n { fill: 'rgba(6, 182, 212, 0.07)', stroke: '#67E8F9' },\n { fill: 'rgba(239, 68, 68, 0.07)', stroke: '#FCA5A5' },\n];\n\nconst NODE_TEXT = '#1F2937';\nconst SHADOW_FILTER_ID = 'rsm-soft-shadow';\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** 共用的軟陰影 filter — 讓節點看起來更接近商業工具。 */\nfunction ensureShadowFilter(svg: Element): void {\n if (svg.querySelector(`#${SHADOW_FILTER_ID}`)) {\n return;\n }\n let defs = svg.querySelector(':scope > defs');\n if (!defs) {\n defs = document.createElementNS(SVG_NS, 'defs');\n svg.insertBefore(defs, svg.firstChild);\n }\n const filter = document.createElementNS(SVG_NS, 'filter');\n filter.setAttribute('id', SHADOW_FILTER_ID);\n filter.setAttribute('x', '-25%');\n filter.setAttribute('y', '-25%');\n filter.setAttribute('width', '150%');\n filter.setAttribute('height', '150%');\n const drop = document.createElementNS(SVG_NS, 'feDropShadow');\n drop.setAttribute('dx', '0');\n drop.setAttribute('dy', '1.5');\n drop.setAttribute('stdDeviation', '2');\n drop.setAttribute('flood-color', '#0F172A');\n drop.setAttribute('flood-opacity', '0.22');\n filter.appendChild(drop);\n defs.appendChild(filter);\n}\n\nfunction roundRect(shape: SVGElement, radius: number): void {\n if (shape.tagName.toLowerCase() !== 'rect') {\n return;\n }\n // Stadium 形狀本身已帶大 rx,別把它壓平。\n const rx = Number(shape.getAttribute('rx') ?? '0');\n if (rx < radius + 1) {\n shape.setAttribute('rx', String(radius));\n shape.setAttribute('ry', String(radius));\n }\n}\n\nfunction paintShapes(group: Element, entry: PaletteEntry): void {\n const direct = Array.from(\n group.querySelectorAll<SVGElement>(\n ':scope > rect, :scope > polygon, :scope > circle, :scope > ellipse, :scope > path',\n ),\n );\n if (direct.length > 0) {\n for (const shape of direct) {\n shape.style.fill = entry.fill;\n shape.style.stroke = entry.stroke;\n shape.style.strokeWidth = '1.4px';\n roundRect(shape, 8);\n }\n direct[0].setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\n return;\n }\n // v11 unified-renderer 節點(如 erDiagram 實體)把形狀包在子群組:\n // g.outer-path 放背景與邊框、g.row-rect-odd/even 放屬性列、g.divider 放分隔線。\n for (const path of Array.from(group.querySelectorAll<SVGElement>(':scope > g.outer-path > *'))) {\n if (path.getAttribute('fill') && path.getAttribute('fill') !== 'none') {\n path.style.fill = entry.fill;\n path.setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\n }\n if (path.getAttribute('stroke') && path.getAttribute('stroke') !== 'none') {\n path.style.stroke = entry.stroke;\n path.style.strokeWidth = '1.4px';\n }\n }\n for (const row of Array.from(group.querySelectorAll<SVGElement>(':scope > g.row-rect-odd > *'))) {\n row.style.fill = 'rgba(255, 255, 255, 0.55)';\n }\n for (const row of Array.from(group.querySelectorAll<SVGElement>(':scope > g.row-rect-even > *'))) {\n row.style.fill = 'rgba(255, 255, 255, 0.3)';\n }\n for (const divider of Array.from(group.querySelectorAll<SVGElement>(':scope > g.divider > *'))) {\n divider.style.stroke = entry.stroke;\n }\n}\n\nfunction darkenNodeText(group: Element): void {\n // 底色為淺色 pastel,節點文字在深淺色主題下都必須是深色才看得清楚。\n for (const el of Array.from(group.querySelectorAll<SVGTextElement>('text, tspan'))) {\n el.style.fill = NODE_TEXT;\n }\n for (const el of Array.from(group.querySelectorAll<HTMLElement>('.nodeLabel, span, p'))) {\n el.style.color = NODE_TEXT;\n }\n}\n\n/** slate 色、圓角端點的邊線,比 mermaid 預設更乾淨。 */\nfunction styleEdges(svg: Element, dark: boolean): void {\n const edgeColor = dark ? '#94A3B8' : '#64748B';\n const edgeSelectors = [\n '.edgePaths path',\n 'g.edgePath path',\n 'path.flowchart-link',\n 'path.relationshipLine',\n ].join(', ');\n for (const edge of Array.from(svg.querySelectorAll<SVGElement>(edgeSelectors))) {\n edge.style.stroke = edgeColor;\n edge.style.strokeWidth = '1.7px';\n edge.style.strokeLinecap = 'round';\n }\n for (const marker of Array.from(svg.querySelectorAll<SVGElement>('marker path'))) {\n marker.style.fill = edgeColor;\n marker.style.stroke = edgeColor;\n }\n}\n\nfunction styleEdgeLabels(svg: Element): void {\n for (const label of Array.from(svg.querySelectorAll<HTMLElement>('.edgeLabel span, .edgeLabel p'))) {\n label.style.borderRadius = '6px';\n }\n for (const rect of Array.from(svg.querySelectorAll<SVGElement>('.edgeLabel rect'))) {\n rect.setAttribute('rx', '4');\n rect.setAttribute('ry', '4');\n }\n}\n\n/** 對舊版 ER markup(mermaid < 11.x)的實體標題列上色。 */\nfunction colorizeLegacyEr(svg: Element): void {\n const erGroups: Element[] = [];\n for (const rect of Array.from(svg.querySelectorAll<SVGElement>('rect.er.entityBox'))) {\n const group = rect.parentElement;\n if (group && !erGroups.includes(group)) {\n erGroups.push(group);\n }\n }\n erGroups.forEach((group, i) => {\n const entry = NODE_PALETTE[i % NODE_PALETTE.length];\n for (const rect of Array.from(group.querySelectorAll<SVGElement>('rect.er.entityBox')).slice(0, 1)) {\n rect.style.fill = entry.fill;\n rect.style.stroke = entry.stroke;\n }\n for (const label of Array.from(group.querySelectorAll<SVGElement>('text.er.entityLabel'))) {\n label.style.fill = NODE_TEXT;\n }\n });\n}\n\n/**\n * sequenceDiagram 上色:每條水道(actor 方框 + 生命線 + 啟用條)依名稱輪用調色盤,\n * 讓原本同色的各水道一眼可辨。其餘圖型(flowchart / ER …)無 rect.actor,整段自動略過。\n */\nfunction colorizeSequence(svg: Element, dark: boolean): void {\n const actorRects = Array.from(svg.querySelectorAll<SVGRectElement>('rect.actor'));\n if (actorRects.length === 0) {\n return;\n }\n\n // 依「DOM 出現順序」(頂端 actor 由左至右)替每個名稱配色;頂 / 底方框與生命線共用同色。\n const colorByName = new Map<string, PaletteEntry>();\n let nextIndex = 0;\n for (const rect of actorRects) {\n const name = rect.getAttribute('name') ?? `#${nextIndex}`;\n let entry = colorByName.get(name);\n if (!entry) {\n entry = NODE_PALETTE[nextIndex % NODE_PALETTE.length];\n colorByName.set(name, entry);\n nextIndex += 1;\n }\n rect.style.fill = entry.fill;\n rect.style.stroke = entry.stroke;\n rect.style.strokeWidth = '1.4px';\n rect.setAttribute('rx', '8');\n rect.setAttribute('ry', '8');\n rect.setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\n // 標題文字(與 rect 同群組)轉深色,落在淺色 pastel 上才清楚。\n const group = rect.parentElement;\n if (group) {\n for (const text of Array.from(group.querySelectorAll<SVGTextElement>('text, tspan'))) {\n text.style.fill = NODE_TEXT;\n }\n }\n }\n\n // 生命線:改用所屬水道的描邊色(以 name 對應),縱向流程比單一灰虛線更好追蹤;\n // 同時記下每條生命線的 x 座標 → 水道色,供啟用條對應歸屬。\n const lanesByX: { x: number; entry: PaletteEntry }[] = [];\n for (const line of Array.from(svg.querySelectorAll<SVGElement>('line.actor-line'))) {\n const entry = colorByName.get(line.getAttribute('name') ?? '');\n if (!entry) {\n continue;\n }\n line.style.stroke = entry.stroke;\n line.style.strokeOpacity = '0.45';\n line.style.strokeWidth = '1.3px';\n line.style.strokeDasharray = '4 5';\n const x = Number(line.getAttribute('x1'));\n if (Number.isFinite(x)) {\n lanesByX.push({ x, entry });\n }\n }\n\n // 啟用條:以中心 x 對應到最近的生命線,套上該水道色,讓「此刻是哪條水道在執行」一眼可辨。\n const activations = Array.from(\n svg.querySelectorAll<SVGRectElement>('rect.activation0, rect.activation1, rect.activation2'),\n );\n for (const bar of activations) {\n const x = Number(bar.getAttribute('x'));\n const w = Number(bar.getAttribute('width'));\n if (!Number.isFinite(x) || !Number.isFinite(w) || lanesByX.length === 0) {\n continue;\n }\n const center = x + w / 2;\n let best = lanesByX[0];\n for (const lane of lanesByX) {\n if (Math.abs(lane.x - center) < Math.abs(best.x - center)) {\n best = lane;\n }\n }\n bar.style.fill = best.entry.fill;\n bar.style.stroke = best.entry.stroke;\n bar.style.strokeWidth = '1px';\n bar.setAttribute('rx', '3');\n bar.setAttribute('ry', '3');\n }\n\n // note:便利貼風(amber)+ 圓角 + 軟陰影 + 深色字。\n for (const note of Array.from(svg.querySelectorAll<SVGRectElement>('rect.note'))) {\n note.style.fill = '#FEF9C3';\n note.style.stroke = '#EAB308';\n note.style.strokeWidth = '1.2px';\n note.setAttribute('rx', '6');\n note.setAttribute('ry', '6');\n note.setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\n }\n for (const text of Array.from(svg.querySelectorAll<SVGTextElement>('.noteText, .noteText tspan'))) {\n text.style.fill = NODE_TEXT;\n }\n\n // 訊息線 / loop·alt·opt 外框:統一成 slate 墨線,與 flowchart edge 風格一致;訊息文字轉深色。\n const ink = dark ? '#94A3B8' : '#64748B';\n for (const line of Array.from(svg.querySelectorAll<SVGElement>('.messageLine0, .messageLine1'))) {\n line.style.stroke = ink;\n line.style.strokeWidth = '1.6px';\n line.style.strokeLinecap = 'round';\n }\n for (const loop of Array.from(svg.querySelectorAll<SVGElement>('.loopLine'))) {\n loop.style.stroke = ink;\n loop.style.strokeOpacity = '0.55';\n }\n for (const text of Array.from(\n svg.querySelectorAll<SVGTextElement>('.messageText, .loopText, .labelText'),\n )) {\n text.style.fill = dark ? '#E2E8F0' : NODE_TEXT;\n }\n}\n\n/** 在已渲染的 mermaid SVG 上套用 Colorful 樣式(就地修改 DOM)。 */\nexport function colorizeDiagram(root: ParentNode, opts: ColorizeOptions = {}): void {\n const svg =\n root instanceof Element && root.tagName.toLowerCase() === 'svg' ? root : root.querySelector('svg');\n if (!svg) {\n return;\n }\n ensureShadowFilter(svg);\n\n // flowchart / state / class / ER 節點(每個節點依序輪用調色盤)\n Array.from(svg.querySelectorAll<SVGGElement>('g.node')).forEach((node, i) => {\n paintShapes(node, NODE_PALETTE[i % NODE_PALETTE.length]);\n darkenNodeText(node);\n });\n\n // flowchart subgraph(叢集)\n Array.from(svg.querySelectorAll<SVGGElement>('g.cluster')).forEach((cluster, i) => {\n const entry = CLUSTER_PALETTE[i % CLUSTER_PALETTE.length];\n for (const rect of Array.from(cluster.querySelectorAll<SVGElement>(':scope > rect'))) {\n rect.style.fill = entry.fill;\n rect.style.stroke = entry.stroke;\n rect.style.strokeWidth = '1.2px';\n roundRect(rect, 10);\n }\n });\n\n colorizeLegacyEr(svg);\n colorizeSequence(svg, opts.dark === true);\n styleEdges(svg, opts.dark === true);\n styleEdgeLabels(svg);\n}\n","// 手繪風(Sketch)後處理器。\n// Mermaid 原生 look:'handDrawn'(rough.js)只作用於走 unified renderer 的圖\n// (flowchart / state / class / ER / venn …);sequenceDiagram 使用獨立 renderer,\n// 設了 handDrawn 也毫無效果。本模組針對「已渲染完成的 sequence SVG」就地補上手繪質感:\n// 1) feTurbulence + feDisplacementMap 位移濾鏡 — 讓直線 / 方框抖動成手繪線條;\n// 因為位移的是 render 後的圖元而非字體,故對 CJK 文字同樣有效。\n// 2) 手寫風字體(Latin / 數字直接生效,CJK 自動 fallback 系統字)。\n// 3) pastel actor 標題 + slate ink 訊息線 + 便利貼 note,讓畫面更精緻。\n// 純 DOM 操作,僅瀏覽器端可用;非 sequence 圖直接略過並回傳 false,\n// 不影響 flowchart / ER 既有的原生 handDrawn 結果。\n\nexport interface SketchOptions {\n dark?: boolean;\n /** 位移濾鏡亂數種子,固定值可確保每次 render 的抖動一致(與 handDrawnSeed 對齊)。 */\n seed?: number;\n}\n\ninterface PaletteEntry {\n fill: string;\n stroke: string;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst SKETCH_FILTER_ID = 'rsm-sketch-wobble';\nconst FONT_FACE_ID = 'rsm-sketch-fontface';\nconst DEFAULT_SEED = 42;\n\n// Excalidraw 招牌手寫字體 Virgil;CJK 用 Windows 內建 KaiTi(標楷體)\n// 補手寫筆刷感,最後回退 Comic Sans MS / cursive。\nexport const SKETCH_FONT = \"'Virgil', 'KaiTi', 'Comic Sans MS', cursive\";\n\n// 預設從本套件發佈在 jsDelivr 的 dist 取 Virgil;host 可用 ensureSketchFont(fontUrl) 覆寫\n// 成自家 /public 路徑或其他 CDN。載入失敗會靜默退回 fallback 字鏈,不阻斷渲染。\nexport const DEFAULT_VIRGIL_FONT_URL =\n 'https://cdn.jsdelivr.net/npm/react-super-mermaid/dist/Virgil.woff2';\n\n// actor 標題用的調色盤 — Excalidraw Open Color 元素底色 + 對應描邊。\nconst ACTOR_PALETTE: PaletteEntry[] = [\n { fill: '#a5d8ff', stroke: '#1971c2' }, // blue\n { fill: '#b2f2bb', stroke: '#2f9e44' }, // green\n { fill: '#ffd8a8', stroke: '#e8590c' }, // orange\n { fill: '#d0bfff', stroke: '#6741d9' }, // violet\n { fill: '#99e9f2', stroke: '#0c8599' }, // cyan\n { fill: '#ffc9c9', stroke: '#e03131' }, // red\n { fill: '#ffec99', stroke: '#f08c00' }, // yellow\n { fill: '#eebefa', stroke: '#9c36b5' }, // grape\n];\n\nconst NOTE_FILL = '#ffec99';\nconst NOTE_STROKE = '#f08c00';\n// Excalidraw 預設黑墨;落在彩色 / 便利貼底色上的文字一律用它,深淺色主題下都看得清楚。\nconst INK_DARK = '#1e1e1e';\n\n/** 是否為 sequenceDiagram 的 SVG(只有它需要本模組補手繪)。 */\nfunction isSequenceSvg(svg: Element): boolean {\n return (\n svg.getAttribute('aria-roledescription') === 'sequence' ||\n svg.querySelector('.actor, .messageLine0, .actor-line') !== null\n );\n}\n\n/** 建立(或重用)位移濾鏡:fractalNoise 噪聲驅動 feDisplacementMap,使線條呈手繪抖動。 */\nfunction ensureWobbleFilter(svg: Element, seed: number): void {\n if (svg.querySelector(`#${SKETCH_FILTER_ID}`)) {\n return;\n }\n let defs = svg.querySelector(':scope > defs');\n if (!defs) {\n defs = document.createElementNS(SVG_NS, 'defs');\n svg.insertBefore(defs, svg.firstChild);\n }\n const filter = document.createElementNS(SVG_NS, 'filter');\n filter.setAttribute('id', SKETCH_FILTER_ID);\n // 濾鏡區域略為外擴,避免抖動位移把邊緣圖元裁掉。\n filter.setAttribute('x', '-3%');\n filter.setAttribute('y', '-3%');\n filter.setAttribute('width', '106%');\n filter.setAttribute('height', '106%');\n const turbulence = document.createElementNS(SVG_NS, 'feTurbulence');\n turbulence.setAttribute('type', 'fractalNoise');\n turbulence.setAttribute('baseFrequency', '0.012');\n turbulence.setAttribute('numOctaves', '2');\n turbulence.setAttribute('seed', String(seed));\n turbulence.setAttribute('result', 'noise');\n const displace = document.createElementNS(SVG_NS, 'feDisplacementMap');\n displace.setAttribute('in', 'SourceGraphic');\n displace.setAttribute('in2', 'noise');\n // 位移幅度:夠明顯能讀出手繪感,又不至於讓文字糊掉。\n displace.setAttribute('scale', '2.2');\n displace.setAttribute('xChannelSelector', 'R');\n displace.setAttribute('yChannelSelector', 'G');\n filter.appendChild(turbulence);\n filter.appendChild(displace);\n defs.appendChild(filter);\n}\n\n/** 把 svg 內所有圖元(defs / style 除外)包進一個套了位移濾鏡的群組。 */\nfunction wrapWithWobble(svg: SVGSVGElement): void {\n if (svg.querySelector(':scope > g.rsm-sketch-layer')) {\n return;\n }\n const layer = document.createElementNS(SVG_NS, 'g');\n layer.setAttribute('class', 'rsm-sketch-layer');\n layer.style.filter = `url(#${SKETCH_FILTER_ID})`;\n const movable = Array.from(svg.childNodes).filter((node): node is Element => {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n const tag = (node as Element).tagName.toLowerCase();\n return tag !== 'defs' && tag !== 'style';\n });\n // 依原順序搬入,維持 z-order(背景 → 線 → 框 → 文字)。\n for (const node of movable) {\n layer.appendChild(node);\n }\n svg.appendChild(layer);\n}\n\n/** 套用手寫風字體到所有文字節點(<text> 與 htmlLabels 的 span/p 都涵蓋)。 */\nfunction applyHandwritingFont(svg: Element): void {\n for (const text of Array.from(svg.querySelectorAll<SVGTextElement>('text, tspan'))) {\n text.style.fontFamily = SKETCH_FONT;\n }\n for (const html of Array.from(\n svg.querySelectorAll<HTMLElement>('.messageText, .noteText, .loopText, .labelText, span, p'),\n )) {\n html.style.fontFamily = SKETCH_FONT;\n }\n}\n\n/** 依 actor 名稱分組上色:同一 actor 的頂 / 底方框共用同一個 pastel 色,label 文字轉深色。 */\nfunction colorizeActors(svg: Element): void {\n const rects = Array.from(svg.querySelectorAll<SVGRectElement>('rect.actor'));\n if (rects.length === 0) {\n return;\n }\n const colorByName = new Map<string, PaletteEntry>();\n let nextIndex = 0;\n for (const rect of rects) {\n const name = rect.getAttribute('name') ?? `#${nextIndex}`;\n let entry = colorByName.get(name);\n if (!entry) {\n entry = ACTOR_PALETTE[nextIndex % ACTOR_PALETTE.length];\n colorByName.set(name, entry);\n nextIndex += 1;\n }\n rect.style.fill = entry.fill;\n rect.style.stroke = entry.stroke;\n rect.style.strokeWidth = '2px';\n rect.setAttribute('rx', '8');\n rect.setAttribute('ry', '8');\n // label 文字與 rect 同在一個 <g> 內 → 把該群組的文字轉黑墨(彩色底色需深字)。\n const group = rect.parentElement;\n if (group) {\n for (const text of Array.from(group.querySelectorAll<SVGTextElement>('text, tspan'))) {\n text.style.fill = INK_DARK;\n }\n }\n }\n}\n\n/** 便利貼風 note:Excalidraw 黃底 + 橘框 + 黑墨字。 */\nfunction colorizeNotes(svg: Element): void {\n for (const note of Array.from(svg.querySelectorAll<SVGRectElement>('rect.note'))) {\n note.style.fill = NOTE_FILL;\n note.style.stroke = NOTE_STROKE;\n note.style.strokeWidth = '1.8px';\n note.setAttribute('rx', '6');\n note.setAttribute('ry', '6');\n }\n for (const text of Array.from(svg.querySelectorAll<SVGTextElement>('.noteText, .noteText tspan'))) {\n text.style.fill = INK_DARK;\n }\n}\n\n/** 訊息線 / 生命線 / 迴圈框:統一成 Excalidraw 黑墨線條,端點圓潤。 */\nfunction styleLines(svg: Element, ink: string): void {\n for (const line of Array.from(svg.querySelectorAll<SVGElement>('.messageLine0, .messageLine1'))) {\n line.style.stroke = ink;\n line.style.strokeWidth = '1.8px';\n line.style.strokeLinecap = 'round';\n line.style.strokeLinejoin = 'round';\n }\n for (const marker of Array.from(\n svg.querySelectorAll<SVGElement>('marker path, .arrowhead, path.arrowMarkerPath'),\n )) {\n marker.style.fill = ink;\n marker.style.stroke = ink;\n }\n // 生命線:更淡的虛線,退到背景。\n for (const life of Array.from(svg.querySelectorAll<SVGElement>('.actor-line'))) {\n life.style.stroke = ink;\n life.style.strokeOpacity = '0.3';\n life.style.strokeDasharray = '2 5';\n }\n // alt / opt / loop 外框 + 標籤(便利貼黃標籤,呼應 Excalidraw)\n for (const loop of Array.from(svg.querySelectorAll<SVGElement>('.loopLine'))) {\n loop.style.stroke = ink;\n loop.style.strokeOpacity = '0.5';\n }\n for (const box of Array.from(svg.querySelectorAll<SVGElement>('polygon.labelBox'))) {\n box.style.fill = NOTE_FILL;\n box.style.stroke = ink;\n box.style.strokeOpacity = '0.6';\n }\n for (const text of Array.from(\n svg.querySelectorAll<SVGTextElement>('.messageText, .loopText, .labelText'),\n )) {\n text.style.fill = ink;\n }\n}\n\n/**\n * 對已渲染的 mermaid SVG 套用手繪風(就地修改 DOM)。\n * 僅處理 sequenceDiagram;其他圖型回傳 false 由呼叫端維持原生 handDrawn 結果。\n */\nexport function sketchifyDiagram(root: ParentNode, opts: SketchOptions = {}): boolean {\n const svg = root instanceof SVGSVGElement ? root : root.querySelector<SVGSVGElement>('svg');\n if (!svg || !isSequenceSvg(svg)) {\n return false;\n }\n // Excalidraw 黑墨;深色主題下退成淺墨,維持線條可讀。\n const ink = opts.dark === true ? '#e9ecef' : INK_DARK;\n\n // 先上色(此時圖元仍是 svg 的直接子節點,選擇器最單純),再包進抖動群組。\n colorizeActors(svg);\n colorizeNotes(svg);\n styleLines(svg, ink);\n applyHandwritingFont(svg);\n\n ensureWobbleFilter(svg, opts.seed ?? DEFAULT_SEED);\n wrapWithWobble(svg);\n return true;\n}\n\n// 字體載入依 URL 快取,避免重複注入 / 重複等待;不同 URL 各自獨立。\nconst fontPromises = new Map<string, Promise<void>>();\n\n/**\n * 注入 Virgil 的 @font-face 並等待載入完成。\n * 必須在 mermaid.render 之前 await — 否則 mermaid 會用 fallback 字體量測文字寬度,\n * 導致換成 Virgil 後文字溢出方框。載入失敗時靜默退回 fallback 字體,不阻斷渲染。\n *\n * @param fontUrl Virgil woff2 的來源網址;省略則用 DEFAULT_VIRGIL_FONT_URL(jsDelivr)。\n */\nexport function ensureSketchFont(fontUrl: string = DEFAULT_VIRGIL_FONT_URL): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.resolve();\n }\n const cached = fontPromises.get(fontUrl);\n if (cached) {\n return cached;\n }\n const promise = (async () => {\n const styleId = `${FONT_FACE_ID}-${hashUrl(fontUrl)}`;\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent =\n `@font-face{font-family:'Virgil';` +\n `src:url(\"${fontUrl}\") format('woff2');font-display:swap;}`;\n document.head.appendChild(style);\n }\n try {\n await document.fonts.load(\"16px 'Virgil'\");\n } catch {\n // 字體載入失敗 → 沿用 fallback(KaiTi / Comic Sans),不中斷流程。\n }\n })();\n fontPromises.set(fontUrl, promise);\n return promise;\n}\n\n/** 把 URL 壓成短雜湊,當 <style> 的 id 後綴(允許多來源並存)。 */\nfunction hashUrl(url: string): string {\n let hash = 0;\n for (let i = 0; i < url.length; i += 1) {\n hash = (hash * 31 + url.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(36);\n}\n","// 把對外的 MermaidTheme 對映成「mermaid base theme + look + 後處理種類」。\n\nimport type { MermaidBaseTheme, MermaidTheme } from '../types';\n\nexport type PostProcess = 'colorful' | 'sketch' | 'none';\n\nexport interface ResolvedTheme {\n base: MermaidBaseTheme;\n look: 'classic' | 'handDrawn';\n postProcess: PostProcess;\n}\n\nexport function resolveTheme(theme: MermaidTheme, dark: boolean): ResolvedTheme {\n // colorful / sketch / auto 都以 default|dark base 渲染,colorful/sketch 之後再後處理。\n if (theme === 'colorful') {\n return { base: dark ? 'dark' : 'default', look: 'classic', postProcess: 'colorful' };\n }\n if (theme === 'sketch') {\n return { base: dark ? 'dark' : 'default', look: 'handDrawn', postProcess: 'sketch' };\n }\n if (theme === 'auto') {\n return { base: dark ? 'dark' : 'default', look: 'classic', postProcess: 'none' };\n }\n // default / dark / neutral / forest:原生主題直接套用。\n return { base: theme, look: 'classic', postProcess: 'none' };\n}\n","// 渲染管線(框架無關),供 React hook 與一次性 renderDiagram() 共用。\n// 順序:ensureStyles → resolveTheme →(sketch 先載字)→ initialize → render → 後處理。\n\nimport { assertBrowser } from '../env';\nimport type { MermaidLike, MermaidTheme, RenderDiagramOptions, RenderResult } from '../types';\nimport { colorizeDiagram } from './themes/colorize';\nimport { ensureSketchFont, SKETCH_FONT, sketchifyDiagram } from './themes/sketch';\nimport { ensureStyles } from './ensure-styles';\nimport { loadMermaid } from './load-mermaid';\nimport { resolveTheme, type PostProcess } from './resolve-theme';\n\n// mermaid.render 需要唯一且合法的 id,用模組級流水號確保不衝突(無 DOM,SSR 安全)。\nlet renderSeq = 0;\n\nexport interface RenderToSvgArgs {\n code: string;\n theme: MermaidTheme;\n dark: boolean;\n seed: number;\n fontUrl?: string;\n mermaidConfig?: Record<string, unknown>;\n mermaid: MermaidLike;\n /** 強制關閉 htmlLabels(供匯出 pristine SVG 用,避免 foreignObject)。 */\n pristine?: boolean;\n}\n\nexport interface RenderedSvg {\n svgString: string;\n id: string;\n postProcess: PostProcess;\n}\n\nfunction buildConfig(args: RenderToSvgArgs): Record<string, unknown> {\n const resolved = resolveTheme(args.theme, args.dark);\n const htmlLabels = args.pristine ? false : true;\n const config: Record<string, unknown> = {\n startOnLoad: false,\n theme: resolved.base,\n securityLevel: 'loose',\n htmlLabels,\n flowchart: { htmlLabels, useMaxWidth: false },\n };\n if (args.theme === 'colorful') {\n config.flowchart = { htmlLabels, useMaxWidth: false, nodeSpacing: 60, rankSpacing: 65, padding: 12 };\n }\n if (resolved.look === 'handDrawn') {\n config.look = 'handDrawn';\n config.handDrawnSeed = args.seed;\n config.fontFamily = SKETCH_FONT;\n }\n // host 自訂設定最後覆蓋(flowchart 做一層淺合併)。\n if (args.mermaidConfig) {\n const userFlowchart = (args.mermaidConfig.flowchart as Record<string, unknown>) ?? {};\n Object.assign(config, args.mermaidConfig);\n config.flowchart = { ...(config.flowchart as Record<string, unknown>), ...userFlowchart };\n }\n return config;\n}\n\n/** 解析設定 → 載字(sketch)→ initialize → render,回傳 mermaid 的 SVG 字串。 */\nexport async function renderToSvg(args: RenderToSvgArgs): Promise<RenderedSvg> {\n const resolved = resolveTheme(args.theme, args.dark);\n if (resolved.look === 'handDrawn') {\n // 先載入手寫字體再 render,確保 mermaid 量測文字寬度時用的就是 Virgil。\n await ensureSketchFont(args.fontUrl);\n }\n args.mermaid.initialize(buildConfig(args));\n renderSeq += 1;\n const id = `rsm-${renderSeq}`;\n const { svg } = await args.mermaid.render(id, args.code);\n return { svgString: svg, id, postProcess: args.pristine ? 'none' : resolved.postProcess };\n}\n\n/** 把 mermaid SVG 字串塞入 host、套後處理、設定填滿尺寸,回傳 live SVG 元素。 */\nexport function mountSvg(\n host: HTMLElement,\n svgString: string,\n postProcess: PostProcess,\n opts: { dark: boolean; seed: number },\n): SVGSVGElement | null {\n host.innerHTML = svgString;\n const svg = host.querySelector('svg');\n if (!svg) {\n return null;\n }\n applyPostProcess(svg, postProcess, opts);\n svg.style.maxWidth = 'none';\n svg.style.width = '100%';\n svg.style.height = '100%';\n return svg;\n}\n\nexport function applyPostProcess(\n svg: SVGSVGElement,\n postProcess: PostProcess,\n opts: { dark: boolean; seed: number },\n): void {\n if (postProcess === 'colorful') {\n colorizeDiagram(svg, { dark: opts.dark });\n } else if (postProcess === 'sketch') {\n // 原生 handDrawn 不作用於 sequenceDiagram,這裡補手繪後處理;非序列圖會自動略過。\n sketchifyDiagram(svg, { dark: opts.dark, seed: opts.seed });\n }\n}\n\n/**\n * 一次性渲染:載入 mermaid、渲染、後處理並(若有 container)注入頁面。\n * 不附 pan/zoom — 適合靜態美化輸出。互動請用 createViewer / <MermaidViewer>。\n */\nexport async function renderDiagram(opts: RenderDiagramOptions): Promise<RenderResult> {\n assertBrowser('renderDiagram');\n const dark = opts.dark ?? false;\n const seed = opts.seed ?? 42;\n if (opts.injectStyles !== false) {\n ensureStyles();\n }\n const mermaid = await loadMermaid({ source: opts.mermaid });\n const { svgString, id, postProcess } = await renderToSvg({\n code: opts.code,\n theme: opts.theme ?? 'colorful',\n dark,\n seed,\n fontUrl: opts.fontUrl,\n mermaidConfig: opts.mermaidConfig,\n mermaid,\n });\n\n const host =\n typeof opts.container === 'string'\n ? document.querySelector<HTMLElement>(opts.container)\n : (opts.container ?? document.createElement('div'));\n if (!host) {\n throw new Error(`[react-super-mermaid] 找不到 container:${String(opts.container)}`);\n }\n const svg = mountSvg(host, svgString, postProcess, { dark, seed });\n if (!svg) {\n throw new Error('[react-super-mermaid] mermaid 未輸出 SVG。');\n }\n return { svg, svgString, id };\n}\n","// svg-pan-zoom 的薄控制器:封裝縮放 / 符合視窗 / 實際大小 / pan-to-element,\n// 並維護 baseZoom(fit 後的初始縮放)以換算顯示百分比。\n\nimport type { PanZoomInstance, SvgPanZoomFactory } from '../types';\n\nexport interface PanZoomView {\n zoom: number;\n pan: { x: number; y: number };\n}\n\nexport interface PanZoomController {\n zoomIn(): void;\n zoomOut(): void;\n fit(): void; // 符合寬度(viewer 的 'w' 行為)\n reset(): void; // resize + fit + center(viewer 的 '0' 行為)\n actualSize(): void; // 回到 baseZoom(viewer 的 '1' 行為)\n getZoomPercent(): number;\n panToElement(el: Element): void;\n capture(): PanZoomView | null;\n restore(view: PanZoomView): void;\n destroy(): void;\n}\n\nexport interface AttachPanZoomOptions {\n minZoom?: number;\n maxZoom?: number;\n zoomScaleSensitivity?: number;\n onZoom?: () => void;\n}\n\nexport function attachPanZoom(\n svg: SVGSVGElement,\n factory: SvgPanZoomFactory,\n opts: AttachPanZoomOptions = {},\n): PanZoomController {\n let baseZoom = 1;\n\n const pz: PanZoomInstance = factory(svg, {\n zoomEnabled: true,\n panEnabled: true,\n controlIconsEnabled: false,\n dblClickZoomEnabled: false,\n fit: true,\n center: true,\n minZoom: opts.minZoom ?? 0.05,\n maxZoom: opts.maxZoom ?? 40,\n zoomScaleSensitivity: opts.zoomScaleSensitivity ?? 0.25,\n onZoom: () => opts.onZoom?.(),\n });\n baseZoom = pz.getZoom() || 1;\n\n const controller: PanZoomController = {\n zoomIn: () => pz.zoomBy(1.25),\n zoomOut: () => pz.zoomBy(0.8),\n getZoomPercent: () => Math.round((pz.getZoom() / (baseZoom || 1)) * 100),\n actualSize: () => pz.zoom(baseZoom),\n reset: () => {\n pz.resize();\n pz.fit();\n pz.center();\n baseZoom = pz.getZoom() || 1;\n opts.onZoom?.();\n },\n fit: () => {\n const sizes = pz.getSizes();\n const targetReal = (sizes.width - 48) / sizes.viewBox.width;\n pz.zoomBy(targetReal / sizes.realZoom);\n opts.onZoom?.();\n },\n panToElement: (el: Element) => {\n const vp = svg.querySelector<SVGGElement>('.svg-pan-zoom_viewport');\n const g = el as SVGGraphicsElement;\n if (!vp || typeof g.getBBox !== 'function') {\n return;\n }\n const vpCtm = vp.getCTM();\n const elCtm = g.getCTM();\n if (!vpCtm || !elCtm) {\n return;\n }\n let bb: DOMRect;\n try {\n bb = g.getBBox();\n } catch {\n return;\n }\n // 元素本地座標 → viewBox 座標;螢幕 = viewBox * realZoom + pan\n const m = vpCtm.inverse().multiply(elCtm);\n const c = new DOMPoint(bb.x + bb.width / 2, bb.y + bb.height / 2).matrixTransform(m);\n const sizes = pz.getSizes();\n pz.pan({\n x: sizes.width / 2 - c.x * sizes.realZoom,\n y: sizes.height / 2 - c.y * sizes.realZoom,\n });\n },\n capture: () => {\n try {\n return { zoom: pz.getZoom(), pan: pz.getPan() };\n } catch {\n return null;\n }\n },\n restore: (view: PanZoomView) => {\n pz.zoom(view.zoom);\n pz.pan(view.pan);\n },\n destroy: () => {\n try {\n pz.destroy();\n } catch {\n // SVG 可能已被覆寫而移除,忽略 destroy 失敗。\n }\n },\n };\n\n return controller;\n}\n","// 圖內文字搜尋:命中節點高亮(rsm-hit)、其餘變暗(rsm-dim),可逐一跳轉。\n// 與框架無關:透過 getSvg() 取得當前 SVG、panTo() 把命中置中(可選)。\n\nimport type { SearchState } from '../types';\n\n// 搜尋時要變暗 / 高亮的節點層級(對齊原 viewer 行為)。\nconst DIMMABLE_SELECTOR = 'g.node, g.cluster, .actor';\n\nconst EMPTY: SearchState = { current: 0, total: 0 };\n\nexport interface SearchController {\n search(term: string, pan?: boolean): SearchState;\n next(pan?: boolean): SearchState;\n prev(pan?: boolean): SearchState;\n /** 重新跑當前 query(例如重繪後),保持高亮一致。 */\n rerun(pan?: boolean): SearchState;\n clear(): void;\n getQuery(): string;\n}\n\nexport function createSearch(\n getSvg: () => SVGSVGElement | null,\n panTo?: (el: Element) => void,\n): SearchController {\n let matches: Element[] = [];\n let current = -1;\n let query = '';\n\n function clearHighlights(): void {\n const svg = getSvg();\n if (!svg) {\n return;\n }\n for (const el of Array.from(svg.querySelectorAll('.rsm-dim, .rsm-hit'))) {\n el.classList.remove('rsm-dim', 'rsm-hit');\n }\n }\n\n function setCurrent(i: number, pan: boolean): SearchState {\n if (matches.length === 0) {\n return EMPTY;\n }\n if (current >= 0) {\n matches[current]?.classList.remove('rsm-hit');\n }\n const next = ((i % matches.length) + matches.length) % matches.length;\n current = next;\n const el = matches[next];\n el.classList.add('rsm-hit');\n if (pan) {\n panTo?.(el);\n }\n return { current: next + 1, total: matches.length };\n }\n\n function run(term: string, pan: boolean): SearchState {\n query = term;\n clearHighlights();\n matches = [];\n current = -1;\n const svg = getSvg();\n const q = term.trim().toLowerCase();\n if (!svg || !q) {\n return EMPTY;\n }\n const seen = new Set<Element>();\n for (const textEl of Array.from(svg.querySelectorAll('text, .nodeLabel'))) {\n if (!(textEl.textContent ?? '').toLowerCase().includes(q)) {\n continue;\n }\n const target = textEl.closest(DIMMABLE_SELECTOR) ?? textEl;\n if (!seen.has(target)) {\n seen.add(target);\n matches.push(target);\n }\n }\n if (matches.length === 0) {\n return EMPTY;\n }\n for (const el of Array.from(svg.querySelectorAll(DIMMABLE_SELECTOR))) {\n const dimTarget = el.classList.contains('actor') ? (el.parentElement ?? el) : el;\n dimTarget.classList.add('rsm-dim');\n }\n for (const match of matches) {\n match.classList.remove('rsm-dim');\n }\n return setCurrent(0, pan);\n }\n\n return {\n search: (term, pan = true) => run(term, pan),\n next: (pan = true) => setCurrent(current + 1, pan),\n prev: (pan = true) => setCurrent(current - 1, pan),\n rerun: (pan = false) => (query.trim() ? run(query, pan) : EMPTY),\n clear: () => {\n clearHighlights();\n matches = [];\n current = -1;\n query = '';\n },\n getQuery: () => query,\n };\n}\n","// 匯出基元:把 SVG 序列化成可攜字串、或經 canvas 點陣化成 PNG/JPEG/WebP Blob。\n// 改寫自 super-mermaid 的 webview/main.ts(renderPristineSvg / prepareSvgText /\n// rasterize / cannotRasterize)。本檔只做純轉換,不依賴 mermaid;\n// 由呼叫端(hook)決定是用 live SVG 還是重繪的 pristine SVG。\n\nimport type { ExportRasterOptions, RasterType } from '../types';\n\nexport interface PreparedSvg {\n serialized: string;\n width: number;\n height: number;\n /** 含 <foreignObject>(htmlLabels)→ 點陣化可能污染 canvas,呼叫端宜退回 SVG。 */\n hasForeignObject: boolean;\n}\n\nconst RASTER_MIME: Record<RasterType, string> = {\n png: 'image/png',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n};\n\nfunction sizeFromViewBox(svgEl: SVGSVGElement): { width: number; height: number } {\n const viewBox = (svgEl.getAttribute('viewBox') ?? '0 0 800 600').split(/[\\s,]+/).map(Number);\n return {\n width: Math.max(1, Math.ceil(viewBox[2] || 800)),\n height: Math.max(1, Math.ceil(viewBox[3] || 600)),\n };\n}\n\nfunction finalizePrepared(svgEl: SVGSVGElement): PreparedSvg {\n const { width, height } = sizeFromViewBox(svgEl);\n svgEl.setAttribute('width', String(width));\n svgEl.setAttribute('height', String(height));\n svgEl.removeAttribute('style');\n const serialized = new XMLSerializer().serializeToString(svgEl);\n return { serialized, width, height, hasForeignObject: serialized.includes('<foreignObject') };\n}\n\n/** 解析 mermaid 重繪出來的 SVG 字串(htmlLabels 關閉的 pristine 版),整理成可匯出形式。 */\nexport function prepareSvgString(svgText: string): PreparedSvg | undefined {\n const holder = document.createElement('div');\n holder.innerHTML = svgText;\n const svgEl = holder.querySelector('svg');\n if (!svgEl) {\n return undefined;\n }\n return finalizePrepared(svgEl);\n}\n\n/** 整理一個已存在的 SVG 元素(就地設定尺寸、移除 style 後序列化)。 */\nexport function prepareSvgElement(svg: SVGSVGElement): PreparedSvg {\n return finalizePrepared(svg);\n}\n\n/**\n * 從畫面上 live SVG(已上色、可能被 pan/zoom 包了 viewport transform)複製一份、\n * 還原縮放平移後序列化。供同步的 exportSvg() 使用。\n */\nexport function serializeLiveSvg(svg: SVGSVGElement): PreparedSvg {\n const clone = svg.cloneNode(true) as SVGSVGElement;\n // 移除 svg-pan-zoom 注入的 viewport transform,讓匯出回到自然 viewBox 版面。\n const vp = clone.querySelector<SVGGElement>('.svg-pan-zoom_viewport');\n if (vp) {\n vp.removeAttribute('transform');\n vp.style.transform = '';\n }\n return finalizePrepared(clone);\n}\n\nexport function svgBlob(serialized: string): Blob {\n const xml = serialized.startsWith('<?xml')\n ? serialized\n : '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' + serialized;\n return new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n}\n\n/** 把整理好的 SVG 經 Image + canvas 點陣化成 Blob。 */\nexport async function rasterizeToBlob(\n prepared: PreparedSvg,\n opts: ExportRasterOptions & { dark?: boolean } = {},\n): Promise<Blob> {\n const scale = opts.scale ?? 2;\n const type = opts.type ?? 'png';\n const mime = RASTER_MIME[type];\n const transparent = opts.transparent === true;\n\n const blob = new Blob([prepared.serialized], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n try {\n const img = new Image();\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error('無法點陣化 SVG(圖片載入失敗)。'));\n img.src = url;\n });\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(prepared.width * scale));\n canvas.height = Math.max(1, Math.round(prepared.height * scale));\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('取不到 Canvas 2D context。');\n }\n // JPEG 無 alpha,一律填背景;其餘格式僅在非透明時填。\n if (!transparent || mime === 'image/jpeg') {\n ctx.fillStyle = opts.background ?? (opts.dark ? '#111827' : '#ffffff');\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0, prepared.width, prepared.height);\n return await canvasToBlob(canvas, mime, type === 'png' ? undefined : (opts.quality ?? 0.92));\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\nfunction canvasToBlob(canvas: HTMLCanvasElement, mime: string, quality?: number): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n // toBlob 回 null 多半是 <foreignObject> 污染了 canvas。\n reject(new Error('匯出失敗:此圖含 HTML 標籤(foreignObject),請改用 SVG 匯出。'));\n }\n },\n mime,\n quality,\n );\n });\n}\n\n/** 觸發瀏覽器下載一個 Blob。 */\nexport function downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n // 給瀏覽器一點時間開始下載再回收 URL。\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n","// 把 core 引擎(載入 / 渲染 / pan-zoom / 搜尋 / 匯出)接到 React 生命週期的內部 hook。\n// 對外的 <MermaidViewer> 與命令式 ref handle 都建立在這之上。\n\nimport { useCallback, useEffect, useMemo, useRef, useState, type RefObject } from 'react';\nimport type {\n ExportRasterOptions,\n MermaidSource,\n MermaidTheme,\n SearchState,\n SvgPanZoomSource,\n} from '../types';\nimport { loadMermaid } from '../core/load-mermaid';\nimport { loadSvgPanZoom } from '../core/load-svg-pan-zoom';\nimport { ensureStyles } from '../core/ensure-styles';\nimport { applyPostProcess, mountSvg, renderToSvg } from '../core/render-pipeline';\nimport { resolveTheme } from '../core/resolve-theme';\nimport { attachPanZoom, type PanZoomController } from '../core/pan-zoom';\nimport { createSearch, type SearchController } from '../core/search';\nimport {\n downloadBlob,\n prepareSvgElement,\n rasterizeToBlob,\n serializeLiveSvg,\n svgBlob,\n} from '../core/export';\n\nexport type RenderStatus = 'loading' | 'ready' | 'error';\n\nexport interface UseMermaidViewerOptions {\n code: string;\n theme: MermaidTheme;\n dark: boolean;\n seed: number;\n fontUrl?: string;\n mermaidConfig?: Record<string, unknown>;\n mermaid?: MermaidSource;\n svgPanZoom?: SvgPanZoomSource;\n panZoom: boolean;\n injectStyles: boolean;\n onRender?: (svg: SVGSVGElement) => void;\n onError?: (err: Error) => void;\n}\n\nexport interface UseMermaidViewerResult {\n stageRef: RefObject<HTMLDivElement>;\n status: RenderStatus;\n error: string;\n zoomPercent: number;\n zoomIn: () => void;\n zoomOut: () => void;\n fit: () => void;\n reset: () => void;\n actualSize: () => void;\n getZoomPercent: () => number;\n search: (term: string, pan?: boolean) => SearchState;\n next: (pan?: boolean) => SearchState;\n prev: (pan?: boolean) => SearchState;\n clearSearch: () => void;\n exportSvg: () => string;\n exportPng: (opts?: ExportRasterOptions) => Promise<Blob>;\n downloadSvg: (filename?: string) => void;\n downloadPng: (filename?: string, opts?: ExportRasterOptions) => Promise<void>;\n getSvg: () => SVGSVGElement | null;\n}\n\nexport function useMermaidViewer(opts: UseMermaidViewerOptions): UseMermaidViewerResult {\n const {\n code,\n theme,\n dark,\n seed,\n fontUrl,\n mermaidConfig,\n mermaid,\n svgPanZoom,\n panZoom,\n injectStyles,\n onRender,\n onError,\n } = opts;\n\n const [status, setStatus] = useState<RenderStatus>('loading');\n const [error, setError] = useState('');\n const [zoomPercent, setZoomPercent] = useState(100);\n\n const stageRef = useRef<HTMLDivElement>(null);\n const svgRef = useRef<SVGSVGElement | null>(null);\n const pzRef = useRef<PanZoomController | null>(null);\n const prevCodeRef = useRef<string | null>(null);\n\n // 把易變的設定放進 ref,讓 async loader / 匯出讀到最新值而不必列為 effect 依賴。\n const mermaidSourceRef = useRef<MermaidSource | undefined>(mermaid);\n const cfgRef = useRef<{\n theme: MermaidTheme;\n dark: boolean;\n seed: number;\n fontUrl?: string;\n mermaidConfig?: Record<string, unknown>;\n code: string;\n }>({ theme, dark, seed, fontUrl, mermaidConfig, code });\n mermaidSourceRef.current = mermaid;\n cfgRef.current = { theme, dark, seed, fontUrl, mermaidConfig, code };\n\n const getSvg = useCallback(() => svgRef.current, []);\n\n // 搜尋控制器:建立一次,透過 ref 讀當前 SVG 與 pan-zoom。\n const searchRef = useRef<SearchController | null>(null);\n const searchController: SearchController = (searchRef.current ??= createSearch(getSvg, (el) =>\n pzRef.current?.panToElement(el),\n ));\n\n const syncZoom = useCallback(() => {\n const pct = pzRef.current?.getZoomPercent();\n if (typeof pct === 'number' && Number.isFinite(pct)) {\n setZoomPercent(pct);\n }\n }, []);\n\n // mermaidConfig 物件每次 render 身分可能改變 → 以序列化值當依賴,避免無謂重繪。\n const mermaidConfigKey = useMemo(\n () => (mermaidConfig ? JSON.stringify(mermaidConfig) : ''),\n [mermaidConfig],\n );\n\n useEffect(() => {\n let cancelled = false;\n const host = stageRef.current;\n if (!host) {\n return undefined;\n }\n if (injectStyles) {\n ensureStyles();\n }\n const keepView = prevCodeRef.current === code;\n\n const run = async (): Promise<void> => {\n setStatus('loading');\n setError('');\n try {\n const mermaidInst = await loadMermaid({ source: mermaidSourceRef.current });\n const { svgString, postProcess } = await renderToSvg({\n code,\n theme,\n dark,\n seed,\n fontUrl,\n mermaidConfig,\n mermaid: mermaidInst,\n });\n if (cancelled) {\n return;\n }\n // 切主題(同一張圖)時保留目前縮放 / 位置。\n const prevView = keepView ? (pzRef.current?.capture() ?? null) : null;\n pzRef.current?.destroy();\n pzRef.current = null;\n\n const svg = mountSvg(host, svgString, postProcess, { dark, seed });\n if (!svg) {\n throw new Error('mermaid 未輸出 SVG。');\n }\n svgRef.current = svg;\n\n if (panZoom) {\n const factory = await loadSvgPanZoom(svgPanZoom);\n if (cancelled) {\n return;\n }\n if (factory) {\n pzRef.current = attachPanZoom(svg, factory, { onZoom: syncZoom });\n if (prevView) {\n pzRef.current.restore(prevView);\n }\n syncZoom();\n }\n }\n\n prevCodeRef.current = code;\n setStatus('ready');\n onRender?.(svg);\n searchController.rerun(false);\n } catch (e) {\n if (cancelled) {\n return;\n }\n // 渲染失敗:保留上一張成功的 SVG(此時尚未覆寫 host),僅回報錯誤。\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err.message);\n setStatus('error');\n onError?.(err);\n }\n };\n\n void run();\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [code, theme, dark, seed, fontUrl, mermaidConfigKey, panZoom, injectStyles]);\n\n // 卸載時清掉 pan-zoom 監聽。\n useEffect(() => {\n return () => {\n pzRef.current?.destroy();\n pzRef.current = null;\n };\n }, []);\n\n const zoomIn = useCallback(() => pzRef.current?.zoomIn(), []);\n const zoomOut = useCallback(() => pzRef.current?.zoomOut(), []);\n const fit = useCallback(() => pzRef.current?.fit(), []);\n const reset = useCallback(() => pzRef.current?.reset(), []);\n const actualSize = useCallback(() => pzRef.current?.actualSize(), []);\n const getZoomPercent = useCallback(() => pzRef.current?.getZoomPercent() ?? 100, []);\n\n const search = useCallback(\n (term: string, pan = true) => searchController.search(term, pan),\n [searchController],\n );\n const next = useCallback((pan = true) => searchController.next(pan), [searchController]);\n const prev = useCallback((pan = true) => searchController.prev(pan), [searchController]);\n const clearSearch = useCallback(() => searchController.clear(), [searchController]);\n\n const exportSvg = useCallback((): string => {\n const svg = svgRef.current;\n if (!svg) {\n throw new Error('[react-super-mermaid] 尚無可匯出的圖表。');\n }\n const prepared = serializeLiveSvg(svg);\n return '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' + prepared.serialized;\n }, []);\n\n // PNG/JPEG/WebP:盡量重繪一張關閉 htmlLabels 的 pristine SVG(避免 foreignObject 污染 canvas),\n // 再依主題補上色後點陣化;mermaid 不可用時退回 live SVG。\n const exportPng = useCallback(async (rasterOpts: ExportRasterOptions = {}): Promise<Blob> => {\n const svg = svgRef.current;\n if (!svg) {\n throw new Error('[react-super-mermaid] 尚無可匯出的圖表。');\n }\n const cfg = cfgRef.current;\n let prepared = serializeLiveSvg(svg);\n try {\n const mermaidInst = await loadMermaid({ source: mermaidSourceRef.current });\n const { svgString } = await renderToSvg({\n code: cfg.code,\n theme: cfg.theme,\n dark: cfg.dark,\n seed: cfg.seed,\n fontUrl: cfg.fontUrl,\n mermaidConfig: cfg.mermaidConfig,\n mermaid: mermaidInst,\n pristine: true,\n });\n const holder = document.createElement('div');\n holder.innerHTML = svgString;\n const pristineSvg = holder.querySelector('svg');\n if (pristineSvg) {\n applyPostProcess(pristineSvg, resolveTheme(cfg.theme, cfg.dark).postProcess, {\n dark: cfg.dark,\n seed: cfg.seed,\n });\n prepared = prepareSvgElement(pristineSvg);\n }\n } catch {\n // 重繪失敗 → 沿用 live SVG(可能含 foreignObject,rasterize 會在污染時丟錯)。\n }\n return rasterizeToBlob(prepared, { ...rasterOpts, dark: cfg.dark });\n }, []);\n\n const downloadSvg = useCallback(\n (filename = 'diagram.svg'): void => {\n downloadBlob(svgBlob(exportSvg()), filename);\n },\n [exportSvg],\n );\n\n const downloadPng = useCallback(\n async (filename = 'diagram.png', rasterOpts: ExportRasterOptions = {}): Promise<void> => {\n const blob = await exportPng(rasterOpts);\n downloadBlob(blob, filename);\n },\n [exportPng],\n );\n\n return {\n stageRef,\n status,\n error,\n zoomPercent,\n zoomIn,\n zoomOut,\n fit,\n reset,\n actualSize,\n getZoomPercent,\n search,\n next,\n prev,\n clearSearch,\n exportSvg,\n exportPng,\n downloadSvg,\n downloadPng,\n getSvg,\n };\n}\n","import type { MermaidTheme } from '../types';\n\nexport interface ThemeOption {\n value: MermaidTheme;\n label: string;\n}\n\nexport const DEFAULT_THEME_OPTIONS: ThemeOption[] = [\n { value: 'colorful', label: 'Colorful' },\n { value: 'sketch', label: 'Excalidraw' },\n { value: 'auto', label: 'Auto' },\n { value: 'default', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n { value: 'neutral', label: 'Neutral' },\n { value: 'forest', label: 'Forest' },\n];\n\nexport interface ToolbarProps {\n theme: MermaidTheme;\n themeOptions: ThemeOption[];\n onThemeChange: (theme: MermaidTheme) => void;\n zoomPercent: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onActualSize: () => void;\n onReset: () => void;\n searchEnabled: boolean;\n searchOpen: boolean;\n onToggleSearch: () => void;\n exportEnabled: boolean;\n exporting: boolean;\n onExportSvg: () => void;\n onExportPng: () => void;\n}\n\nexport function Toolbar(props: ToolbarProps): React.JSX.Element {\n return (\n <div className=\"rsm-toolbar\">\n <label className=\"rsm-label\">\n 樣式\n <select\n className=\"rsm-select\"\n value={props.theme}\n onChange={(e) => props.onThemeChange(e.target.value as MermaidTheme)}\n >\n {props.themeOptions.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n\n <div className=\"rsm-toolbar-spacer\" />\n\n {props.searchEnabled ? (\n <button\n type=\"button\"\n className=\"rsm-btn\"\n aria-pressed={props.searchOpen}\n onClick={props.onToggleSearch}\n title=\"在圖中搜尋(/ 或 Ctrl+F)\"\n >\n 🔍 搜尋\n </button>\n ) : null}\n\n {props.exportEnabled ? (\n <div className=\"rsm-toolbar-group\">\n <button\n type=\"button\"\n className=\"rsm-btn\"\n onClick={props.onExportSvg}\n disabled={props.exporting}\n title=\"匯出 SVG\"\n >\n ⬇ SVG\n </button>\n <button\n type=\"button\"\n className=\"rsm-btn\"\n onClick={props.onExportPng}\n disabled={props.exporting}\n title=\"匯出 PNG(2x)\"\n >\n {props.exporting ? '匯出中…' : '⬇ PNG'}\n </button>\n </div>\n ) : null}\n\n <div className=\"rsm-zoom\">\n <button type=\"button\" onClick={props.onZoomOut} title=\"縮小(-)\">\n -\n </button>\n <button\n type=\"button\"\n className=\"rsm-zoom-percent\"\n onClick={props.onActualSize}\n title=\"實際大小(1)\"\n >\n {props.zoomPercent}%\n </button>\n <button type=\"button\" onClick={props.onZoomIn} title=\"放大(+)\">\n +\n </button>\n <button type=\"button\" onClick={props.onReset} title=\"符合視窗(0)\">\n ⤢\n </button>\n </div>\n </div>\n );\n}\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport type {\n ExportRasterOptions,\n MermaidSource,\n MermaidTheme,\n SearchState,\n SvgPanZoomSource,\n} from '../types';\nimport { useMermaidViewer } from './useMermaidViewer';\nimport { DEFAULT_THEME_OPTIONS, Toolbar, type ThemeOption } from './Toolbar';\n\nexport interface MermaidViewerProps {\n /** mermaid 原始碼字串(必填)。 */\n code: string;\n /** 主題,預設 'colorful'。toolbar 會即時切換;傳入新值也會同步。 */\n theme?: MermaidTheme;\n /** 暗色;省略時自動偵測 prefers-color-scheme。 */\n dark?: boolean;\n /** 是否顯示 toolbox(主題 / 縮放 / 搜尋 / 匯出)。預設 true;false = 只顯示圖表。 */\n toolbar?: boolean;\n /** 自訂 toolbar 上的主題選項。 */\n themeOptions?: ThemeOption[];\n /** 是否啟用 pan/zoom。預設 true。 */\n panZoom?: boolean;\n /** 是否啟用搜尋(toolbar 內)。預設 true。 */\n search?: boolean;\n /** 是否啟用匯出 SVG/PNG(toolbar 內)。預設 true。 */\n exportable?: boolean;\n /** 是否綁定鍵盤快捷鍵(/ Ctrl+F 搜尋、+ - 0 1 縮放)。預設 true。 */\n keyboard?: boolean;\n /** sketch 抖動種子,預設 42。 */\n seed?: number;\n /** sketch 手寫字體來源覆寫。 */\n fontUrl?: string;\n /** 如何取得 mermaid:注入實例 / CDN。省略則動態 import peer。 */\n mermaid?: MermaidSource;\n /** 透傳給 mermaid.initialize 的設定。 */\n mermaidConfig?: Record<string, unknown>;\n /** 如何取得 svg-pan-zoom。省略則動態 import peer。 */\n svgPanZoom?: SvgPanZoomSource;\n /** 是否注入套件內建 CSS,預設 true。 */\n injectStyles?: boolean;\n className?: string;\n style?: React.CSSProperties;\n onRender?: (svg: SVGSVGElement) => void;\n onError?: (err: Error) => void;\n}\n\n/** 命令式控制(透過 ref),適合 toolbar={false} 時 host 自建按鈕。 */\nexport interface MermaidViewerHandle {\n zoomIn: () => void;\n zoomOut: () => void;\n fit: () => void;\n reset: () => void;\n actualSize: () => void;\n getZoomPercent: () => number;\n search: (term: string) => SearchState;\n next: () => SearchState;\n prev: () => SearchState;\n clearSearch: () => void;\n exportSvg: () => string;\n exportPng: (opts?: ExportRasterOptions) => Promise<Blob>;\n downloadSvg: (filename?: string) => void;\n downloadPng: (filename?: string, opts?: ExportRasterOptions) => Promise<void>;\n getSvg: () => SVGSVGElement | null;\n}\n\nfunction usePrefersDark(explicit?: boolean): boolean {\n const [autoDark, setAutoDark] = useState(false);\n useEffect(() => {\n if (explicit !== undefined || typeof window === 'undefined' || !window.matchMedia) {\n return undefined;\n }\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n setAutoDark(mq.matches);\n const handler = (e: MediaQueryListEvent): void => setAutoDark(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [explicit]);\n return explicit ?? autoDark;\n}\n\nexport const MermaidViewer = forwardRef<MermaidViewerHandle, MermaidViewerProps>(\n function MermaidViewer(props, ref): React.JSX.Element {\n const {\n code,\n toolbar = true,\n themeOptions = DEFAULT_THEME_OPTIONS,\n panZoom = true,\n search: searchEnabled = true,\n exportable = true,\n keyboard = true,\n seed = 42,\n fontUrl,\n mermaid,\n mermaidConfig,\n svgPanZoom,\n injectStyles = true,\n className,\n style,\n onRender,\n onError,\n } = props;\n\n const dark = usePrefersDark(props.dark);\n\n // theme:以 prop 為初始 / 受控值,toolbar 變更存內部 state;prop 改變時同步。\n const [theme, setTheme] = useState<MermaidTheme>(props.theme ?? 'colorful');\n useEffect(() => {\n if (props.theme) {\n setTheme(props.theme);\n }\n }, [props.theme]);\n\n const [searchOpen, setSearchOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [matchInfo, setMatchInfo] = useState<SearchState>({ current: 0, total: 0 });\n const [exporting, setExporting] = useState(false);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const vm = useMermaidViewer({\n code,\n theme,\n dark,\n seed,\n fontUrl,\n mermaidConfig,\n mermaid,\n svgPanZoom,\n panZoom,\n injectStyles,\n onRender,\n onError,\n });\n\n const runSearch = useCallback(\n (term: string, pan: boolean): void => {\n setMatchInfo(vm.search(term, pan));\n },\n [vm],\n );\n\n const openSearch = useCallback((): void => {\n setSearchOpen(true);\n window.setTimeout(() => {\n searchInputRef.current?.focus();\n searchInputRef.current?.select();\n }, 0);\n if (query.trim()) {\n runSearch(query, true);\n }\n }, [query, runSearch]);\n\n const closeSearch = useCallback((): void => {\n setSearchOpen(false);\n vm.clearSearch();\n setQuery('');\n setMatchInfo({ current: 0, total: 0 });\n }, [vm]);\n\n const toggleSearch = useCallback((): void => {\n if (searchOpen) {\n closeSearch();\n } else {\n openSearch();\n }\n }, [searchOpen, openSearch, closeSearch]);\n\n const exportSvg = useCallback((): void => {\n try {\n vm.downloadSvg('diagram.svg');\n } catch (e) {\n onError?.(e instanceof Error ? e : new Error(String(e)));\n }\n }, [vm, onError]);\n\n const exportPng = useCallback(async (): Promise<void> => {\n setExporting(true);\n try {\n await vm.downloadPng('diagram.png', { scale: 2 });\n } catch (e) {\n onError?.(e instanceof Error ? e : new Error(String(e)));\n } finally {\n setExporting(false);\n }\n }, [vm, onError]);\n\n // 鍵盤快捷鍵:綁在 root(需 focus),避免像 window 那樣劫持 host 全域按鍵。\n useEffect(() => {\n if (!keyboard) {\n return undefined;\n }\n const root = rootRef.current;\n if (!root) {\n return undefined;\n }\n const onKey = (e: KeyboardEvent): void => {\n const target = e.target as HTMLElement | null;\n const typing = target ? /^(input|textarea|select)$/i.test(target.tagName) : false;\n if ((e.ctrlKey || e.metaKey) && (e.key === 'f' || e.key === 'F')) {\n e.preventDefault();\n openSearch();\n return;\n }\n if (e.key === '/' && !typing) {\n e.preventDefault();\n openSearch();\n return;\n }\n if (e.key === 'Escape' && searchOpen) {\n closeSearch();\n return;\n }\n if (typing) {\n return;\n }\n if (e.key === '+' || e.key === '=') {\n vm.zoomIn();\n } else if (e.key === '-' || e.key === '_') {\n vm.zoomOut();\n } else if (e.key === '0') {\n vm.reset();\n } else if (e.key === '1') {\n vm.actualSize();\n } else if (e.key === 'w' || e.key === 'W') {\n vm.fit();\n }\n };\n root.addEventListener('keydown', onKey);\n return () => root.removeEventListener('keydown', onKey);\n }, [keyboard, searchOpen, openSearch, closeSearch, vm]);\n\n useImperativeHandle(\n ref,\n (): MermaidViewerHandle => ({\n zoomIn: vm.zoomIn,\n zoomOut: vm.zoomOut,\n fit: vm.fit,\n reset: vm.reset,\n actualSize: vm.actualSize,\n getZoomPercent: vm.getZoomPercent,\n search: (term: string) => vm.search(term),\n next: () => vm.next(),\n prev: () => vm.prev(),\n clearSearch: vm.clearSearch,\n exportSvg: vm.exportSvg,\n exportPng: vm.exportPng,\n downloadSvg: vm.downloadSvg,\n downloadPng: vm.downloadPng,\n getSvg: vm.getSvg,\n }),\n [vm],\n );\n\n let countText = '';\n if (matchInfo.total > 0) {\n countText = `${matchInfo.current}/${matchInfo.total}`;\n } else if (query.trim()) {\n countText = '0';\n }\n\n const rootClassName = ['rsm-root', dark ? 'rsm-dark' : '', className ?? '']\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={rootRef}\n className={rootClassName}\n style={style}\n tabIndex={keyboard ? 0 : undefined}\n >\n {toolbar ? (\n <Toolbar\n theme={theme}\n themeOptions={themeOptions}\n onThemeChange={setTheme}\n zoomPercent={vm.zoomPercent}\n onZoomIn={vm.zoomIn}\n onZoomOut={vm.zoomOut}\n onActualSize={vm.actualSize}\n onReset={vm.reset}\n searchEnabled={searchEnabled}\n searchOpen={searchOpen}\n onToggleSearch={toggleSearch}\n exportEnabled={exportable}\n exporting={exporting}\n onExportSvg={exportSvg}\n onExportPng={exportPng}\n />\n ) : null}\n\n {toolbar && searchEnabled && searchOpen ? (\n <div className=\"rsm-searchbar\">\n <input\n ref={searchInputRef}\n className=\"rsm-input\"\n type=\"text\"\n value={query}\n spellCheck={false}\n placeholder=\"在圖中搜尋…(Enter 下一個 / Shift+Enter 上一個)\"\n onChange={(e) => {\n setQuery(e.target.value);\n runSearch(e.target.value, true);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n setMatchInfo(e.shiftKey ? vm.prev() : vm.next());\n } else if (e.key === 'Escape') {\n e.preventDefault();\n closeSearch();\n }\n }}\n />\n <span className=\"rsm-count\">{countText}</span>\n <button type=\"button\" className=\"rsm-btn\" onClick={() => setMatchInfo(vm.prev())}>\n 上一個\n </button>\n <button type=\"button\" className=\"rsm-btn\" onClick={() => setMatchInfo(vm.next())}>\n 下一個\n </button>\n <div className=\"rsm-searchbar-spacer\" />\n <button type=\"button\" className=\"rsm-btn\" onClick={closeSearch}>\n ✕ 關閉\n </button>\n </div>\n ) : null}\n\n <div className=\"rsm-canvas\">\n {vm.status === 'loading' ? <div className=\"rsm-overlay\">圖表渲染中…</div> : null}\n {vm.status === 'error' ? (\n <div className=\"rsm-overlay rsm-error\">圖表載入失敗:{vm.error}</div>\n ) : null}\n <div ref={vm.stageRef} className=\"rsm-stage\" />\n </div>\n </div>\n );\n },\n);\n","import { forwardRef } from 'react';\nimport { MermaidViewer, type MermaidViewerHandle, type MermaidViewerProps } from './MermaidViewer';\n\n/**\n * 只顯示圖表的便利元件 = <MermaidViewer toolbar={false} />。\n * 仍支援 pan/zoom 與透過 ref 的命令式控制(host 可自建按鈕)。\n */\nexport const MermaidDiagram = forwardRef<MermaidViewerHandle, Omit<MermaidViewerProps, 'toolbar'>>(\n function MermaidDiagram(props, ref): React.JSX.Element {\n return <MermaidViewer ref={ref} toolbar={false} {...props} />;\n },\n);\n"]}
@@ -0,0 +1,301 @@
1
+ import * as react from 'react';
2
+ import { RefObject } from 'react';
3
+
4
+ /** 本套件實際用到的 mermaid API 子集 — 避免直接相依 mermaid 匯出的型別。 */
5
+ interface MermaidRenderResult {
6
+ svg: string;
7
+ bindFunctions?: (element: Element) => void;
8
+ }
9
+ interface MermaidLike {
10
+ initialize: (config: unknown) => void;
11
+ render: (id: string, text: string, container?: Element) => Promise<MermaidRenderResult>;
12
+ parse?: (text: string) => Promise<unknown> | unknown;
13
+ }
14
+ /** 如何取得外部 mermaid:注入實例 > peer 動態 import('mermaid') > CDN。 */
15
+ interface MermaidSource {
16
+ /** (a) host 已 import 的 mermaid 實例,最高優先,不再動態載入。 */
17
+ instance?: MermaidLike;
18
+ /** (c) mermaid ESM build 的 CDN 網址,如 .../mermaid@11/dist/mermaid.esm.min.mjs。 */
19
+ cdnUrl?: string;
20
+ }
21
+ interface LoadMermaidOptions {
22
+ source?: MermaidSource;
23
+ /** 強制重新解析(清掉模組級快取)。 */
24
+ fresh?: boolean;
25
+ }
26
+ /** svg-pan-zoom 工廠函式(預設匯出),只列出本套件用到的形狀。 */
27
+ type SvgPanZoomFactory = (svg: SVGElement, options?: Record<string, unknown>) => PanZoomInstance;
28
+ interface SvgPanZoomSource {
29
+ instance?: SvgPanZoomFactory;
30
+ cdnUrl?: string;
31
+ }
32
+ /** svg-pan-zoom 實例 — 只列出本套件用到的方法。 */
33
+ interface PanZoomInstance {
34
+ destroy: () => void;
35
+ zoomBy: (factor: number) => void;
36
+ zoom: (scale: number) => void;
37
+ getZoom: () => number;
38
+ resize: () => void;
39
+ fit: () => void;
40
+ center: () => void;
41
+ pan: (point: {
42
+ x: number;
43
+ y: number;
44
+ }) => void;
45
+ getPan: () => {
46
+ x: number;
47
+ y: number;
48
+ };
49
+ getSizes: () => {
50
+ width: number;
51
+ height: number;
52
+ realZoom: number;
53
+ viewBox: {
54
+ x: number;
55
+ y: number;
56
+ width: number;
57
+ height: number;
58
+ };
59
+ };
60
+ }
61
+ type MermaidTheme = 'colorful' | 'sketch' | 'auto' | 'default' | 'dark' | 'neutral' | 'forest';
62
+ type MermaidBaseTheme = 'default' | 'dark' | 'neutral' | 'forest';
63
+ interface RenderDiagramOptions {
64
+ /** mermaid 原始碼字串。 */
65
+ code: string;
66
+ /** 渲染目標;字串視為 CSS selector。省略則只回傳 detached SVG。 */
67
+ container?: HTMLElement | string;
68
+ theme?: MermaidTheme;
69
+ dark?: boolean;
70
+ /** sketch 抖動亂數種子,預設 42。 */
71
+ seed?: number;
72
+ /** sketch 手寫字體來源覆寫。 */
73
+ fontUrl?: string;
74
+ /** 透傳給 mermaid.initialize 的設定(深合併)。 */
75
+ mermaidConfig?: Record<string, unknown>;
76
+ /** 如何取得 mermaid。 */
77
+ mermaid?: MermaidSource;
78
+ /** 是否注入套件內建 CSS,預設 true。 */
79
+ injectStyles?: boolean;
80
+ }
81
+ interface RenderResult {
82
+ /** 已注入 container(若有提供)的 SVG 元素。 */
83
+ svg: SVGSVGElement;
84
+ /** 序列化後的 SVG 字串。 */
85
+ svgString: string;
86
+ /** 本次 render 使用的唯一 id。 */
87
+ id: string;
88
+ }
89
+ type RasterType = 'png' | 'jpeg' | 'webp';
90
+ interface ExportRasterOptions {
91
+ /** 解析度倍率,預設 2。 */
92
+ scale?: 1 | 2 | 4;
93
+ /** 透明背景(JPEG 不支援,會自動填白)。 */
94
+ transparent?: boolean;
95
+ /** 明確指定背景色,覆寫 transparent。 */
96
+ background?: string;
97
+ type?: RasterType;
98
+ /** jpeg / webp 的品質 0..1,預設 0.92。 */
99
+ quality?: number;
100
+ }
101
+ interface SearchState {
102
+ current: number;
103
+ total: number;
104
+ }
105
+
106
+ interface ThemeOption {
107
+ value: MermaidTheme;
108
+ label: string;
109
+ }
110
+ declare const DEFAULT_THEME_OPTIONS: ThemeOption[];
111
+ interface ToolbarProps {
112
+ theme: MermaidTheme;
113
+ themeOptions: ThemeOption[];
114
+ onThemeChange: (theme: MermaidTheme) => void;
115
+ zoomPercent: number;
116
+ onZoomIn: () => void;
117
+ onZoomOut: () => void;
118
+ onActualSize: () => void;
119
+ onReset: () => void;
120
+ searchEnabled: boolean;
121
+ searchOpen: boolean;
122
+ onToggleSearch: () => void;
123
+ exportEnabled: boolean;
124
+ exporting: boolean;
125
+ onExportSvg: () => void;
126
+ onExportPng: () => void;
127
+ }
128
+ declare function Toolbar(props: ToolbarProps): React.JSX.Element;
129
+
130
+ interface MermaidViewerProps {
131
+ /** mermaid 原始碼字串(必填)。 */
132
+ code: string;
133
+ /** 主題,預設 'colorful'。toolbar 會即時切換;傳入新值也會同步。 */
134
+ theme?: MermaidTheme;
135
+ /** 暗色;省略時自動偵測 prefers-color-scheme。 */
136
+ dark?: boolean;
137
+ /** 是否顯示 toolbox(主題 / 縮放 / 搜尋 / 匯出)。預設 true;false = 只顯示圖表。 */
138
+ toolbar?: boolean;
139
+ /** 自訂 toolbar 上的主題選項。 */
140
+ themeOptions?: ThemeOption[];
141
+ /** 是否啟用 pan/zoom。預設 true。 */
142
+ panZoom?: boolean;
143
+ /** 是否啟用搜尋(toolbar 內)。預設 true。 */
144
+ search?: boolean;
145
+ /** 是否啟用匯出 SVG/PNG(toolbar 內)。預設 true。 */
146
+ exportable?: boolean;
147
+ /** 是否綁定鍵盤快捷鍵(/ Ctrl+F 搜尋、+ - 0 1 縮放)。預設 true。 */
148
+ keyboard?: boolean;
149
+ /** sketch 抖動種子,預設 42。 */
150
+ seed?: number;
151
+ /** sketch 手寫字體來源覆寫。 */
152
+ fontUrl?: string;
153
+ /** 如何取得 mermaid:注入實例 / CDN。省略則動態 import peer。 */
154
+ mermaid?: MermaidSource;
155
+ /** 透傳給 mermaid.initialize 的設定。 */
156
+ mermaidConfig?: Record<string, unknown>;
157
+ /** 如何取得 svg-pan-zoom。省略則動態 import peer。 */
158
+ svgPanZoom?: SvgPanZoomSource;
159
+ /** 是否注入套件內建 CSS,預設 true。 */
160
+ injectStyles?: boolean;
161
+ className?: string;
162
+ style?: React.CSSProperties;
163
+ onRender?: (svg: SVGSVGElement) => void;
164
+ onError?: (err: Error) => void;
165
+ }
166
+ /** 命令式控制(透過 ref),適合 toolbar={false} 時 host 自建按鈕。 */
167
+ interface MermaidViewerHandle {
168
+ zoomIn: () => void;
169
+ zoomOut: () => void;
170
+ fit: () => void;
171
+ reset: () => void;
172
+ actualSize: () => void;
173
+ getZoomPercent: () => number;
174
+ search: (term: string) => SearchState;
175
+ next: () => SearchState;
176
+ prev: () => SearchState;
177
+ clearSearch: () => void;
178
+ exportSvg: () => string;
179
+ exportPng: (opts?: ExportRasterOptions) => Promise<Blob>;
180
+ downloadSvg: (filename?: string) => void;
181
+ downloadPng: (filename?: string, opts?: ExportRasterOptions) => Promise<void>;
182
+ getSvg: () => SVGSVGElement | null;
183
+ }
184
+ declare const MermaidViewer: react.ForwardRefExoticComponent<MermaidViewerProps & react.RefAttributes<MermaidViewerHandle>>;
185
+
186
+ /**
187
+ * 只顯示圖表的便利元件 = <MermaidViewer toolbar={false} />。
188
+ * 仍支援 pan/zoom 與透過 ref 的命令式控制(host 可自建按鈕)。
189
+ */
190
+ declare const MermaidDiagram: react.ForwardRefExoticComponent<Omit<MermaidViewerProps, "toolbar"> & react.RefAttributes<MermaidViewerHandle>>;
191
+
192
+ type RenderStatus = 'loading' | 'ready' | 'error';
193
+ interface UseMermaidViewerOptions {
194
+ code: string;
195
+ theme: MermaidTheme;
196
+ dark: boolean;
197
+ seed: number;
198
+ fontUrl?: string;
199
+ mermaidConfig?: Record<string, unknown>;
200
+ mermaid?: MermaidSource;
201
+ svgPanZoom?: SvgPanZoomSource;
202
+ panZoom: boolean;
203
+ injectStyles: boolean;
204
+ onRender?: (svg: SVGSVGElement) => void;
205
+ onError?: (err: Error) => void;
206
+ }
207
+ interface UseMermaidViewerResult {
208
+ stageRef: RefObject<HTMLDivElement>;
209
+ status: RenderStatus;
210
+ error: string;
211
+ zoomPercent: number;
212
+ zoomIn: () => void;
213
+ zoomOut: () => void;
214
+ fit: () => void;
215
+ reset: () => void;
216
+ actualSize: () => void;
217
+ getZoomPercent: () => number;
218
+ search: (term: string, pan?: boolean) => SearchState;
219
+ next: (pan?: boolean) => SearchState;
220
+ prev: (pan?: boolean) => SearchState;
221
+ clearSearch: () => void;
222
+ exportSvg: () => string;
223
+ exportPng: (opts?: ExportRasterOptions) => Promise<Blob>;
224
+ downloadSvg: (filename?: string) => void;
225
+ downloadPng: (filename?: string, opts?: ExportRasterOptions) => Promise<void>;
226
+ getSvg: () => SVGSVGElement | null;
227
+ }
228
+ declare function useMermaidViewer(opts: UseMermaidViewerOptions): UseMermaidViewerResult;
229
+
230
+ type PostProcess = 'colorful' | 'sketch' | 'none';
231
+ interface ResolvedTheme {
232
+ base: MermaidBaseTheme;
233
+ look: 'classic' | 'handDrawn';
234
+ postProcess: PostProcess;
235
+ }
236
+ declare function resolveTheme(theme: MermaidTheme, dark: boolean): ResolvedTheme;
237
+
238
+ /**
239
+ * 一次性渲染:載入 mermaid、渲染、後處理並(若有 container)注入頁面。
240
+ * 不附 pan/zoom — 適合靜態美化輸出。互動請用 createViewer / <MermaidViewer>。
241
+ */
242
+ declare function renderDiagram(opts: RenderDiagramOptions): Promise<RenderResult>;
243
+
244
+ declare function loadMermaid(opts?: LoadMermaidOptions): Promise<MermaidLike>;
245
+
246
+ declare function loadSvgPanZoom(source?: SvgPanZoomSource): Promise<SvgPanZoomFactory | null>;
247
+
248
+ declare function ensureStyles(): void;
249
+
250
+ interface ColorizeOptions {
251
+ dark?: boolean;
252
+ }
253
+ /** 在已渲染的 mermaid SVG 上套用 Colorful 樣式(就地修改 DOM)。 */
254
+ declare function colorizeDiagram(root: ParentNode, opts?: ColorizeOptions): void;
255
+
256
+ interface SketchOptions {
257
+ dark?: boolean;
258
+ /** 位移濾鏡亂數種子,固定值可確保每次 render 的抖動一致(與 handDrawnSeed 對齊)。 */
259
+ seed?: number;
260
+ }
261
+ declare const SKETCH_FONT = "'Virgil', 'KaiTi', 'Comic Sans MS', cursive";
262
+ declare const DEFAULT_VIRGIL_FONT_URL = "https://cdn.jsdelivr.net/npm/react-super-mermaid/dist/Virgil.woff2";
263
+ /**
264
+ * 對已渲染的 mermaid SVG 套用手繪風(就地修改 DOM)。
265
+ * 僅處理 sequenceDiagram;其他圖型回傳 false 由呼叫端維持原生 handDrawn 結果。
266
+ */
267
+ declare function sketchifyDiagram(root: ParentNode, opts?: SketchOptions): boolean;
268
+ /**
269
+ * 注入 Virgil 的 @font-face 並等待載入完成。
270
+ * 必須在 mermaid.render 之前 await — 否則 mermaid 會用 fallback 字體量測文字寬度,
271
+ * 導致換成 Virgil 後文字溢出方框。載入失敗時靜默退回 fallback 字體,不阻斷渲染。
272
+ *
273
+ * @param fontUrl Virgil woff2 的來源網址;省略則用 DEFAULT_VIRGIL_FONT_URL(jsDelivr)。
274
+ */
275
+ declare function ensureSketchFont(fontUrl?: string): Promise<void>;
276
+
277
+ interface PreparedSvg {
278
+ serialized: string;
279
+ width: number;
280
+ height: number;
281
+ /** 含 <foreignObject>(htmlLabels)→ 點陣化可能污染 canvas,呼叫端宜退回 SVG。 */
282
+ hasForeignObject: boolean;
283
+ }
284
+ /** 解析 mermaid 重繪出來的 SVG 字串(htmlLabels 關閉的 pristine 版),整理成可匯出形式。 */
285
+ declare function prepareSvgString(svgText: string): PreparedSvg | undefined;
286
+ /** 整理一個已存在的 SVG 元素(就地設定尺寸、移除 style 後序列化)。 */
287
+ declare function prepareSvgElement(svg: SVGSVGElement): PreparedSvg;
288
+ /**
289
+ * 從畫面上 live SVG(已上色、可能被 pan/zoom 包了 viewport transform)複製一份、
290
+ * 還原縮放平移後序列化。供同步的 exportSvg() 使用。
291
+ */
292
+ declare function serializeLiveSvg(svg: SVGSVGElement): PreparedSvg;
293
+ declare function svgBlob(serialized: string): Blob;
294
+ /** 把整理好的 SVG 經 Image + canvas 點陣化成 Blob。 */
295
+ declare function rasterizeToBlob(prepared: PreparedSvg, opts?: ExportRasterOptions & {
296
+ dark?: boolean;
297
+ }): Promise<Blob>;
298
+ /** 觸發瀏覽器下載一個 Blob。 */
299
+ declare function downloadBlob(blob: Blob, filename: string): void;
300
+
301
+ export { type ColorizeOptions, DEFAULT_THEME_OPTIONS, DEFAULT_VIRGIL_FONT_URL, type ExportRasterOptions, type LoadMermaidOptions, type MermaidBaseTheme, MermaidDiagram, type MermaidLike, type MermaidSource, type MermaidTheme, MermaidViewer, type MermaidViewerHandle, type MermaidViewerProps, type PanZoomInstance, type PreparedSvg, type RasterType, type RenderDiagramOptions, type RenderResult, type RenderStatus, SKETCH_FONT, type SearchState, type SketchOptions, type SvgPanZoomSource, type ThemeOption, Toolbar, type ToolbarProps, type UseMermaidViewerOptions, type UseMermaidViewerResult, colorizeDiagram, downloadBlob, ensureSketchFont, ensureStyles, loadMermaid, loadSvgPanZoom, prepareSvgElement, prepareSvgString, rasterizeToBlob, renderDiagram, resolveTheme, serializeLiveSvg, sketchifyDiagram, svgBlob, useMermaidViewer };