Draws ```mermaid blocks in Claude's replies as Unicode diagrams, in place

<h1 align="center">claude-mermaid-mod</h1>
A Claude Code mod that draws ``` `mermaid ``` blocks in Claude's replies as Unicode diagrams, in place.

Before:
flowchart LR A[Request] --> B{Cached?} B -->|yes| C[Serve cache] B -->|no| D[Fetch origin] D --> C
After:
┌─────────┐ ╔═════════╗ no ┌──────────────┐ ┌─────────────┐
│ Request ├───▶║ Cached? ╟────▶│ Fetch origin ├───▶│ Serve cache │
└─────────┘ ╚════╤════╝ └──────────────┘ └─────────────┘
│ ▲
└──────────────── yes ────────────────┘
By default the diagram is drawn above its code block, so the source stays readable and copyable. /mermaid diagram hides the code block. The mod changes only what the terminal draws. The stored message keeps its Mermaid source, and ctrl+o shows it.
Requires Claude Code 2.1.287 or later.
/plugin marketplace add ngothanhluc/claude-mermaid-mod
/plugin install mermaid-mod@claude-mermaid-mod
show-me is a skill by HumanLayer (MIT) that has Claude explain the current topic with diagrams, often as Mermaid. With mermaid-mod, those diagrams are drawn right in the terminal. This marketplace lists it, pulled from HumanLayer's repo:
/plugin install show-me@claude-mermaid-mod
Then type /show-me in any conversation.

