react-super-mermaid 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,301 @@
1
+ import * as react from 'react';
2
+ import { RefObject } from 'react';
3
+
4
+ /** 本套件實際用到的 mermaid API 子集 — 避免直接相依 mermaid 匯出的型別。 */
5
+ interface MermaidRenderResult {
6
+ svg: string;
7
+ bindFunctions?: (element: Element) => void;
8
+ }
9
+ interface MermaidLike {
10
+ initialize: (config: unknown) => void;
11
+ render: (id: string, text: string, container?: Element) => Promise<MermaidRenderResult>;
12
+ parse?: (text: string) => Promise<unknown> | unknown;
13
+ }
14
+ /** 如何取得外部 mermaid:注入實例 > peer 動態 import('mermaid') > CDN。 */
15
+ interface MermaidSource {
16
+ /** (a) host 已 import 的 mermaid 實例,最高優先,不再動態載入。 */
17
+ instance?: MermaidLike;
18
+ /** (c) mermaid ESM build 的 CDN 網址,如 .../mermaid@11/dist/mermaid.esm.min.mjs。 */
19
+ cdnUrl?: string;
20
+ }
21
+ interface LoadMermaidOptions {
22
+ source?: MermaidSource;
23
+ /** 強制重新解析(清掉模組級快取)。 */
24
+ fresh?: boolean;
25
+ }
26
+ /** svg-pan-zoom 工廠函式(預設匯出),只列出本套件用到的形狀。 */
27
+ type SvgPanZoomFactory = (svg: SVGElement, options?: Record<string, unknown>) => PanZoomInstance;
28
+ interface SvgPanZoomSource {
29
+ instance?: SvgPanZoomFactory;
30
+ cdnUrl?: string;
31
+ }
32
+ /** svg-pan-zoom 實例 — 只列出本套件用到的方法。 */
33
+ interface PanZoomInstance {
34
+ destroy: () => void;
35
+ zoomBy: (factor: number) => void;
36
+ zoom: (scale: number) => void;
37
+ getZoom: () => number;
38
+ resize: () => void;
39
+ fit: () => void;
40
+ center: () => void;
41
+ pan: (point: {
42
+ x: number;
43
+ y: number;
44
+ }) => void;
45
+ getPan: () => {
46
+ x: number;
47
+ y: number;
48
+ };
49
+ getSizes: () => {
50
+ width: number;
51
+ height: number;
52
+ realZoom: number;
53
+ viewBox: {
54
+ x: number;
55
+ y: number;
56
+ width: number;
57
+ height: number;
58
+ };
59
+ };
60
+ }
61
+ type MermaidTheme = 'colorful' | 'sketch' | 'auto' | 'default' | 'dark' | 'neutral' | 'forest';
62
+ type MermaidBaseTheme = 'default' | 'dark' | 'neutral' | 'forest';
63
+ interface RenderDiagramOptions {
64
+ /** mermaid 原始碼字串。 */
65
+ code: string;
66
+ /** 渲染目標;字串視為 CSS selector。省略則只回傳 detached SVG。 */
67
+ container?: HTMLElement | string;
68
+ theme?: MermaidTheme;
69
+ dark?: boolean;
70
+ /** sketch 抖動亂數種子,預設 42。 */
71
+ seed?: number;
72
+ /** sketch 手寫字體來源覆寫。 */
73
+ fontUrl?: string;
74
+ /** 透傳給 mermaid.initialize 的設定(深合併)。 */
75
+ mermaidConfig?: Record<string, unknown>;
76
+ /** 如何取得 mermaid。 */
77
+ mermaid?: MermaidSource;
78
+ /** 是否注入套件內建 CSS,預設 true。 */
79
+ injectStyles?: boolean;
80
+ }
81
+ interface RenderResult {
82
+ /** 已注入 container(若有提供)的 SVG 元素。 */
83
+ svg: SVGSVGElement;
84
+ /** 序列化後的 SVG 字串。 */
85
+ svgString: string;
86
+ /** 本次 render 使用的唯一 id。 */
87
+ id: string;
88
+ }
89
+ type RasterType = 'png' | 'jpeg' | 'webp';
90
+ interface ExportRasterOptions {
91
+ /** 解析度倍率,預設 2。 */
92
+ scale?: 1 | 2 | 4;
93
+ /** 透明背景(JPEG 不支援,會自動填白)。 */
94
+ transparent?: boolean;
95
+ /** 明確指定背景色,覆寫 transparent。 */
96
+ background?: string;
97
+ type?: RasterType;
98
+ /** jpeg / webp 的品質 0..1,預設 0.92。 */
99
+ quality?: number;
100
+ }
101
+ interface SearchState {
102
+ current: number;
103
+ total: number;
104
+ }
105
+
106
+ interface ThemeOption {
107
+ value: MermaidTheme;
108
+ label: string;
109
+ }
110
+ declare const DEFAULT_THEME_OPTIONS: ThemeOption[];
111
+ interface ToolbarProps {
112
+ theme: MermaidTheme;
113
+ themeOptions: ThemeOption[];
114
+ onThemeChange: (theme: MermaidTheme) => void;
115
+ zoomPercent: number;
116
+ onZoomIn: () => void;
117
+ onZoomOut: () => void;
118
+ onActualSize: () => void;
119
+ onReset: () => void;
120
+ searchEnabled: boolean;
121
+ searchOpen: boolean;
122
+ onToggleSearch: () => void;
123
+ exportEnabled: boolean;
124
+ exporting: boolean;
125
+ onExportSvg: () => void;
126
+ onExportPng: () => void;
127
+ }
128
+ declare function Toolbar(props: ToolbarProps): React.JSX.Element;
129
+
130
+ interface MermaidViewerProps {
131
+ /** mermaid 原始碼字串(必填)。 */
132
+ code: string;
133
+ /** 主題,預設 'colorful'。toolbar 會即時切換;傳入新值也會同步。 */
134
+ theme?: MermaidTheme;
135
+ /** 暗色;省略時自動偵測 prefers-color-scheme。 */
136
+ dark?: boolean;
137
+ /** 是否顯示 toolbox(主題 / 縮放 / 搜尋 / 匯出)。預設 true;false = 只顯示圖表。 */
138
+ toolbar?: boolean;
139
+ /** 自訂 toolbar 上的主題選項。 */
140
+ themeOptions?: ThemeOption[];
141
+ /** 是否啟用 pan/zoom。預設 true。 */
142
+ panZoom?: boolean;
143
+ /** 是否啟用搜尋(toolbar 內)。預設 true。 */
144
+ search?: boolean;
145
+ /** 是否啟用匯出 SVG/PNG(toolbar 內)。預設 true。 */
146
+ exportable?: boolean;
147
+ /** 是否綁定鍵盤快捷鍵(/ Ctrl+F 搜尋、+ - 0 1 縮放)。預設 true。 */
148
+ keyboard?: boolean;
149
+ /** sketch 抖動種子,預設 42。 */
150
+ seed?: number;
151
+ /** sketch 手寫字體來源覆寫。 */
152
+ fontUrl?: string;
153
+ /** 如何取得 mermaid:注入實例 / CDN。省略則動態 import peer。 */
154
+ mermaid?: MermaidSource;
155
+ /** 透傳給 mermaid.initialize 的設定。 */
156
+ mermaidConfig?: Record<string, unknown>;
157
+ /** 如何取得 svg-pan-zoom。省略則動態 import peer。 */
158
+ svgPanZoom?: SvgPanZoomSource;
159
+ /** 是否注入套件內建 CSS,預設 true。 */
160
+ injectStyles?: boolean;
161
+ className?: string;
162
+ style?: React.CSSProperties;
163
+ onRender?: (svg: SVGSVGElement) => void;
164
+ onError?: (err: Error) => void;
165
+ }
166
+ /** 命令式控制(透過 ref),適合 toolbar={false} 時 host 自建按鈕。 */
167
+ interface MermaidViewerHandle {
168
+ zoomIn: () => void;
169
+ zoomOut: () => void;
170
+ fit: () => void;
171
+ reset: () => void;
172
+ actualSize: () => void;
173
+ getZoomPercent: () => number;
174
+ search: (term: string) => SearchState;
175
+ next: () => SearchState;
176
+ prev: () => SearchState;
177
+ clearSearch: () => void;
178
+ exportSvg: () => string;
179
+ exportPng: (opts?: ExportRasterOptions) => Promise<Blob>;
180
+ downloadSvg: (filename?: string) => void;
181
+ downloadPng: (filename?: string, opts?: ExportRasterOptions) => Promise<void>;
182
+ getSvg: () => SVGSVGElement | null;
183
+ }
184
+ declare const MermaidViewer: react.ForwardRefExoticComponent<MermaidViewerProps & react.RefAttributes<MermaidViewerHandle>>;
185
+
186
+ /**
187
+ * 只顯示圖表的便利元件 = <MermaidViewer toolbar={false} />。
188
+ * 仍支援 pan/zoom 與透過 ref 的命令式控制(host 可自建按鈕)。
189
+ */
190
+ declare const MermaidDiagram: react.ForwardRefExoticComponent<Omit<MermaidViewerProps, "toolbar"> & react.RefAttributes<MermaidViewerHandle>>;
191
+
192
+ type RenderStatus = 'loading' | 'ready' | 'error';
193
+ interface UseMermaidViewerOptions {
194
+ code: string;
195
+ theme: MermaidTheme;
196
+ dark: boolean;
197
+ seed: number;
198
+ fontUrl?: string;
199
+ mermaidConfig?: Record<string, unknown>;
200
+ mermaid?: MermaidSource;
201
+ svgPanZoom?: SvgPanZoomSource;
202
+ panZoom: boolean;
203
+ injectStyles: boolean;
204
+ onRender?: (svg: SVGSVGElement) => void;
205
+ onError?: (err: Error) => void;
206
+ }
207
+ interface UseMermaidViewerResult {
208
+ stageRef: RefObject<HTMLDivElement>;
209
+ status: RenderStatus;
210
+ error: string;
211
+ zoomPercent: number;
212
+ zoomIn: () => void;
213
+ zoomOut: () => void;
214
+ fit: () => void;
215
+ reset: () => void;
216
+ actualSize: () => void;
217
+ getZoomPercent: () => number;
218
+ search: (term: string, pan?: boolean) => SearchState;
219
+ next: (pan?: boolean) => SearchState;
220
+ prev: (pan?: boolean) => SearchState;
221
+ clearSearch: () => void;
222
+ exportSvg: () => string;
223
+ exportPng: (opts?: ExportRasterOptions) => Promise<Blob>;
224
+ downloadSvg: (filename?: string) => void;
225
+ downloadPng: (filename?: string, opts?: ExportRasterOptions) => Promise<void>;
226
+ getSvg: () => SVGSVGElement | null;
227
+ }
228
+ declare function useMermaidViewer(opts: UseMermaidViewerOptions): UseMermaidViewerResult;
229
+
230
+ type PostProcess = 'colorful' | 'sketch' | 'none';
231
+ interface ResolvedTheme {
232
+ base: MermaidBaseTheme;
233
+ look: 'classic' | 'handDrawn';
234
+ postProcess: PostProcess;
235
+ }
236
+ declare function resolveTheme(theme: MermaidTheme, dark: boolean): ResolvedTheme;
237
+
238
+ /**
239
+ * 一次性渲染:載入 mermaid、渲染、後處理並(若有 container)注入頁面。
240
+ * 不附 pan/zoom — 適合靜態美化輸出。互動請用 createViewer / <MermaidViewer>。
241
+ */
242
+ declare function renderDiagram(opts: RenderDiagramOptions): Promise<RenderResult>;
243
+
244
+ declare function loadMermaid(opts?: LoadMermaidOptions): Promise<MermaidLike>;
245
+
246
+ declare function loadSvgPanZoom(source?: SvgPanZoomSource): Promise<SvgPanZoomFactory | null>;
247
+
248
+ declare function ensureStyles(): void;
249
+
250
+ interface ColorizeOptions {
251
+ dark?: boolean;
252
+ }
253
+ /** 在已渲染的 mermaid SVG 上套用 Colorful 樣式(就地修改 DOM)。 */
254
+ declare function colorizeDiagram(root: ParentNode, opts?: ColorizeOptions): void;
255
+
256
+ interface SketchOptions {
257
+ dark?: boolean;
258
+ /** 位移濾鏡亂數種子,固定值可確保每次 render 的抖動一致(與 handDrawnSeed 對齊)。 */
259
+ seed?: number;
260
+ }
261
+ declare const SKETCH_FONT = "'Virgil', 'KaiTi', 'Comic Sans MS', cursive";
262
+ declare const DEFAULT_VIRGIL_FONT_URL = "https://cdn.jsdelivr.net/npm/react-super-mermaid/dist/Virgil.woff2";
263
+ /**
264
+ * 對已渲染的 mermaid SVG 套用手繪風(就地修改 DOM)。
265
+ * 僅處理 sequenceDiagram;其他圖型回傳 false 由呼叫端維持原生 handDrawn 結果。
266
+ */
267
+ declare function sketchifyDiagram(root: ParentNode, opts?: SketchOptions): boolean;
268
+ /**
269
+ * 注入 Virgil 的 @font-face 並等待載入完成。
270
+ * 必須在 mermaid.render 之前 await — 否則 mermaid 會用 fallback 字體量測文字寬度,
271
+ * 導致換成 Virgil 後文字溢出方框。載入失敗時靜默退回 fallback 字體,不阻斷渲染。
272
+ *
273
+ * @param fontUrl Virgil woff2 的來源網址;省略則用 DEFAULT_VIRGIL_FONT_URL(jsDelivr)。
274
+ */
275
+ declare function ensureSketchFont(fontUrl?: string): Promise<void>;
276
+
277
+ interface PreparedSvg {
278
+ serialized: string;
279
+ width: number;
280
+ height: number;
281
+ /** 含 <foreignObject>(htmlLabels)→ 點陣化可能污染 canvas,呼叫端宜退回 SVG。 */
282
+ hasForeignObject: boolean;
283
+ }
284
+ /** 解析 mermaid 重繪出來的 SVG 字串(htmlLabels 關閉的 pristine 版),整理成可匯出形式。 */
285
+ declare function prepareSvgString(svgText: string): PreparedSvg | undefined;
286
+ /** 整理一個已存在的 SVG 元素(就地設定尺寸、移除 style 後序列化)。 */
287
+ declare function prepareSvgElement(svg: SVGSVGElement): PreparedSvg;
288
+ /**
289
+ * 從畫面上 live SVG(已上色、可能被 pan/zoom 包了 viewport transform)複製一份、
290
+ * 還原縮放平移後序列化。供同步的 exportSvg() 使用。
291
+ */
292
+ declare function serializeLiveSvg(svg: SVGSVGElement): PreparedSvg;
293
+ declare function svgBlob(serialized: string): Blob;
294
+ /** 把整理好的 SVG 經 Image + canvas 點陣化成 Blob。 */
295
+ declare function rasterizeToBlob(prepared: PreparedSvg, opts?: ExportRasterOptions & {
296
+ dark?: boolean;
297
+ }): Promise<Blob>;
298
+ /** 觸發瀏覽器下載一個 Blob。 */
299
+ declare function downloadBlob(blob: Blob, filename: string): void;
300
+
301
+ export { type ColorizeOptions, DEFAULT_THEME_OPTIONS, DEFAULT_VIRGIL_FONT_URL, type ExportRasterOptions, type LoadMermaidOptions, type MermaidBaseTheme, MermaidDiagram, type MermaidLike, type MermaidSource, type MermaidTheme, MermaidViewer, type MermaidViewerHandle, type MermaidViewerProps, type PanZoomInstance, type PreparedSvg, type RasterType, type RenderDiagramOptions, type RenderResult, type RenderStatus, SKETCH_FONT, type SearchState, type SketchOptions, type SvgPanZoomSource, type ThemeOption, Toolbar, type ToolbarProps, type UseMermaidViewerOptions, type UseMermaidViewerResult, colorizeDiagram, downloadBlob, ensureSketchFont, ensureStyles, loadMermaid, loadSvgPanZoom, prepareSvgElement, prepareSvgString, rasterizeToBlob, renderDiagram, resolveTheme, serializeLiveSvg, sketchifyDiagram, svgBlob, useMermaidViewer };