react-super-mermaid 0.3.0 → 0.4.2
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.
- package/README.md +6 -5
- package/dist/index.cjs +409 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +45 -11
- package/dist/index.d.ts +45 -11
- package/dist/index.js +408 -59
- package/dist/index.js.map +1 -1
- package/llms.txt +3 -3
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +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","useEffect","MermaidViewer","useRef","useCallback","jsxs","jsx","forwardRef","MermaidDiagram"],"mappings":"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","file":"index.js","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>。\r\n// 全部 scope 在 .rsm-root 之下,避免污染 host 頁面;顏色用 CSS 變數,host 可覆寫。\r\n\r\nexport const RSM_STYLE_ID = 'react-super-mermaid-styles';\r\n\r\nexport const RSM_CSS = `\r\n.rsm-root {\r\n --rsm-border: #e5e7eb;\r\n --rsm-fg: #374151;\r\n --rsm-muted: #6b7280;\r\n --rsm-accent: #2563eb;\r\n --rsm-hover: #f3f4f6;\r\n --rsm-surface: #ffffff;\r\n --rsm-canvas-bg: transparent;\r\n --rsm-grid-dot: rgba(0, 0, 0, 0.08);\r\n --rsm-radius: 8px;\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n width: 100%;\r\n box-sizing: border-box;\r\n border: 1px solid var(--rsm-border);\r\n border-radius: var(--rsm-radius);\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\r\n overflow: hidden;\r\n}\r\n.rsm-root *, .rsm-root *::before, .rsm-root *::after { box-sizing: border-box; }\r\n\r\n.rsm-toolbar {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 8px 10px;\r\n border-bottom: 1px solid var(--rsm-border);\r\n}\r\n.rsm-toolbar-spacer { margin-left: auto; }\r\n.rsm-toolbar-group { display: inline-flex; align-items: center; gap: 6px; }\r\n\r\n.rsm-label { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--rsm-muted); }\r\n\r\n.rsm-select {\r\n border: 1px solid var(--rsm-border);\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n border-radius: 6px;\r\n padding: 4px 8px;\r\n font-size: 13px;\r\n cursor: pointer;\r\n}\r\n.rsm-select:focus { outline: none; border-color: var(--rsm-accent); }\r\n\r\n.rsm-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n border: 1px solid var(--rsm-border);\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n border-radius: 6px;\r\n padding: 4px 10px;\r\n font-size: 13px;\r\n line-height: 1.4;\r\n cursor: pointer;\r\n transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;\r\n}\r\n.rsm-btn:hover { background: var(--rsm-hover); }\r\n.rsm-btn[aria-pressed=\"true\"] {\r\n border-color: var(--rsm-accent);\r\n color: var(--rsm-accent);\r\n background: color-mix(in srgb, var(--rsm-accent) 10%, transparent);\r\n}\r\n.rsm-btn:disabled { opacity: 0.6; cursor: default; }\r\n\r\n.rsm-zoom {\r\n display: inline-flex;\r\n align-items: stretch;\r\n border: 1px solid var(--rsm-border);\r\n border-radius: 6px;\r\n overflow: hidden;\r\n}\r\n.rsm-zoom > button {\r\n border: 0;\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n padding: 4px 10px;\r\n font-size: 13px;\r\n cursor: pointer;\r\n}\r\n.rsm-zoom > button:hover { background: var(--rsm-hover); }\r\n.rsm-zoom > button + button { border-left: 1px solid var(--rsm-border); }\r\n.rsm-zoom-percent { min-width: 52px; text-align: center; font-variant-numeric: tabular-nums; font-size: 12px; }\r\n\r\n.rsm-searchbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 8px 10px;\r\n border-bottom: 1px solid var(--rsm-border);\r\n background: var(--rsm-hover);\r\n}\r\n.rsm-input {\r\n flex: 0 1 320px;\r\n border: 1px solid var(--rsm-border);\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n border-radius: 6px;\r\n padding: 5px 10px;\r\n font-size: 13px;\r\n}\r\n.rsm-input:focus { outline: none; border-color: var(--rsm-accent); }\r\n.rsm-count { min-width: 48px; font-size: 12px; color: var(--rsm-muted); font-variant-numeric: tabular-nums; }\r\n.rsm-searchbar-spacer { margin-left: auto; }\r\n\r\n.rsm-canvas {\r\n position: relative;\r\n flex: 1 1 auto;\r\n min-height: 0;\r\n overflow: hidden;\r\n background: var(--rsm-canvas-bg);\r\n}\r\n.rsm-stage { width: 100%; height: 100%; }\r\n.rsm-root svg { cursor: grab; user-select: none; }\r\n.rsm-root svg.rsm-grabbing { cursor: grabbing; }\r\n\r\n.rsm-overlay {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0 16px;\r\n text-align: center;\r\n font-size: 13px;\r\n color: var(--rsm-muted);\r\n pointer-events: none;\r\n}\r\n.rsm-overlay.rsm-error { color: #dc2626; }\r\n\r\n/* 搜尋:命中以外的節點變暗,當前命中加暖色光暈。 */\r\n.rsm-root .rsm-dim { opacity: 0.22; transition: opacity 0.15s ease; }\r\n.rsm-root .rsm-hit { filter: drop-shadow(0 0 5px #f59e0b) drop-shadow(0 0 1.5px #f59e0b); }\r\n\r\n.rsm-root.rsm-dark {\r\n --rsm-border: #374151;\r\n --rsm-fg: #e5e7eb;\r\n --rsm-muted: #9ca3af;\r\n --rsm-accent: #60a5fa;\r\n --rsm-hover: #1f2937;\r\n --rsm-surface: #111827;\r\n --rsm-grid-dot: rgba(255, 255, 255, 0.10);\r\n}\r\n\r\n/* ── 背景模式 ── 透明(預設,跟隨頁面) / 純色(surface) / 點陣格線。 */\r\n.rsm-root.rsm-bg-solid .rsm-canvas { background: var(--rsm-surface); }\r\n.rsm-root.rsm-bg-grid .rsm-canvas {\r\n background-color: var(--rsm-surface);\r\n background-image: radial-gradient(var(--rsm-grid-dot) 1px, transparent 1px);\r\n background-size: 18px 18px;\r\n background-position: -9px -9px;\r\n}\r\n\r\n/* ── 全螢幕跳窗 ── position:fixed 覆蓋整個視窗,RWD 友善。 */\r\n.rsm-root.rsm-fullscreen {\r\n position: fixed;\r\n inset: 0;\r\n width: 100vw;\r\n width: 100dvw;\r\n height: 100vh;\r\n height: 100dvh;\r\n max-width: 100vw;\r\n max-height: 100dvh;\r\n margin: 0;\r\n z-index: 2147483000;\r\n border: 0;\r\n border-radius: 0;\r\n animation: rsm-fs-in 0.16s ease-out;\r\n}\r\n@keyframes rsm-fs-in {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n}\r\n\r\n/* 全螢幕右上角的離開鈕(toolbar 隱藏時也能關閉)。 */\r\n.rsm-fs-close {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n z-index: 5;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 34px;\r\n height: 34px;\r\n padding: 0;\r\n font-size: 16px;\r\n line-height: 1;\r\n border: 1px solid var(--rsm-border);\r\n border-radius: 8px;\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n cursor: pointer;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);\r\n transition: background 0.12s ease, color 0.12s ease;\r\n}\r\n.rsm-fs-close:hover { background: var(--rsm-hover); }\r\n\r\n/* ── RWD ── 小螢幕收緊 toolbar、縮短搜尋框,避免換行擠壓畫布。 */\r\n@media (max-width: 640px) {\r\n .rsm-toolbar { gap: 6px; padding: 6px 8px; }\r\n .rsm-btn { padding: 4px 8px; font-size: 12px; }\r\n .rsm-label { font-size: 11px; }\r\n .rsm-select { padding: 3px 6px; font-size: 12px; }\r\n .rsm-zoom > button { padding: 4px 8px; font-size: 12px; }\r\n .rsm-input { flex-basis: 150px; }\r\n}\r\n`;\r\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 上重新套用現代調色盤\r\n// (Tailwind 100 底色 / 500 邊框) + 圓角 + 軟陰影 + slate 邊線。\r\n// 純 DOM 操作,需在瀏覽器端執行;每個 pass 在零命中時自動跳過,\r\n// 故 mermaid 的 DOM 結構變動不會讓渲染中斷。\r\n\r\nexport interface ColorizeOptions {\r\n dark?: boolean;\r\n}\r\n\r\ninterface PaletteEntry {\r\n fill: string;\r\n stroke: string;\r\n}\r\n\r\nconst NODE_PALETTE: PaletteEntry[] = [\r\n { fill: '#DBEAFE', stroke: '#3B82F6' }, // blue\r\n { fill: '#DCFCE7', stroke: '#22C55E' }, // green\r\n { fill: '#FFEDD5', stroke: '#F97316' }, // orange\r\n { fill: '#F3E8FF', stroke: '#A855F7' }, // purple\r\n { fill: '#FEE2E2', stroke: '#EF4444' }, // red\r\n { fill: '#CFFAFE', stroke: '#06B6D4' }, // cyan\r\n { fill: '#FEF9C3', stroke: '#EAB308' }, // yellow\r\n { fill: '#EDE9FE', stroke: '#8B5CF6' }, // violet\r\n];\r\n\r\n// 叢集 / 水道底色。色相對齊 NODE_PALETTE;底色夠濃(16% 而非舊的 7%)、\r\n// 邊框夠飽和,相鄰水道一眼可辨,標題也更清楚。\r\nconst CLUSTER_PALETTE: PaletteEntry[] = [\r\n { fill: 'rgba(59, 130, 246, 0.16)', stroke: '#3B82F6' }, // blue\r\n { fill: 'rgba(34, 197, 94, 0.16)', stroke: '#22C55E' }, // green\r\n { fill: 'rgba(249, 115, 22, 0.16)', stroke: '#F97316' }, // orange\r\n { fill: 'rgba(168, 85, 247, 0.16)', stroke: '#A855F7' }, // purple\r\n { fill: 'rgba(239, 68, 68, 0.16)', stroke: '#EF4444' }, // red\r\n { fill: 'rgba(6, 182, 212, 0.16)', stroke: '#06B6D4' }, // cyan\r\n { fill: 'rgba(234, 179, 8, 0.16)', stroke: '#EAB308' }, // yellow\r\n { fill: 'rgba(139, 92, 246, 0.16)', stroke: '#8B5CF6' }, // violet\r\n];\r\n\r\n// 圓餅 / 圓環專用的鮮明調色盤。mermaid 在 dark base 主題下的預設圓餅色又暗又糊\r\n// (顏色太死),這裡整組換成飽和、相鄰色相差異大的版本,讓圖表「活」起來。\r\nconst PIE_PALETTE = [\r\n '#3B82F6', // blue\r\n '#22C55E', // green\r\n '#F59E0B', // amber\r\n '#A855F7', // purple\r\n '#EF4444', // red\r\n '#06B6D4', // cyan\r\n '#EC4899', // pink\r\n '#84CC16', // lime\r\n '#F97316', // orange\r\n '#14B8A6', // teal\r\n '#6366F1', // indigo\r\n '#EAB308', // yellow\r\n];\r\n\r\nconst NODE_TEXT = '#1F2937';\r\nconst SHADOW_FILTER_ID = 'rsm-soft-shadow';\r\nconst SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\nfunction resolveSvg(root: ParentNode): Element | null {\r\n if (root instanceof Element && root.tagName.toLowerCase() === 'svg') {\r\n return root;\r\n }\r\n return root.querySelector('svg');\r\n}\r\n\r\n/** 把顏色字串正規化成 \"r,g,b\",讓 attribute(hex)與 inline style(瀏覽器會轉成 rgb)互相對得上。 */\r\nfunction canonColor(input: string): string {\r\n const s = (input || '').trim();\r\n const hex = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(s);\r\n if (hex) {\r\n let h = hex[1];\r\n if (h.length === 3) {\r\n h = h\r\n .split('')\r\n .map((c) => c + c)\r\n .join('');\r\n }\r\n const n = parseInt(h, 16);\r\n return `${(n >> 16) & 255},${(n >> 8) & 255},${n & 255}`;\r\n }\r\n const rgb = /rgba?\\(([^)]+)\\)/i.exec(s);\r\n if (rgb) {\r\n const p = rgb[1].split(',').map((x) => Math.round(parseFloat(x)));\r\n return `${p[0]},${p[1]},${p[2]}`;\r\n }\r\n return s.toLowerCase();\r\n}\r\n\r\n/** 以 sRGB 相對亮度決定:在這個底色上要用白字還是深字,確保對比清楚。 */\r\nfunction readableTextOn(color: string): string {\r\n const m = /^#?([0-9a-f]{6})$/i.exec(color.trim());\r\n if (!m) {\r\n return '#FFFFFF';\r\n }\r\n const n = parseInt(m[1], 16);\r\n const r = (n >> 16) & 255;\r\n const g = (n >> 8) & 255;\r\n const b = n & 255;\r\n const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n return lum > 0.62 ? '#1F2937' : '#FFFFFF';\r\n}\r\n\r\n/** 共用的軟陰影 filter — 讓節點看起來更接近商業工具。 */\r\nfunction ensureShadowFilter(svg: Element): void {\r\n if (svg.querySelector(`#${SHADOW_FILTER_ID}`)) {\r\n return;\r\n }\r\n let defs = svg.querySelector(':scope > defs');\r\n if (!defs) {\r\n defs = document.createElementNS(SVG_NS, 'defs');\r\n svg.insertBefore(defs, svg.firstChild);\r\n }\r\n const filter = document.createElementNS(SVG_NS, 'filter');\r\n filter.setAttribute('id', SHADOW_FILTER_ID);\r\n filter.setAttribute('x', '-25%');\r\n filter.setAttribute('y', '-25%');\r\n filter.setAttribute('width', '150%');\r\n filter.setAttribute('height', '150%');\r\n const drop = document.createElementNS(SVG_NS, 'feDropShadow');\r\n drop.setAttribute('dx', '0');\r\n drop.setAttribute('dy', '1.5');\r\n drop.setAttribute('stdDeviation', '2');\r\n drop.setAttribute('flood-color', '#0F172A');\r\n drop.setAttribute('flood-opacity', '0.22');\r\n filter.appendChild(drop);\r\n defs.appendChild(filter);\r\n}\r\n\r\nfunction roundRect(shape: SVGElement, radius: number): void {\r\n if (shape.tagName.toLowerCase() !== 'rect') {\r\n return;\r\n }\r\n // Stadium 形狀本身已帶大 rx,別把它壓平。\r\n const rx = Number(shape.getAttribute('rx') ?? '0');\r\n if (rx < radius + 1) {\r\n shape.setAttribute('rx', String(radius));\r\n shape.setAttribute('ry', String(radius));\r\n }\r\n}\r\n\r\nfunction paintShapes(group: Element, entry: PaletteEntry): void {\r\n const direct = Array.from(\r\n group.querySelectorAll<SVGElement>(\r\n ':scope > rect, :scope > polygon, :scope > circle, :scope > ellipse, :scope > path',\r\n ),\r\n );\r\n if (direct.length > 0) {\r\n for (const shape of direct) {\r\n shape.style.fill = entry.fill;\r\n shape.style.stroke = entry.stroke;\r\n shape.style.strokeWidth = '1.4px';\r\n roundRect(shape, 8);\r\n }\r\n direct[0].setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\r\n return;\r\n }\r\n // v11 unified-renderer 節點(如 erDiagram 實體)把形狀包在子群組:\r\n // g.outer-path 放背景與邊框、g.row-rect-odd/even 放屬性列、g.divider 放分隔線。\r\n for (const path of Array.from(group.querySelectorAll<SVGElement>(':scope > g.outer-path > *'))) {\r\n if (path.getAttribute('fill') && path.getAttribute('fill') !== 'none') {\r\n path.style.fill = entry.fill;\r\n path.setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\r\n }\r\n if (path.getAttribute('stroke') && path.getAttribute('stroke') !== 'none') {\r\n path.style.stroke = entry.stroke;\r\n path.style.strokeWidth = '1.4px';\r\n }\r\n }\r\n for (const row of Array.from(group.querySelectorAll<SVGElement>(':scope > g.row-rect-odd > *'))) {\r\n row.style.fill = 'rgba(255, 255, 255, 0.55)';\r\n }\r\n for (const row of Array.from(group.querySelectorAll<SVGElement>(':scope > g.row-rect-even > *'))) {\r\n row.style.fill = 'rgba(255, 255, 255, 0.3)';\r\n }\r\n for (const divider of Array.from(group.querySelectorAll<SVGElement>(':scope > g.divider > *'))) {\r\n divider.style.stroke = entry.stroke;\r\n }\r\n}\r\n\r\nfunction darkenNodeText(group: Element): void {\r\n // 底色為淺色 pastel,節點文字在深淺色主題下都必須是深色才看得清楚。\r\n for (const el of Array.from(group.querySelectorAll<SVGTextElement>('text, tspan'))) {\r\n el.style.fill = NODE_TEXT;\r\n }\r\n for (const el of Array.from(group.querySelectorAll<HTMLElement>('.nodeLabel, span, p'))) {\r\n el.style.color = NODE_TEXT;\r\n }\r\n}\r\n\r\n/** slate 色、圓角端點的邊線,比 mermaid 預設更乾淨。 */\r\nfunction styleEdges(svg: Element, dark: boolean): void {\r\n const edgeColor = dark ? '#94A3B8' : '#64748B';\r\n const edgeSelectors = [\r\n '.edgePaths path',\r\n 'g.edgePath path',\r\n 'path.flowchart-link',\r\n 'path.relationshipLine',\r\n ].join(', ');\r\n for (const edge of Array.from(svg.querySelectorAll<SVGElement>(edgeSelectors))) {\r\n edge.style.stroke = edgeColor;\r\n edge.style.strokeWidth = '1.7px';\r\n edge.style.strokeLinecap = 'round';\r\n }\r\n for (const marker of Array.from(svg.querySelectorAll<SVGElement>('marker path'))) {\r\n marker.style.fill = edgeColor;\r\n marker.style.stroke = edgeColor;\r\n }\r\n}\r\n\r\nfunction styleEdgeLabels(svg: Element): void {\r\n for (const label of Array.from(svg.querySelectorAll<HTMLElement>('.edgeLabel span, .edgeLabel p'))) {\r\n label.style.borderRadius = '6px';\r\n }\r\n for (const rect of Array.from(svg.querySelectorAll<SVGElement>('.edgeLabel rect'))) {\r\n rect.setAttribute('rx', '4');\r\n rect.setAttribute('ry', '4');\r\n }\r\n}\r\n\r\n/**\r\n * 訊息文字 / flowchart 邊標籤沿用 mermaid 偏淡的預設色,落在淺色畫布上會糊掉 —\r\n * 一律改成深色(深色主題改淺色),維持像 Excalidraw 一樣清楚。\r\n */\r\nfunction styleLabelText(svg: Element, dark: boolean): void {\r\n const color = dark ? '#E2E8F0' : NODE_TEXT;\r\n for (const t of Array.from(\r\n svg.querySelectorAll<SVGElement>('text.messageText, .edgeLabel text, .edgeLabel tspan'),\r\n )) {\r\n t.style.fill = color;\r\n }\r\n for (const t of Array.from(svg.querySelectorAll<HTMLElement>('.edgeLabel span, .edgeLabel p'))) {\r\n t.style.color = color;\r\n }\r\n}\r\n\r\n/** 對舊版 ER markup(mermaid < 11.x)的實體標題列上色。 */\r\nfunction colorizeLegacyEr(svg: Element): void {\r\n const erGroups: Element[] = [];\r\n for (const rect of Array.from(svg.querySelectorAll<SVGElement>('rect.er.entityBox'))) {\r\n const group = rect.parentElement;\r\n if (group && !erGroups.includes(group)) {\r\n erGroups.push(group);\r\n }\r\n }\r\n erGroups.forEach((group, i) => {\r\n const entry = NODE_PALETTE[i % NODE_PALETTE.length];\r\n for (const rect of Array.from(group.querySelectorAll<SVGElement>('rect.er.entityBox')).slice(0, 1)) {\r\n rect.style.fill = entry.fill;\r\n rect.style.stroke = entry.stroke;\r\n }\r\n for (const label of Array.from(group.querySelectorAll<SVGElement>('text.er.entityLabel'))) {\r\n label.style.fill = NODE_TEXT;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * sequenceDiagram 上色:每條水道(actor 方框 + 生命線 + 啟用條)依名稱輪用調色盤,\r\n * 讓原本同色的各水道一眼可辨。其餘圖型(flowchart / ER …)無 rect.actor,整段自動略過。\r\n */\r\nfunction colorizeSequence(svg: Element, dark: boolean): void {\r\n const actorRects = Array.from(svg.querySelectorAll<SVGRectElement>('rect.actor'));\r\n if (actorRects.length === 0) {\r\n return;\r\n }\r\n\r\n // 依「DOM 出現順序」(頂端 actor 由左至右)替每個名稱配色;頂 / 底方框與生命線共用同色。\r\n const colorByName = new Map<string, PaletteEntry>();\r\n let nextIndex = 0;\r\n for (const rect of actorRects) {\r\n const name = rect.getAttribute('name') ?? `#${nextIndex}`;\r\n let entry = colorByName.get(name);\r\n if (!entry) {\r\n entry = NODE_PALETTE[nextIndex % NODE_PALETTE.length];\r\n colorByName.set(name, entry);\r\n nextIndex += 1;\r\n }\r\n rect.style.fill = entry.fill;\r\n rect.style.stroke = entry.stroke;\r\n rect.style.strokeWidth = '1.4px';\r\n rect.setAttribute('rx', '8');\r\n rect.setAttribute('ry', '8');\r\n rect.setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\r\n // 標題文字(與 rect 同群組)轉深色,落在淺色 pastel 上才清楚。\r\n const group = rect.parentElement;\r\n if (group) {\r\n for (const text of Array.from(group.querySelectorAll<SVGTextElement>('text, tspan'))) {\r\n text.style.fill = NODE_TEXT;\r\n }\r\n }\r\n }\r\n\r\n // 生命線:改用所屬水道的描邊色(以 name 對應),縱向流程比單一灰虛線更好追蹤;\r\n // 同時記下每條生命線的 x 座標 → 水道色,供啟用條對應歸屬。\r\n const lanesByX: { x: number; entry: PaletteEntry }[] = [];\r\n for (const line of Array.from(svg.querySelectorAll<SVGElement>('line.actor-line'))) {\r\n const entry = colorByName.get(line.getAttribute('name') ?? '');\r\n if (!entry) {\r\n continue;\r\n }\r\n line.style.stroke = entry.stroke;\r\n line.style.strokeOpacity = '0.45';\r\n line.style.strokeWidth = '1.3px';\r\n line.style.strokeDasharray = '4 5';\r\n const x = Number(line.getAttribute('x1'));\r\n if (Number.isFinite(x)) {\r\n lanesByX.push({ x, entry });\r\n }\r\n }\r\n\r\n // 啟用條:以中心 x 對應到最近的生命線,套上該水道色,讓「此刻是哪條水道在執行」一眼可辨。\r\n const activations = Array.from(\r\n svg.querySelectorAll<SVGRectElement>('rect.activation0, rect.activation1, rect.activation2'),\r\n );\r\n for (const bar of activations) {\r\n const x = Number(bar.getAttribute('x'));\r\n const w = Number(bar.getAttribute('width'));\r\n if (!Number.isFinite(x) || !Number.isFinite(w) || lanesByX.length === 0) {\r\n continue;\r\n }\r\n const center = x + w / 2;\r\n let best = lanesByX[0];\r\n for (const lane of lanesByX) {\r\n if (Math.abs(lane.x - center) < Math.abs(best.x - center)) {\r\n best = lane;\r\n }\r\n }\r\n bar.style.fill = best.entry.fill;\r\n bar.style.stroke = best.entry.stroke;\r\n bar.style.strokeWidth = '1px';\r\n bar.setAttribute('rx', '3');\r\n bar.setAttribute('ry', '3');\r\n }\r\n\r\n // note:便利貼風(amber)+ 圓角 + 軟陰影 + 深色字。\r\n for (const note of Array.from(svg.querySelectorAll<SVGRectElement>('rect.note'))) {\r\n note.style.fill = '#FEF9C3';\r\n note.style.stroke = '#EAB308';\r\n note.style.strokeWidth = '1.2px';\r\n note.setAttribute('rx', '6');\r\n note.setAttribute('ry', '6');\r\n note.setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\r\n }\r\n for (const text of Array.from(svg.querySelectorAll<SVGTextElement>('.noteText, .noteText tspan'))) {\r\n text.style.fill = NODE_TEXT;\r\n }\r\n\r\n // 訊息線 / loop·alt·opt 外框:統一成 slate 墨線,與 flowchart edge 風格一致;訊息文字轉深色。\r\n const ink = dark ? '#94A3B8' : '#64748B';\r\n for (const line of Array.from(svg.querySelectorAll<SVGElement>('.messageLine0, .messageLine1'))) {\r\n line.style.stroke = ink;\r\n line.style.strokeWidth = '1.6px';\r\n line.style.strokeLinecap = 'round';\r\n }\r\n for (const loop of Array.from(svg.querySelectorAll<SVGElement>('.loopLine'))) {\r\n loop.style.stroke = ink;\r\n loop.style.strokeOpacity = '0.55';\r\n }\r\n for (const text of Array.from(\r\n svg.querySelectorAll<SVGTextElement>('.messageText, .loopText, .labelText'),\r\n )) {\r\n text.style.fill = dark ? '#E2E8F0' : NODE_TEXT;\r\n }\r\n}\r\n\r\n/** Pie / 圓環:換上鮮明調色盤(取代又暗又糊的原生深色),白色分隔線 + 對比文字。 */\r\nfunction stylePie(svg: Element, dark: boolean): void {\r\n const slices = Array.from(svg.querySelectorAll<SVGElement>('path.pieCircle'));\r\n const swatches = Array.from(svg.querySelectorAll<SVGElement>('g.legend rect'));\r\n if (slices.length === 0 && swatches.length === 0) {\r\n return;\r\n }\r\n\r\n // 以「目前填色」為鍵建立 舊色→新鮮明色 對映,讓同一資料項的扇形與圖例色塊拿到同一個新色\r\n // (mermaid 用 ordinal scale 依 label 上色,同 label 的扇形與圖例底色字串一致)。\r\n const remap = new Map<string, string>();\r\n let next = 0;\r\n const newColorFor = (old: string): string => {\r\n const key = canonColor(old) || `#slot-${next}`;\r\n let c = remap.get(key);\r\n if (!c) {\r\n c = PIE_PALETTE[next % PIE_PALETTE.length];\r\n remap.set(key, c);\r\n next += 1;\r\n }\r\n return c;\r\n };\r\n\r\n for (const slice of slices) {\r\n const old = slice.style.fill || slice.getAttribute('fill') || '';\r\n const c = newColorFor(old);\r\n slice.style.fill = c;\r\n slice.style.opacity = '1'; // 原生深色主題的 pieOpacity < 1 會讓扇形發灰 → 拉回不透明。\r\n slice.style.stroke = dark ? '#0F172A' : '#FFFFFF';\r\n slice.style.strokeWidth = '2px';\r\n slice.style.strokeLinejoin = 'round';\r\n }\r\n for (const sw of swatches) {\r\n const old = sw.style.fill || sw.getAttribute('fill') || '';\r\n const c = newColorFor(old);\r\n sw.style.fill = c;\r\n sw.style.stroke = c;\r\n sw.setAttribute('rx', '3');\r\n sw.setAttribute('ry', '3');\r\n }\r\n // 扇形上的百分比文字:依該扇形新色挑白字 / 深字(mermaid 扇形與 .slice 文字同順序)。\r\n Array.from(svg.querySelectorAll<SVGElement>('text.slice')).forEach((label, i) => {\r\n const slice = slices[i];\r\n const c = slice ? slice.style.fill || PIE_PALETTE[0] : PIE_PALETTE[0];\r\n label.style.fill = readableTextOn(c);\r\n label.style.fontWeight = '600';\r\n });\r\n for (const title of Array.from(svg.querySelectorAll<SVGElement>('text.pieTitleText'))) {\r\n title.style.fontWeight = '700';\r\n title.style.fill = dark ? '#E2E8F0' : '#1F2937';\r\n }\r\n for (const t of Array.from(svg.querySelectorAll<SVGElement>('g.legend text'))) {\r\n t.style.fill = dark ? '#E2E8F0' : '#1F2937';\r\n }\r\n for (const oc of Array.from(svg.querySelectorAll<SVGElement>('circle.pieOuterCircle'))) {\r\n oc.style.stroke = dark ? '#334155' : '#CBD5E1';\r\n }\r\n}\r\n\r\n/** Gantt:依 section 替任務上色,保留 done/active/crit 的語意色不動。 */\r\nfunction styleGantt(svg: Element, dark: boolean): void {\r\n const tasks = Array.from(svg.querySelectorAll<SVGElement>('rect.task'));\r\n if (tasks.length === 0) {\r\n return;\r\n }\r\n for (const task of tasks) {\r\n const cls = task.getAttribute('class') ?? '';\r\n if (/\\b(done|active|crit|milestone)\\d*\\b/.test(cls)) {\r\n continue;\r\n }\r\n const m = cls.match(/task(\\d+)/);\r\n if (!m) {\r\n continue;\r\n }\r\n const entry = NODE_PALETTE[Number(m[1]) % NODE_PALETTE.length];\r\n task.style.fill = entry.fill;\r\n task.style.stroke = entry.stroke;\r\n task.setAttribute('rx', '4');\r\n task.setAttribute('ry', '4');\r\n }\r\n Array.from(svg.querySelectorAll<SVGElement>('rect.section')).forEach((band) => {\r\n const m = (band.getAttribute('class') ?? '').match(/section(\\d+)/);\r\n if (m) {\r\n band.style.fill = CLUSTER_PALETTE[Number(m[1]) % CLUSTER_PALETTE.length].fill;\r\n }\r\n });\r\n for (const inBar of Array.from(svg.querySelectorAll<SVGElement>('text.taskText'))) {\r\n if (!/Outside/.test(inBar.getAttribute('class') ?? '')) {\r\n inBar.style.fill = NODE_TEXT;\r\n }\r\n }\r\n for (const tick of Array.from(svg.querySelectorAll<SVGElement>('g.grid g.tick line'))) {\r\n tick.style.stroke = dark ? '#334155' : '#E2E8F0';\r\n }\r\n}\r\n\r\n/** Timeline:同一 section 的節點共用一色(以 section-N class 取得)。 */\r\nfunction styleTimeline(svg: Element): void {\r\n const nodes = Array.from(svg.querySelectorAll<SVGGElement>('g[class*=\"timeline-node\"]'));\r\n nodes.forEach((node, i) => {\r\n const m = (node.getAttribute('class') ?? '').match(/section-(-?\\d+)/);\r\n const section = m ? Number(m[1]) : i;\r\n const entry = section < 0 ? NODE_PALETTE[7] : NODE_PALETTE[section % NODE_PALETTE.length];\r\n const backgrounds = Array.from(node.querySelectorAll<SVGElement>('.node-bkg'));\r\n if (backgrounds.length > 0) {\r\n for (const bkg of backgrounds) {\r\n bkg.style.fill = entry.fill;\r\n bkg.style.stroke = entry.stroke;\r\n bkg.style.strokeWidth = '1.4px';\r\n }\r\n } else {\r\n paintShapes(node, entry);\r\n }\r\n darkenNodeText(node);\r\n });\r\n}\r\n\r\n/** Mindmap:以 section-N class 為鍵,讓同一分支的兄弟節點共用一色。 */\r\nfunction styleMindmap(svg: Element): void {\r\n const nodes = Array.from(svg.querySelectorAll<SVGGElement>('g.mindmap-node'));\r\n if (nodes.length === 0) {\r\n return;\r\n }\r\n for (const node of nodes) {\r\n const m = (node.getAttribute('class') ?? '').match(/section-(-?\\d+)/);\r\n const section = m ? Number(m[1]) : 0;\r\n const entry =\r\n section < 0\r\n ? NODE_PALETTE[7] // root → violet\r\n : NODE_PALETTE[section % NODE_PALETTE.length];\r\n for (const shape of Array.from(\r\n node.querySelectorAll<SVGElement>('path, rect, circle, ellipse'),\r\n )) {\r\n if (shape.closest('g.children')) {\r\n continue; // 只上自己的形狀,不動子孫\r\n }\r\n shape.style.fill = entry.fill;\r\n shape.style.stroke = entry.stroke;\r\n shape.style.strokeWidth = '1.4px';\r\n }\r\n darkenNodeText(node);\r\n }\r\n for (const edge of Array.from(svg.querySelectorAll<SVGElement>('path[class*=\"edge\"]'))) {\r\n const m = (edge.getAttribute('class') ?? '').match(/section-edge-(-?\\d+)/);\r\n if (m) {\r\n const section = Number(m[1]);\r\n const entry = section < 0 ? NODE_PALETTE[7] : NODE_PALETTE[section % NODE_PALETTE.length];\r\n edge.style.stroke = entry.stroke;\r\n edge.style.strokeWidth = '2px';\r\n edge.style.opacity = '0.6';\r\n edge.style.fill = 'none';\r\n }\r\n }\r\n}\r\n\r\n/** Journey:依任務型別替圓點上色,笑臉維持不動。 */\r\nfunction styleJourney(svg: Element): void {\r\n const tasks = Array.from(\r\n svg.querySelectorAll<SVGElement>('circle[class*=\"task-type\"], rect[class*=\"task-type\"]'),\r\n );\r\n tasks.forEach((shape) => {\r\n const m = (shape.getAttribute('class') ?? '').match(/task-type-(\\d+)/);\r\n if (m) {\r\n const entry = NODE_PALETTE[Number(m[1]) % NODE_PALETTE.length];\r\n shape.style.fill = entry.fill;\r\n shape.style.stroke = entry.stroke;\r\n }\r\n });\r\n Array.from(svg.querySelectorAll<SVGElement>('rect[class*=\"section-type\"]')).forEach((rect) => {\r\n const m = (rect.getAttribute('class') ?? '').match(/section-type-(\\d+)/);\r\n if (m) {\r\n const entry = CLUSTER_PALETTE[Number(m[1]) % CLUSTER_PALETTE.length];\r\n rect.style.fill = entry.fill;\r\n rect.style.stroke = entry.stroke;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * 字體清晰度:對「任何主題」渲染出的圖加重文字字重,小字與縮圖也讀得清楚。\r\n * 只動 font-weight(不改色),故對原生 neutral/forest/dark 主題也安全,不會打架。\r\n */\r\nexport function boostLegibility(root: ParentNode): void {\r\n const svg = resolveSvg(root);\r\n if (!svg) {\r\n return;\r\n }\r\n // 節點 / 心智圖 / 時間軸 / actor 標籤:semibold(標題交給各 styler 設更重的 700,\r\n // 這裡不碰,以免把 colorful 已設好的 700 標題壓回 600)。\r\n for (const el of Array.from(\r\n svg.querySelectorAll<SVGElement>(\r\n 'g.node text, g.node tspan, g.mindmap-node text, g[class*=\"timeline-node\"] text, text.actor',\r\n ),\r\n )) {\r\n el.style.fontWeight = '600';\r\n }\r\n for (const el of Array.from(svg.querySelectorAll<HTMLElement>('.nodeLabel, g.node span, g.node p'))) {\r\n el.style.fontWeight = '600';\r\n }\r\n // 其餘文字(邊標籤 / 訊息 / 圖例 / 軸…)至少 medium,整體提升可讀性。\r\n for (const el of Array.from(svg.querySelectorAll<SVGElement>('text'))) {\r\n if (!el.style.fontWeight) {\r\n el.style.fontWeight = '500';\r\n }\r\n }\r\n}\r\n\r\n/** 在已渲染的 mermaid SVG 上套用 Colorful 樣式(就地修改 DOM)。 */\r\nexport function colorizeDiagram(root: ParentNode, opts: ColorizeOptions = {}): void {\r\n const svg = resolveSvg(root);\r\n if (!svg) {\r\n return;\r\n }\r\n ensureShadowFilter(svg);\r\n const dark = opts.dark === true;\r\n\r\n // flowchart / state / class / ER 節點(每個節點依序輪用調色盤)\r\n Array.from(svg.querySelectorAll<SVGGElement>('g.node')).forEach((node, i) => {\r\n paintShapes(node, NODE_PALETTE[i % NODE_PALETTE.length]);\r\n darkenNodeText(node);\r\n });\r\n\r\n // flowchart subgraph(叢集):濃淡分明的底色 + 飽和邊框 + 同色粗體標題,水道一眼可辨。\r\n Array.from(svg.querySelectorAll<SVGGElement>('g.cluster')).forEach((cluster, i) => {\r\n const entry = CLUSTER_PALETTE[i % CLUSTER_PALETTE.length];\r\n for (const rect of Array.from(cluster.querySelectorAll<SVGElement>(':scope > rect'))) {\r\n rect.style.fill = entry.fill;\r\n rect.style.stroke = entry.stroke;\r\n rect.style.strokeWidth = '1.5px';\r\n roundRect(rect, 10);\r\n }\r\n // 標題在 g.cluster-label 內,可能是 HTML label(live)或 <text>(htmlLabels:false 匯出)— 兩種都上色 + 加粗。\r\n const label = cluster.querySelector(':scope > .cluster-label');\r\n if (label) {\r\n for (const el of Array.from(label.querySelectorAll<SVGTextElement>('text, tspan'))) {\r\n el.style.fill = entry.stroke;\r\n el.style.fontWeight = '700';\r\n }\r\n for (const el of Array.from(label.querySelectorAll<HTMLElement>('.nodeLabel, span, p'))) {\r\n el.style.color = entry.stroke;\r\n el.style.fontWeight = '700';\r\n }\r\n for (const lr of Array.from(label.querySelectorAll<SVGElement>('rect'))) {\r\n lr.style.fill = entry.fill;\r\n }\r\n }\r\n });\r\n\r\n colorizeLegacyEr(svg);\r\n colorizeSequence(svg, dark);\r\n styleEdges(svg, dark);\r\n styleEdgeLabels(svg);\r\n styleLabelText(svg, dark);\r\n\r\n // 依 aria-roledescription 分派各圖型專屬上色;未知型別自動略過,每個 styler 零命中即早退,\r\n // 故 mermaid 的 DOM 變動永遠不會讓渲染中斷。\r\n const kind = svg.getAttribute('aria-roledescription') ?? '';\r\n if (kind === 'pie' || kind === 'pieChart') {\r\n stylePie(svg, dark);\r\n } else if (kind === 'gantt') {\r\n styleGantt(svg, dark);\r\n } else if (kind === 'timeline') {\r\n styleTimeline(svg);\r\n } else if (kind === 'mindmap') {\r\n styleMindmap(svg);\r\n } else if (kind === 'journey') {\r\n styleJourney(svg);\r\n }\r\n}\r\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() 共用。\r\n// 順序:ensureStyles → resolveTheme →(sketch 先載字)→ initialize → render → 後處理。\r\n\r\nimport { assertBrowser } from '../env';\r\nimport type { MermaidLike, MermaidTheme, RenderDiagramOptions, RenderResult } from '../types';\r\nimport { boostLegibility, colorizeDiagram } from './themes/colorize';\r\nimport { ensureSketchFont, SKETCH_FONT, sketchifyDiagram } from './themes/sketch';\r\nimport { ensureStyles } from './ensure-styles';\r\nimport { loadMermaid } from './load-mermaid';\r\nimport { resolveTheme, type PostProcess } from './resolve-theme';\r\n\r\n// mermaid.render 需要唯一且合法的 id,用模組級流水號確保不衝突(無 DOM,SSR 安全)。\r\nlet renderSeq = 0;\r\n\r\nexport interface RenderToSvgArgs {\r\n code: string;\r\n theme: MermaidTheme;\r\n dark: boolean;\r\n seed: number;\r\n fontUrl?: string;\r\n mermaidConfig?: Record<string, unknown>;\r\n mermaid: MermaidLike;\r\n /** 強制關閉 htmlLabels(供匯出 pristine SVG 用,避免 foreignObject)。 */\r\n pristine?: boolean;\r\n}\r\n\r\nexport interface RenderedSvg {\r\n svgString: string;\r\n id: string;\r\n postProcess: PostProcess;\r\n}\r\n\r\nfunction buildConfig(args: RenderToSvgArgs): Record<string, unknown> {\r\n const resolved = resolveTheme(args.theme, args.dark);\r\n const htmlLabels = args.pristine ? false : true;\r\n const config: Record<string, unknown> = {\r\n startOnLoad: false,\r\n theme: resolved.base,\r\n securityLevel: 'loose',\r\n htmlLabels,\r\n flowchart: { htmlLabels, useMaxWidth: false },\r\n };\r\n if (args.theme === 'colorful') {\r\n config.flowchart = { htmlLabels, useMaxWidth: false, nodeSpacing: 60, rankSpacing: 65, padding: 12 };\r\n }\r\n if (resolved.look === 'handDrawn') {\r\n config.look = 'handDrawn';\r\n config.handDrawnSeed = args.seed;\r\n config.fontFamily = SKETCH_FONT;\r\n }\r\n // host 自訂設定最後覆蓋(flowchart 做一層淺合併)。\r\n if (args.mermaidConfig) {\r\n const userFlowchart = (args.mermaidConfig.flowchart as Record<string, unknown>) ?? {};\r\n Object.assign(config, args.mermaidConfig);\r\n config.flowchart = { ...(config.flowchart as Record<string, unknown>), ...userFlowchart };\r\n }\r\n return config;\r\n}\r\n\r\n/** 解析設定 → 載字(sketch)→ initialize → render,回傳 mermaid 的 SVG 字串。 */\r\nexport async function renderToSvg(args: RenderToSvgArgs): Promise<RenderedSvg> {\r\n const resolved = resolveTheme(args.theme, args.dark);\r\n if (resolved.look === 'handDrawn') {\r\n // 先載入手寫字體再 render,確保 mermaid 量測文字寬度時用的就是 Virgil。\r\n await ensureSketchFont(args.fontUrl);\r\n }\r\n args.mermaid.initialize(buildConfig(args));\r\n renderSeq += 1;\r\n const id = `rsm-${renderSeq}`;\r\n const { svg } = await args.mermaid.render(id, args.code);\r\n return { svgString: svg, id, postProcess: args.pristine ? 'none' : resolved.postProcess };\r\n}\r\n\r\n/** 把 mermaid SVG 字串塞入 host、套後處理、設定填滿尺寸,回傳 live SVG 元素。 */\r\nexport function mountSvg(\r\n host: HTMLElement,\r\n svgString: string,\r\n postProcess: PostProcess,\r\n opts: { dark: boolean; seed: number },\r\n): SVGSVGElement | null {\r\n host.innerHTML = svgString;\r\n const svg = host.querySelector('svg');\r\n if (!svg) {\r\n return null;\r\n }\r\n applyPostProcess(svg, postProcess, opts);\r\n svg.style.maxWidth = 'none';\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n return svg;\r\n}\r\n\r\nexport function applyPostProcess(\r\n svg: SVGSVGElement,\r\n postProcess: PostProcess,\r\n opts: { dark: boolean; seed: number },\r\n): void {\r\n if (postProcess === 'colorful') {\r\n colorizeDiagram(svg, { dark: opts.dark });\r\n } else if (postProcess === 'sketch') {\r\n // 原生 handDrawn 不作用於 sequenceDiagram,這裡補手繪後處理;非序列圖會自動略過。\r\n sketchifyDiagram(svg, { dark: opts.dark, seed: opts.seed });\r\n }\r\n // 字體清晰度:所有主題(含原生 neutral/forest/dark)都套用,只加粗不改色,安全。\r\n boostLegibility(svg);\r\n}\r\n\r\n/**\r\n * 一次性渲染:載入 mermaid、渲染、後處理並(若有 container)注入頁面。\r\n * 不附 pan/zoom — 適合靜態美化輸出。互動請用 createViewer / <MermaidViewer>。\r\n */\r\nexport async function renderDiagram(opts: RenderDiagramOptions): Promise<RenderResult> {\r\n assertBrowser('renderDiagram');\r\n const dark = opts.dark ?? false;\r\n const seed = opts.seed ?? 42;\r\n if (opts.injectStyles !== false) {\r\n ensureStyles();\r\n }\r\n const mermaid = await loadMermaid({ source: opts.mermaid });\r\n const { svgString, id, postProcess } = await renderToSvg({\r\n code: opts.code,\r\n theme: opts.theme ?? 'colorful',\r\n dark,\r\n seed,\r\n fontUrl: opts.fontUrl,\r\n mermaidConfig: opts.mermaidConfig,\r\n mermaid,\r\n });\r\n\r\n const host =\r\n typeof opts.container === 'string'\r\n ? document.querySelector<HTMLElement>(opts.container)\r\n : (opts.container ?? document.createElement('div'));\r\n if (!host) {\r\n throw new Error(`[react-super-mermaid] 找不到 container:${String(opts.container)}`);\r\n }\r\n const svg = mountSvg(host, svgString, postProcess, { dark, seed });\r\n if (!svg) {\r\n throw new Error('[react-super-mermaid] mermaid 未輸出 SVG。');\r\n }\r\n return { svg, svgString, id };\r\n}\r\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, RsmBackground } from '../types';\r\n\r\nexport interface ThemeOption {\r\n value: MermaidTheme;\r\n label: string;\r\n}\r\n\r\n/** 背景模式 → 按鈕上顯示的圖示與文字。 */\r\nexport const BACKGROUND_LABELS: Record<RsmBackground, { icon: string; label: string }> = {\r\n transparent: { icon: '▦', label: '透明' },\r\n solid: { icon: '◻', label: '純色' },\r\n grid: { icon: '⊞', label: '格線' },\r\n};\r\n\r\nexport const DEFAULT_THEME_OPTIONS: ThemeOption[] = [\r\n { value: 'colorful', label: 'Colorful' },\r\n { value: 'sketch', label: 'Excalidraw' },\r\n { value: 'auto', label: 'Auto' },\r\n { value: 'default', label: 'Light' },\r\n { value: 'dark', label: 'Dark' },\r\n { value: 'neutral', label: 'Neutral' },\r\n { value: 'forest', label: 'Forest' },\r\n];\r\n\r\nexport interface ToolbarProps {\r\n theme: MermaidTheme;\r\n themeOptions: ThemeOption[];\r\n onThemeChange: (theme: MermaidTheme) => void;\r\n zoomPercent: number;\r\n onZoomIn: () => void;\r\n onZoomOut: () => void;\r\n onActualSize: () => void;\r\n onReset: () => void;\r\n searchEnabled: boolean;\r\n searchOpen: boolean;\r\n onToggleSearch: () => void;\r\n exportEnabled: boolean;\r\n exporting: boolean;\r\n onExportSvg: () => void;\r\n onExportPng: () => void;\r\n backgroundEnabled: boolean;\r\n background: RsmBackground;\r\n onCycleBackground: () => void;\r\n fullscreenEnabled: boolean;\r\n fullscreen: boolean;\r\n onToggleFullscreen: () => void;\r\n}\r\n\r\nexport function Toolbar(props: ToolbarProps): React.JSX.Element {\r\n return (\r\n <div className=\"rsm-toolbar\">\r\n <label className=\"rsm-label\">\r\n 樣式\r\n <select\r\n className=\"rsm-select\"\r\n value={props.theme}\r\n onChange={(e) => props.onThemeChange(e.target.value as MermaidTheme)}\r\n >\r\n {props.themeOptions.map((o) => (\r\n <option key={o.value} value={o.value}>\r\n {o.label}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n\r\n {props.backgroundEnabled ? (\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn\"\r\n onClick={props.onCycleBackground}\r\n title=\"切換畫布背景(透明 / 純色 / 格線,B)\"\r\n >\r\n {BACKGROUND_LABELS[props.background].icon} 背景:{BACKGROUND_LABELS[props.background].label}\r\n </button>\r\n ) : null}\r\n\r\n <div className=\"rsm-toolbar-spacer\" />\r\n\r\n {props.searchEnabled ? (\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn\"\r\n aria-pressed={props.searchOpen}\r\n onClick={props.onToggleSearch}\r\n title=\"在圖中搜尋(/ 或 Ctrl+F)\"\r\n >\r\n 🔍 搜尋\r\n </button>\r\n ) : null}\r\n\r\n {props.exportEnabled ? (\r\n <div className=\"rsm-toolbar-group\">\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn\"\r\n onClick={props.onExportSvg}\r\n disabled={props.exporting}\r\n title=\"匯出 SVG\"\r\n >\r\n ⬇ SVG\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn\"\r\n onClick={props.onExportPng}\r\n disabled={props.exporting}\r\n title=\"匯出 PNG(2x)\"\r\n >\r\n {props.exporting ? '匯出中…' : '⬇ PNG'}\r\n </button>\r\n </div>\r\n ) : null}\r\n\r\n <div className=\"rsm-zoom\">\r\n <button type=\"button\" onClick={props.onZoomOut} title=\"縮小(-)\">\r\n -\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"rsm-zoom-percent\"\r\n onClick={props.onActualSize}\r\n title=\"實際大小(1)\"\r\n >\r\n {props.zoomPercent}%\r\n </button>\r\n <button type=\"button\" onClick={props.onZoomIn} title=\"放大(+)\">\r\n +\r\n </button>\r\n <button type=\"button\" onClick={props.onReset} title=\"符合視窗(0)\">\r\n ⤢\r\n </button>\r\n </div>\r\n\r\n {props.fullscreenEnabled ? (\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn rsm-btn-fullscreen\"\r\n aria-pressed={props.fullscreen ? 'true' : 'false'}\r\n onClick={props.onToggleFullscreen}\r\n title={props.fullscreen ? '離開全螢幕(Esc)' : '全螢幕檢視(F)'}\r\n >\r\n {props.fullscreen ? '✕ 離開全螢幕' : '⛶ 全螢幕'}\r\n </button>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\r\nimport type {\r\n ExportRasterOptions,\r\n MermaidSource,\r\n MermaidTheme,\r\n RsmBackground,\r\n SearchState,\r\n SvgPanZoomSource,\r\n} from '../types';\r\nimport { useMermaidViewer } from './useMermaidViewer';\r\nimport { DEFAULT_THEME_OPTIONS, Toolbar, type ThemeOption } from './Toolbar';\r\n\r\n/** 背景循環順序:透明 → 純色 → 格線 → 透明。 */\r\nconst BACKGROUND_CYCLE: RsmBackground[] = ['transparent', 'solid', 'grid'];\r\n\r\nexport interface MermaidViewerProps {\r\n /** mermaid 原始碼字串(必填)。 */\r\n code: string;\r\n /** 主題,預設 'colorful'。toolbar 會即時切換;傳入新值也會同步。 */\r\n theme?: MermaidTheme;\r\n /** 暗色;省略時自動偵測 prefers-color-scheme。 */\r\n dark?: boolean;\r\n /** 是否顯示 toolbox(主題 / 縮放 / 搜尋 / 匯出)。預設 true;false = 只顯示圖表。 */\r\n toolbar?: boolean;\r\n /** 自訂 toolbar 上的主題選項。 */\r\n themeOptions?: ThemeOption[];\r\n /** 是否啟用 pan/zoom。預設 true。 */\r\n panZoom?: boolean;\r\n /** 是否啟用搜尋(toolbar 內)。預設 true。 */\r\n search?: boolean;\r\n /** 是否啟用匯出 SVG/PNG(toolbar 內)。預設 true。 */\r\n exportable?: boolean;\r\n /** 是否顯示背景切換鈕(透明 / 純色 / 格線)。預設 true。 */\r\n background?: boolean;\r\n /** 背景模式初始 / 受控值,預設 'transparent';toolbar 變更存內部 state。 */\r\n backgroundMode?: RsmBackground;\r\n /** 是否顯示全螢幕鈕(以跳窗形式覆蓋整個視窗,支援 RWD)。預設 true。 */\r\n fullscreen?: boolean;\r\n /** 進 / 出全螢幕時的回呼。 */\r\n onFullscreenChange?: (fullscreen: boolean) => void;\r\n /** 是否綁定鍵盤快捷鍵(/ Ctrl+F 搜尋、+ - 0 1 縮放、F 全螢幕、B 背景)。預設 true。 */\r\n keyboard?: boolean;\r\n /** sketch 抖動種子,預設 42。 */\r\n seed?: number;\r\n /** sketch 手寫字體來源覆寫。 */\r\n fontUrl?: string;\r\n /** 如何取得 mermaid:注入實例 / CDN。省略則動態 import peer。 */\r\n mermaid?: MermaidSource;\r\n /** 透傳給 mermaid.initialize 的設定。 */\r\n mermaidConfig?: Record<string, unknown>;\r\n /** 如何取得 svg-pan-zoom。省略則動態 import peer。 */\r\n svgPanZoom?: SvgPanZoomSource;\r\n /** 是否注入套件內建 CSS,預設 true。 */\r\n injectStyles?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n onRender?: (svg: SVGSVGElement) => void;\r\n onError?: (err: Error) => void;\r\n}\r\n\r\n/** 命令式控制(透過 ref),適合 toolbar={false} 時 host 自建按鈕。 */\r\nexport interface MermaidViewerHandle {\r\n zoomIn: () => void;\r\n zoomOut: () => void;\r\n fit: () => void;\r\n reset: () => void;\r\n actualSize: () => void;\r\n getZoomPercent: () => number;\r\n search: (term: string) => SearchState;\r\n next: () => SearchState;\r\n prev: () => SearchState;\r\n clearSearch: () => void;\r\n exportSvg: () => string;\r\n exportPng: (opts?: ExportRasterOptions) => Promise<Blob>;\r\n downloadSvg: (filename?: string) => void;\r\n downloadPng: (filename?: string, opts?: ExportRasterOptions) => Promise<void>;\r\n getSvg: () => SVGSVGElement | null;\r\n enterFullscreen: () => void;\r\n exitFullscreen: () => void;\r\n toggleFullscreen: () => void;\r\n isFullscreen: () => boolean;\r\n setBackground: (mode: RsmBackground) => void;\r\n cycleBackground: () => void;\r\n getBackground: () => RsmBackground;\r\n}\r\n\r\nfunction usePrefersDark(explicit?: boolean): boolean {\r\n const [autoDark, setAutoDark] = useState(false);\r\n useEffect(() => {\r\n if (explicit !== undefined || typeof window === 'undefined' || !window.matchMedia) {\r\n return undefined;\r\n }\r\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\r\n setAutoDark(mq.matches);\r\n const handler = (e: MediaQueryListEvent): void => setAutoDark(e.matches);\r\n mq.addEventListener('change', handler);\r\n return () => mq.removeEventListener('change', handler);\r\n }, [explicit]);\r\n return explicit ?? autoDark;\r\n}\r\n\r\nexport const MermaidViewer = forwardRef<MermaidViewerHandle, MermaidViewerProps>(\r\n function MermaidViewer(props, ref): React.JSX.Element {\r\n const {\r\n code,\r\n toolbar = true,\r\n themeOptions = DEFAULT_THEME_OPTIONS,\r\n panZoom = true,\r\n search: searchEnabled = true,\r\n exportable = true,\r\n background: backgroundEnabled = true,\r\n fullscreen: fullscreenEnabled = true,\r\n onFullscreenChange,\r\n keyboard = true,\r\n seed = 42,\r\n fontUrl,\r\n mermaid,\r\n mermaidConfig,\r\n svgPanZoom,\r\n injectStyles = true,\r\n className,\r\n style,\r\n onRender,\r\n onError,\r\n } = props;\r\n\r\n const dark = usePrefersDark(props.dark);\r\n\r\n // theme:以 prop 為初始 / 受控值,toolbar 變更存內部 state;prop 改變時同步。\r\n const [theme, setTheme] = useState<MermaidTheme>(props.theme ?? 'colorful');\r\n useEffect(() => {\r\n if (props.theme) {\r\n setTheme(props.theme);\r\n }\r\n }, [props.theme]);\r\n\r\n const [searchOpen, setSearchOpen] = useState(false);\r\n const [query, setQuery] = useState('');\r\n const [matchInfo, setMatchInfo] = useState<SearchState>({ current: 0, total: 0 });\r\n const [exporting, setExporting] = useState(false);\r\n\r\n // 背景模式:以 prop 為初始 / 受控值,toolbar 變更存內部 state;prop 改變時同步。\r\n const [background, setBackgroundState] = useState<RsmBackground>(\r\n props.backgroundMode ?? 'transparent',\r\n );\r\n useEffect(() => {\r\n if (props.backgroundMode) {\r\n setBackgroundState(props.backgroundMode);\r\n }\r\n }, [props.backgroundMode]);\r\n\r\n const [isFullscreen, setIsFullscreen] = useState(false);\r\n\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const searchInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const vm = useMermaidViewer({\r\n code,\r\n theme,\r\n dark,\r\n seed,\r\n fontUrl,\r\n mermaidConfig,\r\n mermaid,\r\n svgPanZoom,\r\n panZoom,\r\n injectStyles,\r\n onRender,\r\n onError,\r\n });\r\n\r\n const runSearch = useCallback(\r\n (term: string, pan: boolean): void => {\r\n setMatchInfo(vm.search(term, pan));\r\n },\r\n [vm],\r\n );\r\n\r\n const openSearch = useCallback((): void => {\r\n setSearchOpen(true);\r\n window.setTimeout(() => {\r\n searchInputRef.current?.focus();\r\n searchInputRef.current?.select();\r\n }, 0);\r\n if (query.trim()) {\r\n runSearch(query, true);\r\n }\r\n }, [query, runSearch]);\r\n\r\n const closeSearch = useCallback((): void => {\r\n setSearchOpen(false);\r\n vm.clearSearch();\r\n setQuery('');\r\n setMatchInfo({ current: 0, total: 0 });\r\n }, [vm]);\r\n\r\n const toggleSearch = useCallback((): void => {\r\n if (searchOpen) {\r\n closeSearch();\r\n } else {\r\n openSearch();\r\n }\r\n }, [searchOpen, openSearch, closeSearch]);\r\n\r\n const exportSvg = useCallback((): void => {\r\n try {\r\n vm.downloadSvg('diagram.svg');\r\n } catch (e) {\r\n onError?.(e instanceof Error ? e : new Error(String(e)));\r\n }\r\n }, [vm, onError]);\r\n\r\n const exportPng = useCallback(async (): Promise<void> => {\r\n setExporting(true);\r\n try {\r\n await vm.downloadPng('diagram.png', { scale: 2 });\r\n } catch (e) {\r\n onError?.(e instanceof Error ? e : new Error(String(e)));\r\n } finally {\r\n setExporting(false);\r\n }\r\n }, [vm, onError]);\r\n\r\n const cycleBackground = useCallback((): void => {\r\n setBackgroundState((prev) => {\r\n const i = BACKGROUND_CYCLE.indexOf(prev);\r\n return BACKGROUND_CYCLE[(i + 1) % BACKGROUND_CYCLE.length];\r\n });\r\n }, []);\r\n\r\n const setBackground = useCallback((mode: RsmBackground): void => {\r\n setBackgroundState(mode);\r\n }, []);\r\n\r\n // 全螢幕用「跳窗」實作(position:fixed 覆蓋整個視窗),而非原生 Fullscreen API:\r\n // 可靠、可跨 iframe、天然支援 RWD,且 Esc / 按鈕皆能關閉。\r\n const enterFullscreen = useCallback((): void => {\r\n setIsFullscreen((prev) => {\r\n if (!prev) {\r\n onFullscreenChange?.(true);\r\n }\r\n return true;\r\n });\r\n }, [onFullscreenChange]);\r\n\r\n const exitFullscreen = useCallback((): void => {\r\n setIsFullscreen((prev) => {\r\n if (prev) {\r\n onFullscreenChange?.(false);\r\n }\r\n return false;\r\n });\r\n }, [onFullscreenChange]);\r\n\r\n const toggleFullscreen = useCallback((): void => {\r\n setIsFullscreen((prev) => {\r\n onFullscreenChange?.(!prev);\r\n return !prev;\r\n });\r\n }, [onFullscreenChange]);\r\n\r\n // 進 / 出全螢幕:鎖住背景捲動、綁 window 級 Esc 關閉,並在版面尺寸改變後重新 fit。\r\n useEffect(() => {\r\n if (!isFullscreen) {\r\n return undefined;\r\n }\r\n const body = typeof document !== 'undefined' ? document.body : null;\r\n const prevOverflow = body?.style.overflow ?? '';\r\n if (body) {\r\n body.style.overflow = 'hidden';\r\n }\r\n const onWinKey = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n exitFullscreen();\r\n }\r\n };\r\n window.addEventListener('keydown', onWinKey);\r\n // 等版面套用全螢幕尺寸後再 resize + fit + center。\r\n const fitId = window.setTimeout(() => vm.reset(), 60);\r\n // RWD:旋轉螢幕 / 視窗尺寸變動時重新貼合。\r\n let resizeId = 0;\r\n const onResize = (): void => {\r\n window.clearTimeout(resizeId);\r\n resizeId = window.setTimeout(() => vm.reset(), 150);\r\n };\r\n window.addEventListener('resize', onResize);\r\n window.addEventListener('orientationchange', onResize);\r\n // 把焦點移到 root,讓內部鍵盤快捷鍵(縮放 / 搜尋)在跳窗內可用。\r\n rootRef.current?.focus();\r\n return () => {\r\n window.removeEventListener('keydown', onWinKey);\r\n window.removeEventListener('resize', onResize);\r\n window.removeEventListener('orientationchange', onResize);\r\n window.clearTimeout(fitId);\r\n window.clearTimeout(resizeId);\r\n if (body) {\r\n body.style.overflow = prevOverflow;\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isFullscreen, exitFullscreen]);\r\n\r\n // 離開全螢幕後也重新 fit(版面從跳窗縮回行內尺寸);跳過首次掛載。\r\n const fsMountedRef = useRef(false);\r\n useEffect(() => {\r\n if (!fsMountedRef.current) {\r\n fsMountedRef.current = true;\r\n return undefined;\r\n }\r\n if (isFullscreen) {\r\n return undefined;\r\n }\r\n const id = window.setTimeout(() => vm.reset(), 60);\r\n return () => window.clearTimeout(id);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isFullscreen]);\r\n\r\n // 鍵盤快捷鍵:綁在 root(需 focus),避免像 window 那樣劫持 host 全域按鍵。\r\n useEffect(() => {\r\n if (!keyboard) {\r\n return undefined;\r\n }\r\n const root = rootRef.current;\r\n if (!root) {\r\n return undefined;\r\n }\r\n const onKey = (e: KeyboardEvent): void => {\r\n const target = e.target as HTMLElement | null;\r\n const typing = target ? /^(input|textarea|select)$/i.test(target.tagName) : false;\r\n if ((e.ctrlKey || e.metaKey) && (e.key === 'f' || e.key === 'F')) {\r\n e.preventDefault();\r\n openSearch();\r\n return;\r\n }\r\n if (e.key === '/' && !typing) {\r\n e.preventDefault();\r\n openSearch();\r\n return;\r\n }\r\n if (e.key === 'Escape' && searchOpen) {\r\n closeSearch();\r\n return;\r\n }\r\n if (e.key === 'Escape' && isFullscreen) {\r\n e.preventDefault();\r\n exitFullscreen();\r\n return;\r\n }\r\n if (typing) {\r\n return;\r\n }\r\n if (e.key === '+' || e.key === '=') {\r\n vm.zoomIn();\r\n } else if (e.key === '-' || e.key === '_') {\r\n vm.zoomOut();\r\n } else if (e.key === '0') {\r\n vm.reset();\r\n } else if (e.key === '1') {\r\n vm.actualSize();\r\n } else if (e.key === 'w' || e.key === 'W') {\r\n vm.fit();\r\n } else if (fullscreenEnabled && (e.key === 'f' || e.key === 'F')) {\r\n e.preventDefault();\r\n toggleFullscreen();\r\n } else if (backgroundEnabled && (e.key === 'b' || e.key === 'B')) {\r\n e.preventDefault();\r\n cycleBackground();\r\n }\r\n };\r\n root.addEventListener('keydown', onKey);\r\n return () => root.removeEventListener('keydown', onKey);\r\n }, [\r\n keyboard,\r\n searchOpen,\r\n openSearch,\r\n closeSearch,\r\n vm,\r\n isFullscreen,\r\n exitFullscreen,\r\n toggleFullscreen,\r\n cycleBackground,\r\n fullscreenEnabled,\r\n backgroundEnabled,\r\n ]);\r\n\r\n useImperativeHandle(\r\n ref,\r\n (): MermaidViewerHandle => ({\r\n zoomIn: vm.zoomIn,\r\n zoomOut: vm.zoomOut,\r\n fit: vm.fit,\r\n reset: vm.reset,\r\n actualSize: vm.actualSize,\r\n getZoomPercent: vm.getZoomPercent,\r\n search: (term: string) => vm.search(term),\r\n next: () => vm.next(),\r\n prev: () => vm.prev(),\r\n clearSearch: vm.clearSearch,\r\n exportSvg: vm.exportSvg,\r\n exportPng: vm.exportPng,\r\n downloadSvg: vm.downloadSvg,\r\n downloadPng: vm.downloadPng,\r\n getSvg: vm.getSvg,\r\n enterFullscreen,\r\n exitFullscreen,\r\n toggleFullscreen,\r\n isFullscreen: () => isFullscreen,\r\n setBackground,\r\n cycleBackground,\r\n getBackground: () => background,\r\n }),\r\n [\r\n vm,\r\n enterFullscreen,\r\n exitFullscreen,\r\n toggleFullscreen,\r\n isFullscreen,\r\n setBackground,\r\n cycleBackground,\r\n background,\r\n ],\r\n );\r\n\r\n let countText = '';\r\n if (matchInfo.total > 0) {\r\n countText = `${matchInfo.current}/${matchInfo.total}`;\r\n } else if (query.trim()) {\r\n countText = '0';\r\n }\r\n\r\n const rootClassName = [\r\n 'rsm-root',\r\n dark ? 'rsm-dark' : '',\r\n `rsm-bg-${background}`,\r\n isFullscreen ? 'rsm-fullscreen' : '',\r\n className ?? '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={rootClassName}\r\n style={style}\r\n tabIndex={keyboard ? 0 : undefined}\r\n >\r\n {toolbar ? (\r\n <Toolbar\r\n theme={theme}\r\n themeOptions={themeOptions}\r\n onThemeChange={setTheme}\r\n zoomPercent={vm.zoomPercent}\r\n onZoomIn={vm.zoomIn}\r\n onZoomOut={vm.zoomOut}\r\n onActualSize={vm.actualSize}\r\n onReset={vm.reset}\r\n searchEnabled={searchEnabled}\r\n searchOpen={searchOpen}\r\n onToggleSearch={toggleSearch}\r\n exportEnabled={exportable}\r\n exporting={exporting}\r\n onExportSvg={exportSvg}\r\n onExportPng={exportPng}\r\n backgroundEnabled={backgroundEnabled}\r\n background={background}\r\n onCycleBackground={cycleBackground}\r\n fullscreenEnabled={fullscreenEnabled}\r\n fullscreen={isFullscreen}\r\n onToggleFullscreen={toggleFullscreen}\r\n />\r\n ) : null}\r\n\r\n {toolbar && searchEnabled && searchOpen ? (\r\n <div className=\"rsm-searchbar\">\r\n <input\r\n ref={searchInputRef}\r\n className=\"rsm-input\"\r\n type=\"text\"\r\n value={query}\r\n spellCheck={false}\r\n placeholder=\"在圖中搜尋…(Enter 下一個 / Shift+Enter 上一個)\"\r\n onChange={(e) => {\r\n setQuery(e.target.value);\r\n runSearch(e.target.value, true);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n setMatchInfo(e.shiftKey ? vm.prev() : vm.next());\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n closeSearch();\r\n }\r\n }}\r\n />\r\n <span className=\"rsm-count\">{countText}</span>\r\n <button type=\"button\" className=\"rsm-btn\" onClick={() => setMatchInfo(vm.prev())}>\r\n 上一個\r\n </button>\r\n <button type=\"button\" className=\"rsm-btn\" onClick={() => setMatchInfo(vm.next())}>\r\n 下一個\r\n </button>\r\n <div className=\"rsm-searchbar-spacer\" />\r\n <button type=\"button\" className=\"rsm-btn\" onClick={closeSearch}>\r\n ✕ 關閉\r\n </button>\r\n </div>\r\n ) : null}\r\n\r\n <div className=\"rsm-canvas\">\r\n {vm.status === 'loading' ? <div className=\"rsm-overlay\">圖表渲染中…</div> : null}\r\n {vm.status === 'error' ? (\r\n <div className=\"rsm-overlay rsm-error\">圖表載入失敗:{vm.error}</div>\r\n ) : null}\r\n {isFullscreen ? (\r\n <button\r\n type=\"button\"\r\n className=\"rsm-fs-close\"\r\n onClick={exitFullscreen}\r\n title=\"離開全螢幕(Esc)\"\r\n aria-label=\"離開全螢幕\"\r\n >\r\n ✕\r\n </button>\r\n ) : null}\r\n <div ref={vm.stageRef} className=\"rsm-stage\" />\r\n </div>\r\n </div>\r\n );\r\n },\r\n);\r\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"]}
|
|
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","useEffect","MermaidViewer","useCallback","jsxs","jsx","forwardRef","MermaidDiagram"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"index.js","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>。\r\n// 全部 scope 在 .rsm-root 之下,避免污染 host 頁面;顏色用 CSS 變數,host 可覆寫。\r\n\r\nexport const RSM_STYLE_ID = 'react-super-mermaid-styles';\r\n\r\nexport const RSM_CSS = `\r\n.rsm-root {\r\n --rsm-border: #e5e7eb;\r\n --rsm-fg: #374151;\r\n --rsm-muted: #6b7280;\r\n --rsm-accent: #2563eb;\r\n --rsm-hover: #f3f4f6;\r\n --rsm-surface: #ffffff;\r\n /* --rsm-paper = 畫布底色,對齊 VS Code 擴充套件的 editor-background(亮)。 */\r\n --rsm-paper: #ffffff;\r\n --rsm-canvas-bg: transparent;\r\n /* 點陣格線:對齊 VS Code 的 color-mix(foreground 9%) 公式。 */\r\n --rsm-grid-dot: color-mix(in srgb, var(--rsm-fg) 9%, transparent);\r\n /* 網格線:比網點再淡一點,避免線條搶過圖表。 */\r\n --rsm-grid-line: color-mix(in srgb, var(--rsm-fg) 7%, transparent);\r\n --rsm-radius: 8px;\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n width: 100%;\r\n box-sizing: border-box;\r\n border: 1px solid var(--rsm-border);\r\n border-radius: var(--rsm-radius);\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\r\n overflow: hidden;\r\n}\r\n.rsm-root *, .rsm-root *::before, .rsm-root *::after { box-sizing: border-box; }\r\n\r\n.rsm-toolbar {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 8px 10px;\r\n border-bottom: 1px solid var(--rsm-border);\r\n}\r\n.rsm-toolbar-spacer { margin-left: auto; }\r\n.rsm-toolbar-group { display: inline-flex; align-items: center; gap: 6px; }\r\n\r\n.rsm-label { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--rsm-muted); }\r\n\r\n.rsm-select {\r\n border: 1px solid var(--rsm-border);\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n border-radius: 6px;\r\n padding: 4px 8px;\r\n font-size: 13px;\r\n cursor: pointer;\r\n}\r\n.rsm-select:focus { outline: none; border-color: var(--rsm-accent); }\r\n\r\n.rsm-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n border: 1px solid var(--rsm-border);\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n border-radius: 6px;\r\n padding: 4px 10px;\r\n font-size: 13px;\r\n line-height: 1.4;\r\n cursor: pointer;\r\n transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;\r\n}\r\n.rsm-btn:hover { background: var(--rsm-hover); }\r\n.rsm-btn[aria-pressed=\"true\"] {\r\n border-color: var(--rsm-accent);\r\n color: var(--rsm-accent);\r\n background: color-mix(in srgb, var(--rsm-accent) 10%, transparent);\r\n}\r\n.rsm-btn:disabled { opacity: 0.6; cursor: default; }\r\n\r\n/* 工具列控制項高度一致(樣式下拉 / 一般鈕 / 縮放群 / 背景鈕),避免高低不齊。 */\r\n.rsm-toolbar .rsm-btn,\r\n.rsm-toolbar .rsm-select,\r\n.rsm-toolbar .rsm-zoom { min-height: 30px; }\r\n.rsm-toolbar .rsm-btn,\r\n.rsm-toolbar .rsm-select { align-items: center; }\r\n.rsm-toolbar .rsm-zoom > button { display: inline-flex; align-items: center; justify-content: center; }\r\n\r\n.rsm-zoom {\r\n display: inline-flex;\r\n align-items: stretch;\r\n border: 1px solid var(--rsm-border);\r\n border-radius: 6px;\r\n overflow: hidden;\r\n}\r\n.rsm-zoom > button {\r\n border: 0;\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n padding: 4px 10px;\r\n font-size: 13px;\r\n cursor: pointer;\r\n}\r\n.rsm-zoom > button:hover { background: var(--rsm-hover); }\r\n.rsm-zoom > button + button { border-left: 1px solid var(--rsm-border); }\r\n.rsm-zoom-percent { min-width: 52px; text-align: center; font-variant-numeric: tabular-nums; font-size: 12px; }\r\n\r\n.rsm-searchbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 8px 10px;\r\n border-bottom: 1px solid var(--rsm-border);\r\n background: var(--rsm-hover);\r\n}\r\n.rsm-input {\r\n flex: 0 1 320px;\r\n border: 1px solid var(--rsm-border);\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n border-radius: 6px;\r\n padding: 5px 10px;\r\n font-size: 13px;\r\n}\r\n.rsm-input:focus { outline: none; border-color: var(--rsm-accent); }\r\n.rsm-count { min-width: 48px; font-size: 12px; color: var(--rsm-muted); font-variant-numeric: tabular-nums; }\r\n.rsm-searchbar-spacer { margin-left: auto; }\r\n\r\n.rsm-canvas {\r\n position: relative;\r\n flex: 1 1 auto;\r\n min-height: 0;\r\n overflow: hidden;\r\n /* 底色由 --rsm-canvas-bg 控制(預設透明,跟隨頁面);圖樣疊在其上(background-image)。 */\r\n background-color: var(--rsm-canvas-bg, transparent);\r\n}\r\n.rsm-stage { width: 100%; height: 100%; }\r\n.rsm-root svg { cursor: grab; user-select: none; }\r\n.rsm-root svg.rsm-grabbing { cursor: grabbing; }\r\n\r\n.rsm-overlay {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0 16px;\r\n text-align: center;\r\n font-size: 13px;\r\n color: var(--rsm-muted);\r\n pointer-events: none;\r\n}\r\n.rsm-overlay.rsm-error { color: #dc2626; }\r\n\r\n/* 搜尋:命中以外的節點變暗,當前命中加暖色光暈。 */\r\n.rsm-root .rsm-dim { opacity: 0.22; transition: opacity 0.15s ease; }\r\n.rsm-root .rsm-hit { filter: drop-shadow(0 0 5px #f59e0b) drop-shadow(0 0 1.5px #f59e0b); }\r\n\r\n.rsm-root.rsm-dark {\r\n /* 暗色面板對齊 VS Code Dark+ / Dark Modern 的中性灰(非藍調)。 */\r\n --rsm-border: #3c3c3c;\r\n --rsm-fg: #cccccc;\r\n --rsm-muted: #9d9d9d;\r\n --rsm-accent: #3794ff;\r\n --rsm-hover: #2a2d2e;\r\n --rsm-surface: #252526;\r\n /* 畫布底色 = VS Code editor-background(暗);grid-dot 由 --rsm-fg 9% 自動推導。 */\r\n --rsm-paper: #1e1e1e;\r\n}\r\n\r\n/* ── 背景 ── 底色 + 疊加圖樣,兩者獨立。\r\n * 底色:--rsm-canvas-bg(由色票 / 自訂色 inline 覆寫;未設 = 透明跟隨頁面)。\r\n * 圖樣:.rsm-pattern-dots(網點) / .rsm-pattern-grid(網格線),疊在底色之上。 */\r\n.rsm-root.rsm-pattern-dots .rsm-canvas {\r\n background-image: radial-gradient(var(--rsm-grid-dot) 1px, transparent 1px);\r\n background-size: 18px 18px;\r\n background-position: -9px -9px;\r\n}\r\n.rsm-root.rsm-pattern-grid .rsm-canvas {\r\n background-image:\r\n linear-gradient(to right, var(--rsm-grid-line) 1px, transparent 1px),\r\n linear-gradient(to bottom, var(--rsm-grid-line) 1px, transparent 1px);\r\n background-size: 22px 22px;\r\n background-position: -1px -1px;\r\n}\r\n\r\n/* ── 背景選擇器(toolbar 內的色井按鈕 + 彈出面板)── */\r\n.rsm-bg { position: relative; display: inline-flex; }\r\n\r\n/* 觸發鈕左側的「色井」:反映目前底色;透明 / 預設時畫一道斜線表示「不覆寫」。 */\r\n.rsm-bg-well {\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 4px;\r\n border: 1px solid color-mix(in srgb, var(--rsm-fg) 28%, transparent);\r\n background-color: var(--rsm-well-color, transparent);\r\n}\r\n.rsm-bg-well[data-empty=\"true\"] {\r\n background-color: var(--rsm-surface);\r\n background-image: linear-gradient(\r\n to top right,\r\n transparent calc(50% - 1px),\r\n #ef4444 calc(50% - 1px),\r\n #ef4444 calc(50% + 1px),\r\n transparent calc(50% + 1px)\r\n );\r\n}\r\n\r\n/* 彈出面板:卡片式、輕陰影、淡入。 */\r\n.rsm-bg-pop {\r\n position: absolute;\r\n top: calc(100% + 8px);\r\n left: 0;\r\n z-index: 50;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n padding: 12px;\r\n min-width: 260px;\r\n border: 1px solid var(--rsm-border);\r\n border-radius: 12px;\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.16), 0 2px 6px rgba(0, 0, 0, 0.08);\r\n animation: rsm-pop-in 0.13s ease-out;\r\n}\r\n@keyframes rsm-pop-in {\r\n from { opacity: 0; transform: translateY(-5px); }\r\n to { opacity: 1; transform: none; }\r\n}\r\n.rsm-bg-section { display: flex; flex-direction: column; gap: 8px; }\r\n.rsm-bg-section-label {\r\n font-size: 11px;\r\n font-weight: 600;\r\n letter-spacing: 0.03em;\r\n color: var(--rsm-muted);\r\n}\r\n.rsm-bg-swatches { display: flex; flex-wrap: wrap; gap: 8px; }\r\n\r\n/* 色票:圓角小方塊;選中加同色外環。 */\r\n.rsm-swatch {\r\n position: relative;\r\n width: 26px;\r\n height: 26px;\r\n padding: 0;\r\n border: 1px solid color-mix(in srgb, var(--rsm-fg) 16%, transparent);\r\n border-radius: 7px;\r\n cursor: pointer;\r\n transition: transform 0.1s ease, box-shadow 0.1s ease;\r\n}\r\n.rsm-swatch:hover { transform: scale(1.12); }\r\n.rsm-swatch:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--rsm-accent); }\r\n.rsm-swatch.rsm-selected { outline: 2px solid var(--rsm-accent); outline-offset: 2px; }\r\n.rsm-swatch[data-empty=\"true\"] {\r\n background-color: var(--rsm-surface);\r\n background-image: linear-gradient(\r\n to top right,\r\n transparent calc(50% - 1px),\r\n #ef4444 calc(50% - 1px),\r\n #ef4444 calc(50% + 1px),\r\n transparent calc(50% + 1px)\r\n );\r\n}\r\n\r\n/* 自訂色票:覆一個隱形的原生 color input,未選時顯示 🎨。 */\r\n.rsm-swatch-custom {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n background:\r\n conic-gradient(from 180deg, #f87171, #fbbf24, #34d399, #60a5fa, #a78bfa, #f87171);\r\n}\r\n.rsm-swatch-custom.rsm-has-color { background: none; }\r\n.rsm-swatch-custom input[type=\"color\"] {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n margin: 0;\r\n padding: 0;\r\n border: 0;\r\n opacity: 0;\r\n cursor: pointer;\r\n}\r\n.rsm-swatch-custom-icon {\r\n font-size: 12px;\r\n line-height: 1;\r\n pointer-events: none;\r\n filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.35));\r\n}\r\n\r\n/* 圖樣切換:分段式按鈕(無 / 網點 / 網格)。 */\r\n.rsm-seg {\r\n display: inline-flex;\r\n align-self: flex-start;\r\n border: 1px solid var(--rsm-border);\r\n border-radius: 8px;\r\n overflow: hidden;\r\n}\r\n.rsm-seg > button {\r\n flex: 1 1 0;\r\n min-width: 58px;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 5px;\r\n border: 0;\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n padding: 6px 11px;\r\n font-size: 12px;\r\n line-height: 1.3;\r\n white-space: nowrap;\r\n cursor: pointer;\r\n transition: background 0.1s ease, color 0.1s ease;\r\n}\r\n.rsm-seg > button + button { border-left: 1px solid var(--rsm-border); }\r\n.rsm-seg > button:hover { background: var(--rsm-hover); }\r\n.rsm-seg > button[aria-pressed=\"true\"] {\r\n background: color-mix(in srgb, var(--rsm-accent) 14%, transparent);\r\n color: var(--rsm-accent);\r\n font-weight: 600;\r\n}\r\n.rsm-seg-glyph { font-size: 13px; line-height: 1; }\r\n\r\n/* ── 全螢幕跳窗 ── position:fixed 覆蓋整個視窗,RWD 友善。 */\r\n.rsm-root.rsm-fullscreen {\r\n position: fixed;\r\n inset: 0;\r\n width: 100vw;\r\n width: 100dvw;\r\n height: 100vh;\r\n height: 100dvh;\r\n max-width: 100vw;\r\n max-height: 100dvh;\r\n margin: 0;\r\n z-index: 2147483000;\r\n border: 0;\r\n border-radius: 0;\r\n animation: rsm-fs-in 0.16s ease-out;\r\n}\r\n@keyframes rsm-fs-in {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n}\r\n\r\n/* 全螢幕右上角的離開鈕(toolbar 隱藏時也能關閉)。 */\r\n.rsm-fs-close {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n z-index: 5;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 34px;\r\n height: 34px;\r\n padding: 0;\r\n font-size: 16px;\r\n line-height: 1;\r\n border: 1px solid var(--rsm-border);\r\n border-radius: 8px;\r\n background: var(--rsm-surface);\r\n color: var(--rsm-fg);\r\n cursor: pointer;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);\r\n transition: background 0.12s ease, color 0.12s ease;\r\n}\r\n.rsm-fs-close:hover { background: var(--rsm-hover); }\r\n\r\n/* ── RWD ── 小螢幕收緊 toolbar、縮短搜尋框,避免換行擠壓畫布。 */\r\n@media (max-width: 640px) {\r\n .rsm-toolbar { gap: 6px; padding: 6px 8px; }\r\n .rsm-btn { padding: 4px 8px; font-size: 12px; }\r\n .rsm-label { font-size: 11px; }\r\n .rsm-select { padding: 3px 6px; font-size: 12px; }\r\n .rsm-zoom > button { padding: 4px 8px; font-size: 12px; }\r\n .rsm-input { flex-basis: 150px; }\r\n}\r\n\r\n/* ── 標籤字重(量測階段就生效)──\r\n * boostLegibility 在「渲染後」才把標籤字重加到 600/700,但 mermaid 是在「渲染中」\r\n * 量測文字寬度來決定 foreignObject / 節點外框的大小。若只在事後加粗,粗體字會比已量好的\r\n * 框更寬 → foreignObject 把尾字裁掉(心智圖節點「react-super-mermaid」尾巴的 d 不見就是這個)。\r\n * 解法:把同樣的字重用 CSS 提前宣告,且「不」scope 在 .rsm-root 之下,而是 scope 在 mermaid\r\n * 的渲染 id(svg[id^=\"rsm-\"])——因為量測時那顆暫時的 svg 還在 <body> 下、尚未掛進 .rsm-root。\r\n * 這樣 mermaid 量到的就是粗體寬度,框會剛好容納,事後 boostLegibility 設同值不再撐破。\r\n * 只 scope 我們自己渲染出的 svg,故不會污染 host 頁面其它 mermaid。 */\r\nsvg[id^=\"rsm-\"] g.node text,\r\nsvg[id^=\"rsm-\"] g.node tspan,\r\nsvg[id^=\"rsm-\"] g.node .nodeLabel,\r\nsvg[id^=\"rsm-\"] g.mindmap-node text,\r\nsvg[id^=\"rsm-\"] g.mindmap-node .nodeLabel,\r\nsvg[id^=\"rsm-\"] g[class*=\"timeline-node\"] text,\r\nsvg[id^=\"rsm-\"] text.actor { font-weight: 600 !important; }\r\nsvg[id^=\"rsm-\"] .cluster-label text,\r\nsvg[id^=\"rsm-\"] .cluster-label .nodeLabel,\r\nsvg[id^=\"rsm-\"] text.pieTitleText { font-weight: 700 !important; }\r\n`;\r\n","// 一次性把套件內建 CSS 注入 <head>(以 id 去重)。SSR 安全:非瀏覽器直接略過。\r\n\r\nimport { RSM_CSS, RSM_STYLE_ID } from './styles.css';\r\n\r\nexport function ensureStyles(): void {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n const existing = document.getElementById(RSM_STYLE_ID) as HTMLStyleElement | null;\r\n if (existing) {\r\n // 已注入過:若內容過時(版本升級 / HMR 換 bundle),就刷新——否則舊 CSS 會卡住,\r\n // 新元件 markup 配舊樣式 → 例如背景彈窗變成行內排版而非浮層。比對成本低(字串相等)。\r\n if (existing.textContent !== RSM_CSS) {\r\n existing.textContent = RSM_CSS;\r\n }\r\n return;\r\n }\r\n const style = document.createElement('style');\r\n style.id = RSM_STYLE_ID;\r\n style.textContent = RSM_CSS;\r\n document.head.appendChild(style);\r\n}\r\n","// Colorful 樣式的後處理上色器:在 mermaid 輸出的 SVG 上重新套用現代調色盤\r\n// (Tailwind 100 底色 / 500 邊框) + 圓角 + 軟陰影 + slate 邊線。\r\n// 純 DOM 操作,需在瀏覽器端執行;每個 pass 在零命中時自動跳過,\r\n// 故 mermaid 的 DOM 結構變動不會讓渲染中斷。\r\n\r\nexport interface ColorizeOptions {\r\n dark?: boolean;\r\n}\r\n\r\ninterface PaletteEntry {\r\n fill: string;\r\n stroke: string;\r\n}\r\n\r\nconst NODE_PALETTE: PaletteEntry[] = [\r\n { fill: '#DBEAFE', stroke: '#3B82F6' }, // blue\r\n { fill: '#DCFCE7', stroke: '#22C55E' }, // green\r\n { fill: '#FFEDD5', stroke: '#F97316' }, // orange\r\n { fill: '#F3E8FF', stroke: '#A855F7' }, // purple\r\n { fill: '#FEE2E2', stroke: '#EF4444' }, // red\r\n { fill: '#CFFAFE', stroke: '#06B6D4' }, // cyan\r\n { fill: '#FEF9C3', stroke: '#EAB308' }, // yellow\r\n { fill: '#EDE9FE', stroke: '#8B5CF6' }, // violet\r\n];\r\n\r\n// 叢集 / 水道底色。色相對齊 NODE_PALETTE;底色夠濃(16% 而非舊的 7%)、\r\n// 邊框夠飽和,相鄰水道一眼可辨,標題也更清楚。\r\nconst CLUSTER_PALETTE: PaletteEntry[] = [\r\n { fill: 'rgba(59, 130, 246, 0.16)', stroke: '#3B82F6' }, // blue\r\n { fill: 'rgba(34, 197, 94, 0.16)', stroke: '#22C55E' }, // green\r\n { fill: 'rgba(249, 115, 22, 0.16)', stroke: '#F97316' }, // orange\r\n { fill: 'rgba(168, 85, 247, 0.16)', stroke: '#A855F7' }, // purple\r\n { fill: 'rgba(239, 68, 68, 0.16)', stroke: '#EF4444' }, // red\r\n { fill: 'rgba(6, 182, 212, 0.16)', stroke: '#06B6D4' }, // cyan\r\n { fill: 'rgba(234, 179, 8, 0.16)', stroke: '#EAB308' }, // yellow\r\n { fill: 'rgba(139, 92, 246, 0.16)', stroke: '#8B5CF6' }, // violet\r\n];\r\n\r\n// 圓餅 / 圓環專用的鮮明調色盤。mermaid 在 dark base 主題下的預設圓餅色又暗又糊\r\n// (顏色太死),這裡整組換成飽和、相鄰色相差異大的版本,讓圖表「活」起來。\r\nconst PIE_PALETTE = [\r\n '#3B82F6', // blue\r\n '#22C55E', // green\r\n '#F59E0B', // amber\r\n '#A855F7', // purple\r\n '#EF4444', // red\r\n '#06B6D4', // cyan\r\n '#EC4899', // pink\r\n '#84CC16', // lime\r\n '#F97316', // orange\r\n '#14B8A6', // teal\r\n '#6366F1', // indigo\r\n '#EAB308', // yellow\r\n];\r\n\r\nconst NODE_TEXT = '#1F2937';\r\nconst SHADOW_FILTER_ID = 'rsm-soft-shadow';\r\nconst SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\nfunction resolveSvg(root: ParentNode): Element | null {\r\n if (root instanceof Element && root.tagName.toLowerCase() === 'svg') {\r\n return root;\r\n }\r\n return root.querySelector('svg');\r\n}\r\n\r\n/** 把顏色字串正規化成 \"r,g,b\",讓 attribute(hex)與 inline style(瀏覽器會轉成 rgb)互相對得上。 */\r\nfunction canonColor(input: string): string {\r\n const s = (input || '').trim();\r\n const hex = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(s);\r\n if (hex) {\r\n let h = hex[1];\r\n if (h.length === 3) {\r\n h = h\r\n .split('')\r\n .map((c) => c + c)\r\n .join('');\r\n }\r\n const n = parseInt(h, 16);\r\n return `${(n >> 16) & 255},${(n >> 8) & 255},${n & 255}`;\r\n }\r\n const rgb = /rgba?\\(([^)]+)\\)/i.exec(s);\r\n if (rgb) {\r\n const p = rgb[1].split(',').map((x) => Math.round(parseFloat(x)));\r\n return `${p[0]},${p[1]},${p[2]}`;\r\n }\r\n return s.toLowerCase();\r\n}\r\n\r\n/** 以 sRGB 相對亮度決定:在這個底色上要用白字還是深字,確保對比清楚。 */\r\nfunction readableTextOn(color: string): string {\r\n const m = /^#?([0-9a-f]{6})$/i.exec(color.trim());\r\n if (!m) {\r\n return '#FFFFFF';\r\n }\r\n const n = parseInt(m[1], 16);\r\n const r = (n >> 16) & 255;\r\n const g = (n >> 8) & 255;\r\n const b = n & 255;\r\n const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n return lum > 0.62 ? '#1F2937' : '#FFFFFF';\r\n}\r\n\r\n/** 共用的軟陰影 filter — 讓節點看起來更接近商業工具。 */\r\nfunction ensureShadowFilter(svg: Element): void {\r\n if (svg.querySelector(`#${SHADOW_FILTER_ID}`)) {\r\n return;\r\n }\r\n let defs = svg.querySelector(':scope > defs');\r\n if (!defs) {\r\n defs = document.createElementNS(SVG_NS, 'defs');\r\n svg.insertBefore(defs, svg.firstChild);\r\n }\r\n const filter = document.createElementNS(SVG_NS, 'filter');\r\n filter.setAttribute('id', SHADOW_FILTER_ID);\r\n filter.setAttribute('x', '-25%');\r\n filter.setAttribute('y', '-25%');\r\n filter.setAttribute('width', '150%');\r\n filter.setAttribute('height', '150%');\r\n const drop = document.createElementNS(SVG_NS, 'feDropShadow');\r\n drop.setAttribute('dx', '0');\r\n drop.setAttribute('dy', '1.5');\r\n drop.setAttribute('stdDeviation', '2');\r\n drop.setAttribute('flood-color', '#0F172A');\r\n drop.setAttribute('flood-opacity', '0.22');\r\n filter.appendChild(drop);\r\n defs.appendChild(filter);\r\n}\r\n\r\nfunction roundRect(shape: SVGElement, radius: number): void {\r\n if (shape.tagName.toLowerCase() !== 'rect') {\r\n return;\r\n }\r\n // Stadium 形狀本身已帶大 rx,別把它壓平。\r\n const rx = Number(shape.getAttribute('rx') ?? '0');\r\n if (rx < radius + 1) {\r\n shape.setAttribute('rx', String(radius));\r\n shape.setAttribute('ry', String(radius));\r\n }\r\n}\r\n\r\nfunction paintShapes(group: Element, entry: PaletteEntry): void {\r\n const direct = Array.from(\r\n group.querySelectorAll<SVGElement>(\r\n ':scope > rect, :scope > polygon, :scope > circle, :scope > ellipse, :scope > path',\r\n ),\r\n );\r\n if (direct.length > 0) {\r\n for (const shape of direct) {\r\n shape.style.fill = entry.fill;\r\n shape.style.stroke = entry.stroke;\r\n shape.style.strokeWidth = '1.4px';\r\n roundRect(shape, 8);\r\n }\r\n direct[0].setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\r\n return;\r\n }\r\n // v11 unified-renderer 節點(如 erDiagram 實體)把形狀包在子群組:\r\n // g.outer-path 放背景與邊框、g.row-rect-odd/even 放屬性列、g.divider 放分隔線。\r\n for (const path of Array.from(group.querySelectorAll<SVGElement>(':scope > g.outer-path > *'))) {\r\n if (path.getAttribute('fill') && path.getAttribute('fill') !== 'none') {\r\n path.style.fill = entry.fill;\r\n path.setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\r\n }\r\n if (path.getAttribute('stroke') && path.getAttribute('stroke') !== 'none') {\r\n path.style.stroke = entry.stroke;\r\n path.style.strokeWidth = '1.4px';\r\n }\r\n }\r\n for (const row of Array.from(group.querySelectorAll<SVGElement>(':scope > g.row-rect-odd > *'))) {\r\n row.style.fill = 'rgba(255, 255, 255, 0.55)';\r\n }\r\n for (const row of Array.from(group.querySelectorAll<SVGElement>(':scope > g.row-rect-even > *'))) {\r\n row.style.fill = 'rgba(255, 255, 255, 0.3)';\r\n }\r\n for (const divider of Array.from(group.querySelectorAll<SVGElement>(':scope > g.divider > *'))) {\r\n divider.style.stroke = entry.stroke;\r\n }\r\n}\r\n\r\nfunction darkenNodeText(group: Element): void {\r\n // 底色為淺色 pastel,節點文字在深淺色主題下都必須是深色才看得清楚。\r\n for (const el of Array.from(group.querySelectorAll<SVGTextElement>('text, tspan'))) {\r\n el.style.fill = NODE_TEXT;\r\n }\r\n for (const el of Array.from(group.querySelectorAll<HTMLElement>('.nodeLabel, span, p'))) {\r\n el.style.color = NODE_TEXT;\r\n }\r\n}\r\n\r\n/** slate 色、圓角端點的邊線,比 mermaid 預設更乾淨。 */\r\nfunction styleEdges(svg: Element, dark: boolean): void {\r\n const edgeColor = dark ? '#94A3B8' : '#64748B';\r\n const edgeSelectors = [\r\n '.edgePaths path',\r\n 'g.edgePath path',\r\n 'path.flowchart-link',\r\n 'path.relationshipLine',\r\n ].join(', ');\r\n for (const edge of Array.from(svg.querySelectorAll<SVGElement>(edgeSelectors))) {\r\n edge.style.stroke = edgeColor;\r\n edge.style.strokeWidth = '1.7px';\r\n edge.style.strokeLinecap = 'round';\r\n }\r\n for (const marker of Array.from(svg.querySelectorAll<SVGElement>('marker path'))) {\r\n marker.style.fill = edgeColor;\r\n marker.style.stroke = edgeColor;\r\n }\r\n}\r\n\r\nfunction styleEdgeLabels(svg: Element): void {\r\n for (const label of Array.from(svg.querySelectorAll<HTMLElement>('.edgeLabel span, .edgeLabel p'))) {\r\n label.style.borderRadius = '6px';\r\n }\r\n for (const rect of Array.from(svg.querySelectorAll<SVGElement>('.edgeLabel rect'))) {\r\n rect.setAttribute('rx', '4');\r\n rect.setAttribute('ry', '4');\r\n }\r\n}\r\n\r\n/**\r\n * 訊息文字 / flowchart 邊標籤沿用 mermaid 偏淡的預設色,落在淺色畫布上會糊掉 —\r\n * 一律改成深色(深色主題改淺色),維持像 Excalidraw 一樣清楚。\r\n */\r\nfunction styleLabelText(svg: Element, dark: boolean): void {\r\n const color = dark ? '#E2E8F0' : NODE_TEXT;\r\n for (const t of Array.from(\r\n svg.querySelectorAll<SVGElement>('text.messageText, .edgeLabel text, .edgeLabel tspan'),\r\n )) {\r\n t.style.fill = color;\r\n }\r\n for (const t of Array.from(svg.querySelectorAll<HTMLElement>('.edgeLabel span, .edgeLabel p'))) {\r\n t.style.color = color;\r\n }\r\n}\r\n\r\n/** 對舊版 ER markup(mermaid < 11.x)的實體標題列上色。 */\r\nfunction colorizeLegacyEr(svg: Element): void {\r\n const erGroups: Element[] = [];\r\n for (const rect of Array.from(svg.querySelectorAll<SVGElement>('rect.er.entityBox'))) {\r\n const group = rect.parentElement;\r\n if (group && !erGroups.includes(group)) {\r\n erGroups.push(group);\r\n }\r\n }\r\n erGroups.forEach((group, i) => {\r\n const entry = NODE_PALETTE[i % NODE_PALETTE.length];\r\n for (const rect of Array.from(group.querySelectorAll<SVGElement>('rect.er.entityBox')).slice(0, 1)) {\r\n rect.style.fill = entry.fill;\r\n rect.style.stroke = entry.stroke;\r\n }\r\n for (const label of Array.from(group.querySelectorAll<SVGElement>('text.er.entityLabel'))) {\r\n label.style.fill = NODE_TEXT;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * sequenceDiagram 上色:每條水道(actor 方框 + 生命線 + 啟用條)依名稱輪用調色盤,\r\n * 讓原本同色的各水道一眼可辨。其餘圖型(flowchart / ER …)無 rect.actor,整段自動略過。\r\n */\r\nfunction colorizeSequence(svg: Element, dark: boolean): void {\r\n const actorRects = Array.from(svg.querySelectorAll<SVGRectElement>('rect.actor'));\r\n if (actorRects.length === 0) {\r\n return;\r\n }\r\n\r\n // 依「DOM 出現順序」(頂端 actor 由左至右)替每個名稱配色;頂 / 底方框與生命線共用同色。\r\n const colorByName = new Map<string, PaletteEntry>();\r\n let nextIndex = 0;\r\n for (const rect of actorRects) {\r\n const name = rect.getAttribute('name') ?? `#${nextIndex}`;\r\n let entry = colorByName.get(name);\r\n if (!entry) {\r\n entry = NODE_PALETTE[nextIndex % NODE_PALETTE.length];\r\n colorByName.set(name, entry);\r\n nextIndex += 1;\r\n }\r\n rect.style.fill = entry.fill;\r\n rect.style.stroke = entry.stroke;\r\n rect.style.strokeWidth = '1.4px';\r\n rect.setAttribute('rx', '8');\r\n rect.setAttribute('ry', '8');\r\n rect.setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\r\n // 標題文字(與 rect 同群組)轉深色,落在淺色 pastel 上才清楚。\r\n const group = rect.parentElement;\r\n if (group) {\r\n for (const text of Array.from(group.querySelectorAll<SVGTextElement>('text, tspan'))) {\r\n text.style.fill = NODE_TEXT;\r\n }\r\n }\r\n }\r\n\r\n // 生命線:改用所屬水道的描邊色(以 name 對應),縱向流程比單一灰虛線更好追蹤;\r\n // 同時記下每條生命線的 x 座標 → 水道色,供啟用條對應歸屬。\r\n const lanesByX: { x: number; entry: PaletteEntry }[] = [];\r\n for (const line of Array.from(svg.querySelectorAll<SVGElement>('line.actor-line'))) {\r\n const entry = colorByName.get(line.getAttribute('name') ?? '');\r\n if (!entry) {\r\n continue;\r\n }\r\n line.style.stroke = entry.stroke;\r\n line.style.strokeOpacity = '0.45';\r\n line.style.strokeWidth = '1.3px';\r\n line.style.strokeDasharray = '4 5';\r\n const x = Number(line.getAttribute('x1'));\r\n if (Number.isFinite(x)) {\r\n lanesByX.push({ x, entry });\r\n }\r\n }\r\n\r\n // 啟用條:以中心 x 對應到最近的生命線,套上該水道色,讓「此刻是哪條水道在執行」一眼可辨。\r\n const activations = Array.from(\r\n svg.querySelectorAll<SVGRectElement>('rect.activation0, rect.activation1, rect.activation2'),\r\n );\r\n for (const bar of activations) {\r\n const x = Number(bar.getAttribute('x'));\r\n const w = Number(bar.getAttribute('width'));\r\n if (!Number.isFinite(x) || !Number.isFinite(w) || lanesByX.length === 0) {\r\n continue;\r\n }\r\n const center = x + w / 2;\r\n let best = lanesByX[0];\r\n for (const lane of lanesByX) {\r\n if (Math.abs(lane.x - center) < Math.abs(best.x - center)) {\r\n best = lane;\r\n }\r\n }\r\n bar.style.fill = best.entry.fill;\r\n bar.style.stroke = best.entry.stroke;\r\n bar.style.strokeWidth = '1px';\r\n bar.setAttribute('rx', '3');\r\n bar.setAttribute('ry', '3');\r\n }\r\n\r\n // note:便利貼風(amber)+ 圓角 + 軟陰影 + 深色字。\r\n for (const note of Array.from(svg.querySelectorAll<SVGRectElement>('rect.note'))) {\r\n note.style.fill = '#FEF9C3';\r\n note.style.stroke = '#EAB308';\r\n note.style.strokeWidth = '1.2px';\r\n note.setAttribute('rx', '6');\r\n note.setAttribute('ry', '6');\r\n note.setAttribute('filter', `url(#${SHADOW_FILTER_ID})`);\r\n }\r\n for (const text of Array.from(svg.querySelectorAll<SVGTextElement>('.noteText, .noteText tspan'))) {\r\n text.style.fill = NODE_TEXT;\r\n }\r\n\r\n // 訊息線 / loop·alt·opt 外框:統一成 slate 墨線,與 flowchart edge 風格一致;訊息文字轉深色。\r\n const ink = dark ? '#94A3B8' : '#64748B';\r\n for (const line of Array.from(svg.querySelectorAll<SVGElement>('.messageLine0, .messageLine1'))) {\r\n line.style.stroke = ink;\r\n line.style.strokeWidth = '1.6px';\r\n line.style.strokeLinecap = 'round';\r\n }\r\n for (const loop of Array.from(svg.querySelectorAll<SVGElement>('.loopLine'))) {\r\n loop.style.stroke = ink;\r\n loop.style.strokeOpacity = '0.55';\r\n }\r\n for (const text of Array.from(\r\n svg.querySelectorAll<SVGTextElement>('.messageText, .loopText, .labelText'),\r\n )) {\r\n text.style.fill = dark ? '#E2E8F0' : NODE_TEXT;\r\n }\r\n}\r\n\r\n/** Pie / 圓環:換上鮮明調色盤(取代又暗又糊的原生深色),白色分隔線 + 對比文字。 */\r\nfunction stylePie(svg: Element, dark: boolean): void {\r\n const slices = Array.from(svg.querySelectorAll<SVGElement>('path.pieCircle'));\r\n const swatches = Array.from(svg.querySelectorAll<SVGElement>('g.legend rect'));\r\n if (slices.length === 0 && swatches.length === 0) {\r\n return;\r\n }\r\n\r\n // 以「目前填色」為鍵建立 舊色→新鮮明色 對映,讓同一資料項的扇形與圖例色塊拿到同一個新色\r\n // (mermaid 用 ordinal scale 依 label 上色,同 label 的扇形與圖例底色字串一致)。\r\n const remap = new Map<string, string>();\r\n let next = 0;\r\n const newColorFor = (old: string): string => {\r\n const key = canonColor(old) || `#slot-${next}`;\r\n let c = remap.get(key);\r\n if (!c) {\r\n c = PIE_PALETTE[next % PIE_PALETTE.length];\r\n remap.set(key, c);\r\n next += 1;\r\n }\r\n return c;\r\n };\r\n\r\n for (const slice of slices) {\r\n const old = slice.style.fill || slice.getAttribute('fill') || '';\r\n const c = newColorFor(old);\r\n slice.style.fill = c;\r\n slice.style.opacity = '1'; // 原生深色主題的 pieOpacity < 1 會讓扇形發灰 → 拉回不透明。\r\n slice.style.stroke = dark ? '#0F172A' : '#FFFFFF';\r\n slice.style.strokeWidth = '2px';\r\n slice.style.strokeLinejoin = 'round';\r\n }\r\n for (const sw of swatches) {\r\n const old = sw.style.fill || sw.getAttribute('fill') || '';\r\n const c = newColorFor(old);\r\n sw.style.fill = c;\r\n sw.style.stroke = c;\r\n sw.setAttribute('rx', '3');\r\n sw.setAttribute('ry', '3');\r\n }\r\n // 扇形上的百分比文字:依該扇形新色挑白字 / 深字(mermaid 扇形與 .slice 文字同順序)。\r\n Array.from(svg.querySelectorAll<SVGElement>('text.slice')).forEach((label, i) => {\r\n const slice = slices[i];\r\n const c = slice ? slice.style.fill || PIE_PALETTE[0] : PIE_PALETTE[0];\r\n label.style.fill = readableTextOn(c);\r\n label.style.fontWeight = '600';\r\n });\r\n for (const title of Array.from(svg.querySelectorAll<SVGElement>('text.pieTitleText'))) {\r\n title.style.fontWeight = '700';\r\n title.style.fill = dark ? '#E2E8F0' : '#1F2937';\r\n }\r\n for (const t of Array.from(svg.querySelectorAll<SVGElement>('g.legend text'))) {\r\n t.style.fill = dark ? '#E2E8F0' : '#1F2937';\r\n }\r\n for (const oc of Array.from(svg.querySelectorAll<SVGElement>('circle.pieOuterCircle'))) {\r\n oc.style.stroke = dark ? '#334155' : '#CBD5E1';\r\n }\r\n}\r\n\r\n/** Gantt:依 section 替任務上色,保留 done/active/crit 的語意色不動。 */\r\nfunction styleGantt(svg: Element, dark: boolean): void {\r\n const tasks = Array.from(svg.querySelectorAll<SVGElement>('rect.task'));\r\n if (tasks.length === 0) {\r\n return;\r\n }\r\n for (const task of tasks) {\r\n const cls = task.getAttribute('class') ?? '';\r\n if (/\\b(done|active|crit|milestone)\\d*\\b/.test(cls)) {\r\n continue;\r\n }\r\n const m = cls.match(/task(\\d+)/);\r\n if (!m) {\r\n continue;\r\n }\r\n const entry = NODE_PALETTE[Number(m[1]) % NODE_PALETTE.length];\r\n task.style.fill = entry.fill;\r\n task.style.stroke = entry.stroke;\r\n task.setAttribute('rx', '4');\r\n task.setAttribute('ry', '4');\r\n }\r\n Array.from(svg.querySelectorAll<SVGElement>('rect.section')).forEach((band) => {\r\n const m = (band.getAttribute('class') ?? '').match(/section(\\d+)/);\r\n if (m) {\r\n band.style.fill = CLUSTER_PALETTE[Number(m[1]) % CLUSTER_PALETTE.length].fill;\r\n }\r\n });\r\n for (const inBar of Array.from(svg.querySelectorAll<SVGElement>('text.taskText'))) {\r\n if (!/Outside/.test(inBar.getAttribute('class') ?? '')) {\r\n inBar.style.fill = NODE_TEXT;\r\n }\r\n }\r\n for (const tick of Array.from(svg.querySelectorAll<SVGElement>('g.grid g.tick line'))) {\r\n tick.style.stroke = dark ? '#334155' : '#E2E8F0';\r\n }\r\n}\r\n\r\n/** Timeline:同一 section 的節點共用一色(以 section-N class 取得)。 */\r\nfunction styleTimeline(svg: Element): void {\r\n const nodes = Array.from(svg.querySelectorAll<SVGGElement>('g[class*=\"timeline-node\"]'));\r\n nodes.forEach((node, i) => {\r\n const m = (node.getAttribute('class') ?? '').match(/section-(-?\\d+)/);\r\n const section = m ? Number(m[1]) : i;\r\n const entry = section < 0 ? NODE_PALETTE[7] : NODE_PALETTE[section % NODE_PALETTE.length];\r\n const backgrounds = Array.from(node.querySelectorAll<SVGElement>('.node-bkg'));\r\n if (backgrounds.length > 0) {\r\n for (const bkg of backgrounds) {\r\n bkg.style.fill = entry.fill;\r\n bkg.style.stroke = entry.stroke;\r\n bkg.style.strokeWidth = '1.4px';\r\n }\r\n } else {\r\n paintShapes(node, entry);\r\n }\r\n darkenNodeText(node);\r\n });\r\n}\r\n\r\n/** Mindmap:以 section-N class 為鍵,讓同一分支的兄弟節點共用一色。 */\r\nfunction styleMindmap(svg: Element): void {\r\n const nodes = Array.from(svg.querySelectorAll<SVGGElement>('g.mindmap-node'));\r\n if (nodes.length === 0) {\r\n return;\r\n }\r\n for (const node of nodes) {\r\n const m = (node.getAttribute('class') ?? '').match(/section-(-?\\d+)/);\r\n const section = m ? Number(m[1]) : 0;\r\n const entry =\r\n section < 0\r\n ? NODE_PALETTE[7] // root → violet\r\n : NODE_PALETTE[section % NODE_PALETTE.length];\r\n for (const shape of Array.from(\r\n node.querySelectorAll<SVGElement>('path, rect, circle, ellipse'),\r\n )) {\r\n if (shape.closest('g.children')) {\r\n continue; // 只上自己的形狀,不動子孫\r\n }\r\n shape.style.fill = entry.fill;\r\n shape.style.stroke = entry.stroke;\r\n shape.style.strokeWidth = '1.4px';\r\n }\r\n darkenNodeText(node);\r\n }\r\n for (const edge of Array.from(svg.querySelectorAll<SVGElement>('path[class*=\"edge\"]'))) {\r\n const m = (edge.getAttribute('class') ?? '').match(/section-edge-(-?\\d+)/);\r\n if (m) {\r\n const section = Number(m[1]);\r\n const entry = section < 0 ? NODE_PALETTE[7] : NODE_PALETTE[section % NODE_PALETTE.length];\r\n edge.style.stroke = entry.stroke;\r\n edge.style.strokeWidth = '2px';\r\n edge.style.opacity = '0.6';\r\n edge.style.fill = 'none';\r\n }\r\n }\r\n}\r\n\r\n/** Journey:依任務型別替圓點上色,笑臉維持不動。 */\r\nfunction styleJourney(svg: Element): void {\r\n const tasks = Array.from(\r\n svg.querySelectorAll<SVGElement>('circle[class*=\"task-type\"], rect[class*=\"task-type\"]'),\r\n );\r\n tasks.forEach((shape) => {\r\n const m = (shape.getAttribute('class') ?? '').match(/task-type-(\\d+)/);\r\n if (m) {\r\n const entry = NODE_PALETTE[Number(m[1]) % NODE_PALETTE.length];\r\n shape.style.fill = entry.fill;\r\n shape.style.stroke = entry.stroke;\r\n }\r\n });\r\n Array.from(svg.querySelectorAll<SVGElement>('rect[class*=\"section-type\"]')).forEach((rect) => {\r\n const m = (rect.getAttribute('class') ?? '').match(/section-type-(\\d+)/);\r\n if (m) {\r\n const entry = CLUSTER_PALETTE[Number(m[1]) % CLUSTER_PALETTE.length];\r\n rect.style.fill = entry.fill;\r\n rect.style.stroke = entry.stroke;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * 字體清晰度:對「任何主題」渲染出的圖加重文字字重,小字與縮圖也讀得清楚。\r\n * 只動 font-weight(不改色),故對原生 neutral/forest/dark 主題也安全,不會打架。\r\n */\r\nexport function boostLegibility(root: ParentNode): void {\r\n const svg = resolveSvg(root);\r\n if (!svg) {\r\n return;\r\n }\r\n // 節點 / 心智圖 / 時間軸 / actor 標籤:semibold(標題交給各 styler 設更重的 700,\r\n // 這裡不碰,以免把 colorful 已設好的 700 標題壓回 600)。\r\n for (const el of Array.from(\r\n svg.querySelectorAll<SVGElement>(\r\n 'g.node text, g.node tspan, g.mindmap-node text, g[class*=\"timeline-node\"] text, text.actor',\r\n ),\r\n )) {\r\n el.style.fontWeight = '600';\r\n }\r\n for (const el of Array.from(svg.querySelectorAll<HTMLElement>('.nodeLabel, g.node span, g.node p'))) {\r\n el.style.fontWeight = '600';\r\n }\r\n // 其餘文字(邊標籤 / 訊息 / 圖例 / 軸…)至少 medium,整體提升可讀性。\r\n for (const el of Array.from(svg.querySelectorAll<SVGElement>('text'))) {\r\n if (!el.style.fontWeight) {\r\n el.style.fontWeight = '500';\r\n }\r\n }\r\n}\r\n\r\n/** 在已渲染的 mermaid SVG 上套用 Colorful 樣式(就地修改 DOM)。 */\r\nexport function colorizeDiagram(root: ParentNode, opts: ColorizeOptions = {}): void {\r\n const svg = resolveSvg(root);\r\n if (!svg) {\r\n return;\r\n }\r\n ensureShadowFilter(svg);\r\n const dark = opts.dark === true;\r\n\r\n // flowchart / state / class / ER 節點(每個節點依序輪用調色盤)\r\n Array.from(svg.querySelectorAll<SVGGElement>('g.node')).forEach((node, i) => {\r\n paintShapes(node, NODE_PALETTE[i % NODE_PALETTE.length]);\r\n darkenNodeText(node);\r\n });\r\n\r\n // flowchart subgraph(叢集):濃淡分明的底色 + 飽和邊框 + 同色粗體標題,水道一眼可辨。\r\n Array.from(svg.querySelectorAll<SVGGElement>('g.cluster')).forEach((cluster, i) => {\r\n const entry = CLUSTER_PALETTE[i % CLUSTER_PALETTE.length];\r\n for (const rect of Array.from(cluster.querySelectorAll<SVGElement>(':scope > rect'))) {\r\n rect.style.fill = entry.fill;\r\n rect.style.stroke = entry.stroke;\r\n rect.style.strokeWidth = '1.5px';\r\n roundRect(rect, 10);\r\n }\r\n // 標題在 g.cluster-label 內,可能是 HTML label(live)或 <text>(htmlLabels:false 匯出)— 兩種都上色 + 加粗。\r\n const label = cluster.querySelector(':scope > .cluster-label');\r\n if (label) {\r\n for (const el of Array.from(label.querySelectorAll<SVGTextElement>('text, tspan'))) {\r\n el.style.fill = entry.stroke;\r\n el.style.fontWeight = '700';\r\n }\r\n for (const el of Array.from(label.querySelectorAll<HTMLElement>('.nodeLabel, span, p'))) {\r\n el.style.color = entry.stroke;\r\n el.style.fontWeight = '700';\r\n }\r\n for (const lr of Array.from(label.querySelectorAll<SVGElement>('rect'))) {\r\n lr.style.fill = entry.fill;\r\n }\r\n }\r\n });\r\n\r\n colorizeLegacyEr(svg);\r\n colorizeSequence(svg, dark);\r\n styleEdges(svg, dark);\r\n styleEdgeLabels(svg);\r\n styleLabelText(svg, dark);\r\n\r\n // 依 aria-roledescription 分派各圖型專屬上色;未知型別自動略過,每個 styler 零命中即早退,\r\n // 故 mermaid 的 DOM 變動永遠不會讓渲染中斷。\r\n const kind = svg.getAttribute('aria-roledescription') ?? '';\r\n if (kind === 'pie' || kind === 'pieChart') {\r\n stylePie(svg, dark);\r\n } else if (kind === 'gantt') {\r\n styleGantt(svg, dark);\r\n } else if (kind === 'timeline') {\r\n styleTimeline(svg);\r\n } else if (kind === 'mindmap') {\r\n styleMindmap(svg);\r\n } else if (kind === 'journey') {\r\n styleJourney(svg);\r\n }\r\n}\r\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() 共用。\r\n// 順序:ensureStyles → resolveTheme →(sketch 先載字)→ initialize → render → 後處理。\r\n\r\nimport { assertBrowser } from '../env';\r\nimport type { MermaidLike, MermaidTheme, RenderDiagramOptions, RenderResult } from '../types';\r\nimport { boostLegibility, colorizeDiagram } from './themes/colorize';\r\nimport { ensureSketchFont, SKETCH_FONT, sketchifyDiagram } from './themes/sketch';\r\nimport { ensureStyles } from './ensure-styles';\r\nimport { loadMermaid } from './load-mermaid';\r\nimport { resolveTheme, type PostProcess } from './resolve-theme';\r\n\r\n// mermaid.render 需要唯一且合法的 id,用模組級流水號確保不衝突(無 DOM,SSR 安全)。\r\nlet renderSeq = 0;\r\n\r\nexport interface RenderToSvgArgs {\r\n code: string;\r\n theme: MermaidTheme;\r\n dark: boolean;\r\n seed: number;\r\n fontUrl?: string;\r\n mermaidConfig?: Record<string, unknown>;\r\n mermaid: MermaidLike;\r\n /** 強制關閉 htmlLabels(供匯出 pristine SVG 用,避免 foreignObject)。 */\r\n pristine?: boolean;\r\n}\r\n\r\nexport interface RenderedSvg {\r\n svgString: string;\r\n id: string;\r\n postProcess: PostProcess;\r\n}\r\n\r\nfunction buildConfig(args: RenderToSvgArgs): Record<string, unknown> {\r\n const resolved = resolveTheme(args.theme, args.dark);\r\n const htmlLabels = args.pristine ? false : true;\r\n const config: Record<string, unknown> = {\r\n startOnLoad: false,\r\n theme: resolved.base,\r\n securityLevel: 'loose',\r\n htmlLabels,\r\n flowchart: { htmlLabels, useMaxWidth: false },\r\n };\r\n if (args.theme === 'colorful') {\r\n config.flowchart = { htmlLabels, useMaxWidth: false, nodeSpacing: 60, rankSpacing: 65, padding: 12 };\r\n }\r\n if (resolved.look === 'handDrawn') {\r\n config.look = 'handDrawn';\r\n config.handDrawnSeed = args.seed;\r\n config.fontFamily = SKETCH_FONT;\r\n }\r\n // host 自訂設定最後覆蓋(flowchart 做一層淺合併)。\r\n if (args.mermaidConfig) {\r\n const userFlowchart = (args.mermaidConfig.flowchart as Record<string, unknown>) ?? {};\r\n Object.assign(config, args.mermaidConfig);\r\n config.flowchart = { ...(config.flowchart as Record<string, unknown>), ...userFlowchart };\r\n }\r\n return config;\r\n}\r\n\r\n/** 解析設定 → 載字(sketch)→ initialize → render,回傳 mermaid 的 SVG 字串。 */\r\nexport async function renderToSvg(args: RenderToSvgArgs): Promise<RenderedSvg> {\r\n const resolved = resolveTheme(args.theme, args.dark);\r\n if (resolved.look === 'handDrawn') {\r\n // 先載入手寫字體再 render,確保 mermaid 量測文字寬度時用的就是 Virgil。\r\n await ensureSketchFont(args.fontUrl);\r\n }\r\n args.mermaid.initialize(buildConfig(args));\r\n renderSeq += 1;\r\n const id = `rsm-${renderSeq}`;\r\n const { svg } = await args.mermaid.render(id, args.code);\r\n return { svgString: svg, id, postProcess: args.pristine ? 'none' : resolved.postProcess };\r\n}\r\n\r\n/** 把 mermaid SVG 字串塞入 host、套後處理、設定填滿尺寸,回傳 live SVG 元素。 */\r\nexport function mountSvg(\r\n host: HTMLElement,\r\n svgString: string,\r\n postProcess: PostProcess,\r\n opts: { dark: boolean; seed: number },\r\n): SVGSVGElement | null {\r\n host.innerHTML = svgString;\r\n const svg = host.querySelector('svg');\r\n if (!svg) {\r\n return null;\r\n }\r\n applyPostProcess(svg, postProcess, opts);\r\n svg.style.maxWidth = 'none';\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n return svg;\r\n}\r\n\r\nexport function applyPostProcess(\r\n svg: SVGSVGElement,\r\n postProcess: PostProcess,\r\n opts: { dark: boolean; seed: number },\r\n): void {\r\n if (postProcess === 'colorful') {\r\n colorizeDiagram(svg, { dark: opts.dark });\r\n } else if (postProcess === 'sketch') {\r\n // 原生 handDrawn 不作用於 sequenceDiagram,這裡補手繪後處理;非序列圖會自動略過。\r\n sketchifyDiagram(svg, { dark: opts.dark, seed: opts.seed });\r\n }\r\n // 字體清晰度:所有主題(含原生 neutral/forest/dark)都套用,只加粗不改色,安全。\r\n boostLegibility(svg);\r\n}\r\n\r\n/**\r\n * 一次性渲染:載入 mermaid、渲染、後處理並(若有 container)注入頁面。\r\n * 不附 pan/zoom — 適合靜態美化輸出。互動請用 createViewer / <MermaidViewer>。\r\n */\r\nexport async function renderDiagram(opts: RenderDiagramOptions): Promise<RenderResult> {\r\n assertBrowser('renderDiagram');\r\n const dark = opts.dark ?? false;\r\n const seed = opts.seed ?? 42;\r\n if (opts.injectStyles !== false) {\r\n ensureStyles();\r\n }\r\n const mermaid = await loadMermaid({ source: opts.mermaid });\r\n const { svgString, id, postProcess } = await renderToSvg({\r\n code: opts.code,\r\n theme: opts.theme ?? 'colorful',\r\n dark,\r\n seed,\r\n fontUrl: opts.fontUrl,\r\n mermaidConfig: opts.mermaidConfig,\r\n mermaid,\r\n });\r\n\r\n const host =\r\n typeof opts.container === 'string'\r\n ? document.querySelector<HTMLElement>(opts.container)\r\n : (opts.container ?? document.createElement('div'));\r\n if (!host) {\r\n throw new Error(`[react-super-mermaid] 找不到 container:${String(opts.container)}`);\r\n }\r\n const svg = mountSvg(host, svgString, postProcess, { dark, seed });\r\n if (!svg) {\r\n throw new Error('[react-super-mermaid] mermaid 未輸出 SVG。');\r\n }\r\n return { svg, svgString, id };\r\n}\r\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。\r\n// 改寫自 super-mermaid 的 webview/main.ts(renderPristineSvg / prepareSvgText /\r\n// rasterize / cannotRasterize)。本檔只做純轉換,不依賴 mermaid;\r\n// 由呼叫端(hook)決定是用 live SVG 還是重繪的 pristine SVG。\r\n\r\nimport type { ExportRasterOptions, RasterType } from '../types';\r\n\r\nexport interface PreparedSvg {\r\n serialized: string;\r\n width: number;\r\n height: number;\r\n /** 含 <foreignObject>(htmlLabels)→ 點陣化可能污染 canvas,呼叫端宜退回 SVG。 */\r\n hasForeignObject: boolean;\r\n}\r\n\r\nconst RASTER_MIME: Record<RasterType, string> = {\r\n png: 'image/png',\r\n jpeg: 'image/jpeg',\r\n webp: 'image/webp',\r\n};\r\n\r\nfunction sizeFromViewBox(svgEl: SVGSVGElement): { width: number; height: number } {\r\n const viewBox = (svgEl.getAttribute('viewBox') ?? '0 0 800 600').split(/[\\s,]+/).map(Number);\r\n return {\r\n width: Math.max(1, Math.ceil(viewBox[2] || 800)),\r\n height: Math.max(1, Math.ceil(viewBox[3] || 600)),\r\n };\r\n}\r\n\r\nfunction finalizePrepared(svgEl: SVGSVGElement): PreparedSvg {\r\n const { width, height } = sizeFromViewBox(svgEl);\r\n svgEl.setAttribute('width', String(width));\r\n svgEl.setAttribute('height', String(height));\r\n svgEl.removeAttribute('style');\r\n const serialized = new XMLSerializer().serializeToString(svgEl);\r\n return { serialized, width, height, hasForeignObject: serialized.includes('<foreignObject') };\r\n}\r\n\r\n/** 解析 mermaid 重繪出來的 SVG 字串(htmlLabels 關閉的 pristine 版),整理成可匯出形式。 */\r\nexport function prepareSvgString(svgText: string): PreparedSvg | undefined {\r\n const holder = document.createElement('div');\r\n holder.innerHTML = svgText;\r\n const svgEl = holder.querySelector('svg');\r\n if (!svgEl) {\r\n return undefined;\r\n }\r\n return finalizePrepared(svgEl);\r\n}\r\n\r\n/** 整理一個已存在的 SVG 元素(就地設定尺寸、移除 style 後序列化)。 */\r\nexport function prepareSvgElement(svg: SVGSVGElement): PreparedSvg {\r\n return finalizePrepared(svg);\r\n}\r\n\r\n/**\r\n * 從畫面上 live SVG(已上色、可能被 pan/zoom 包了 viewport transform)複製一份、\r\n * 還原縮放平移後序列化。供同步的 exportSvg() 使用。\r\n */\r\nexport function serializeLiveSvg(svg: SVGSVGElement): PreparedSvg {\r\n const clone = svg.cloneNode(true) as SVGSVGElement;\r\n // 移除 svg-pan-zoom 注入的 viewport transform,讓匯出回到自然 viewBox 版面。\r\n const vp = clone.querySelector<SVGGElement>('.svg-pan-zoom_viewport');\r\n if (vp) {\r\n vp.removeAttribute('transform');\r\n vp.style.transform = '';\r\n }\r\n return finalizePrepared(clone);\r\n}\r\n\r\nexport function svgBlob(serialized: string): Blob {\r\n const xml = serialized.startsWith('<?xml')\r\n ? serialized\r\n : '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' + serialized;\r\n return new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\r\n}\r\n\r\n/** 把整理好的 SVG 經 Image + canvas 點陣化成 Blob。 */\r\nexport async function rasterizeToBlob(\r\n prepared: PreparedSvg,\r\n opts: ExportRasterOptions & { dark?: boolean } = {},\r\n): Promise<Blob> {\r\n const scale = opts.scale ?? 2;\r\n const type = opts.type ?? 'png';\r\n const mime = RASTER_MIME[type];\r\n const transparent = opts.transparent === true;\r\n\r\n const blob = new Blob([prepared.serialized], { type: 'image/svg+xml;charset=utf-8' });\r\n const url = URL.createObjectURL(blob);\r\n try {\r\n const img = new Image();\r\n await new Promise<void>((resolve, reject) => {\r\n img.onload = () => resolve();\r\n img.onerror = () => reject(new Error('無法點陣化 SVG(圖片載入失敗)。'));\r\n img.src = url;\r\n });\r\n const canvas = document.createElement('canvas');\r\n canvas.width = Math.max(1, Math.round(prepared.width * scale));\r\n canvas.height = Math.max(1, Math.round(prepared.height * scale));\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) {\r\n throw new Error('取不到 Canvas 2D context。');\r\n }\r\n // JPEG 無 alpha,一律填背景;其餘格式僅在非透明時填。\r\n if (!transparent || mime === 'image/jpeg') {\r\n ctx.fillStyle = opts.background ?? (opts.dark ? '#1e1e1e' : '#ffffff');\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n }\r\n ctx.scale(scale, scale);\r\n ctx.drawImage(img, 0, 0, prepared.width, prepared.height);\r\n return await canvasToBlob(canvas, mime, type === 'png' ? undefined : (opts.quality ?? 0.92));\r\n } finally {\r\n URL.revokeObjectURL(url);\r\n }\r\n}\r\n\r\nfunction canvasToBlob(canvas: HTMLCanvasElement, mime: string, quality?: number): Promise<Blob> {\r\n return new Promise((resolve, reject) => {\r\n canvas.toBlob(\r\n (blob) => {\r\n if (blob) {\r\n resolve(blob);\r\n } else {\r\n // toBlob 回 null 多半是 <foreignObject> 污染了 canvas。\r\n reject(new Error('匯出失敗:此圖含 HTML 標籤(foreignObject),請改用 SVG 匯出。'));\r\n }\r\n },\r\n mime,\r\n quality,\r\n );\r\n });\r\n}\r\n\r\n/** 觸發瀏覽器下載一個 Blob。 */\r\nexport function downloadBlob(blob: Blob, filename: string): void {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n // 給瀏覽器一點時間開始下載再回收 URL。\r\n setTimeout(() => URL.revokeObjectURL(url), 1000);\r\n}\r\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 { useEffect, useRef, useState } from 'react';\r\nimport type { MermaidTheme, RsmBackgroundPreset, RsmPattern } from '../types';\r\n\r\nexport interface ThemeOption {\r\n value: MermaidTheme;\r\n label: string;\r\n}\r\n\r\n/**\r\n * 底色預設色票。第一個 value=null 代表「預設 / 透明」(跟隨頁面底色);\r\n * 其餘對齊 VS Code 擴充套件的色票,色相柔和、適合做圖表底色。\r\n * 不符合時可用面板裡的「自訂」色票自選任意顏色。\r\n */\r\nexport const BACKGROUND_PRESETS: RsmBackgroundPreset[] = [\r\n { value: null, label: '預設 / 透明' },\r\n { value: '#FFFFFF', label: '白' },\r\n { value: '#F3F4F6', label: '淺灰' },\r\n { value: '#EFF6FF', label: '淺藍' },\r\n { value: '#FEFCE8', label: '淺黃' },\r\n { value: '#FDF2F8', label: '淺玫瑰' },\r\n];\r\n\r\n/** 疊加圖樣選項(分段切換鈕):無 / 網點 / 網格線。 */\r\nexport const PATTERN_OPTIONS: { value: RsmPattern; glyph: string; label: string }[] = [\r\n { value: 'none', glyph: '▢', label: '無' },\r\n { value: 'dots', glyph: '⠿', label: '網點' },\r\n { value: 'grid', glyph: '⊞', label: '網格' },\r\n];\r\n\r\nexport const DEFAULT_THEME_OPTIONS: ThemeOption[] = [\r\n { value: 'colorful', label: 'Colorful' },\r\n { value: 'sketch', label: 'Excalidraw' },\r\n { value: 'auto', label: 'Auto' },\r\n { value: 'default', label: 'Light' },\r\n { value: 'dark', label: 'Dark' },\r\n { value: 'neutral', label: 'Neutral' },\r\n { value: 'forest', label: 'Forest' },\r\n];\r\n\r\n/** 是否為合法的 #rrggbb;原生 color input 只接受這種格式。 */\r\nconst HEX6 = /^#[0-9a-fA-F]{6}$/;\r\n\r\n/** 把 surface 跟某個預設值做比對(大小寫不敏感)。 */\r\nfunction isSameColor(a: string | null, b: string | null): boolean {\r\n if (a === null || b === null) {\r\n return a === b;\r\n }\r\n return a.toLowerCase() === b.toLowerCase();\r\n}\r\n\r\ninterface BackgroundPickerProps {\r\n /** 目前底色;null = 透明 / 跟隨頁面。 */\r\n surface: string | null;\r\n /** 使用者選了新底色(色票或自訂);null = 透明。 */\r\n onSurfaceChange: (color: string | null) => void;\r\n /** 目前疊加圖樣。 */\r\n pattern: RsmPattern;\r\n /** 使用者切換了圖樣。 */\r\n onPatternChange: (pattern: RsmPattern) => void;\r\n}\r\n\r\n/**\r\n * 背景選擇器:一顆色井觸發鈕,點開後是「底色色票 + 自訂色」與「圖樣切換」兩段。\r\n * 點面板外或按 Esc 收合;底色與圖樣可自由組合(例如:淺藍底 + 網格)。\r\n */\r\nfunction BackgroundPicker(props: BackgroundPickerProps): React.JSX.Element {\r\n const [open, setOpen] = useState(false);\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!open) {\r\n return undefined;\r\n }\r\n const onDocPointer = (e: MouseEvent): void => {\r\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n };\r\n const onKey = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape') {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', onDocPointer);\r\n document.addEventListener('keydown', onKey);\r\n return () => {\r\n document.removeEventListener('mousedown', onDocPointer);\r\n document.removeEventListener('keydown', onKey);\r\n };\r\n }, [open]);\r\n\r\n // 目前底色是否落在某個預設上;若否(且非透明)則「自訂」色票為選中狀態。\r\n const isPreset = BACKGROUND_PRESETS.some((p) => isSameColor(p.value, props.surface));\r\n const customActive = props.surface !== null && !isPreset;\r\n // color input 必須是合法 #rrggbb;以目前底色為起點,否則給一個中性深藍。\r\n const customInputValue =\r\n props.surface && HEX6.test(props.surface) ? props.surface : '#1e293b';\r\n\r\n return (\r\n <div className=\"rsm-bg\" ref={rootRef}>\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn rsm-bg-trigger\"\r\n aria-expanded={open}\r\n aria-haspopup=\"dialog\"\r\n onClick={() => setOpen((o) => !o)}\r\n title=\"畫布背景(底色 + 網點 / 網格,B)\"\r\n >\r\n <span\r\n className=\"rsm-bg-well\"\r\n data-empty={props.surface === null ? 'true' : undefined}\r\n style={\r\n props.surface ? ({ ['--rsm-well-color' as string]: props.surface }) : undefined\r\n }\r\n />\r\n 背景\r\n </button>\r\n\r\n {open ? (\r\n <div className=\"rsm-bg-pop\" role=\"dialog\" aria-label=\"畫布背景設定\">\r\n <div className=\"rsm-bg-section\">\r\n <div className=\"rsm-bg-section-label\">底色</div>\r\n <div className=\"rsm-bg-swatches\">\r\n {BACKGROUND_PRESETS.map((preset) => {\r\n const selected = isSameColor(preset.value, props.surface);\r\n return (\r\n <button\r\n key={preset.label}\r\n type=\"button\"\r\n className={`rsm-swatch${selected ? ' rsm-selected' : ''}`}\r\n data-empty={preset.value === null ? 'true' : undefined}\r\n style={preset.value ? { backgroundColor: preset.value } : undefined}\r\n title={preset.label}\r\n aria-label={`底色:${preset.label}`}\r\n aria-pressed={selected}\r\n onClick={() => props.onSurfaceChange(preset.value)}\r\n />\r\n );\r\n })}\r\n\r\n {/* 自訂色:覆一個隱形 color input,挑不到合適預設時用。 */}\r\n <span\r\n className={`rsm-swatch rsm-swatch-custom${customActive ? ' rsm-has-color rsm-selected' : ''}`}\r\n style={customActive ? { backgroundColor: props.surface as string } : undefined}\r\n title=\"自訂顏色\"\r\n >\r\n {!customActive ? <span className=\"rsm-swatch-custom-icon\">🎨</span> : null}\r\n <input\r\n type=\"color\"\r\n value={customInputValue}\r\n aria-label=\"自訂底色\"\r\n onChange={(e) => props.onSurfaceChange(e.target.value)}\r\n />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"rsm-bg-section\">\r\n <div className=\"rsm-bg-section-label\">圖樣</div>\r\n <div className=\"rsm-seg\" role=\"group\" aria-label=\"背景圖樣\">\r\n {PATTERN_OPTIONS.map((opt) => (\r\n <button\r\n key={opt.value}\r\n type=\"button\"\r\n aria-pressed={props.pattern === opt.value}\r\n title={opt.label}\r\n onClick={() => props.onPatternChange(opt.value)}\r\n >\r\n <span className=\"rsm-seg-glyph\" aria-hidden=\"true\">\r\n {opt.glyph}\r\n </span>\r\n {opt.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface ToolbarProps {\r\n theme: MermaidTheme;\r\n themeOptions: ThemeOption[];\r\n onThemeChange: (theme: MermaidTheme) => void;\r\n zoomPercent: number;\r\n onZoomIn: () => void;\r\n onZoomOut: () => void;\r\n onActualSize: () => void;\r\n onReset: () => void;\r\n searchEnabled: boolean;\r\n searchOpen: boolean;\r\n onToggleSearch: () => void;\r\n exportEnabled: boolean;\r\n exporting: boolean;\r\n onExportSvg: () => void;\r\n onExportPng: () => void;\r\n /** 是否顯示背景選擇器。 */\r\n backgroundEnabled: boolean;\r\n /** 目前底色(hex);null = 透明 / 跟隨頁面。 */\r\n surface: string | null;\r\n /** 使用者選了新底色。 */\r\n onSurfaceChange: (color: string | null) => void;\r\n /** 目前疊加圖樣。 */\r\n pattern: RsmPattern;\r\n /** 使用者切換了圖樣。 */\r\n onPatternChange: (pattern: RsmPattern) => void;\r\n fullscreenEnabled: boolean;\r\n fullscreen: boolean;\r\n onToggleFullscreen: () => void;\r\n}\r\n\r\nexport function Toolbar(props: ToolbarProps): React.JSX.Element {\r\n return (\r\n <div className=\"rsm-toolbar\">\r\n <label className=\"rsm-label\">\r\n 樣式\r\n <select\r\n className=\"rsm-select\"\r\n value={props.theme}\r\n onChange={(e) => props.onThemeChange(e.target.value as MermaidTheme)}\r\n >\r\n {props.themeOptions.map((o) => (\r\n <option key={o.value} value={o.value}>\r\n {o.label}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n\r\n {props.backgroundEnabled ? (\r\n <BackgroundPicker\r\n surface={props.surface}\r\n onSurfaceChange={props.onSurfaceChange}\r\n pattern={props.pattern}\r\n onPatternChange={props.onPatternChange}\r\n />\r\n ) : null}\r\n\r\n <div className=\"rsm-toolbar-spacer\" />\r\n\r\n {props.searchEnabled ? (\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn\"\r\n aria-pressed={props.searchOpen}\r\n onClick={props.onToggleSearch}\r\n title=\"在圖中搜尋(/ 或 Ctrl+F)\"\r\n >\r\n 🔍 搜尋\r\n </button>\r\n ) : null}\r\n\r\n {props.exportEnabled ? (\r\n <div className=\"rsm-toolbar-group\">\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn\"\r\n onClick={props.onExportSvg}\r\n disabled={props.exporting}\r\n title=\"匯出 SVG\"\r\n >\r\n ⬇ SVG\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn\"\r\n onClick={props.onExportPng}\r\n disabled={props.exporting}\r\n title=\"匯出 PNG(2x)\"\r\n >\r\n {props.exporting ? '匯出中…' : '⬇ PNG'}\r\n </button>\r\n </div>\r\n ) : null}\r\n\r\n <div className=\"rsm-zoom\">\r\n <button type=\"button\" onClick={props.onZoomOut} title=\"縮小(-)\">\r\n -\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"rsm-zoom-percent\"\r\n onClick={props.onActualSize}\r\n title=\"實際大小(1)\"\r\n >\r\n {props.zoomPercent}%\r\n </button>\r\n <button type=\"button\" onClick={props.onZoomIn} title=\"放大(+)\">\r\n +\r\n </button>\r\n <button type=\"button\" onClick={props.onReset} title=\"符合視窗(0)\">\r\n ⤢\r\n </button>\r\n </div>\r\n\r\n {props.fullscreenEnabled ? (\r\n <button\r\n type=\"button\"\r\n className=\"rsm-btn rsm-btn-fullscreen\"\r\n aria-pressed={props.fullscreen ? 'true' : 'false'}\r\n onClick={props.onToggleFullscreen}\r\n title={props.fullscreen ? '離開全螢幕(Esc)' : '全螢幕檢視(F)'}\r\n >\r\n {props.fullscreen ? '✕ 離開全螢幕' : '⛶ 全螢幕'}\r\n </button>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\r\nimport type {\r\n ExportRasterOptions,\r\n MermaidSource,\r\n MermaidTheme,\r\n RsmPattern,\r\n SearchState,\r\n SvgPanZoomSource,\r\n} from '../types';\r\nimport { useMermaidViewer } from './useMermaidViewer';\r\nimport { DEFAULT_THEME_OPTIONS, Toolbar, type ThemeOption } from './Toolbar';\r\n\r\n/** 圖樣循環順序(快捷鍵 B):無 → 網點 → 網格 → 無。 */\r\nconst PATTERN_CYCLE: RsmPattern[] = ['none', 'dots', 'grid'];\r\n\r\nexport interface MermaidViewerProps {\r\n /** mermaid 原始碼字串(必填)。 */\r\n code: string;\r\n /** 主題,預設 'colorful'。toolbar 會即時切換;傳入新值也會同步。 */\r\n theme?: MermaidTheme;\r\n /** 暗色;省略時自動偵測 prefers-color-scheme。 */\r\n dark?: boolean;\r\n /** 是否顯示 toolbox(主題 / 縮放 / 搜尋 / 匯出)。預設 true;false = 只顯示圖表。 */\r\n toolbar?: boolean;\r\n /** 自訂 toolbar 上的主題選項。 */\r\n themeOptions?: ThemeOption[];\r\n /** 是否啟用 pan/zoom。預設 true。 */\r\n panZoom?: boolean;\r\n /** 是否啟用搜尋(toolbar 內)。預設 true。 */\r\n search?: boolean;\r\n /** 是否啟用匯出 SVG/PNG(toolbar 內)。預設 true。 */\r\n exportable?: boolean;\r\n /** 是否顯示背景選擇器(底色色票 + 自訂色 + 網點 / 網格圖樣)。預設 true。 */\r\n background?: boolean;\r\n /** 疊加圖樣初始 / 受控值,預設 'dots'(網點);toolbar 變更存內部 state。 */\r\n pattern?: RsmPattern;\r\n /**\r\n * 底色初始 / 受控值(hex,如 `#EFF6FF`);null / 省略 = 透明(跟隨頁面底色)。\r\n * toolbar 的色票與「自訂」色會更新此值。\r\n */\r\n solidColor?: string | null;\r\n /** 是否顯示全螢幕鈕(以跳窗形式覆蓋整個視窗,支援 RWD)。預設 true。 */\r\n fullscreen?: boolean;\r\n /** 進 / 出全螢幕時的回呼。 */\r\n onFullscreenChange?: (fullscreen: boolean) => void;\r\n /** 是否綁定鍵盤快捷鍵(/ Ctrl+F 搜尋、+ - 0 1 縮放、F 全螢幕、B 背景)。預設 true。 */\r\n keyboard?: boolean;\r\n /** sketch 抖動種子,預設 42。 */\r\n seed?: number;\r\n /** sketch 手寫字體來源覆寫。 */\r\n fontUrl?: string;\r\n /** 如何取得 mermaid:注入實例 / CDN。省略則動態 import peer。 */\r\n mermaid?: MermaidSource;\r\n /** 透傳給 mermaid.initialize 的設定。 */\r\n mermaidConfig?: Record<string, unknown>;\r\n /** 如何取得 svg-pan-zoom。省略則動態 import peer。 */\r\n svgPanZoom?: SvgPanZoomSource;\r\n /** 是否注入套件內建 CSS,預設 true。 */\r\n injectStyles?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n onRender?: (svg: SVGSVGElement) => void;\r\n onError?: (err: Error) => void;\r\n}\r\n\r\n/** 命令式控制(透過 ref),適合 toolbar={false} 時 host 自建按鈕。 */\r\nexport interface MermaidViewerHandle {\r\n zoomIn: () => void;\r\n zoomOut: () => void;\r\n fit: () => void;\r\n reset: () => void;\r\n actualSize: () => void;\r\n getZoomPercent: () => number;\r\n search: (term: string) => SearchState;\r\n next: () => SearchState;\r\n prev: () => SearchState;\r\n clearSearch: () => void;\r\n exportSvg: () => string;\r\n exportPng: (opts?: ExportRasterOptions) => Promise<Blob>;\r\n downloadSvg: (filename?: string) => void;\r\n downloadPng: (filename?: string, opts?: ExportRasterOptions) => Promise<void>;\r\n getSvg: () => SVGSVGElement | null;\r\n enterFullscreen: () => void;\r\n exitFullscreen: () => void;\r\n toggleFullscreen: () => void;\r\n isFullscreen: () => boolean;\r\n setPattern: (pattern: RsmPattern) => void;\r\n cyclePattern: () => void;\r\n getPattern: () => RsmPattern;\r\n /** 設定底色(hex);null = 透明 / 跟隨頁面。 */\r\n setSolidColor: (color: string | null) => void;\r\n getSolidColor: () => string | null;\r\n}\r\n\r\n/** 畫布底色 / 純色背景的預設顏色(對齊 VS Code editor-background)。 */\r\nfunction defaultSolidColor(dark: boolean): string {\r\n return dark ? '#1e1e1e' : '#ffffff';\r\n}\r\n\r\n/**\r\n * 依「實際畫布亮度」挑網點 / 網格線的墨色 —— 讓圖樣永遠跟底色對比、看得見。\r\n * 舊版把墨色綁在主題前景色(--rsm-fg),所以「深色主題 + 使用者選了淺底色」會變成\r\n * 淺墨疊淺底→看不見。這裡改成:有底色就量它的相對亮度,沒底色(透明)就看頁面亮暗。\r\n * 深底→淺墨(slate-200);淺底→深墨(slate-900),濃度對齊 VS Code 的點陣手感。\r\n */\r\nfunction patternInk(surface: string | null, dark: boolean): { dot: string; line: string } {\r\n const m = surface ? /^#([0-9a-fA-F]{6})$/.exec(surface) : null;\r\n let lightCanvas: boolean;\r\n if (m) {\r\n const r = parseInt(m[1].slice(0, 2), 16);\r\n const g = parseInt(m[1].slice(2, 4), 16);\r\n const b = parseInt(m[1].slice(4, 6), 16);\r\n lightCanvas = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255 > 0.5;\r\n } else {\r\n lightCanvas = !dark;\r\n }\r\n const ink = lightCanvas ? '15, 23, 42' : '226, 232, 240';\r\n // 網點是 1px 小圓、墨量天生比連續網格線少,故點略濃於線,兩者視覺份量才相當。\r\n return { dot: `rgba(${ink}, 0.34)`, line: `rgba(${ink}, 0.2)` };\r\n}\r\n\r\nfunction usePrefersDark(explicit?: boolean): boolean {\r\n const [autoDark, setAutoDark] = useState(false);\r\n useEffect(() => {\r\n if (explicit !== undefined || typeof window === 'undefined' || !window.matchMedia) {\r\n return undefined;\r\n }\r\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\r\n setAutoDark(mq.matches);\r\n const handler = (e: MediaQueryListEvent): void => setAutoDark(e.matches);\r\n mq.addEventListener('change', handler);\r\n return () => mq.removeEventListener('change', handler);\r\n }, [explicit]);\r\n return explicit ?? autoDark;\r\n}\r\n\r\nexport const MermaidViewer = forwardRef<MermaidViewerHandle, MermaidViewerProps>(\r\n function MermaidViewer(props, ref): React.JSX.Element {\r\n const {\r\n code,\r\n toolbar = true,\r\n themeOptions = DEFAULT_THEME_OPTIONS,\r\n panZoom = true,\r\n search: searchEnabled = true,\r\n exportable = true,\r\n background: backgroundEnabled = true,\r\n fullscreen: fullscreenEnabled = true,\r\n onFullscreenChange,\r\n keyboard = true,\r\n seed = 42,\r\n fontUrl,\r\n mermaid,\r\n mermaidConfig,\r\n svgPanZoom,\r\n injectStyles = true,\r\n className,\r\n style,\r\n onRender,\r\n onError,\r\n } = props;\r\n\r\n const dark = usePrefersDark(props.dark);\r\n\r\n // theme:以 prop 為初始 / 受控值,toolbar 變更存內部 state;prop 改變時同步。\r\n const [theme, setTheme] = useState<MermaidTheme>(props.theme ?? 'colorful');\r\n useEffect(() => {\r\n if (props.theme) {\r\n setTheme(props.theme);\r\n }\r\n }, [props.theme]);\r\n\r\n const [searchOpen, setSearchOpen] = useState(false);\r\n const [query, setQuery] = useState('');\r\n const [matchInfo, setMatchInfo] = useState<SearchState>({ current: 0, total: 0 });\r\n const [exporting, setExporting] = useState(false);\r\n\r\n // 疊加圖樣:以 prop 為初始 / 受控值,toolbar 變更存內部 state;prop 改變時同步。\r\n const [pattern, setPatternState] = useState<RsmPattern>(props.pattern ?? 'dots');\r\n useEffect(() => {\r\n if (props.pattern) {\r\n setPatternState(props.pattern);\r\n }\r\n }, [props.pattern]);\r\n\r\n // 底色:null = 透明(跟隨頁面);使用者選色票 / 自訂色後釘住。prop 改變時同步。\r\n const [solidColor, setSolidColorState] = useState<string | null>(props.solidColor ?? null);\r\n useEffect(() => {\r\n if (props.solidColor !== undefined) {\r\n setSolidColorState(props.solidColor);\r\n }\r\n }, [props.solidColor]);\r\n\r\n const [isFullscreen, setIsFullscreen] = useState(false);\r\n\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const searchInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const vm = useMermaidViewer({\r\n code,\r\n theme,\r\n dark,\r\n seed,\r\n fontUrl,\r\n mermaidConfig,\r\n mermaid,\r\n svgPanZoom,\r\n panZoom,\r\n injectStyles,\r\n onRender,\r\n onError,\r\n });\r\n\r\n const runSearch = useCallback(\r\n (term: string, pan: boolean): void => {\r\n setMatchInfo(vm.search(term, pan));\r\n },\r\n [vm],\r\n );\r\n\r\n const openSearch = useCallback((): void => {\r\n setSearchOpen(true);\r\n window.setTimeout(() => {\r\n searchInputRef.current?.focus();\r\n searchInputRef.current?.select();\r\n }, 0);\r\n if (query.trim()) {\r\n runSearch(query, true);\r\n }\r\n }, [query, runSearch]);\r\n\r\n const closeSearch = useCallback((): void => {\r\n setSearchOpen(false);\r\n vm.clearSearch();\r\n setQuery('');\r\n setMatchInfo({ current: 0, total: 0 });\r\n }, [vm]);\r\n\r\n const toggleSearch = useCallback((): void => {\r\n if (searchOpen) {\r\n closeSearch();\r\n } else {\r\n openSearch();\r\n }\r\n }, [searchOpen, openSearch, closeSearch]);\r\n\r\n const exportSvg = useCallback((): void => {\r\n try {\r\n vm.downloadSvg('diagram.svg');\r\n } catch (e) {\r\n onError?.(e instanceof Error ? e : new Error(String(e)));\r\n }\r\n }, [vm, onError]);\r\n\r\n const exportPng = useCallback(async (): Promise<void> => {\r\n setExporting(true);\r\n try {\r\n // 匯出背景跟隨畫布:透明底色 + 無圖樣 → 透明 PNG;否則用自選底色或 paper 填底。\r\n const paper = solidColor ?? defaultSolidColor(dark);\r\n const transparent = solidColor === null && pattern === 'none';\r\n const bgOpt = transparent ? { transparent: true } : { background: paper };\r\n await vm.downloadPng('diagram.png', { scale: 2, ...bgOpt });\r\n } catch (e) {\r\n onError?.(e instanceof Error ? e : new Error(String(e)));\r\n } finally {\r\n setExporting(false);\r\n }\r\n }, [vm, onError, pattern, solidColor, dark]);\r\n\r\n const cyclePattern = useCallback((): void => {\r\n setPatternState((prev) => {\r\n const i = PATTERN_CYCLE.indexOf(prev);\r\n return PATTERN_CYCLE[(i + 1) % PATTERN_CYCLE.length];\r\n });\r\n }, []);\r\n\r\n const setPattern = useCallback((next: RsmPattern): void => {\r\n setPatternState(next);\r\n }, []);\r\n\r\n const setSolidColor = useCallback((color: string | null): void => {\r\n setSolidColorState(color);\r\n }, []);\r\n\r\n // 全螢幕用「跳窗」實作(position:fixed 覆蓋整個視窗),而非原生 Fullscreen API:\r\n // 可靠、可跨 iframe、天然支援 RWD,且 Esc / 按鈕皆能關閉。\r\n const enterFullscreen = useCallback((): void => {\r\n setIsFullscreen((prev) => {\r\n if (!prev) {\r\n onFullscreenChange?.(true);\r\n }\r\n return true;\r\n });\r\n }, [onFullscreenChange]);\r\n\r\n const exitFullscreen = useCallback((): void => {\r\n setIsFullscreen((prev) => {\r\n if (prev) {\r\n onFullscreenChange?.(false);\r\n }\r\n return false;\r\n });\r\n }, [onFullscreenChange]);\r\n\r\n const toggleFullscreen = useCallback((): void => {\r\n setIsFullscreen((prev) => {\r\n onFullscreenChange?.(!prev);\r\n return !prev;\r\n });\r\n }, [onFullscreenChange]);\r\n\r\n // 進 / 出全螢幕:鎖住背景捲動、綁 window 級 Esc 關閉,並在版面尺寸改變後重新 fit。\r\n useEffect(() => {\r\n if (!isFullscreen) {\r\n return undefined;\r\n }\r\n const body = typeof document !== 'undefined' ? document.body : null;\r\n const prevOverflow = body?.style.overflow ?? '';\r\n if (body) {\r\n body.style.overflow = 'hidden';\r\n }\r\n const onWinKey = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n exitFullscreen();\r\n }\r\n };\r\n window.addEventListener('keydown', onWinKey);\r\n // 等版面套用全螢幕尺寸後再 resize + fit + center。\r\n const fitId = window.setTimeout(() => vm.reset(), 60);\r\n // RWD:旋轉螢幕 / 視窗尺寸變動時重新貼合。\r\n let resizeId = 0;\r\n const onResize = (): void => {\r\n window.clearTimeout(resizeId);\r\n resizeId = window.setTimeout(() => vm.reset(), 150);\r\n };\r\n window.addEventListener('resize', onResize);\r\n window.addEventListener('orientationchange', onResize);\r\n // 把焦點移到 root,讓內部鍵盤快捷鍵(縮放 / 搜尋)在跳窗內可用。\r\n rootRef.current?.focus();\r\n return () => {\r\n window.removeEventListener('keydown', onWinKey);\r\n window.removeEventListener('resize', onResize);\r\n window.removeEventListener('orientationchange', onResize);\r\n window.clearTimeout(fitId);\r\n window.clearTimeout(resizeId);\r\n if (body) {\r\n body.style.overflow = prevOverflow;\r\n }\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isFullscreen, exitFullscreen]);\r\n\r\n // 離開全螢幕後也重新 fit(版面從跳窗縮回行內尺寸);跳過首次掛載。\r\n const fsMountedRef = useRef(false);\r\n useEffect(() => {\r\n if (!fsMountedRef.current) {\r\n fsMountedRef.current = true;\r\n return undefined;\r\n }\r\n if (isFullscreen) {\r\n return undefined;\r\n }\r\n const id = window.setTimeout(() => vm.reset(), 60);\r\n return () => window.clearTimeout(id);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isFullscreen]);\r\n\r\n // 鍵盤快捷鍵:綁在 root(需 focus),避免像 window 那樣劫持 host 全域按鍵。\r\n useEffect(() => {\r\n if (!keyboard) {\r\n return undefined;\r\n }\r\n const root = rootRef.current;\r\n if (!root) {\r\n return undefined;\r\n }\r\n const onKey = (e: KeyboardEvent): void => {\r\n const target = e.target as HTMLElement | null;\r\n const typing = target ? /^(input|textarea|select)$/i.test(target.tagName) : false;\r\n if ((e.ctrlKey || e.metaKey) && (e.key === 'f' || e.key === 'F')) {\r\n e.preventDefault();\r\n openSearch();\r\n return;\r\n }\r\n if (e.key === '/' && !typing) {\r\n e.preventDefault();\r\n openSearch();\r\n return;\r\n }\r\n if (e.key === 'Escape' && searchOpen) {\r\n closeSearch();\r\n return;\r\n }\r\n if (e.key === 'Escape' && isFullscreen) {\r\n e.preventDefault();\r\n exitFullscreen();\r\n return;\r\n }\r\n if (typing) {\r\n return;\r\n }\r\n if (e.key === '+' || e.key === '=') {\r\n vm.zoomIn();\r\n } else if (e.key === '-' || e.key === '_') {\r\n vm.zoomOut();\r\n } else if (e.key === '0') {\r\n vm.reset();\r\n } else if (e.key === '1') {\r\n vm.actualSize();\r\n } else if (e.key === 'w' || e.key === 'W') {\r\n vm.fit();\r\n } else if (fullscreenEnabled && (e.key === 'f' || e.key === 'F')) {\r\n e.preventDefault();\r\n toggleFullscreen();\r\n } else if (backgroundEnabled && (e.key === 'b' || e.key === 'B')) {\r\n e.preventDefault();\r\n cyclePattern();\r\n }\r\n };\r\n root.addEventListener('keydown', onKey);\r\n return () => root.removeEventListener('keydown', onKey);\r\n }, [\r\n keyboard,\r\n searchOpen,\r\n openSearch,\r\n closeSearch,\r\n vm,\r\n isFullscreen,\r\n exitFullscreen,\r\n toggleFullscreen,\r\n cyclePattern,\r\n fullscreenEnabled,\r\n backgroundEnabled,\r\n ]);\r\n\r\n useImperativeHandle(\r\n ref,\r\n (): MermaidViewerHandle => ({\r\n zoomIn: vm.zoomIn,\r\n zoomOut: vm.zoomOut,\r\n fit: vm.fit,\r\n reset: vm.reset,\r\n actualSize: vm.actualSize,\r\n getZoomPercent: vm.getZoomPercent,\r\n search: (term: string) => vm.search(term),\r\n next: () => vm.next(),\r\n prev: () => vm.prev(),\r\n clearSearch: vm.clearSearch,\r\n exportSvg: vm.exportSvg,\r\n exportPng: vm.exportPng,\r\n downloadSvg: vm.downloadSvg,\r\n downloadPng: vm.downloadPng,\r\n getSvg: vm.getSvg,\r\n enterFullscreen,\r\n exitFullscreen,\r\n toggleFullscreen,\r\n isFullscreen: () => isFullscreen,\r\n setPattern,\r\n cyclePattern,\r\n getPattern: () => pattern,\r\n setSolidColor,\r\n getSolidColor: () => solidColor,\r\n }),\r\n [\r\n vm,\r\n enterFullscreen,\r\n exitFullscreen,\r\n toggleFullscreen,\r\n isFullscreen,\r\n setPattern,\r\n cyclePattern,\r\n pattern,\r\n setSolidColor,\r\n solidColor,\r\n ],\r\n );\r\n\r\n let countText = '';\r\n if (matchInfo.total > 0) {\r\n countText = `${matchInfo.current}/${matchInfo.total}`;\r\n } else if (query.trim()) {\r\n countText = '0';\r\n }\r\n\r\n const rootClassName = [\r\n 'rsm-root',\r\n dark ? 'rsm-dark' : '',\r\n `rsm-pattern-${pattern}`,\r\n isFullscreen ? 'rsm-fullscreen' : '',\r\n className ?? '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n // 底色透過 inline CSS 變數覆寫;未選(null)則交給 CSS 退回透明(跟隨頁面)。\r\n // 網點 / 網格墨色一律依「實際畫布亮度」算,確保任何底色(預設或自訂)上都看得見。\r\n const ink = patternInk(solidColor, dark);\r\n const rootStyle: React.CSSProperties = {\r\n ...(style ?? {}),\r\n ['--rsm-grid-dot' as string]: ink.dot,\r\n ['--rsm-grid-line' as string]: ink.line,\r\n ...(solidColor ? { ['--rsm-canvas-bg' as string]: solidColor } : {}),\r\n };\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={rootClassName}\r\n style={rootStyle}\r\n tabIndex={keyboard ? 0 : undefined}\r\n >\r\n {toolbar ? (\r\n <Toolbar\r\n theme={theme}\r\n themeOptions={themeOptions}\r\n onThemeChange={setTheme}\r\n zoomPercent={vm.zoomPercent}\r\n onZoomIn={vm.zoomIn}\r\n onZoomOut={vm.zoomOut}\r\n onActualSize={vm.actualSize}\r\n onReset={vm.reset}\r\n searchEnabled={searchEnabled}\r\n searchOpen={searchOpen}\r\n onToggleSearch={toggleSearch}\r\n exportEnabled={exportable}\r\n exporting={exporting}\r\n onExportSvg={exportSvg}\r\n onExportPng={exportPng}\r\n backgroundEnabled={backgroundEnabled}\r\n surface={solidColor}\r\n onSurfaceChange={setSolidColor}\r\n pattern={pattern}\r\n onPatternChange={setPattern}\r\n fullscreenEnabled={fullscreenEnabled}\r\n fullscreen={isFullscreen}\r\n onToggleFullscreen={toggleFullscreen}\r\n />\r\n ) : null}\r\n\r\n {toolbar && searchEnabled && searchOpen ? (\r\n <div className=\"rsm-searchbar\">\r\n <input\r\n ref={searchInputRef}\r\n className=\"rsm-input\"\r\n type=\"text\"\r\n value={query}\r\n spellCheck={false}\r\n placeholder=\"在圖中搜尋…(Enter 下一個 / Shift+Enter 上一個)\"\r\n onChange={(e) => {\r\n setQuery(e.target.value);\r\n runSearch(e.target.value, true);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n setMatchInfo(e.shiftKey ? vm.prev() : vm.next());\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n closeSearch();\r\n }\r\n }}\r\n />\r\n <span className=\"rsm-count\">{countText}</span>\r\n <button type=\"button\" className=\"rsm-btn\" onClick={() => setMatchInfo(vm.prev())}>\r\n 上一個\r\n </button>\r\n <button type=\"button\" className=\"rsm-btn\" onClick={() => setMatchInfo(vm.next())}>\r\n 下一個\r\n </button>\r\n <div className=\"rsm-searchbar-spacer\" />\r\n <button type=\"button\" className=\"rsm-btn\" onClick={closeSearch}>\r\n ✕ 關閉\r\n </button>\r\n </div>\r\n ) : null}\r\n\r\n <div className=\"rsm-canvas\">\r\n {vm.status === 'loading' ? <div className=\"rsm-overlay\">圖表渲染中…</div> : null}\r\n {vm.status === 'error' ? (\r\n <div className=\"rsm-overlay rsm-error\">圖表載入失敗:{vm.error}</div>\r\n ) : null}\r\n {isFullscreen ? (\r\n <button\r\n type=\"button\"\r\n className=\"rsm-fs-close\"\r\n onClick={exitFullscreen}\r\n title=\"離開全螢幕(Esc)\"\r\n aria-label=\"離開全螢幕\"\r\n >\r\n ✕\r\n </button>\r\n ) : null}\r\n <div ref={vm.stageRef} className=\"rsm-stage\" />\r\n </div>\r\n </div>\r\n );\r\n },\r\n);\r\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"]}
|