@brett_lamy/docstream 1.14.1 → 1.15.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.
package/README.md CHANGED
@@ -13,7 +13,7 @@ GitBook-aware markdown rendering for React applications and AI streaming surface
13
13
  Markdown vs HTML images, blank lines between blocks, list markers, fences, table layout and tag lines as written).
14
14
  Layout-only fields (`gap`, `raw`, `opening`, …) are recorded only where the source differs from the default
15
15
  output, and are ignored once they no longer fit an edited node.
16
- - Syntax-highlighted code blocks through `gpu-lexer`; Mermaid diagrams and KaTeX math load on first use.
16
+ - Syntax-highlighted code blocks through `gpu-lexer`; Mermaid diagrams (drawn by [Pele](https://pele.run)) and KaTeX math load on first use.
17
17
  - GitBook block support for hints, tabs, expandables, steppers, embeds, content refs, columns, figures, tables, math, dividers, updates, and OpenAPI operations.
18
18
  - Embed blocks render YouTube/direct video URLs through the built-in `VideoEmbed` and public Loop QA task, journey, exploration, or test-run URLs through `ReplayPreview`.
19
19
  - CSS exported as a stable package entrypoint so host apps can theme with CSS variables or shadcn-style design tokens.
@@ -31,8 +31,20 @@ pnpm add @brett_lamy/docstream
31
31
  React and React DOM are peer dependencies and must be provided by your app.
32
32
  Nothing in docstream's dependency tree runs an install script, so
33
33
  `pnpm add` succeeds with no build-script prompts (no `ERR_PNPM_IGNORED_BUILDS`).
34
- Heavy renderers are loaded only when a page needs them: Mermaid for
35
- ` ```mermaid ` fences, KaTeX for math blocks, rrweb for replay event lists.
34
+ Heavy renderers are loaded only when a page needs them: Pele for
35
+ ` ```mermaid ` fences (only the diagram types the page uses), KaTeX for math
36
+ blocks, rrweb for replay event lists.
37
+
38
+ ` ```mermaid ` fences are drawn by [Pele](https://pele.run), which turns Mermaid
39
+ text into SVG synchronously, without Mermaid or a browser layout pass. Each
40
+ diagram is a card: the source on the left (with a copy button), the drawing on
41
+ the right with **Open in Playground** and the render time; the panes stack on a
42
+ narrow page. Pele reads its colors from `--pele-*` variables, which docstream
43
+ maps to its theme on `.docs-mermaid-preview`. `PeleDiagram` (the drawing pane)
44
+ and `usePele(code, ref)` are exported for hosts that show the source
45
+ themselves, as the editor does. Pele supports every diagram type built into
46
+ Mermaid, though its layout is its own. A diagram it can't draw shows Pele's
47
+ error as text.
36
48
 
37
49
  Two features are opt-in, each behind its own entry and an **optional** peer
38
50
  dependency that the rest of the package never references:
@@ -840,7 +852,7 @@ import { ReactDemo } from "@brett_lamy/docstream/playground"
840
852
 
841
853
  Since 1.4 the package ships compiled ES modules (ES2022, `react-jsx`) with type
842
854
  declarations and declaration maps — one file per source module in `dist/`,
843
- dependencies left as imports, lazy features (Mermaid, KaTeX, rrweb, the
855
+ dependencies left as imports, lazy features (Pele, KaTeX, rrweb, the
844
856
  playground's almost-node) still behind dynamic `import()`:
845
857
 
846
858
  ```json
@@ -1,7 +1,25 @@
1
+ import { type ReactNode, type RefObject } from "react";
1
2
  export interface MermaidProps {
2
3
  code: string;
4
+ /** Accepted for compatibility with older documents; the source pane always shows the whole diagram. */
3
5
  collapsedCodeLines?: number;
4
6
  expandedCodeLines?: number;
5
7
  }
6
- export declare function Mermaid({ code, collapsedCodeLines, expandedCodeLines }: MermaidProps): import("react").JSX.Element;
8
+ /** Pele's playground, opened on this source. Long sources don't fit in a link. */
9
+ export declare function pelePlaygroundUrl(code: string): string | null;
10
+ export interface PeleDrawing {
11
+ svg?: string;
12
+ error?: string;
13
+ /** How long Pele took to draw it. */
14
+ ms?: number;
15
+ }
16
+ /** Draws `code` with Pele: the SVG (or the error) and the render time; null until it's drawn. */
17
+ export declare function usePele(code: string, host: RefObject<HTMLElement | null>): PeleDrawing | null;
18
+ /** The drawing pane: "Pele", the playground link, the diagram and its render time. */
19
+ export declare function PeleDiagram({ code, className, children }: {
20
+ code: string;
21
+ className?: string;
22
+ children?: ReactNode;
23
+ }): import("react").JSX.Element;
24
+ export declare function Mermaid({ code }: MermaidProps): import("react").JSX.Element;
7
25
  //# sourceMappingURL=Mermaid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Mermaid.d.ts","sourceRoot":"","sources":["../../src/docs/Mermaid.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAMD,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAsB,EAAE,iBAAsB,EAAE,EAAE,YAAY,+BA0D7F"}
1
+ {"version":3,"file":"Mermaid.d.ts","sourceRoot":"","sources":["../../src/docs/Mermaid.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAU1F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,uGAAuG;IACvG,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7D;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qCAAqC;IACrC,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,iGAAiG;AACjG,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,WAAW,GAAG,IAAI,CAiC7F;AAID,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,+BA2BpH;AAED,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,YAAY,+BAkB7C"}
@@ -1,39 +1,65 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useId, useState } from "react";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useId, useRef, useState } from "react";
3
+ import { Play } from "lucide-react";
3
4
  import { HighlightedCode } from "./HighlightedCode.js";
4
- let seq = 0;
5
- function positiveLineCount(value, fallback) {
6
- return value !== undefined && Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;
5
+ import { CopyIcon, useCopied } from "./copy.js";
6
+ /** Pele's playground, opened on this source. Long sources don't fit in a link. */
7
+ export function pelePlaygroundUrl(code) {
8
+ const hash = new URLSearchParams({ source: code }).toString();
9
+ return hash.length > 8000 ? null : `https://pele.run/playground#${hash}`;
7
10
  }
8
- export function Mermaid({ code, collapsedCodeLines = 3, expandedCodeLines = 30 }) {
9
- const [svg, setSvg] = useState(null);
10
- const [error, setError] = useState(null);
11
- const [codeExpanded, setCodeExpanded] = useState(false);
12
- const codePanelId = useId();
13
- const collapsedLines = positiveLineCount(collapsedCodeLines, 3);
14
- const expandedLines = Math.max(collapsedLines, positiveLineCount(expandedCodeLines, 30));
11
+ /** Draws `code` with Pele: the SVG (or the error) and the render time; null until it's drawn. */
12
+ export function usePele(code, host) {
13
+ const [drawn, setDrawn] = useState(null);
14
+ const idPrefix = `pele-${useId().replace(/[^a-zA-Z0-9_-]/g, "")}-`;
15
15
  useEffect(() => {
16
16
  let cancelled = false;
17
- import("mermaid")
18
- .then(async ({ default: mermaid }) => {
19
- mermaid.initialize({ startOnLoad: false, securityLevel: "strict" });
20
- // A fresh id per render: mermaid.render removes any element with the id it is given,
21
- // so reusing one (StrictMode's double effect, a code change) deleted the diagram an
22
- // earlier render had already mounted.
23
- const { svg } = await mermaid.render(`mermaid-${++seq}`, code);
24
- if (!cancelled)
25
- setSvg(svg);
17
+ import("pele/lazy")
18
+ .then(async (pele) => {
19
+ await pele.load(pele.detectType(code));
20
+ if (cancelled)
21
+ return;
22
+ // Pele measures text itself, so it needs the font the diagram is shown in.
23
+ const style = host.current ? getComputedStyle(host.current) : null;
24
+ const font = style ? style.getPropertyValue("--pele-font").trim() || style.fontFamily : "";
25
+ // …and the SVG draws in `--pele-font`, so measure and draw with the same one.
26
+ if (font && host.current && !style?.getPropertyValue("--pele-font").trim())
27
+ host.current.style.setProperty("--pele-font", font);
28
+ const start = performance.now();
29
+ try {
30
+ // The pane's width: a wide left-to-right chart turns top-down in a narrow pane rather than shrinking.
31
+ const width = host.current ? host.current.clientWidth - parseFloat(style?.paddingLeft ?? "0") - parseFloat(style?.paddingRight ?? "0") : 0;
32
+ const { svg } = pele.render(code, { idPrefix, ...(font ? { fontFamily: font } : {}), ...(width > 0 ? { maxWidth: width } : {}) });
33
+ setDrawn({ svg, ms: performance.now() - start });
34
+ }
35
+ catch (e) {
36
+ if (!(e instanceof pele.PeleError))
37
+ throw e;
38
+ setDrawn({ error: e.message });
39
+ }
26
40
  })
27
41
  .catch((e) => {
28
42
  if (!cancelled)
29
- setError(String(e.message ?? e));
43
+ setDrawn({ error: String(e?.message ?? e) });
30
44
  });
31
45
  return () => {
32
46
  cancelled = true;
33
47
  };
34
- }, [code]);
35
- return (_jsxs("section", { className: "docs-mermaid-preview", "data-docstream-mermaid": "", children: [error ? (_jsxs("pre", { className: "docs-mermaid-error", children: ["mermaid error: ", error] })) : svg ? (_jsx("div", { className: "docs-mermaid", dangerouslySetInnerHTML: { __html: svg } })) : (_jsx("div", { className: "docs-mermaid", children: "Rendering diagram\u2026" })), _jsxs("div", { className: "docs-react-demo-code docs-mermaid-code", children: [_jsx("pre", { id: codePanelId, className: codeExpanded ? "docs-react-demo-code-body docs-react-demo-code-body-expanded" : "docs-react-demo-code-body", style: {
36
- "--docs-react-demo-code-lines": codeExpanded ? expandedLines : collapsedLines,
37
- }, children: _jsx(HighlightedCode, { code: code, language: "mermaid", lineNumbers: true }) }), _jsx("button", { type: "button", className: "docs-react-demo-code-toggle", "aria-controls": codePanelId, "aria-expanded": codeExpanded, onClick: () => setCodeExpanded((value) => !value), children: codeExpanded ? "Hide Code" : "View Code" })] })] }));
48
+ }, [code, idPrefix, host]);
49
+ return drawn;
50
+ }
51
+ const formatMs = (ms) => (ms < 10 ? `${ms.toFixed(1)} ms` : `${Math.round(ms)} ms`);
52
+ /** The drawing pane: "Pele", the playground link, the diagram and its render time. */
53
+ export function PeleDiagram({ code, className, children }) {
54
+ const host = useRef(null);
55
+ const drawn = usePele(code, host);
56
+ const playground = pelePlaygroundUrl(code);
57
+ return (_jsxs("div", { ref: host, className: `docs-pele-pane docs-pele-diagram-pane${className ? ` ${className}` : ""}`, children: [_jsxs("div", { className: "docs-pele-head", children: [_jsx("span", { className: "docs-pele-label", children: "Pele" }), playground ? (_jsxs("a", { className: "docs-pele-action", href: playground, target: "_blank", rel: "noreferrer", children: [_jsx(Play, { width: 14, height: 14, strokeWidth: 2, "aria-hidden": "true" }), "Open in Playground"] })) : null] }), drawn?.error !== undefined ? (
58
+ // The message quotes the diagram source: text, never markup.
59
+ _jsx("pre", { className: "docs-mermaid-error", role: "alert", children: drawn.error })) : drawn?.svg ? (_jsx("div", { className: "docs-mermaid", dangerouslySetInnerHTML: { __html: drawn.svg } })) : (_jsx("div", { className: "docs-mermaid docs-mermaid-pending", children: "Drawing\u2026" })), drawn?.ms !== undefined ? _jsx("span", { className: "docs-pele-time", children: formatMs(drawn.ms) }) : null, children] }));
60
+ }
61
+ export function Mermaid({ code }) {
62
+ const { copied, copy } = useCopied();
63
+ return (_jsxs("section", { className: "docs-mermaid-preview", "data-docstream-mermaid": "", children: [_jsxs("div", { className: "docs-pele-pane docs-pele-source-pane", children: [_jsxs("div", { className: "docs-pele-head", children: [_jsx("span", { className: "docs-pele-label", children: "Mermaid" }), _jsx("button", { type: "button", className: "docs-pele-action docs-pele-copy", "aria-label": copied ? "Copied" : "Copy Mermaid source", onClick: () => void copy(code), children: _jsx(CopyIcon, { copied: copied, size: 16 }) })] }), _jsx("pre", { className: "docs-pele-source", children: _jsx(HighlightedCode, { code: code, language: "mermaid" }) })] }), _jsx(PeleDiagram, { code: code })] }));
38
64
  }
39
65
  //# sourceMappingURL=Mermaid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Mermaid.js","sourceRoot":"","sources":["../../src/docs/Mermaid.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Mermaid.js","sourceRoot":"","sources":["../../src/docs/Mermaid.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -28,6 +28,8 @@ export type { VideoEmbedProps } from "./video/index.js";
28
28
  export { StlViewer, isStlUrl, parseStl } from "./stl/index.js";
29
29
  export type { StlMesh, StlViewerProps } from "./stl/index.js";
30
30
  export { StrudelPlayer } from "./strudel/StrudelPlayer.js";
31
+ export { Mermaid, PeleDiagram, pelePlaygroundUrl, usePele } from "./docs/Mermaid.js";
32
+ export type { MermaidProps, PeleDrawing } from "./docs/Mermaid.js";
31
33
  export { isStrudelFile, isStrudelLanguage } from "./strudel/url.js";
32
34
  export type { StrudelPlayerProps } from "./strudel/StrudelPlayer.js";
33
35
  export { OpenApiOperation } from "./openapi/OpenApiOperation.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ export { isReplayQaUrl, normalizeReplayEmbedUrl } from "./replay/url.js";
17
17
  export { VideoEmbed } from "./video/index.js";
18
18
  export { StlViewer, isStlUrl, parseStl } from "./stl/index.js";
19
19
  export { StrudelPlayer } from "./strudel/StrudelPlayer.js";
20
+ export { Mermaid, PeleDiagram, pelePlaygroundUrl, usePele } from "./docs/Mermaid.js";
20
21
  export { isStrudelFile, isStrudelLanguage } from "./strudel/url.js";
21
22
  export { OpenApiOperation } from "./openapi/OpenApiOperation.js";
22
23
  export { createInlineDemoProject, createReactDemoFiles } from "./playground/project.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/styles.css CHANGED
@@ -1545,34 +1545,136 @@
1545
1545
  }
1546
1546
 
1547
1547
  .docs-mermaid-preview {
1548
+ /* Pele draws with these; they follow the theme without a redraw. */
1549
+ --pele-bg: transparent;
1550
+ --pele-fg: var(--gb-panel-foreground);
1551
+ --pele-muted: var(--gb-muted-foreground);
1552
+ --pele-line: var(--gb-muted-foreground);
1553
+ --pele-surface: var(--gb-hover);
1554
+ --pele-surface-alt: var(--gb-code-bg);
1555
+ --pele-border: var(--gb-border);
1556
+ --pele-accent: var(--gb-primary);
1557
+ --pele-error: var(--gb-danger);
1558
+ --pele-radius: 6px;
1559
+ display: grid;
1560
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
1548
1561
  border: 1px solid var(--gb-border);
1549
- border-radius: 12px;
1562
+ border-radius: 16px;
1550
1563
  overflow: hidden;
1564
+ background: var(--gb-panel);
1565
+ color: var(--gb-panel-foreground);
1566
+ }
1567
+
1568
+ .docs-pele-pane {
1569
+ position: relative;
1570
+ display: flex;
1571
+ flex-direction: column;
1572
+ min-width: 0;
1573
+ padding: 14px 18px 18px;
1574
+ }
1575
+
1576
+ /* Side by side, a hairline between; stacked, a hairline above the drawing. */
1577
+ .docs-pele-source-pane {
1578
+ box-shadow: 1px 0 0 var(--gb-border), 0 1px 0 var(--gb-border);
1579
+ }
1580
+
1581
+ .docs-pele-head {
1582
+ display: flex;
1583
+ align-items: center;
1584
+ justify-content: space-between;
1585
+ gap: 12px;
1586
+ min-height: 28px;
1587
+ margin-bottom: 10px;
1588
+ }
1589
+
1590
+ .docs-pele-label {
1591
+ font-size: 13px;
1592
+ color: var(--gb-muted-foreground);
1593
+ }
1594
+
1595
+ .docs-pele-action {
1596
+ display: inline-flex;
1597
+ align-items: center;
1598
+ gap: 6px;
1599
+ padding: 4px 6px;
1600
+ margin-right: -6px;
1601
+ border: 0;
1602
+ border-radius: 6px;
1603
+ background: none;
1604
+ font: inherit;
1605
+ font-size: 13px;
1606
+ color: var(--gb-muted-foreground);
1607
+ text-decoration: none;
1608
+ cursor: pointer;
1609
+ }
1610
+
1611
+ .docs-mermaid-preview a.docs-pele-action {
1612
+ color: var(--gb-muted-foreground);
1613
+ text-decoration: none;
1614
+ }
1615
+
1616
+ .docs-pele-action:hover,
1617
+ .docs-mermaid-preview a.docs-pele-action:hover {
1618
+ background: var(--gb-hover);
1619
+ color: var(--gb-panel-foreground);
1620
+ }
1621
+
1622
+ .docs-pele-action:focus-visible {
1623
+ outline: 2px solid var(--gb-primary);
1624
+ outline-offset: 1px;
1625
+ }
1626
+
1627
+ .docs-pele-source {
1628
+ margin: 0;
1629
+ overflow: auto;
1630
+ font-size: 13px;
1631
+ line-height: 1.7;
1632
+ white-space: pre;
1633
+ }
1634
+
1635
+ .docs-mermaid-preview .docs-pele-source code {
1636
+ padding: 0;
1637
+ border: 0;
1638
+ border-radius: 0;
1639
+ background: none;
1640
+ font-size: inherit;
1551
1641
  }
1552
1642
 
1553
1643
  .docs-mermaid {
1554
1644
  display: flex;
1645
+ flex: 1;
1646
+ align-items: center;
1555
1647
  justify-content: center;
1556
- padding: 16px;
1557
- background: var(--background, #ffffff);
1648
+ min-height: 120px;
1649
+ padding: 8px 0 18px;
1558
1650
  }
1559
1651
 
1560
1652
  .docs-mermaid svg {
1561
1653
  max-width: 100%;
1654
+ height: auto;
1655
+ }
1656
+
1657
+ .docs-mermaid-pending {
1658
+ font-size: 13px;
1659
+ color: var(--gb-muted-foreground);
1660
+ }
1661
+
1662
+ .docs-pele-time {
1663
+ position: absolute;
1664
+ right: 18px;
1665
+ bottom: 12px;
1666
+ font-size: 12px;
1667
+ font-variant-numeric: tabular-nums;
1668
+ color: var(--gb-muted-foreground);
1562
1669
  }
1563
1670
 
1564
1671
  .docs-mermaid-error {
1565
1672
  margin: 0;
1566
1673
  font-size: 12px;
1567
1674
  color: var(--gb-danger);
1568
- padding: 10px;
1569
1675
  white-space: pre-wrap;
1570
1676
  }
1571
1677
 
1572
- .docs-mermaid-code {
1573
- border-top: 1px solid var(--gb-border);
1574
- }
1575
-
1576
1678
  .docs-inline-img {
1577
1679
  display: inline-block;
1578
1680
  vertical-align: middle;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brett_lamy/docstream",
3
- "version": "1.14.1",
3
+ "version": "1.15.0",
4
4
  "description": "GitBook-aware readonly markdown and AI stream renderer.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -145,7 +145,7 @@
145
145
  "gpu-lexer": "^0.0.2",
146
146
  "katex": "^0.18.5",
147
147
  "lucide-react": "^1.17.0",
148
- "mermaid": "^11.15.0",
148
+ "pele": "1.6.0",
149
149
  "react-aria": "^3.52.1",
150
150
  "rrweb": "2.0.0-alpha.20",
151
151
  "yaml": "^2.9.0"
@@ -1,74 +1,117 @@
1
- import { useEffect, useId, useState, type CSSProperties } from "react"
1
+ import { useEffect, useId, useRef, useState, type ReactNode, type RefObject } from "react"
2
+ import { Play } from "lucide-react"
2
3
  import { HighlightedCode } from "./HighlightedCode"
4
+ import { CopyIcon, useCopied } from "./copy"
3
5
 
4
- let seq = 0
6
+ /* Mermaid diagrams, drawn by Pele (https://pele.run): Mermaid text in, SVG out, synchronously and with no
7
+ browser layout pass. A diagram is a card of two panes — the source on the left, the drawing on the right with
8
+ an "Open in Playground" link and how long it took — that stack on a narrow page. Pele loads on first use, and only
9
+ the diagram types a page uses. */
5
10
 
6
11
  export interface MermaidProps {
7
12
  code: string
13
+ /** Accepted for compatibility with older documents; the source pane always shows the whole diagram. */
8
14
  collapsedCodeLines?: number
9
15
  expandedCodeLines?: number
10
16
  }
11
17
 
12
- function positiveLineCount(value: number | undefined, fallback: number): number {
13
- return value !== undefined && Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback
18
+ /** Pele's playground, opened on this source. Long sources don't fit in a link. */
19
+ export function pelePlaygroundUrl(code: string): string | null {
20
+ const hash = new URLSearchParams({ source: code }).toString()
21
+ return hash.length > 8000 ? null : `https://pele.run/playground#${hash}`
14
22
  }
15
23
 
16
- export function Mermaid({ code, collapsedCodeLines = 3, expandedCodeLines = 30 }: MermaidProps) {
17
- const [svg, setSvg] = useState<string | null>(null)
18
- const [error, setError] = useState<string | null>(null)
19
- const [codeExpanded, setCodeExpanded] = useState(false)
20
- const codePanelId = useId()
21
- const collapsedLines = positiveLineCount(collapsedCodeLines, 3)
22
- const expandedLines = Math.max(collapsedLines, positiveLineCount(expandedCodeLines, 30))
24
+ export interface PeleDrawing {
25
+ svg?: string
26
+ error?: string
27
+ /** How long Pele took to draw it. */
28
+ ms?: number
29
+ }
23
30
 
31
+ /** Draws `code` with Pele: the SVG (or the error) and the render time; null until it's drawn. */
32
+ export function usePele(code: string, host: RefObject<HTMLElement | null>): PeleDrawing | null {
33
+ const [drawn, setDrawn] = useState<PeleDrawing | null>(null)
34
+ const idPrefix = `pele-${useId().replace(/[^a-zA-Z0-9_-]/g, "")}-`
24
35
  useEffect(() => {
25
36
  let cancelled = false
26
- import("mermaid")
27
- .then(async ({ default: mermaid }) => {
28
- mermaid.initialize({ startOnLoad: false, securityLevel: "strict" })
29
- // A fresh id per render: mermaid.render removes any element with the id it is given,
30
- // so reusing one (StrictMode's double effect, a code change) deleted the diagram an
31
- // earlier render had already mounted.
32
- const { svg } = await mermaid.render(`mermaid-${++seq}`, code)
33
- if (!cancelled) setSvg(svg)
37
+ import("pele/lazy")
38
+ .then(async (pele) => {
39
+ await pele.load(pele.detectType(code))
40
+ if (cancelled) return
41
+ // Pele measures text itself, so it needs the font the diagram is shown in.
42
+ const style = host.current ? getComputedStyle(host.current) : null
43
+ const font = style ? style.getPropertyValue("--pele-font").trim() || style.fontFamily : ""
44
+ // …and the SVG draws in `--pele-font`, so measure and draw with the same one.
45
+ if (font && host.current && !style?.getPropertyValue("--pele-font").trim()) host.current.style.setProperty("--pele-font", font)
46
+ const start = performance.now()
47
+ try {
48
+ // The pane's width: a wide left-to-right chart turns top-down in a narrow pane rather than shrinking.
49
+ const width = host.current ? host.current.clientWidth - parseFloat(style?.paddingLeft ?? "0") - parseFloat(style?.paddingRight ?? "0") : 0
50
+ const { svg } = pele.render(code, { idPrefix, ...(font ? { fontFamily: font } : {}), ...(width > 0 ? { maxWidth: width } : {}) })
51
+ setDrawn({ svg, ms: performance.now() - start })
52
+ } catch (e) {
53
+ if (!(e instanceof pele.PeleError)) throw e
54
+ setDrawn({ error: e.message })
55
+ }
34
56
  })
35
- .catch((e) => {
36
- if (!cancelled) setError(String(e.message ?? e))
57
+ .catch((e: unknown) => {
58
+ if (!cancelled) setDrawn({ error: String((e as Error)?.message ?? e) })
37
59
  })
38
60
  return () => {
39
61
  cancelled = true
40
62
  }
41
- }, [code])
63
+ }, [code, idPrefix, host])
64
+ return drawn
65
+ }
66
+
67
+ const formatMs = (ms: number) => (ms < 10 ? `${ms.toFixed(1)} ms` : `${Math.round(ms)} ms`)
42
68
 
69
+ /** The drawing pane: "Pele", the playground link, the diagram and its render time. */
70
+ export function PeleDiagram({ code, className, children }: { code: string; className?: string; children?: ReactNode }) {
71
+ const host = useRef<HTMLDivElement>(null)
72
+ const drawn = usePele(code, host)
73
+ const playground = pelePlaygroundUrl(code)
43
74
  return (
44
- <section className="docs-mermaid-preview" data-docstream-mermaid="">
45
- {error ? (
46
- <pre className="docs-mermaid-error">mermaid error: {error}</pre>
47
- ) : svg ? (
48
- <div className="docs-mermaid" dangerouslySetInnerHTML={{ __html: svg }} />
75
+ <div ref={host} className={`docs-pele-pane docs-pele-diagram-pane${className ? ` ${className}` : ""}`}>
76
+ <div className="docs-pele-head">
77
+ <span className="docs-pele-label">Pele</span>
78
+ {playground ? (
79
+ <a className="docs-pele-action" href={playground} target="_blank" rel="noreferrer">
80
+ <Play width={14} height={14} strokeWidth={2} aria-hidden="true" />
81
+ Open in Playground
82
+ </a>
83
+ ) : null}
84
+ </div>
85
+ {drawn?.error !== undefined ? (
86
+ // The message quotes the diagram source: text, never markup.
87
+ <pre className="docs-mermaid-error" role="alert">{drawn.error}</pre>
88
+ ) : drawn?.svg ? (
89
+ <div className="docs-mermaid" dangerouslySetInnerHTML={{ __html: drawn.svg }} />
49
90
  ) : (
50
- <div className="docs-mermaid">Rendering diagram…</div>
91
+ <div className="docs-mermaid docs-mermaid-pending">Drawing…</div>
51
92
  )}
52
- <div className="docs-react-demo-code docs-mermaid-code">
53
- <pre
54
- id={codePanelId}
55
- className={codeExpanded ? "docs-react-demo-code-body docs-react-demo-code-body-expanded" : "docs-react-demo-code-body"}
56
- style={{
57
- "--docs-react-demo-code-lines": codeExpanded ? expandedLines : collapsedLines,
58
- } as CSSProperties}
59
- >
60
- <HighlightedCode code={code} language="mermaid" lineNumbers />
93
+ {drawn?.ms !== undefined ? <span className="docs-pele-time">{formatMs(drawn.ms)}</span> : null}
94
+ {children}
95
+ </div>
96
+ )
97
+ }
98
+
99
+ export function Mermaid({ code }: MermaidProps) {
100
+ const { copied, copy } = useCopied()
101
+ return (
102
+ <section className="docs-mermaid-preview" data-docstream-mermaid="">
103
+ <div className="docs-pele-pane docs-pele-source-pane">
104
+ <div className="docs-pele-head">
105
+ <span className="docs-pele-label">Mermaid</span>
106
+ <button type="button" className="docs-pele-action docs-pele-copy" aria-label={copied ? "Copied" : "Copy Mermaid source"} onClick={() => void copy(code)}>
107
+ <CopyIcon copied={copied} size={16} />
108
+ </button>
109
+ </div>
110
+ <pre className="docs-pele-source">
111
+ <HighlightedCode code={code} language="mermaid" />
61
112
  </pre>
62
- <button
63
- type="button"
64
- className="docs-react-demo-code-toggle"
65
- aria-controls={codePanelId}
66
- aria-expanded={codeExpanded}
67
- onClick={() => setCodeExpanded((value) => !value)}
68
- >
69
- {codeExpanded ? "Hide Code" : "View Code"}
70
- </button>
71
113
  </div>
114
+ <PeleDiagram code={code} />
72
115
  </section>
73
116
  )
74
117
  }
package/src/index.ts CHANGED
@@ -91,6 +91,8 @@ export type { VideoEmbedProps } from "./video"
91
91
  export { StlViewer, isStlUrl, parseStl } from "./stl"
92
92
  export type { StlMesh, StlViewerProps } from "./stl"
93
93
  export { StrudelPlayer } from "./strudel/StrudelPlayer"
94
+ export { Mermaid, PeleDiagram, pelePlaygroundUrl, usePele } from "./docs/Mermaid"
95
+ export type { MermaidProps, PeleDrawing } from "./docs/Mermaid"
94
96
  export { isStrudelFile, isStrudelLanguage } from "./strudel/url"
95
97
  export type { StrudelPlayerProps } from "./strudel/StrudelPlayer"
96
98
  export { OpenApiOperation } from "./openapi/OpenApiOperation"
package/src/styles.css CHANGED
@@ -1545,34 +1545,136 @@
1545
1545
  }
1546
1546
 
1547
1547
  .docs-mermaid-preview {
1548
+ /* Pele draws with these; they follow the theme without a redraw. */
1549
+ --pele-bg: transparent;
1550
+ --pele-fg: var(--gb-panel-foreground);
1551
+ --pele-muted: var(--gb-muted-foreground);
1552
+ --pele-line: var(--gb-muted-foreground);
1553
+ --pele-surface: var(--gb-hover);
1554
+ --pele-surface-alt: var(--gb-code-bg);
1555
+ --pele-border: var(--gb-border);
1556
+ --pele-accent: var(--gb-primary);
1557
+ --pele-error: var(--gb-danger);
1558
+ --pele-radius: 6px;
1559
+ display: grid;
1560
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
1548
1561
  border: 1px solid var(--gb-border);
1549
- border-radius: 12px;
1562
+ border-radius: 16px;
1550
1563
  overflow: hidden;
1564
+ background: var(--gb-panel);
1565
+ color: var(--gb-panel-foreground);
1566
+ }
1567
+
1568
+ .docs-pele-pane {
1569
+ position: relative;
1570
+ display: flex;
1571
+ flex-direction: column;
1572
+ min-width: 0;
1573
+ padding: 14px 18px 18px;
1574
+ }
1575
+
1576
+ /* Side by side, a hairline between; stacked, a hairline above the drawing. */
1577
+ .docs-pele-source-pane {
1578
+ box-shadow: 1px 0 0 var(--gb-border), 0 1px 0 var(--gb-border);
1579
+ }
1580
+
1581
+ .docs-pele-head {
1582
+ display: flex;
1583
+ align-items: center;
1584
+ justify-content: space-between;
1585
+ gap: 12px;
1586
+ min-height: 28px;
1587
+ margin-bottom: 10px;
1588
+ }
1589
+
1590
+ .docs-pele-label {
1591
+ font-size: 13px;
1592
+ color: var(--gb-muted-foreground);
1593
+ }
1594
+
1595
+ .docs-pele-action {
1596
+ display: inline-flex;
1597
+ align-items: center;
1598
+ gap: 6px;
1599
+ padding: 4px 6px;
1600
+ margin-right: -6px;
1601
+ border: 0;
1602
+ border-radius: 6px;
1603
+ background: none;
1604
+ font: inherit;
1605
+ font-size: 13px;
1606
+ color: var(--gb-muted-foreground);
1607
+ text-decoration: none;
1608
+ cursor: pointer;
1609
+ }
1610
+
1611
+ .docs-mermaid-preview a.docs-pele-action {
1612
+ color: var(--gb-muted-foreground);
1613
+ text-decoration: none;
1614
+ }
1615
+
1616
+ .docs-pele-action:hover,
1617
+ .docs-mermaid-preview a.docs-pele-action:hover {
1618
+ background: var(--gb-hover);
1619
+ color: var(--gb-panel-foreground);
1620
+ }
1621
+
1622
+ .docs-pele-action:focus-visible {
1623
+ outline: 2px solid var(--gb-primary);
1624
+ outline-offset: 1px;
1625
+ }
1626
+
1627
+ .docs-pele-source {
1628
+ margin: 0;
1629
+ overflow: auto;
1630
+ font-size: 13px;
1631
+ line-height: 1.7;
1632
+ white-space: pre;
1633
+ }
1634
+
1635
+ .docs-mermaid-preview .docs-pele-source code {
1636
+ padding: 0;
1637
+ border: 0;
1638
+ border-radius: 0;
1639
+ background: none;
1640
+ font-size: inherit;
1551
1641
  }
1552
1642
 
1553
1643
  .docs-mermaid {
1554
1644
  display: flex;
1645
+ flex: 1;
1646
+ align-items: center;
1555
1647
  justify-content: center;
1556
- padding: 16px;
1557
- background: var(--background, #ffffff);
1648
+ min-height: 120px;
1649
+ padding: 8px 0 18px;
1558
1650
  }
1559
1651
 
1560
1652
  .docs-mermaid svg {
1561
1653
  max-width: 100%;
1654
+ height: auto;
1655
+ }
1656
+
1657
+ .docs-mermaid-pending {
1658
+ font-size: 13px;
1659
+ color: var(--gb-muted-foreground);
1660
+ }
1661
+
1662
+ .docs-pele-time {
1663
+ position: absolute;
1664
+ right: 18px;
1665
+ bottom: 12px;
1666
+ font-size: 12px;
1667
+ font-variant-numeric: tabular-nums;
1668
+ color: var(--gb-muted-foreground);
1562
1669
  }
1563
1670
 
1564
1671
  .docs-mermaid-error {
1565
1672
  margin: 0;
1566
1673
  font-size: 12px;
1567
1674
  color: var(--gb-danger);
1568
- padding: 10px;
1569
1675
  white-space: pre-wrap;
1570
1676
  }
1571
1677
 
1572
- .docs-mermaid-code {
1573
- border-top: 1px solid var(--gb-border);
1574
- }
1575
-
1576
1678
  .docs-inline-img {
1577
1679
  display: inline-block;
1578
1680
  vertical-align: middle;