@barzhsieh/nuxt-content-mermaid 2.2.3 → 3.0.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.
Files changed (62) hide show
  1. package/README.md +47 -502
  2. package/README.zh-TW.md +46 -509
  3. package/dist/module.d.mts +39 -53
  4. package/dist/module.json +3 -3
  5. package/dist/module.mjs +600 -155
  6. package/dist/runtime/built-in-renderer/BuiltInRenderer.d.vue.ts +0 -0
  7. package/dist/runtime/built-in-renderer/BuiltInRenderer.vue +597 -0
  8. package/dist/runtime/built-in-renderer/BuiltInRenderer.vue.d.ts +0 -0
  9. package/dist/runtime/component-configuration-error.d.ts +3 -0
  10. package/dist/runtime/component-configuration-error.js +7 -0
  11. package/dist/runtime/component-configuration.d.ts +23 -0
  12. package/dist/runtime/component-configuration.js +78 -0
  13. package/dist/runtime/components/ContentMermaidTransport.d.vue.ts +10 -0
  14. package/dist/runtime/components/ContentMermaidTransport.vue +21 -0
  15. package/dist/runtime/components/ContentMermaidTransport.vue.d.ts +10 -0
  16. package/dist/runtime/components/Mermaid.d.vue.ts +0 -31
  17. package/dist/runtime/components/Mermaid.vue +136 -743
  18. package/dist/runtime/components/Mermaid.vue.d.ts +0 -31
  19. package/dist/runtime/components/MermaidExpandOverlay.d.vue.ts +13 -16
  20. package/dist/runtime/components/MermaidExpandOverlay.vue +61 -53
  21. package/dist/runtime/components/MermaidExpandOverlay.vue.d.ts +13 -16
  22. package/dist/runtime/components/MermaidFullscreenPresentation.d.vue.ts +18 -0
  23. package/dist/runtime/components/MermaidFullscreenPresentation.vue +56 -0
  24. package/dist/runtime/components/MermaidFullscreenPresentation.vue.d.ts +18 -0
  25. package/dist/runtime/composables/useMermaidExpand.d.ts +16 -32
  26. package/dist/runtime/composables/useMermaidExpand.js +232 -75
  27. package/dist/runtime/composables/useMermaidFullscreen.d.ts +18 -0
  28. package/dist/runtime/composables/useMermaidFullscreen.js +242 -0
  29. package/dist/runtime/composables/useMermaidZoom.d.ts +5 -1
  30. package/dist/runtime/composables/useMermaidZoom.js +54 -28
  31. package/dist/runtime/configuration/core.d.ts +27 -0
  32. package/dist/runtime/configuration/core.js +340 -0
  33. package/dist/runtime/configuration/module.d.ts +17 -0
  34. package/dist/runtime/configuration/module.js +233 -0
  35. package/dist/runtime/configuration/runtime-options.d.ts +4 -0
  36. package/dist/runtime/configuration/runtime-options.js +57 -0
  37. package/dist/runtime/constants.d.ts +24 -0
  38. package/dist/runtime/constants.js +60 -2
  39. package/dist/runtime/direct-mermaid-config.d.ts +5 -0
  40. package/dist/runtime/direct-mermaid-config.js +216 -0
  41. package/dist/runtime/mermaid-config.d.ts +9 -5
  42. package/dist/runtime/mermaid-config.js +30 -19
  43. package/dist/runtime/mermaid-rendering.d.ts +28 -0
  44. package/dist/runtime/mermaid-rendering.js +140 -0
  45. package/dist/runtime/plugins/content-mermaid-transport.d.ts +2 -0
  46. package/dist/runtime/plugins/content-mermaid-transport.js +5 -0
  47. package/dist/runtime/plugins/mermaid.client.d.ts +0 -3
  48. package/dist/runtime/plugins/mermaid.client.js +14 -32
  49. package/dist/runtime/plugins/runtime-config.d.ts +2 -0
  50. package/dist/runtime/plugins/runtime-config.js +9 -0
  51. package/dist/runtime/rendererSelection.d.ts +43 -0
  52. package/dist/runtime/rendererSelection.js +36 -0
  53. package/dist/runtime/rendererSelectionOrchestration.d.ts +12 -0
  54. package/dist/runtime/rendererSelectionOrchestration.js +13 -0
  55. package/dist/runtime/runtime-snapshot.d.ts +3 -0
  56. package/dist/runtime/runtime-snapshot.js +26 -0
  57. package/dist/runtime/utils/index.d.ts +0 -4
  58. package/dist/runtime/utils/index.js +0 -37
  59. package/dist/types.d.mts +2 -2
  60. package/package.json +38 -32
  61. package/dist/runtime/utils/mermaid-transform.d.ts +0 -18
  62. package/dist/runtime/utils/mermaid-transform.js +0 -345