It's the skill I reach for most. Instead of reading paragraphs about how a flow works, I type /show-me and get a call tree or a diagram in seconds. It's the fastest way I know to get a grip on unfamiliar code, and with mermaid-mod I never leave the terminal to see it.
The mod renders flowcharts, state, class, ER, sequence, pie, mindmap, timeline and gitGraph diagrams. It colours borders, text, edges, edge labels and titles with your Claude Code theme.
It keeps the original code block when:
gantt),| Command | Effect |
|---|---|
/mermaid | Show the current settings. |
/mermaid streaming | Draw every Mermaid block, including one still being written. This is the default. |
/mermaid final | Draw only blocks whose closing fence has arrived. |
/mermaid off | Draw nothing. Code blocks stay as they are. |
/mermaid both | Draw the diagram above its code block. This is the default. |
/mermaid diagram | Draw the diagram in place of its code block. |
Settings are saved for every session on the machine.
npm install # esbuild and lovely-mermaid, for the vendor script only
npm test # node --test on the transform, then claude plugin test on the hooks
npm run golden # rewrite test/fixtures/*.txt from the .mmd inputs
npm run vendor # rebuild hooks/vendor/lovely-mermaid.js from the pinned version
claude --plugin-dir . # try it in a live session
vhs demo/demo.tape # re-record demo/demo.gif, .mp4 and .png (needs vhs)
vhs demo/show-me.tape # re-record demo/show-me.gif
src/transform.ts is a pure function from reply text to segments, and holds all the logic. hooks/register.ts connects it to Claude Code's AssistantMessage render hook and the /mermaid command.
This is a port of the Mermaid rendering built into the pi coding agent, added in pi#7624 by @xl0. Diagrams are drawn by lovely-mermaid, vendored under its Apache-2.0 license in hooks/vendor/.
MIT
hooks/register.ts 81 lines1import type { Register } from 'claude-code'
2import { ROLE_STYLE, WARNING_COLOR } from '../src/theme.ts'
3import { type Display, type Mode, type Segment, transform } from '../src/transform.ts'
4
5const MODES: readonly Mode[] = ['off', 'final', 'streaming']
6const DISPLAYS: readonly Display[] = ['both', 'diagram']
7const BULLET = '⏺'
8// Measured: reply text sits behind a 2-column gutter ("⏺ "); one more column keeps the art off the edge.
9const GUTTER = 3
10const CACHE_LIMIT = 64
11
12let mode: Mode = 'streaming'
13let display: Display = 'both'
14const cache = new Map<string, Segment[] | null>()
15
16function cached(text: string, width: number | undefined): Segment[] | null {
17 const key = `${mode}\0${display}\0${width}\0${text}`
18 if (cache.has(key)) return cache.get(key)!
19 const segments = transform(text, { mode, width, display })
20 if (cache.size >= CACHE_LIMIT) cache.delete(cache.keys().next().value!)
21 cache.set(key, segments)
22 return segments
23}
24
25const isMode = (value: unknown): value is Mode => MODES.includes(value as Mode)
26const isDisplay = (value: unknown): value is Display => DISPLAYS.includes(value as Display)
27const status = () => ({ text: `mermaid: ${mode}, ${display}` })
28
29export const register: Register = on => {
30 on('session.start', async ($, e, next) => {
31 const result = await next(e)
32 const saved = await $.store.get('mode').catch(() => undefined)
33 if (isMode(saved)) mode = saved
34 const savedDisplay = await $.store.get('display').catch(() => undefined)
35 if (isDisplay(savedDisplay)) display = savedDisplay
36 await $.command
37 .register({ name: 'mermaid', description: 'Draw ```mermaid blocks as diagrams: off, final or streaming; both or diagram', argumentHint: '[off|final|streaming|both|diagram]', immediate: true })
38 .catch(err => $.ui.log(`mermaid-mod: /mermaid not registered: ${err}`))
39 return result
40 })
41
42 on('command.run', { command: 'mermaid' }, async ($, e) => {
43 const arg = e.args.trim().toLowerCase()
44 if (isMode(arg)) {
45 mode = arg
46 await $.store.set('mode', mode)
47 } else if (isDisplay(arg)) {
48 display = arg
49 await $.store.set('display', display)
50 } else if (arg) {
51 return { text: `mermaid: unknown setting "${arg}"; use off, final, streaming, both or diagram` }
52 }
53 if (arg) $.ui.invalidate('ui.render')
54 return status()
55 })
56
57 on('ui.render', { component: 'AssistantMessage' }, ($, e, next) => {
58 const width = e.viewport ? e.viewport.columns - GUTTER : undefined
59 const segments = cached(e.props.text, width)
60 if (!segments) return next(e)
61 const { Box, Text, Markdown } = $.ui.resolve(e)
62 const body = segments.map(segment => {
63 if (segment.kind === 'markdown') return Markdown({ text: segment.text })
64 if (segment.kind === 'warning') return Text({ color: WARNING_COLOR, children: segment.text })
65 return Box({
66 flexDirection: 'column',
67 children: segment.rows.map(row =>
68 Text({ children: row.length ? row.map(span => (ROLE_STYLE[span.role].color ? Text({ ...ROLE_STYLE[span.role], children: span.text }) : span.text)) : ' ' }),
69 ),
70 })
71 })
72 return Box({
73 flexDirection: 'row',
74 children: [
75 Text({ children: e.props.isFirstOfReply ? `${BULLET} ` : ' ' }),
76 Box({ flexDirection: 'column', flexGrow: 1, gap: 1, children: body }),
77 ],
78 })
79 })
80}
81src/theme.ts 14 lines1import type { ThemeKey } from 'claude-code'
2import type { Role } from '../hooks/vendor/lovely-mermaid.js'
3
4export const ROLE_STYLE: Record<Role, { color?: ThemeKey; bold?: true }> = {
5 border: { color: 'subtle' },
6 text: { color: 'text' },
7 edge: { color: 'suggestion' },
8 edgeLabel: { color: 'inactive' },
9 title: { color: 'suggestion', bold: true },
10 none: {},
11}
12
13export const WARNING_COLOR: ThemeKey = 'warning'
14src/transform.ts 85 lines1import { render, type Span } from '../hooks/vendor/lovely-mermaid.js'
2import { normalize } from './normalize.ts'
3
4export type Mode = 'off' | 'final' | 'streaming'
5export type Display = 'both' | 'diagram'
6export type Segment =
7 | { kind: 'markdown'; text: string }
8 | { kind: 'diagram'; rows: Span[][] }
9 | { kind: 'warning'; text: string }
10
11type Fence = { char: string; length: number; indent: number; isMermaid: boolean; start: number }
12
13const OPENING = /^( {0,3})(`{3,}|~{3,})(.*)$/
14const CLOSING = /^ {0,3}(`{3,}|~{3,})[ \t\r]*$/
15
16function openingOf(line: string, start: number): Fence | null {
17 const m = OPENING.exec(line)
18 if (!m) return null
19 const [, indent = '', run = '', info = ''] = m
20 const char = run.charAt(0)
21 if (char === '`' && info.includes('`')) return null
22 const lang = info.trim().split(/\s+/, 1)[0]?.toLowerCase()
23 return { char, length: run.length, indent: indent.length, isMermaid: lang === 'mermaid', start }
24}
25
26function closes(fence: Fence, line: string): boolean {
27 const run = CLOSING.exec(line)?.[1] ?? ''
28 return run.charAt(0) === fence.char && run.length >= fence.length
29}
30
31// shortcut: a fence indented 1-3 spaces inside a list item counts as top level; parse list context if that misfires.
32export function transform(markdown: string, ctx: { mode: Mode; width: number | undefined; display: Display }): Segment[] | null {
33 if (ctx.mode === 'off') return null
34 const lines = markdown.split('\n')
35 const segments: Segment[] = []
36 let prose: string[] = []
37 let drewSomething = false
38
39 const flush = () => {
40 const text = prose.join('\n')
41 if (text.trim()) segments.push({ kind: 'markdown', text })
42 prose = []
43 }
44
45 const settle = (fence: Fence, end: number, closed: boolean) => {
46 const raw = lines.slice(fence.start, closed ? end + 1 : end)
47 const art =
48 ctx.width === undefined || (!closed && ctx.mode === 'final')
49 ? null
50 : render(normalize(lines.slice(fence.start + 1, end).map(l => l.replace(new RegExp(`^ {0,${fence.indent}}`), '')).join('\n')))
51 if (!art || art.width > ctx.width!) {
52 prose.push(...raw)
53 return
54 }
55 if (closed && art.warnings.length > 0) {
56 prose.push(...raw)
57 flush()
58 const more = art.warnings.length > 1 ? ` (+${art.warnings.length - 1} more)` : ''
59 segments.push({ kind: 'warning', text: `Mermaid diagram not rendered: ${art.warnings[0]}${more}` })
60 } else {
61 flush()
62 segments.push({ kind: 'diagram', rows: art.styled })
63 if (ctx.display === 'both') prose.push(...raw)
64 }
65 drewSomething = true
66 }
67
68 let fence: Fence | null = null
69 for (const [i, line] of lines.entries()) {
70 if (!fence) {
71 fence = openingOf(line, i)
72 if (!fence?.isMermaid) prose.push(line)
73 continue
74 }
75 if (closes(fence, line)) {
76 if (fence.isMermaid) settle(fence, i, true)
77 else prose.push(line)
78 fence = null
79 } else if (!fence.isMermaid) prose.push(line)
80 }
81 if (fence?.isMermaid) settle(fence, lines.length, false)
82 flush()
83 return drewSomething ? segments : null
84}
85hooks/vendor/lovely-mermaid.js 5177 lines1// Generated by scripts/vendor.mjs from lovely-mermaid 0.3.3 (Apache-2.0, see LICENSE-lovely-mermaid). Do not edit.
2
3// node_modules/lovely-mermaid/dist/width-data.js
4var WIDTHS = [
5 [0, 172, 1],
6 [173, 173, 0],
7 [174, 767, 1],
8 [768, 879, 0],
9 [880, 1154, 1],
10 [1155, 1161, 0],
11 [1162, 1424, 1],
12 [1425, 1469, 0],
13 [1470, 1470, 1],
14 [1471, 1471, 0],
15 [1472, 1472, 1],
16 [1473, 1474, 0],
17 [1475, 1475, 1],
18 [1476, 1477, 0],
19 [1478, 1478, 1],
20 [1479, 1479, 0],
21 [1480, 1540, 1],
22 [1541, 1541, 0],
23 [1542, 1551, 1],
24 [1552, 1562, 0],
25 [1563, 1563, 1],
26 [1564, 1564, 0],
27 [1565, 1610, 1],
28 [1611, 1631, 0],
29 [1632, 1647, 1],
30 [1648, 1648, 0],
31 [1649, 1749, 1],
32 [1750, 1756, 0],
33 [1757, 1758, 1],
34 [1759, 1764, 0],
35 [1765, 1766, 1],
36 [1767, 1768, 0],
37 [1769, 1769, 1],
38 [1770, 1773, 0],
39 [1774, 1806, 1],
40 [1807, 1807, 0],
41 [1808, 1808, 1],
42 [1809, 1809, 0],
43 [1810, 1839, 1],
44 [1840, 1866, 0],
45 [1867, 1957, 1],
46 [1958, 1968, 0],
47 [1969, 2026, 1],
48 [2027, 2035, 0],
49 [2036, 2044, 1],
50 [2045, 2045, 0],
51 [2046, 2069, 1],
52 [2070, 2073, 0],
53 [2074, 2074, 1],
54 [2075, 2083, 0],
55 [2084, 2084, 1],
56 [2085, 2087, 0],
57 [2088, 2088, 1],
58 [2089, 2093, 0],
59 [2094, 2136, 1],
60 [2137, 2139, 0],
61 [2140, 2191, 1],
62 [2192, 2193, 0],
63 [2194, 2199, 1],
64 [2200, 2207, 0],
65 [2208, 2249, 1],
66 [2250, 2306, 0],
67 [2307, 2361, 1],
68 [2362, 2362, 0],
69 [2363, 2363, 1],
70 [2364, 2364, 0],
71 [2365, 2368, 1],
72 [2369, 2376, 0],
73 [2377, 2380, 1],
74 [2381, 2381, 0],
75 [2382, 2384, 1],
76 [2385, 2391, 0],
77 [2392, 2401, 1],
78 [2402, 2403, 0],
79 [2404, 2432, 1],
80 [2433, 2433, 0],
81 [2434, 2491, 1],
82 [2492, 2492, 0],
83 [2493, 2493, 1],
84 [2494, 2494, 0],
85 [2495, 2496, 1],
86 [2497, 2500, 0],
87 [2501, 2508, 1],
88 [2509, 2509, 0],
89 [2510, 2518, 1],
90 [2519, 2519, 0],
91 [2520, 2529, 1],
92 [2530, 2531, 0],
93 [2532, 2557, 1],
94 [2558, 2558, 0],
95 [2559, 2560, 1],
96 [2561, 2562, 0],
97 [2563, 2619, 1],
98 [2620, 2620, 0],
99 [2621, 2624, 1],
100 [2625, 2626, 0],
101 [2627, 2630, 1],
102 [2631, 2632, 0],
103 [2633, 2634, 1],
104 [2635, 2637, 0],
105 [2638, 2640, 1],
106 [2641, 2641, 0],
107 [2642, 2671, 1],
108 [2672, 2673, 0],
109 [2674, 2676, 1],
110 [2677, 2677, 0],
111 [2678, 2688, 1],
112 [2689, 2690, 0],
113 [2691, 2747, 1],
114 [2748, 2748, 0],
115 [2749, 2752, 1],
116 [2753, 2757, 0],
117 [2758, 2758, 1],
118 [2759, 2760, 0],
119 [2761, 2764, 1],
120 [2765, 2765, 0],
121 [2766, 2785, 1],
122 [2786, 2787, 0],
123 [2788, 2809, 1],
124 [2810, 2815, 0],
125 [2816, 2816, 1],
126 [2817, 2817, 0],
127 [2818, 2875, 1],
128 [2876, 2876, 0],
129 [2877, 2877, 1],
130 [2878, 2879, 0],
131 [2880, 2880, 1],
132 [2881, 2884, 0],
133 [2885, 2892, 1],
134 [2893, 2893, 0],
135 [2894, 2900, 1],
136 [2901, 2903, 0],
137 [2904, 2913, 1],
138 [2914, 2915, 0],
139 [2916, 2945, 1],
140 [2946, 2946, 0],
141 [2947, 3005, 1],
142 [3006, 3006, 0],
143 [3007, 3007, 1],
144 [3008, 3008, 0],
145 [3009, 3020, 1],
146 [3021, 3021, 0],
147 [3022, 3030, 1],
148 [3031, 3031, 0],
149 [3032, 3071, 1],
150 [3072, 3072, 0],
151 [3073, 3075, 1],
152 [3076, 3076, 0],
153 [3077, 3131, 1],
154 [3132, 3132, 0],
155 [3133, 3133, 1],
156 [3134, 3136, 0],
157 [3137, 3141, 1],
158 [3142, 3144, 0],
159 [3145, 3145, 1],
160 [3146, 3149, 0],
161 [3150, 3156, 1],
162 [3157, 3158, 0],
163 [3159, 3169, 1],
164 [3170, 3171, 0],
165 [3172, 3200, 1],
166 [3201, 3201, 0],
167 [3202, 3259, 1],
168 [3260, 3260, 0],
169 [3261, 3262, 1],
170 [3263, 3264, 0],
171 [3265, 3265, 1],
172 [3266, 3266, 0],
173 [3267, 3269, 1],
174 [3270, 3272, 0],
175 [3273, 3273, 1],
176 [3274, 3277, 0],
177 [3278, 3284, 1],
178 [3285, 3286, 0],
179 [3287, 3297, 1],
180 [3298, 3299, 0],
181 [3300, 3327, 1],
182 [3328, 3329, 0],
183 [3330, 3386, 1],
184 [3387, 3388, 0],
185 [3389, 3389, 1],
186 [3390, 3390, 0],
187 [3391, 3392, 1],
188 [3393, 3396, 0],
189 [3397, 3404, 1],
190 [3405, 3406, 0],
191 [3407, 3414, 1],
192 [3415, 3415, 0],
193 [3416, 3425, 1],
194 [3426, 3427, 0],
195 [3428, 3456, 1],
196 [3457, 3457, 0],
197 [3458, 3529, 1],
198 [3530, 3530, 0],
199 [3531, 3534, 1],
200 [3535, 3535, 0],
201 [3536, 3537, 1],
202 [3538, 3540, 0],
203 [3541, 3541, 1],
204 [3542, 3542, 0],
205 [3543, 3550, 1],
206 [3551, 3551, 0],
207 [3552, 3632, 1],
208 [3633, 3633, 0],
209 [3634, 3635, 1],
210 [3636, 3642, 0],
211 [3643, 3654, 1],
212 [3655, 3662, 0],
213 [3663, 3760, 1],
214 [3761, 3761, 0],
215 [3762, 3763, 1],
216 [3764, 3772, 0],
217 [3773, 3783, 1],
218 [3784, 3790, 0],
219 [3791, 3863, 1],
220 [3864, 3865, 0],
221 [3866, 3892, 1],
222 [3893, 3893, 0],
223 [3894, 3894, 1],
224 [3895, 3895, 0],
225 [3896, 3896, 1],
226 [3897, 3897, 0],
227 [3898, 3952, 1],
228 [3953, 3966, 0],
229 [3967, 3967, 1],
230 [3968, 3972, 0],
231 [3973, 3973, 1],
232 [3974, 3975, 0],
233 [3976, 3980, 1],
234 [3981, 3991, 0],
235 [3992, 3992, 1],
236 [3993, 4028, 0],
237 [4029, 4037, 1],
238 [4038, 4038, 0],
239 [4039, 4140, 1],
240 [4141, 4144, 0],
241 [4145, 4145, 1],
242 [4146, 4151, 0],
243 [4152, 4152, 1],
244 [4153, 4154, 0],
245 [4155, 4156, 1],
246 [4157, 4158, 0],
247 [4159, 4183, 1],
248 [4184, 4185, 0],
249 [4186, 4189, 1],
250 [4190, 4192, 0],
251 [4193, 4208, 1],
252 [4209, 4212, 0],
253 [4213, 4225, 1],
254 [4226, 4226, 0],
255 [4227, 4228, 1],
256 [4229, 4230, 0],
257 [4231, 4236, 1],
258 [4237, 4237, 0],
259 [4238, 4252, 1],
260 [4253, 4253, 0],
261 [4254, 4351, 1],
262 [4352, 4447, 2],
263 [4448, 4607, 0],
264 [4608, 4956, 1],
265 [4957, 4959, 0],
266 [4960, 5905, 1],
267 [5906, 5908, 0],
268 [5909, 5937, 1],
269 [5938, 5939, 0],
270 [5940, 5969, 1],
271 [5970, 5971, 0],
272 [5972, 6001, 1],
273 [6002, 6003, 0],
274 [6004, 6051, 1],
275 [6052, 6052, 2],
276 [6053, 6067, 1],
277 [6068, 6069, 0],
278 [6070, 6070, 1],
279 [6071, 6077, 0],
280 [6078, 6085, 1],
281 [6086, 6086, 0],
282 [6087, 6088, 1],
283 [6089, 6099, 0],
284 [6100, 6103, 1],
285 [6104, 6104, 3],
286 [6105, 6108, 1],
287 [6109, 6109, 0],
288 [6110, 6154, 1],
289 [6155, 6159, 0],
290 [6160, 6276, 1],
291 [6277, 6278, 0],
292 [6279, 6312, 1],
293 [6313, 6313, 0],
294 [6314, 6431, 1],
295 [6432, 6434, 0],
296 [6435, 6438, 1],
297 [6439, 6440, 0],
298 [6441, 6449, 1],
299 [6450, 6450, 0],
300 [6451, 6456, 1],
301 [6457, 6459, 0],
302 [6460, 6678, 1],
303 [6679, 6680, 0],
304 [6681, 6682, 1],
305 [6683, 6683, 0],
306 [6684, 6741, 1],
307 [6742, 6742, 0],
308 [6743, 6743, 1],
309 [6744, 6750, 0],
310 [6751, 6751, 1],
311 [6752, 6752, 0],
312 [6753, 6753, 1],
313 [6754, 6754, 0],
314 [6755, 6756, 1],
315 [6757, 6764, 0],
316 [6765, 6770, 1],
317 [6771, 6780, 0],
318 [6781, 6782, 1],
319 [6783, 6783, 0],
320 [6784, 6831, 1],
321 [6832, 6862, 0],
322 [6863, 6911, 1],
323 [6912, 6915, 0],
324 [6916, 6963, 1],
325 [6964, 6973, 0],
326 [6974, 6977, 1],
327 [6978, 6979, 0],
328 [6980, 7018, 1],
329 [7019, 7027, 0],
330 [7028, 7039, 1],
331 [7040, 7041, 0],
332 [7042, 7073, 1],
333 [7074, 7077, 0],
334 [7078, 7079, 1],
335 [7080, 7081, 0],
336 [7082, 7082, 1],
337 [7083, 7085, 0],
338 [7086, 7141, 1],
339 [7142, 7142, 0],
340 [7143, 7143, 1],
341 [7144, 7145, 0],
342 [7146, 7148, 1],
343 [7149, 7149, 0],
344 [7150, 7150, 1],
345 [7151, 7153, 0],
346 [7154, 7211, 1],
347 [7212, 7219, 0],
348 [7220, 7221, 1],
349 [7222, 7223, 0],
350 [7224, 7375, 1],
351 [7376, 7378, 0],
352 [7379, 7379, 1],
353 [7380, 7392, 0],
354 [7393, 7393, 1],
355 [7394, 7400, 0],
356 [7401, 7404, 1],
357 [7405, 7405, 0],
358 [7406, 7411, 1],
359 [7412, 7412, 0],
360 [7413, 7415, 1],
361 [7416, 7417, 0],
362 [7418, 7615, 1],
363 [7616, 7679, 0],
364 [7680, 8202, 1],
365 [8203, 8207, 0],
366 [8208, 8233, 1],
367 [8234, 8238, 0],
368 [8239, 8287, 1],
369 [8288, 8303, 0],
370 [8304, 8399, 1],
371 [8400, 8432, 0],
372 [8433, 8985, 1],
373 [8986, 8987, 2],
374 [8988, 9e3, 1],
375 [9001, 9002, 2],
376 [9003, 9192, 1],
377 [9193, 9196, 2],
378 [9197, 9199, 1],
379 [9200, 9200, 2],
380 [9201, 9202, 1],
381 [9203, 9203, 2],
382 [9204, 9724, 1],
383 [9725, 9726, 2],
384 [9727, 9747, 1],
385 [9748, 9749, 2],
386 [9750, 9799, 1],
387 [9800, 9811, 2],
388 [9812, 9854, 1],
389 [9855, 9855, 2],
390 [9856, 9874, 1],
391 [9875, 9875, 2],
392 [9876, 9888, 1],
393 [9889, 9889, 2],
394 [9890, 9897, 1],
395 [9898, 9899, 2],
396 [9900, 9916, 1],
397 [9917, 9918, 2],
398 [9919, 9923, 1],
399 [9924, 9925, 2],
400 [9926, 9933, 1],
401 [9934, 9934, 2],
402 [9935, 9939, 1],
403 [9940, 9940, 2],
404 [9941, 9961, 1],
405 [9962, 9962, 2],
406 [9963, 9969, 1],
407 [9970, 9971, 2],
408 [9972, 9972, 1],
409 [9973, 9973, 2],
410 [9974, 9977, 1],
411 [9978, 9978, 2],
412 [9979, 9980, 1],
413 [9981, 9981, 2],
414 [9982, 9988, 1],
415 [9989, 9989, 2],
416 [9990, 9993, 1],
417 [9994, 9995, 2],
418 [9996, 10023, 1],
419 [10024, 10024, 2],
420 [10025, 10059, 1],
421 [10060, 10060, 2],
422 [10061, 10061, 1],
423 [10062, 10062, 2],
424 [10063, 10066, 1],
425 [10067, 10069, 2],
426 [10070, 10070, 1],
427 [10071, 10071, 2],
428 [10072, 10132, 1],
429 [10133, 10135, 2],
430 [10136, 10159, 1],
431 [10160, 10160, 2],
432 [10161, 10174, 1],
433 [10175, 10175, 2],
434 [10176, 11034, 1],
435 [11035, 11036, 2],
436 [11037, 11087, 1],
437 [11088, 11088, 2],
438 [11089, 11092, 1],
439 [11093, 11093, 2],
440 [11094, 11502, 1],
441 [11503, 11505, 0],
442 [11506, 11743, 1],
443 [11744, 11775, 0],
444 [11776, 11903, 1],
445 [11904, 11929, 2],
446 [11930, 11930, 1],
447 [11931, 12019, 2],
448 [12020, 12031, 1],
449 [12032, 12245, 2],
450 [12246, 12271, 1],
451 [12272, 12329, 2],
452 [12330, 12335, 0],
453 [12336, 12350, 2],
454 [12351, 12352, 1],
455 [12353, 12438, 2],
456 [12439, 12440, 1],
457 [12441, 12442, 0],
458 [12443, 12543, 2],
459 [12544, 12548, 1],
460 [12549, 12591, 2],
461 [12592, 12592, 1],
462 [12593, 12643, 2],
463 [12644, 12644, 0],
464 [12645, 12686, 2],
465 [12687, 12687, 1],
466 [12688, 12771, 2],
467 [12772, 12782, 1],
468 [12783, 12830, 2],
469 [12831, 12831, 1],
470 [12832, 12871, 2],
471 [12872, 12879, 1],
472 [12880, 19903, 2],
473 [19904, 19967, 1],
474 [19968, 42124, 2],
475 [42125, 42127, 1],
476 [42128, 42182, 2],
477 [42183, 42606, 1],
478 [42607, 42610, 0],
479 [42611, 42611, 1],
480 [42612, 42621, 0],
481 [42622, 42653, 1],
482 [42654, 42655, 0],
483 [42656, 42735, 1],
484 [42736, 42737, 0],
485 [42738, 43009, 1],
486 [43010, 43010, 0],
487 [43011, 43013, 1],
488 [43014, 43014, 0],
489 [43015, 43018, 1],
490 [43019, 43019, 0],
491 [43020, 43044, 1],
492 [43045, 43046, 0],
493 [43047, 43051, 1],
494 [43052, 43052, 0],
495 [43053, 43203, 1],
496 [43204, 43205, 0],
497 [43206, 43231, 1],
498 [43232, 43249, 0],
499 [43250, 43257, 1],
500 [43258, 43258, 0],
501 [43259, 43262, 1],
502 [43263, 43263, 0],
503 [43264, 43301, 1],
504 [43302, 43309, 0],
505 [43310, 43334, 1],
506 [43335, 43345, 0],
507 [43346, 43359, 1],
508 [43360, 43388, 2],
509 [43389, 43391, 1],
510 [43392, 43394, 0],
511 [43395, 43442, 1],
512 [43443, 43443, 0],
513 [43444, 43445, 1],
514 [43446, 43449, 0],
515 [43450, 43451, 1],
516 [43452, 43453, 0],
517 [43454, 43492, 1],
518 [43493, 43493, 0],
519 [43494, 43560, 1],
520 [43561, 43566, 0],
521 [43567, 43568, 1],
522 [43569, 43570, 0],
523 [43571, 43572, 1],
524 [43573, 43574, 0],
525 [43575, 43586, 1],
526 [43587, 43587, 0],
527 [43588, 43595, 1],
528 [43596, 43596, 0],
529 [43597, 43643, 1],
530 [43644, 43644, 0],
531 [43645, 43695, 1],
532 [43696, 43696, 0],
533 [43697, 43697, 1],
534 [43698, 43700, 0],
535 [43701, 43702, 1],
536 [43703, 43704, 0],
537 [43705, 43709, 1],
538 [43710, 43711, 0],
539 [43712, 43712, 1],
540 [43713, 43713, 0],
541 [43714, 43755, 1],
542 [43756, 43757, 0],
543 [43758, 43765, 1],
544 [43766, 43766, 0],
545 [43767, 44004, 1],
546 [44005, 44005, 0],
547 [44006, 44007, 1],
548 [44008, 44008, 0],
549 [44009, 44012, 1],
550 [44013, 44013, 0],
551 [44014, 44031, 1],
552 [44032, 55203, 2],
553 [55204, 55215, 1],
554 [55216, 55238, 0],
555 [55239, 55242, 1],
556 [55243, 55291, 0],
557 [55292, 63743, 1],
558 [63744, 64255, 2],
559 [64256, 64285, 1],
560 [64286, 64286, 0],
561 [64287, 65023, 1],
562 [65024, 65039, 0],
563 [65040, 65049, 2],
564 [65050, 65055, 1],
565 [65056, 65071, 0],
566 [65072, 65106, 2],
567 [65107, 65107, 1],
568 [65108, 65126, 2],
569 [65127, 65127, 1],
570 [65128, 65131, 2],
571 [65132, 65278, 1],
572 [65279, 65279, 0],
573 [65280, 65280, 1],
574 [65281, 65376, 2],
575 [65377, 65437, 1],
576 [65438, 65440, 0],
577 [65441, 65503, 1],
578 [65504, 65510, 2],
579 [65511, 65519, 1],
580 [65520, 65528, 0],
581 [65529, 66044, 1],
582 [66045, 66045, 0],
583 [66046, 66271, 1],
584 [66272, 66272, 0],
585 [66273, 66421, 1],
586 [66422, 66426, 0],
587 [66427, 68096, 1],
588 [68097, 68099, 0],
589 [68100, 68100, 1],
590 [68101, 68102, 0],
591 [68103, 68107, 1],
592 [68108, 68111, 0],
593 [68112, 68151, 1],
594 [68152, 68154, 0],
595 [68155, 68158, 1],
596 [68159, 68159, 0],
597 [68160, 68324, 1],
598 [68325, 68326, 0],
599 [68327, 68899, 1],
600 [68900, 68903, 0],
601 [68904, 69290, 1],
602 [69291, 69292, 0],
603 [69293, 69372, 1],
604 [69373, 69375, 0],
605 [69376, 69445, 1],
606 [69446, 69456, 0],
607 [69457, 69505, 1],
608 [69506, 69509, 0],
609 [69510, 69632, 1],
610 [69633, 69633, 0],
611 [69634, 69687, 1],
612 [69688, 69702, 0],
613 [69703, 69743, 1],
614 [69744, 69744, 0],
615 [69745, 69746, 1],
616 [69747, 69748, 0],
617 [69749, 69758, 1],
618 [69759, 69761, 0],
619 [69762, 69810, 1],
620 [69811, 69814, 0],
621 [69815, 69816, 1],
622 [69817, 69818, 0],
623 [69819, 69825, 1],
624 [69826, 69826, 0],
625 [69827, 69887, 1],
626 [69888, 69890, 0],
627 [69891, 69926, 1],
628 [69927, 69931, 0],
629 [69932, 69932, 1],
630 [69933, 69940, 0],
631 [69941, 70002, 1],
632 [70003, 70003, 0],
633 [70004, 70015, 1],
634 [70016, 70017, 0],
635 [70018, 70069, 1],
636 [70070, 70078, 0],
637 [70079, 70081, 1],
638 [70082, 70083, 0],
639 [70084, 70088, 1],
640 [70089, 70092, 0],
641 [70093, 70094, 1],
642 [70095, 70095, 0],
643 [70096, 70190, 1],
644 [70191, 70193, 0],
645 [70194, 70195, 1],
646 [70196, 70196, 0],
647 [70197, 70197, 1],
648 [70198, 70199, 0],
649 [70200, 70205, 1],
650 [70206, 70206, 0],
651 [70207, 70208, 1],
652 [70209, 70209, 0],
653 [70210, 70366, 1],
654 [70367, 70367, 0],
655 [70368, 70370, 1],
656 [70371, 70378, 0],
657 [70379, 70399, 1],
658 [70400, 70401, 0],
659 [70402, 70458, 1],
660 [70459, 70460, 0],
661 [70461, 70461, 1],
662 [70462, 70462, 0],
663 [70463, 70463, 1],
664 [70464, 70464, 0],
665 [70465, 70486, 1],
666 [70487, 70487, 0],
667 [70488, 70501, 1],
668 [70502, 70508, 0],
669 [70509, 70511, 1],
670 [70512, 70516, 0],
671 [70517, 70711, 1],
672 [70712, 70719, 0],
673 [70720, 70721, 1],
674 [70722, 70724, 0],
675 [70725, 70725, 1],
676 [70726, 70726, 0],
677 [70727, 70749, 1],
678 [70750, 70750, 0],
679 [70751, 70831, 1],
680 [70832, 70832, 0],
681 [70833, 70834, 1],
682 [70835, 70840, 0],
683 [70841, 70841, 1],
684 [70842, 70842, 0],
685 [70843, 70844, 1],
686 [70845, 70845, 0],
687 [70846, 70846, 1],
688 [70847, 70848, 0],
689 [70849, 70849, 1],
690 [70850, 70851, 0],
691 [70852, 71086, 1],
692 [71087, 71087, 0],
693 [71088, 71089, 1],
694 [71090, 71093, 0],
695 [71094, 71099, 1],
696 [71100, 71101, 0],
697 [71102, 71102, 1],
698 [71103, 71104, 0],
699 [71105, 71131, 1],
700 [71132, 71133, 0],
701 [71134, 71218, 1],
702 [71219, 71226, 0],
703 [71227, 71228, 1],
704 [71229, 71229, 0],
705 [71230, 71230, 1],
706 [71231, 71232, 0],
707 [71233, 71338, 1],
708 [71339, 71339, 0],
709 [71340, 71340, 1],
710 [71341, 71341, 0],
711 [71342, 71343, 1],
712 [71344, 71349, 0],
713 [71350, 71350, 1],
714 [71351, 71351, 0],
715 [71352, 71452, 1],
716 [71453, 71455, 0],
717 [71456, 71457, 1],
718 [71458, 71461, 0],
719 [71462, 71462, 1],
720 [71463, 71467, 0],
721 [71468, 71726, 1],
722 [71727, 71735, 0],
723 [71736, 71736, 1],
724 [71737, 71738, 0],
725 [71739, 71983, 1],
726 [71984, 71984, 0],
727 [71985, 71994, 1],
728 [71995, 71996, 0],
729 [71997, 71997, 1],
730 [71998, 71999, 0],
731 [72e3, 72e3, 1],
732 [72001, 72001, 0],
733 [72002, 72002, 1],
734 [72003, 72003, 0],
735 [72004, 72147, 1],
736 [72148, 72151, 0],
737 [72152, 72153, 1],
738 [72154, 72155, 0],
739 [72156, 72159, 1],
740 [72160, 72160, 0],
741 [72161, 72192, 1],
742 [72193, 72202, 0],
743 [72203, 72242, 1],
744 [72243, 72248, 0],
745 [72249, 72249, 1],
746 [72250, 72254, 0],
747 [72255, 72262, 1],
748 [72263, 72263, 0],
749 [72264, 72272, 1],
750 [72273, 72278, 0],
751 [72279, 72280, 1],
752 [72281, 72283, 0],
753 [72284, 72323, 1],
754 [72324, 72342, 0],
755 [72343, 72343, 1],
756 [72344, 72345, 0],
757 [72346, 72751, 1],
758 [72752, 72758, 0],
759 [72759, 72759, 1],
760 [72760, 72765, 0],
761 [72766, 72766, 1],
762 [72767, 72767, 0],
763 [72768, 72849, 1],
764 [72850, 72871, 0],
765 [72872, 72873, 1],
766 [72874, 72880, 0],
767 [72881, 72881, 1],
768 [72882, 72883, 0],
769 [72884, 72884, 1],
770 [72885, 72886, 0],
771 [72887, 73008, 1],
772 [73009, 73014, 0],
773 [73015, 73017, 1],
774 [73018, 73018, 0],
775 [73019, 73019, 1],
776 [73020, 73021, 0],
777 [73022, 73022, 1],
778 [73023, 73031, 0],
779 [73032, 73103, 1],
780 [73104, 73105, 0],
781 [73106, 73108, 1],
782 [73109, 73109, 0],
783 [73110, 73110, 1],
784 [73111, 73111, 0],
785 [73112, 73458, 1],
786 [73459, 73460, 0],
787 [73461, 73471, 1],
788 [73472, 73474, 0],
789 [73475, 73525, 1],
790 [73526, 73530, 0],
791 [73531, 73535, 1],
792 [73536, 73536, 0],
793 [73537, 73537, 1],
794 [73538, 73538, 0],
795 [73539, 78911, 1],
796 [78912, 78912, 0],
797 [78913, 78918, 1],
798 [78919, 78933, 0],
799 [78934, 92911, 1],
800 [92912, 92916, 0],
801 [92917, 92975, 1],
802 [92976, 92982, 0],
803 [92983, 94030, 1],
804 [94031, 94031, 0],
805 [94032, 94094, 1],
806 [94095, 94098, 0],
807 [94099, 94175, 1],
808 [94176, 94179, 2],
809 [94180, 94180, 0],
810 [94181, 94191, 1],
811 [94192, 94193, 2],
812 [94194, 94207, 1],
813 [94208, 100343, 2],
814 [100344, 100351, 1],
815 [100352, 101589, 2],
816 [101590, 101631, 1],
817 [101632, 101640, 2],
818 [101641, 110575, 1],
819 [110576, 110579, 2],
820 [110580, 110580, 1],
821 [110581, 110587, 2],
822 [110588, 110588, 1],
823 [110589, 110590, 2],
824 [110591, 110591, 1],
825 [110592, 110882, 2],
826 [110883, 110897, 1],
827 [110898, 110898, 2],
828 [110899, 110927, 1],
829 [110928, 110930, 2],
830 [110931, 110932, 1],
831 [110933, 110933, 2],
832 [110934, 110947, 1],
833 [110948, 110951, 2],
834 [110952, 110959, 1],
835 [110960, 111355, 2],
836 [111356, 113820, 1],
837 [113821, 113822, 0],
838 [113823, 113823, 1],
839 [113824, 113827, 0],
840 [113828, 118527, 1],
841 [118528, 118573, 0],
842 [118574, 118575, 1],
843 [118576, 118598, 0],
844 [118599, 119140, 1],
845 [119141, 119141, 0],
846 [119142, 119142, 1],
847 [119143, 119145, 0],
848 [119146, 119149, 1],
849 [119150, 119170, 0],
850 [119171, 119172, 1],
851 [119173, 119179, 0],
852 [119180, 119209, 1],
853 [119210, 119213, 0],
854 [119214, 119361, 1],
855 [119362, 119364, 0],
856 [119365, 121343, 1],
857 [121344, 121398, 0],
858 [121399, 121402, 1],
859 [121403, 121452, 0],
860 [121453, 121460, 1],
861 [121461, 121461, 0],
862 [121462, 121475, 1],
863 [121476, 121476, 0],
864 [121477, 121498, 1],
865 [121499, 121503, 0],
866 [121504, 121504, 1],
867 [121505, 121519, 0],
868 [121520, 122879, 1],
869 [122880, 122886, 0],
870 [122887, 122887, 1],
871 [122888, 122904, 0],
872 [122905, 122906, 1],
873 [122907, 122913, 0],
874 [122914, 122914, 1],
875 [122915, 122916, 0],
876 [122917, 122917, 1],
877 [122918, 122922, 0],
878 [122923, 123022, 1],
879 [123023, 123023, 0],
880 [123024, 123183, 1],
881 [123184, 123190, 0],
882 [123191, 123565, 1],
883 [123566, 123566, 0],
884 [123567, 123627, 1],
885 [123628, 123631, 0],
886 [123632, 124139, 1],
887 [124140, 124143, 0],
888 [124144, 125135, 1],
889 [125136, 125142, 0],
890 [125143, 125251, 1],
891 [125252, 125258, 0],
892 [125259, 126979, 1],
893 [126980, 126980, 2],
894 [126981, 127182, 1],
895 [127183, 127183, 2],
896 [127184, 127373, 1],
897 [127374, 127374, 2],
898 [127375, 127376, 1],
899 [127377, 127386, 2],
900 [127387, 127487, 1],
901 [127488, 127490, 2],
902 [127491, 127503, 1],
903 [127504, 127547, 2],
904 [127548, 127551, 1],
905 [127552, 127560, 2],
906 [127561, 127567, 1],
907 [127568, 127569, 2],
908 [127570, 127583, 1],
909 [127584, 127589, 2],
910 [127590, 127743, 1],
911 [127744, 127776, 2],
912 [127777, 127788, 1],
913 [127789, 127797, 2],
914 [127798, 127798, 1],
915 [127799, 127868, 2],
916 [127869, 127869, 1],
917 [127870, 127891, 2],
918 [127892, 127903, 1],
919 [127904, 127946, 2],
920 [127947, 127950, 1],
921 [127951, 127955, 2],
922 [127956, 127967, 1],
923 [127968, 127984, 2],
924 [127985, 127987, 1],
925 [127988, 127988, 2],
926 [127989, 127991, 1],
927 [127992, 128062, 2],
928 [128063, 128063, 1],
929 [128064, 128064, 2],
930 [128065, 128065, 1],
931 [128066, 128252, 2],
932 [128253, 128254, 1],
933 [128255, 128317, 2],
934 [128318, 128330, 1],
935 [128331, 128334, 2],
936 [128335, 128335, 1],
937 [128336, 128359, 2],
938 [128360, 128377, 1],
939 [128378, 128378, 2],
940 [128379, 128404, 1],
941 [128405, 128406, 2],
942 [128407, 128419, 1],
943 [128420, 128420, 2],
944 [128421, 128506, 1],
945 [128507, 128591, 2],
946 [128592, 128639, 1],
947 [128640, 128709, 2],
948 [128710, 128715, 1],
949 [128716, 128716, 2],
950 [128717, 128719, 1],
951 [128720, 128722, 2],
952 [128723, 128724, 1],
953 [128725, 128727, 2],
954 [128728, 128731, 1],
955 [128732, 128735, 2],
956 [128736, 128746, 1],
957 [128747, 128748, 2],
958 [128749, 128755, 1],
959 [128756, 128764, 2],
960 [128765, 128991, 1],
961 [128992, 129003, 2],
962 [129004, 129007, 1],
963 [129008, 129008, 2],
964 [129009, 129291, 1],
965 [129292, 129338, 2],
966 [129339, 129339, 1],
967 [129340, 129349, 2],
968 [129350, 129350, 1],
969 [129351, 129535, 2],
970 [129536, 129647, 1],
971 [129648, 129660, 2],
972 [129661, 129663, 1],
973 [129664, 129672, 2],
974 [129673, 129679, 1],
975 [129680, 129725, 2],
976 [129726, 129726, 1],
977 [129727, 129733, 2],
978 [129734, 129741, 1],
979 [129742, 129755, 2],
980 [129756, 129759, 1],
981 [129760, 129768, 2],
982 [129769, 129775, 1],
983 [129776, 129784, 2],
984 [129785, 131071, 1],
985 [131072, 196605, 2],
986 [196606, 196607, 1],
987 [196608, 262141, 2],
988 [262142, 917503, 1],
989 [917504, 921599, 0],
990 [921600, 1114111, 1]
991];
992
993// node_modules/lovely-mermaid/dist/width.js
994var segmenter = new Intl.Segmenter("en", { granularity: "grapheme" });
995var VS16 = 65039;
996var isRegionalIndicator = (cp) => cp >= 127462 && cp <= 127487;
997function codePointWidth(cp) {
998 let lo = 0;
999 let hi = WIDTHS.length - 1;
1000 while (lo <= hi) {
1001 const mid = lo + hi >> 1;
1002 const run = WIDTHS[mid];
1003 if (cp < run[0])
1004 hi = mid - 1;
1005 else if (cp > run[1])
1006 lo = mid + 1;
1007 else
1008 return run[2];
1009 }
1010 return 1;
1011}
1012function clusterWidth(cluster) {
1013 let w = 0;
1014 let vs16 = false;
1015 let regional = 0;
1016 for (const ch of cluster) {
1017 const cp = ch.codePointAt(0);
1018 if (cp === VS16)
1019 vs16 = true;
1020 if (isRegionalIndicator(cp))
1021 regional++;
1022 const cw = codePointWidth(cp);
1023 if (cw > w)
1024 w = cw;
1025 }
1026 return vs16 || regional >= 2 ? 2 : w;
1027}
1028function* measured(s) {
1029 for (const { segment } of segmenter.segment(s))
1030 yield [segment, clusterWidth(segment)];
1031}
1032function stringWidth(s) {
1033 let w = 0;
1034 for (const { segment } of segmenter.segment(s))
1035 w += clusterWidth(segment);
1036 return w;
1037}
1038
1039// node_modules/lovely-mermaid/dist/labels.js
1040var WRAP_WIDTH = 24;
1041var MAX_LINES = 4;
1042var MAX_LABEL = 28;
1043var LABEL_BREAK_CHARS = ["_", "-", ".", "/"];
1044var asciiLower = (s) => s.replace(/[A-Z]/g, (c) => c.toLowerCase());
1045var asciiUpper = (s) => s.replace(/[a-z]/g, (c) => c.toUpperCase());
1046var CONTROLS = /[\0-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g;
1047var stripControls = (src) => src.replace(CONTROLS, "");
1048function srcLines(src) {
1049 const out = src.split("\n").map((l) => l.endsWith("\r") ? l.slice(0, -1) : l);
1050 if (out.length > 0 && out[out.length - 1] === "")
1051 out.pop();
1052 return out;
1053}
1054var ALNUM = /[\p{Alphabetic}\p{N}]/u;
1055var isAlphanumeric = (c) => ALNUM.test(c);
1056var isIdChar = (c) => isAlphanumeric(c) || c === "_";
1057var ENTITY_LOOKAHEAD = 10;
1058var NAMED_ENTITIES = {
1059 lt: "<",
1060 gt: ">",
1061 amp: "&",
1062 quot: '"',
1063 apos: "'"
1064};
1065function decodeEntityBody(body) {
1066 const named = NAMED_ENTITIES[body];
1067 if (named !== void 0)
1068 return named;
1069 if (!body.startsWith("#"))
1070 return null;
1071 const num = body.slice(1);
1072 const hex = /^[xX]/.test(num);
1073 const digits = hex ? num.slice(1) : num;
1074 if (!(hex ? /^[0-9a-fA-F]+$/ : /^[0-9]+$/).test(digits))
1075 return null;
1076 const code = Number.parseInt(digits, hex ? 16 : 10);
1077 if (code > 1114111 || code >= 55296 && code <= 57343)
1078 return null;
1079 if (code < 32 || code >= 127 && code <= 159)
1080 return null;
1081 return String.fromCodePoint(code);
1082}
1083function decodeHtmlEntities(s) {
1084 if (!s.includes("&"))
1085 return s;
1086 const chars = [...s];
1087 let out = "";
1088 let i = 0;
1089 while (i < chars.length) {
1090 if (chars[i] !== "&") {
1091 out += chars[i];
1092 i++;
1093 continue;
1094 }
1095 const hi = Math.min(i + 1 + ENTITY_LOOKAHEAD, chars.length);
1096 let semi = -1;
1097 for (let j = i + 1; j < hi; j++) {
1098 if (chars[j] === ";") {
1099 semi = j;
1100 break;
1101 }
1102 }
1103 const decoded = semi === -1 ? null : decodeEntityBody(chars.slice(i + 1, semi).join(""));
1104 if (decoded === null) {
1105 out += "&";
1106 i++;
1107 } else {
1108 out += decoded;
1109 i = semi + 1;
1110 }
1111 }
1112 return out;
1113}
1114function stripMarkdown(s) {
1115 const noCode = [...s].filter((c) => c !== "`").join("");
1116 const noStrong = noCode.replaceAll("**", "").replaceAll("__", "");
1117 const chars = [...noStrong];
1118 let out = "";
1119 for (let i = 0; i < chars.length; i++) {
1120 const c = chars[i];
1121 const inWord = i > 0 && isAlphanumeric(chars[i - 1]) && chars[i + 1] !== void 0 && isAlphanumeric(chars[i + 1]);
1122 if ((c === "*" || c === "_") && !inWord)
1123 continue;
1124 out += c;
1125 }
1126 return out.trim();
1127}
1128var HTML_FORMAT_TAGS = /* @__PURE__ */ new Set([
1129 "b",
1130 "strong",
1131 "i",
1132 "em",
1133 "u",
1134 "s",
1135 "strike",
1136 "del",
1137 "ins",
1138 "mark",
1139 "small",
1140 "big",
1141 "sub",
1142 "sup",
1143 "code",
1144 "kbd",
1145 "samp",
1146 "var",
1147 "tt",
1148 "span",
1149 "font",
1150 "q",
1151 "abbr",
1152 "cite",
1153 "pre"
1154]);
1155function htmlTagAt(chars, start) {
1156 let i = start + 1;
1157 if (chars[i] === "/")
1158 i++;
1159 const nameStart = i;
1160 while (i < chars.length && /^[0-9A-Za-z]$/.test(chars[i]))
1161 i++;
1162 if (i === nameStart)
1163 return null;
1164 const name = chars.slice(nameStart, i).join("");
1165 while (i < chars.length && chars[i] !== ">") {
1166 if (chars[i] === "<")
1167 return null;
1168 i++;
1169 }
1170 return chars[i] === ">" ? { name, end: i + 1 } : null;
1171}
1172function stripHtmlTags(s) {
1173 const chars = [...s];
1174 let out = "";
1175 let i = 0;
1176 while (i < chars.length) {
1177 if (chars[i] === "<") {
1178 const tag = htmlTagAt(chars, i);
1179 if (tag) {
1180 const lower = tag.name.toLowerCase();
1181 if (lower === "br") {
1182 out += " ";
1183 i = tag.end;
1184 continue;
1185 }
1186 if (HTML_FORMAT_TAGS.has(lower)) {
1187 i = tag.end;
1188 continue;
1189 }
1190 }
1191 }
1192 out += chars[i];
1193 i++;
1194 }
1195 return out;
1196}
1197function unwrap(s, open, close) {
1198 return s.length >= open.length + close.length && s.startsWith(open) && s.endsWith(close) ? s.slice(open.length, s.length - close.length) : null;
1199}
1200function cleanLabel(raw) {src/normalize.ts 11 lines1export function normalize(source: string): string {
2 return (
3 source
4 // `A --> |yes| B` loses B ("link has no target") though Mermaid accepts it; drop when lovely-mermaid fixes it upstream.
5 .replace(/([-=.]{2,}[>xo]?)[ \t]+(?=\|)/g, '$1')
6 // Mermaid's entity codes (`#quot;`, `#35;`) are drawn literally; drop when lovely-mermaid fixes it upstream.
7 .replace(/#quot;/g, '"')
8 .replace(/#(\d+);/g, (match, code: string) => (Number(code) <= 0x10ffff ? String.fromCodePoint(Number(code)) : match))
9 )
10}
11