package/README.zh-TW.md CHANGED
@@ -1,6 +1,6 @@
1
- [中文](./README.zh-TW.md) | [English](./README.md)
1
+ [中文](./README.zh-TW.md) | [English](./README.md)
2
2
 
3
- [![nuxt-content-social-card](https://raw.githubusercontent.com/andy820621/nuxt-content-mermaid/main/src/assets/nuxt-content-mermaid.webp)](https://www.npmjs.com/package/@barzhsieh/nuxt-content-mermaid)
3
+ [![nuxt-content-social-card](https://raw.githubusercontent.com/andy820621/nuxt-content-mermaid/main/src/assets/nuxt-content-mermaid.webp)](https://nuxt-content-mermaid.barz.app/zh)
4
4
 
5
5
  # nuxt-content-mermaid
6
6
 
@@ -11,546 +11,83 @@
11
11
  [![Mermaid](https://img.shields.io/badge/mermaid-11.x-0f5b9d?logo=mermaid)](https://mermaid.js.org/)
12
12
  [![Nuxt Content](https://img.shields.io/badge/Nuxt%20Content-3.x-00DC82?logo=nuxt.js)](https://content.nuxt.com/)
13
13
 
14
- 專為 [**Nuxt Content v3**](https://content.nuxt.com/docs/getting-started) 整合 [**Mermaid**](https://mermaid.js.org/) 的模組。
15
- 能自動將 Markdown 中的 \`\`\`mermaid 區塊轉換為響應式的圖表元件,並支援 Lazy Loading 與深色模式切換。
14
+ **@barzhsieh/nuxt-content-mermaid** 會將 Nuxt Content Markdown 中的
15
+ `mermaid` 程式碼圍欄 (fence) 轉換為響應式、可互動的圖表,並支援延遲載入、深淺色
16
+ 主題、工具列控制,以及由應用程式提供的渲染元件。
16
17
 
17
- ## Features
18
+ [英文正式文件](https://nuxt-content-mermaid.barz.app) 是 canonical package
19
+ documentation。本 README 是 npm 與 GitHub 的精簡發佈摘要;
20
+ [繁體中文網站](https://nuxt-content-mermaid.barz.app/zh) 為 best-effort
21
+ translation,可能比英文內容稍晚同步。若兩者有差異,請以英文文件為準。
18
22
 
19
- - **自動轉換**:解析 Markdown 代碼區塊並替換為 `<Mermaid>` 渲染元件。
20
- - **效能優化**:支援 Lazy Loading,僅在元件掛載時載入 Mermaid 核心與資源。
21
- - **主題整合**:無縫整合 `@nuxtjs/color-mode`,自動切換 Light/Dark 對應主題。
22
- - **高度客製**:支援自訂渲染元件(Wrapper)、Loading Spinner、錯誤畫面以及 CDN 來源。
23
- - **Runtime Config**:支援透過環境變數動態覆寫設定。
23
+ ## 適用情境
24
24
 
25
- ## 使用前提
25
+ 當 Nuxt Content 應用程式需要下列能力時,可使用本模組:
26
26
 
27
- - `nuxt@^3.20.1 || ^4.1.0`
28
- - `@nuxt/content@>=3.5.0`
27
+ - 在 Markdown 中以 Mermaid 程式碼圍欄 (fence) 撰寫圖表;
28
+ - 在瀏覽器中渲染圖表,並使用套件提供的載入與錯誤狀態;
29
+ - 跟隨應用程式的深色與淺色模式;
30
+ - 在全域、單一頁面或單一圍欄 (fence) 設定圖表;
31
+ - 選用延遲渲染、工具列控制或自訂渲染元件。
29
32
 
30
- ## Quick Setup
33
+ 本模組管理相容的 Mermaid 版本;應用程式負責 Nuxt、Nuxt Content peer
34
+ dependencies,以及 Nuxt Content database connector。
31
35
 
32
- ### 1. 安裝模組
36
+ ## 相容性
33
37
 
34
- **自動設定(自動寫入 `modules`):**
38
+ - Node.js `>=22.19.0`
39
+ - Nuxt `^4.1.0`
40
+ - Nuxt Content `>=3.5.0 <4.0.0`
35
41
 
36
- ```bash
37
- npx nuxi module add @barzhsieh/nuxt-content-mermaid
38
- ```
42
+ 相依擁有權、Nuxt Content v2 遷移邊界與渲染保證,請參閱
43
+ [相依與遷移契約](./docs/ch/DEPENDENCY_AND_MIGRATION_CONTRACT.md)。
39
44
 
40
- > Nuxt CLI 對第三方模組預設會裝到 `dependencies`。若你偏好放在 `devDependencies`,請安裝完後移動或改用下方的方式手動安裝。
45
+ ## 快速開始
41
46
 
42
- **裝到 `devDependencies`(需手動加入 `modules`):**
47
+ 安裝本模組與 Nuxt Content peer:
43
48
 
44
49
  ```bash
45
- # pnpm
46
- pnpm add -D @barzhsieh/nuxt-content-mermaid
47
-
48
- # npm
49
- npm install -D @barzhsieh/nuxt-content-mermaid
50
-
51
- # yarn
52
- yarn add -D @barzhsieh/nuxt-content-mermaid
53
- ```
54
-
55
- ### 2. 配置 `nuxt.config.ts`
56
-
57
- 確保模組已加入 `modules` 清單(若使用 `nuxi module add` 則可略過):
58
-
59
- ```ts
60
- export default defineNuxtConfig({
61
- modules: ["@barzhsieh/nuxt-content-mermaid", "@nuxt/content"],
62
- });
63
- ```
64
-
65
- ### 3. 在 Markdown 中使用
66
-
67
- 在 `content/` 目錄下的 `.md` 檔案中直接撰寫 Mermaid 語法:
68
-
69
- ````markdown
70
- # 流程圖範例
71
-
72
- ```mermaid
73
- graph LR
74
- A[Start] --> B{Is it working?}
75
- B -- Yes --> C[Great!]
76
- B -- No --> D[Debug]
50
+ pnpm add @barzhsieh/nuxt-content-mermaid @nuxt/content
77
51
  ```
78
- ````
79
-
80
- 模組會自動將其轉換為 SVG 圖表。
81
-
82
- ## Configuration
83
52
 
84
- 你可以透過 `contentMermaid` 選項進行全域設定。
85
- (`mermaidContent` 仍會被接受以維持相容,但已棄用,未來版本會移除。)
53
+ 註冊模組:
86
54
 
87
55
  ```ts
88
- // nuxt.config.ts
89
56
  export default defineNuxtConfig({
90
- contentMermaid: {
91
- enabled: true,
92
- loader: {
93
- init: {
94
- securityLevel: "strict",
95
- // 其他傳遞給 mermaid.initialize() 的參數
96
- },
97
- lazy: true,
98
- },
99
- theme: {
100
- light: "default",
101
- dark: "dark",
102
- },
103
- components: {
104
- renderer: undefined,
105
- spinner: undefined,
106
- error: undefined,
107
- },
108
- toolbar: {
109
- title: "mermaid",
110
- fontSize: "14px",
111
- fullscreenToolbarScale: 1.25,
112
- buttons: {
113
- copy: true,
114
- fullscreen: true,
115
- expand: true,
116
- },
117
- },
118
- expand: {
119
- enabled: true,
120
- margin: 0,
121
- invokeOpenOn: {
122
- diagramClick: true,
123
- },
124
- invokeCloseOn: {
125
- esc: true,
126
- wheel: true,
127
- swipe: true,
128
- overlayClick: true,
129
- closeButtonClick: true,
130
- },
131
- },
132
- },
133
- });
134
- ```
135
-
136
- ### 參數說明
137
-
138
- **Top-level**
139
-
140
- | 參數 | 類型 | 預設值 | 說明 |
141
- | :-------- | :-------- | :----- | :----------------------------- |
142
- | `enabled` | `boolean` | `true` | 是否啟用模組與轉換邏輯。 |
143
- | `debug` | `boolean` | `false` | 啟用除錯模式;見下方 Debug 說明。 |
144
-
145
- **loader**
146
-
147
- | 參數 | 類型 | 預設值 | 說明 |
148
- | :--------------- | :------------------------------------- | :----------------------- | :---------------------------------------------------------------------- |
149
- | `loader.init` | `MermaidConfig` | `{ startOnLoad: false }` | 直接傳遞給 `mermaid.initialize` 的原始設定。 |
150
- | `loader.lazy` | `boolean \| { threshold?: number }` | `true` | 元件進入 viewport 時才載入 Mermaid;設為 `false` 會在前一刻就載入。 |
151
-
152
- **theme**
153
-
154
- 若專案安裝了 `@nuxtjs/color-mode` 會自動偵測並跟隨;透過 `useMermaidTheme()` 設定的手動主題會優先。
155
-
156
- | 參數 | 類型 | 預設值 | 說明 |
157
- | :------------ | :----- | :---------- | :-------------------------------------------------------------------------------- |
158
- | `theme.light` | string | `'default'` | 當 color-mode 為 light 時的主題,若 color-mode 不存在也會回退使用。 |
159
- | `theme.dark` | string | `'dark'` | 當 color-mode 為 dark 時的主題,若 color-mode 不存在也會回退使用。 |
160
-
161
- **components**
162
-
163
- | 參數 | 類型 | 預設值 | 說明 |
164
- | :----------------------- | :------- | :--------- | :----------------------------------------------------- |
165
- | `components.renderer` | `string` | `undefined` | 指定自訂的 Mermaid 實作元件名稱(見進階用法)。 |
166
- | `components.spinner` | `string` | `undefined` | 指定全域的 Loading 元件名稱。 |
167
- | `components.error` | `string` | `undefined` | 指定全域的錯誤顯示元件名稱,渲染失敗時會使用。 |
168
-
169
- **toolbar**
170
-
171
- | 參數 | 類型 | 預設值 | 說明 |
172
- | :---------------------- | :----------------- | :----- | :------------------------------------- |
173
- | `toolbar.title` | `string` | `'mermaid'` | Mermaid 工具列預設標題。 |
174
- | `toolbar.fontSize` | `string \| number` | `'14px'` | Mermaid 工具列預設字體大小。 |
175
- | `toolbar.fullscreenToolbarScale` | `number` | `1.25` | fullscreen 時工具列字體/圖示的放大倍率。 |
176
- | `toolbar.buttons.copy` | `boolean` | `true` | 顯示工具列複製原始 Mermaid 的按鈕。 |
177
- | `toolbar.buttons.fullscreen` | `boolean` | `true` | 顯示工具列全螢幕按鈕。 |
178
- | `toolbar.buttons.expand` | `boolean` | `true` | 顯示工具列放大按鈕。 |
179
-
180
- **expand**
181
-
182
- 控制 SVG 放大互動行為,也可直接設為 `expand: false` 來停用,或 `expand: true` 使用預設值。
183
-
184
- | 參數 | 類型 | 預設值 | 說明 |
185
- | :------------------------ | :-------- | :----- | :------------------------------------------------------- |
186
- | `expand.enabled` | `boolean` | `true` | 是否啟用放大功能。 |
187
- | `expand.margin` | `number` | `0` | 放大後 SVG 在視窗內保留的邊距(px)。 |
188
- | `expand.invokeOpenOn.diagramClick` | `boolean` | `true` | 允許直接點擊 SVG 開啟放大。 |
189
- | `expand.invokeCloseOn.esc` | `boolean` | `true` | 允許按 ESC 關閉。 |
190
- | `expand.invokeCloseOn.wheel` | `boolean` | `true` | 允許滑鼠滾輪關閉。 |
191
- | `expand.invokeCloseOn.swipe` | `boolean` | `true` | 允許滑動手勢關閉。 |
192
- | `expand.invokeCloseOn.overlayClick` | `boolean` | `true` | 允許點擊 overlay 背景關閉。 |
193
- | `expand.invokeCloseOn.closeButtonClick`| `boolean` | `true` | 顯示 overlay 關閉按鈕。 |
194
-
195
- **平移與縮放 (Expand Overlay / Fullscreen)**
196
-
197
- 當放大 Fullscreen 或是 Expand 模式時,使用者可平移與縮放圖表:
198
-
199
- | 操作 | 桌機 | 行動裝置 |
200
- |:---|:---|:---|
201
- | **平移 (Pan)** | `Space` + 拖曳 | 單指拖曳 |
202
- | **縮放 (Zoom)** | `Ctrl/⌘` + 滾輪 | 雙指捏合 |
203
- | **鍵盤** | `+`/`-` 縮放、方向鍵平移、`0` 重置 | — |
204
-
205
- 放大介面會顯示縮放工具列,包含 +/−/Reset 按鈕與百分比顯示。
206
-
207
- 可透過 `toolbar.fullscreenToolbarScale` 調整 Fullscreen 工具列與縮放控制的尺寸。
208
-
209
-
210
- > **Note**: 所有設定皆可透過 `runtimeConfig.public.contentMermaid` 在部署時進行覆寫(`runtimeConfig.public.mermaidContent` 仍支援但已棄用)。
211
-
212
- ## 樣式自訂(CSS 變數)
213
-
214
- 模組會提供全域 CSS 變數(來源為 `runtime/styles.css`),讓 Mermaid 區塊與放大 overlay 使用同一套配色。你可以在專案中覆寫:
215
-
216
- ```css
217
- :root {
218
- --ncm-code-bg: #f3f4f6;
219
- --ncm-code-bg-hover: #e5e7eb;
220
- --ncm-border: #e5e7eb;
221
- --ncm-text: #111827;
222
- --ncm-text-muted: #4b5563;
223
- --ncm-text-xmuted: #6b7280;
224
- --ncm-overlay-bg: rgba(255, 255, 255, 0.98);
225
- }
226
-
227
- html[data-theme="dark"],
228
- .dark {
229
- --ncm-code-bg: #111827;
230
- --ncm-code-bg-hover: #1f2937;
231
- --ncm-border: #1f2937;
232
- --ncm-text: #f9fafb;
233
- --ncm-text-muted: #9ca3af;
234
- --ncm-text-xmuted: #6b7280;
235
- --ncm-overlay-bg: rgba(17, 24, 39, 0.98);
236
- }
237
- ```
238
-
239
- 可覆寫的變數:
240
- 可覆寫的變數:
241
- - `--ncm-code-bg`:Mermaid 區塊背景色
242
- - `--ncm-code-bg-hover`:工具列按鈕 hover 背景
243
- - `--ncm-border-color`:區塊與工具列的邊框顏色
244
- - `--ncm-border-width`:邊框厚度
245
- - `--ncm-border-style`:邊框樣式
246
- - `--ncm-border`:邊框 shorthand(寬度、樣式、顏色)
247
- - `--ncm-border-bottom`:工具列底部的邊框
248
- - `--ncm-text`:主要文字顏色
249
- - `--ncm-text-muted`:標題與次要文字
250
- - `--ncm-text-xmuted`:工具列 icon 與更淡的文字
251
- - `--ncm-overlay-bg`:放大 overlay 背景(預設跟 `--ncm-code-bg` 一致)
252
- - `--ncm-expand-target-bg`:當 `expand.margin > 0` 時,放大後留白的 SVG 外框背景,可以與 overlay 做出區隔
253
- - `--ncm-overlay-opacity`:overlay 的透明度(搭配 margin 留白時可微調濃淡)
254
- - `--ncm-overlay-backdrop`:顯示 overlay 時加上的 `backdrop-filter`,可自訂 blur/效果
255
- - `--ncm-hint-bg`:縮放提示訊息背景色(預設 `rgba(0,0,0,0.75)`)
256
- - `--ncm-hint-text`:縮放提示訊息文字顏色(預設 `#fff`)
257
- - `--ncm-hint-radius`:縮放提示訊息圓角(預設 `8px`)
258
-
259
- ## Advanced Usage
260
-
261
- ### Debug 模式
262
-
263
- **`contentMermaid.debug`**(預設 `false`):
264
- - **自動配置**:若未手動設定 `loader.init.logLevel` 或 `suppressErrorRendering`,開啟 debug 模式會自動將 `logLevel` 設為 `1` (Info),並將 `suppressErrorRendering` 設為 `false`(允許 Mermaid 在 DOM 中顯示錯誤訊息)。
265
- - **執行行為**:
266
- - **Debug 開啟**:`mermaid.run` 使用 `suppressErrors: false`,發生錯誤時會拋出完整堆疊以便除錯。
267
- - **Debug 關閉**:`mermaid.run` 使用 `suppressErrors: true`,避免單一圖表錯誤中斷其他圖表的渲染。
268
- - **主控台輸出**:模組會額外輸出渲染佇列的診斷資訊與執行時間統計。
269
-
270
- ### 主題與顏色模式 (Theme & Color Mode)
271
-
272
- 模組會依據以下優先順序決定主題:
273
-
274
- 1. Frontmatter `config.theme`(單篇覆寫)
275
- 2. `useMermaidTheme()` 設定的手動模式(若有)
276
- 3. `@nuxtjs/color-mode`(安裝時自動偵測):
277
- - `dark` → 使用 `theme.dark`
278
- - `light` → 使用 `theme.light`
279
- 4. `loader.init.theme`(若有設定)
280
- 5. 回退:`theme.light`,若無則 Mermaid 預設 `'default'`
281
-
282
- 更多進階手動控制(如:強制指定特定主題、自訂切換邏輯),請參閱 [手動主題控制指南](./docs/ch/MANUAL_THEME_CONTROL.md)。
283
-
284
- ### 以 frontmatter 覆寫單頁設定
285
-
286
- 每篇 Markdown 都可以透過於 frontmatter 中加入 `config` 欄位來覆寫模組設定。
287
-
288
- > **⚠️ 若要使用 frontmatter `config` 覆寫,務必在 `content.config.ts` 的 collection schema 中宣告 `config` 欄位。**
289
- > 若未宣告,Nuxt Content 不會將 `config` 解析為 JSON 物件,覆寫將無法生效。
290
-
291
- 在 `content.config.ts` 加上:
292
-
293
- ```ts
294
- import { defineContentConfig, defineCollection, z } from '@nuxt/content'
295
-
296
- export default defineContentConfig({
297
- collections: {
298
- content: defineCollection({
299
- type: 'page',
300
- source: '**',
301
- schema: z.object({
302
- config: z.record(z.unknown()).optional(), // 宣告 config 欄位
303
- }).passthrough(),
304
- }),
305
- },
57
+ modules: ['@barzhsieh/nuxt-content-mermaid'],
306
58
  })
307
59
  ```
308
60
 
309
- 接著在 Markdown frontmatter 使用:
61
+ 接著在 Content Markdown 檔案中加入 Mermaid 圍欄:
310
62
 
311
63
  ````markdown
312
- ---
313
- title: 單篇覆寫 Mermaid 設定範例
314
- config:
315
- theme: forest
316
- flowchart:
317
- htmlLabels: false
318
- ---
319
-
320
64
  ```mermaid
321
65
  flowchart LR
322
- A["<b>允許 HTML labels?</b>"] --> B{不允許}
66
+ Markdown --> Content --> Mermaid --> SVG
323
67
  ```
324
68
  ````
325
69
 
326
- ### `%%{init}%%` 語法、frontmatter 與模組設定的優先順序
70
+ Mermaid 已包含在本模組中,不需要另外安裝。資料庫 connector 選擇與完整的
71
+ 第一個專案步驟,請參閱[開始使用](https://nuxt-content-mermaid.barz.app/zh/getting-started)。
327
72
 
328
- Mermaid 本身也支援在圖表內透過 `%%{init: ...}%%` 語法覆寫設定,例如:
73
+ ## 繁體中文文件
329
74
 
330
- ````markdown
331
- ```mermaid
332
- %%{init: { 'theme': 'forest', 'flowchart': { 'curve': 'step' } }}%%
333
- graph TD
334
- A[Input] --> B{Valid?}
335
- B -- Yes --> C[Persist]
336
- B -- No --> D[Error]
337
- ```
338
- ````
75
+ - [開始使用](https://nuxt-content-mermaid.barz.app/zh/getting-started)
76
+ - [撰寫圖表](https://nuxt-content-mermaid.barz.app/zh/writing-diagrams)
77
+ - [設定](https://nuxt-content-mermaid.barz.app/zh/configuration)
78
+ - [疑難排解](https://nuxt-content-mermaid.barz.app/zh/troubleshooting)
79
+ - [升級至 v3](https://nuxt-content-mermaid.barz.app/zh/migration/v3)
339
80
 
340
- > 細節可參考 [Mermaid 官方文件](https://mermaid.js.org/config/directives.html#declaring-directives)
81
+ ## 支持與貢獻
341
82
 
342
- 實際生效時的優先順序如下:
343
-
344
- 1. **圖表內的 `%%{init: ...}%%`** —— 最優先,直接由 Mermaid 處理。
345
- 2. **frontmatter `config`** —— 深度合併在模組的 `loader.init` 之上。
346
- 3. **模組層級的 `contentMermaid.loader.init`** —— 專案的全域預設。
347
-
348
- ### Mermaid Inline attrs 與 YAML Frontmatter
349
-
350
- 支援三種方式控制 Mermaid Svg 的渲染:inline attrs、Mermaid YAML frontmatter、`%%{init}%%` 指令。
351
-
352
- #### Inline attrs(fence info)
353
-
354
- 在 `mermaid` fence 上使用 inline attrs,傳遞 wrapper props 或設定 Mermaid 的 YAML 欄位(包含 `toolbar` 的 title/fontSize 與 `toolbar.buttons.*`)。
355
-
356
- ````markdown
357
- ```mermaid {title="Diagram A" toolbar='{"title":"My Diagram","fontSize":"14px"}' config='{"theme":"dark"}'}
358
- graph TD
359
- A --> B
360
- ```
361
- ````
362
-
363
- #### Mermaid YAML frontmatter(block 內)
364
-
365
- 把 Mermaid 的 YAML frontmatter 放在 code block 最前面,用來影響 SVG 輸出(例如 title、displayMode、config),也可以提供 `toolbar` 給 wrapper 元件(包含 `toolbar.buttons.copy: true`)。
366
-
367
- ````markdown
368
- ```mermaid
369
- ---
370
- title: Sample Flowchart
371
- displayMode: compact
372
- config:
373
- theme: dark
374
- toolbar:
375
- title: "Sample Diagram"
376
- buttons:
377
- copy: true
378
- expand: true
379
- fullscreen: false
380
- ---
381
- graph TD
382
- A --> B
383
- ```
384
- ````
385
-
386
- #### `%%{init}%%` 指令(block 內)
387
-
388
- 使用 Mermaid directive,直接在圖表定義內設定渲染選項。
389
-
390
- ````markdown
391
- ```mermaid
392
- %%{init: { 'theme': 'forest', 'flowchart': { 'curve': 'step' } }}%%
393
- graph TD
394
- A --> B
395
- ```
396
- ````
397
-
398
- ### 自訂渲染元件 (Custom Component)
399
-
400
- 若需完全接管 Mermaid 的渲染行為(例如:加入外框、Expand/Collapse 功能),可指定 `components.renderer`。
401
-
402
- 1. 在 `nuxt.config.ts` 中指定元件名稱:
403
-
404
- ```ts
405
- contentMermaid: {
406
- components: {
407
- renderer: "MyCustomMermaid",
408
- }
409
- }
410
- ```
411
-
412
- 2. 在 `components/MyCustomMermaid.vue` 中實作:
413
-
414
- ```vue
415
- <script setup lang="ts">
416
- // 你可以在此使用 slot 內容或自行呼叫 useMermaid() 等邏輯
417
- </script>
418
-
419
- <template>
420
- <div class="custom-wrapper border rounded p-4">
421
- <Mermaid>
422
- <slot />
423
- </Mermaid>
424
- </div>
425
- </template>
426
- ```
427
-
428
- #### 載入中指示
429
-
430
- 模組在首次渲染前會使用內建的 spinner,如需替換可在 `components.spinner` 指定元件名稱;該元件也會以 `spinner` prop 傳入你的自訂渲染元件,方便直接渲染。
431
-
432
- 以下是極簡的設定與元件示例:
433
-
434
- ```ts
435
- // nuxt.config.ts
436
- export default defineNuxtConfig({
437
- contentMermaid: {
438
- components: {
439
- renderer: 'MyCustomMermaid',
440
- spinner: 'MySpinner', // 選填:改用自己的全域 Loading 元件
441
- }
442
- }
443
- })
444
- ```
445
-
446
- ```vue
447
- <!-- components/MyCustomMermaid.vue -->
448
- <script setup lang="ts">
449
- import { ref, onMounted } from 'vue'
450
- import type { Component } from 'vue'
451
-
452
- const props = defineProps<{ spinner: Component | string }>()
453
- const loading = ref(true)
454
- onMounted(() => { loading.value = false })
455
- </script>
456
-
457
- <template>
458
- <div class="my-mermaid">
459
- <component v-if="loading" :is="props.spinner" />
460
- <Mermaid v-else>
461
- <slot />
462
- </Mermaid>
463
- </div>
464
- </template>
465
- ```
466
-
467
- ### 元件使用方式
468
-
469
- 可以用 `<Mermaid>` 自己包一個的 Vue 元件 。
470
- 例如,你可以同時放入標題、Loading 與錯誤顯示,之後就能在任意模板重複使用:
471
- ```vue
472
- <!-- WrapperMermaid.vue -->
473
- <template>
474
- <section>
475
- <header v-if="title">{{ title }}</header>
476
-
477
- <Mermaid>
478
- <slot>
479
- <pre><code>{{ code }}</code></pre>
480
- </slot>
481
-
482
- <template #loading>
483
- <component :is="spinner" v-if="spinner" />
484
- <p v-else>Diagram loading…</p>
485
- </template>
486
-
487
- <template #error="{ error, source }">
488
- <p>渲染失敗:{{ error instanceof Error ? error.message : String(error) }}</p>
489
- <pre><code>{{ source }}</code></pre>
490
- </template>
491
- </Mermaid>
492
- </section>
493
- </template>
494
- ```
495
-
496
- ```vue
497
- <!-- 使用範例 -->
498
- <WrapperMermaid
499
- title="Demo Diagram"
500
- spinner="MySpinner"
501
- >
502
- <pre><code>graph TD; A-->B; B-->C; C-->A</code></pre>
503
- </WrapperMermaid>
504
- ```
505
-
506
- 可依需求調整此模式,把常用的 slot 寫在一個可重用的包裝元件中。
507
-
508
- ### 錯誤處理
509
-
510
- 當 Mermaid 解析或渲染失敗時,`<Mermaid>` 會觸發 `error` slot,並可透過 `components.error` 指定全域錯誤元件。兩者都會拿到錯誤內容與原始 Mermaid 定義,方便除錯。
511
-
512
- ```vue
513
- <Mermaid>
514
- <pre><code>graph TD; A-->B; B-->C; C-->A</code></pre>
515
-
516
- <template #error="{ error, source }">
517
- <p>渲染失敗:{{ error instanceof Error ? error.message : String(error) }}</p>
518
- <details>
519
- <summary>查看原始定義</summary>
520
- <pre><code>{{ source }}</code></pre>
521
- </details>
522
- </template>
523
- </Mermaid>
524
- ```
525
-
526
- 若想一次註冊、全域套用自訂錯誤畫面,可在設定中指定元件名稱:
527
-
528
- ```ts
529
- // nuxt.config.ts
530
- export default defineNuxtConfig({
531
- contentMermaid: {
532
- components: {
533
- error: 'MermaidError', // 全域註冊的元件名稱
534
- },
535
- },
536
- })
537
- ```
538
-
539
- ## Contribution
540
-
541
- <details>
542
- <summary>Local Development Commands</summary>
543
-
544
- ```bash
545
- pnpm install
546
- pnpm dev:prepare
547
- pnpm dev # Run playground
548
- pnpm test # Run tests
549
- ```
83
+ 如果本模組對你有幫助,歡迎透過
84
+ [Ko-fi 支持我的開源工作](https://ko-fi.com/barzhsieh)。
550
85
 
551
- </details>
86
+ 歡迎建立 [Issue](https://github.com/andy820621/nuxt-content-mermaid/issues)
87
+ 或提交附有清楚摘要與測試結果的 Pull Request。維護者請遵循
88
+ [stable release runbook](./docs/en/RELEASING.md)。
552
89
 
553
- ## License
90
+ ## 授權
554
91
 
555
92
  [MIT License](./LICENSE)
556
93