@schlessera/brain-ui-react 0.7.2 → 0.9.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/dist/components/chat/brain-markdown.d.ts.map +1 -1
- package/dist/components/chat/brain-markdown.js +93 -55
- package/dist/components/chat/brain-markdown.js.map +1 -1
- package/dist/components/chat/chat-page.d.ts.map +1 -1
- package/dist/components/chat/chat-page.js +10 -1
- package/dist/components/chat/chat-page.js.map +1 -1
- package/dist/components/chat/copy-button.d.ts +6 -0
- package/dist/components/chat/copy-button.d.ts.map +1 -0
- package/dist/components/chat/copy-button.js +16 -0
- package/dist/components/chat/copy-button.js.map +1 -0
- package/dist/components/chat/mermaid-block.d.ts +14 -0
- package/dist/components/chat/mermaid-block.d.ts.map +1 -0
- package/dist/components/chat/mermaid-block.js +55 -0
- package/dist/components/chat/mermaid-block.js.map +1 -0
- package/dist/components/chat/mermaid-share.d.ts +5 -0
- package/dist/components/chat/mermaid-share.d.ts.map +1 -0
- package/dist/components/chat/mermaid-share.js +80 -0
- package/dist/components/chat/mermaid-share.js.map +1 -0
- package/dist/components/chat/mermaid-viewer.d.ts +6 -0
- package/dist/components/chat/mermaid-viewer.d.ts.map +1 -0
- package/dist/components/chat/mermaid-viewer.js +266 -0
- package/dist/components/chat/mermaid-viewer.js.map +1 -0
- package/dist/components/chat/message-share.d.ts.map +1 -1
- package/dist/components/chat/message-share.js +7 -4
- package/dist/components/chat/message-share.js.map +1 -1
- package/dist/components/chat/share-block.d.ts.map +1 -1
- package/dist/components/chat/share-block.js +5 -2
- package/dist/components/chat/share-block.js.map +1 -1
- package/dist/components/files/file-viewer.d.ts.map +1 -1
- package/dist/components/files/file-viewer.js +30 -5
- package/dist/components/files/file-viewer.js.map +1 -1
- package/dist/components/share/share-menu.d.ts +8 -1
- package/dist/components/share/share-menu.d.ts.map +1 -1
- package/dist/components/share/share-menu.js +10 -5
- package/dist/components/share/share-menu.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/client-environment.d.ts +29 -0
- package/dist/lib/client-environment.d.ts.map +1 -0
- package/dist/lib/client-environment.js +153 -0
- package/dist/lib/client-environment.js.map +1 -0
- package/dist/lib/mermaid-theme.d.ts +4 -0
- package/dist/lib/mermaid-theme.d.ts.map +1 -0
- package/dist/lib/mermaid-theme.js +221 -0
- package/dist/lib/mermaid-theme.js.map +1 -0
- package/dist/lib/mermaid.d.ts +62 -0
- package/dist/lib/mermaid.d.ts.map +1 -0
- package/dist/lib/mermaid.js +244 -0
- package/dist/lib/mermaid.js.map +1 -0
- package/dist/stores/file-store.d.ts.map +1 -1
- package/dist/stores/file-store.js +9 -2
- package/dist/stores/file-store.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -2
- package/src/components/chat/brain-markdown.tsx +109 -80
- package/src/components/chat/chat-page.tsx +20 -1
- package/src/components/chat/copy-button.tsx +26 -0
- package/src/components/chat/mermaid-block.tsx +106 -0
- package/src/components/chat/mermaid-share.ts +91 -0
- package/src/components/chat/mermaid-viewer.tsx +336 -0
- package/src/components/chat/message-share.ts +7 -4
- package/src/components/chat/share-block.tsx +5 -2
- package/src/components/files/file-viewer.tsx +37 -5
- package/src/components/share/share-menu.tsx +20 -6
- package/src/index.ts +5 -0
- package/src/lib/client-environment.ts +152 -0
- package/src/lib/mermaid-theme.ts +246 -0
- package/src/lib/mermaid.ts +287 -0
- package/src/stores/file-store.ts +12 -2
- package/src/theme.css +10 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { uiConfig } from "../../config.js";
|
|
2
|
+
import { renderMermaidSvg, sizeSvgForExport } from "../../lib/mermaid.js";
|
|
3
|
+
import { renderAndShare, shareFile, shareText } from "../../lib/share.js";
|
|
4
|
+
/**
|
|
5
|
+
* Share options for a single diagram.
|
|
6
|
+
*
|
|
7
|
+
* Exports are rendered in the LIGHT theme, not the dark one on screen: a share
|
|
8
|
+
* lands in WhatsApp, a mail client or a printer, all of which assume paper.
|
|
9
|
+
* PNG and PDF go through the same /api/render path as every other share, so a
|
|
10
|
+
* diagram in a shared message and a diagram shared on its own are the same
|
|
11
|
+
* pixels.
|
|
12
|
+
*/
|
|
13
|
+
/** Guard: the render route rejects a body over 512 KiB, so fail with a readable message. */
|
|
14
|
+
const MAX_CONTENT_CHARS = 480_000;
|
|
15
|
+
function figureHtml(svg, tight) {
|
|
16
|
+
// `width: fit-content` is what makes a PNG crop to the diagram instead of to
|
|
17
|
+
// the render viewport — the screenshot clips to the body box. PDF keeps the
|
|
18
|
+
// template's normal page flow, since an A4 page has a fixed width anyway.
|
|
19
|
+
const style = tight
|
|
20
|
+
? "<style>body{width:fit-content;padding:24px}.mermaid-figure{margin:0}</style>"
|
|
21
|
+
: "";
|
|
22
|
+
return `${style}<div class="mermaid-figure">${svg.replace(/[\r\n]+/g, " ")}</div>`;
|
|
23
|
+
}
|
|
24
|
+
async function exportSvg(source) {
|
|
25
|
+
const svg = await renderMermaidSvg(source, "light");
|
|
26
|
+
if (!svg)
|
|
27
|
+
throw new Error("This diagram can't be rendered yet");
|
|
28
|
+
return sizeSvgForExport(svg);
|
|
29
|
+
}
|
|
30
|
+
async function exportHtml(source, tight) {
|
|
31
|
+
const html = figureHtml(await exportSvg(source), tight);
|
|
32
|
+
if (html.length > MAX_CONTENT_CHARS) {
|
|
33
|
+
throw new Error("Diagram is too large to share as an image");
|
|
34
|
+
}
|
|
35
|
+
return html;
|
|
36
|
+
}
|
|
37
|
+
export function buildDiagramShareOptions(source, opts = {}) {
|
|
38
|
+
const filename = opts.filename ?? "diagram";
|
|
39
|
+
return [
|
|
40
|
+
{
|
|
41
|
+
id: "image",
|
|
42
|
+
label: "Image (PNG)",
|
|
43
|
+
hint: "Cropped to the diagram",
|
|
44
|
+
run: async () => renderAndShare({
|
|
45
|
+
content: await exportHtml(source, true),
|
|
46
|
+
contentType: "html",
|
|
47
|
+
format: "png",
|
|
48
|
+
filename,
|
|
49
|
+
title: uiConfig.shareTitle,
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "pdf",
|
|
54
|
+
label: "PDF",
|
|
55
|
+
hint: "Vector PDF, A4",
|
|
56
|
+
run: async () => renderAndShare({
|
|
57
|
+
content: await exportHtml(source, false),
|
|
58
|
+
contentType: "html",
|
|
59
|
+
format: "pdf",
|
|
60
|
+
filename,
|
|
61
|
+
title: uiConfig.shareTitle,
|
|
62
|
+
}),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: "svg",
|
|
66
|
+
label: "Vector (SVG)",
|
|
67
|
+
hint: "Scales to any size",
|
|
68
|
+
run: async () => shareFile(new File([await exportSvg(source)], `${filename}.svg`, { type: "image/svg+xml" }), {
|
|
69
|
+
title: uiConfig.shareTitle,
|
|
70
|
+
}),
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "source",
|
|
74
|
+
label: "Mermaid source",
|
|
75
|
+
hint: "Paste into another tool",
|
|
76
|
+
run: () => shareText({ text: source, title: uiConfig.shareTitle }),
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=mermaid-share.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaid-share.js","sourceRoot":"","sources":["../../../src/components/chat/mermaid-share.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaid-viewer.d.ts","sourceRoot":"","sources":["../../../src/components/chat/mermaid-viewer.tsx"],"names":[],"mappings":"AAqCA,wBAAgB,aAAa,CAAC,EAC5B,GAAG,EACH,MAAM,EACN,OAAO,GACR,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,+BAkSA"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { Minus, Plus, Maximize2, X } from "lucide-react";
|
|
5
|
+
import { sizeSvgForExport } from "../../lib/mermaid.js";
|
|
6
|
+
import { ShareMenu } from "../share/share-menu.js";
|
|
7
|
+
import { buildDiagramShareOptions } from "./mermaid-share.js";
|
|
8
|
+
/**
|
|
9
|
+
* Full-screen, pan-and-zoom view of one diagram.
|
|
10
|
+
*
|
|
11
|
+
* Hand-rolled on pointer events rather than pulling a pan/zoom library: the
|
|
12
|
+
* whole surface is two transforms and the repo has no other dependency of that
|
|
13
|
+
* shape. Touch gestures work because the stage sets `touch-action: none` —
|
|
14
|
+
* the browser hands us every pointer instead of scrolling the page, which is
|
|
15
|
+
* also why no preventDefault is needed on the touch path. Wheel is the one
|
|
16
|
+
* exception: React's onWheel is passive, so it is bound manually.
|
|
17
|
+
*
|
|
18
|
+
* The SVG string is the same one the block already rendered, so opening the
|
|
19
|
+
* viewer costs no mermaid work. Both copies carry mermaid's ids; that is
|
|
20
|
+
* harmless because the markup is byte-identical — a `url(#id)` in either copy
|
|
21
|
+
* resolves to an identical marker.
|
|
22
|
+
*/
|
|
23
|
+
const MIN_SCALE = 0.15;
|
|
24
|
+
const MAX_SCALE = 12;
|
|
25
|
+
/** Small diagrams may grow to fill the stage, but blowing one up 8x reads as broken. */
|
|
26
|
+
const MAX_FIT_SCALE = 2.5;
|
|
27
|
+
function clampScale(s) {
|
|
28
|
+
return Math.min(MAX_SCALE, Math.max(MIN_SCALE, s));
|
|
29
|
+
}
|
|
30
|
+
export function MermaidViewer({ svg, source, onClose, }) {
|
|
31
|
+
const stageRef = useRef(null);
|
|
32
|
+
const contentRef = useRef(null);
|
|
33
|
+
// Mermaid ships `width: 100%` + `max-width` on the svg, which has no
|
|
34
|
+
// intrinsic size to measure or to scale from. Reuse the export sizer to pin
|
|
35
|
+
// it to its viewBox pixels; the transform below does all the scaling.
|
|
36
|
+
const sizedSvg = useMemo(() => sizeSvgForExport(svg), [svg]);
|
|
37
|
+
const [scale, setScale] = useState(1);
|
|
38
|
+
const [offset, setOffset] = useState({ x: 0, y: 0 });
|
|
39
|
+
const [ready, setReady] = useState(false);
|
|
40
|
+
// Live gesture state lives in refs: pointer maths must not wait for a render.
|
|
41
|
+
const pointers = useRef(new Map());
|
|
42
|
+
const pinch = useRef(null);
|
|
43
|
+
const panFrom = useRef(null);
|
|
44
|
+
const view = useRef({ scale: 1, offset: { x: 0, y: 0 } });
|
|
45
|
+
/** The scale `fit()` last produced — the baseline double-click toggles against. */
|
|
46
|
+
const fitScale = useRef(1);
|
|
47
|
+
/** Set once the user pans/zooms; after that nothing may re-fit behind their back. */
|
|
48
|
+
const touched = useRef(false);
|
|
49
|
+
const apply = useCallback((next) => {
|
|
50
|
+
view.current = next;
|
|
51
|
+
setScale(next.scale);
|
|
52
|
+
setOffset(next.offset);
|
|
53
|
+
}, []);
|
|
54
|
+
/** Natural (untransformed) size of the diagram — offsetWidth ignores transforms. */
|
|
55
|
+
const natural = useCallback(() => {
|
|
56
|
+
const el = contentRef.current;
|
|
57
|
+
if (!el || !el.offsetWidth || !el.offsetHeight)
|
|
58
|
+
return null;
|
|
59
|
+
return { w: el.offsetWidth, h: el.offsetHeight };
|
|
60
|
+
}, []);
|
|
61
|
+
const fit = useCallback(() => {
|
|
62
|
+
const stage = stageRef.current;
|
|
63
|
+
const size = natural();
|
|
64
|
+
if (!stage || !size)
|
|
65
|
+
return;
|
|
66
|
+
const pad = 32;
|
|
67
|
+
const sx = (stage.clientWidth - pad * 2) / size.w;
|
|
68
|
+
const sy = (stage.clientHeight - pad * 2) / size.h;
|
|
69
|
+
const next = clampScale(Math.min(MAX_FIT_SCALE, Math.min(sx, sy)));
|
|
70
|
+
fitScale.current = next;
|
|
71
|
+
apply({
|
|
72
|
+
scale: next,
|
|
73
|
+
offset: {
|
|
74
|
+
x: (stage.clientWidth - size.w * next) / 2,
|
|
75
|
+
y: (stage.clientHeight - size.h * next) / 2,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}, [apply, natural]);
|
|
79
|
+
useLayoutEffect(() => {
|
|
80
|
+
// Re-runs when the diagram itself changes, which happens while the message
|
|
81
|
+
// is still streaming — so a user who has already panned keeps their view.
|
|
82
|
+
if (!touched.current)
|
|
83
|
+
fit();
|
|
84
|
+
setReady(true);
|
|
85
|
+
}, [fit, sizedSvg]);
|
|
86
|
+
/** Zoom about a stage-local anchor, so the point under the cursor/fingers stays put. */
|
|
87
|
+
const zoomAt = useCallback((factor, anchor) => {
|
|
88
|
+
// Any deliberate zoom counts as touching the view — including the
|
|
89
|
+
// toolbar buttons and the wheel. Without this a diagram that is still
|
|
90
|
+
// streaming would re-fit itself out from under the reader's zoom.
|
|
91
|
+
touched.current = true;
|
|
92
|
+
const { scale: prev, offset: prevOffset } = view.current;
|
|
93
|
+
const next = clampScale(prev * factor);
|
|
94
|
+
if (next === prev)
|
|
95
|
+
return;
|
|
96
|
+
const ratio = next / prev;
|
|
97
|
+
apply({
|
|
98
|
+
scale: next,
|
|
99
|
+
offset: {
|
|
100
|
+
x: anchor.x - (anchor.x - prevOffset.x) * ratio,
|
|
101
|
+
y: anchor.y - (anchor.y - prevOffset.y) * ratio,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}, [apply]);
|
|
105
|
+
const zoomCenter = useCallback((factor) => {
|
|
106
|
+
const stage = stageRef.current;
|
|
107
|
+
if (!stage)
|
|
108
|
+
return;
|
|
109
|
+
zoomAt(factor, { x: stage.clientWidth / 2, y: stage.clientHeight / 2 });
|
|
110
|
+
}, [zoomAt]);
|
|
111
|
+
const stagePoint = (e) => {
|
|
112
|
+
const rect = stageRef.current?.getBoundingClientRect();
|
|
113
|
+
return { x: e.clientX - (rect?.left ?? 0), y: e.clientY - (rect?.top ?? 0) };
|
|
114
|
+
};
|
|
115
|
+
// Wheel must be bound manually: React's onWheel is passive, so it cannot
|
|
116
|
+
// preventDefault, and the page behind would scroll (or the browser would
|
|
117
|
+
// pinch-zoom the whole PWA on a ctrl+wheel trackpad gesture).
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
const stage = stageRef.current;
|
|
120
|
+
if (!stage)
|
|
121
|
+
return;
|
|
122
|
+
const onWheel = (e) => {
|
|
123
|
+
e.preventDefault();
|
|
124
|
+
// A trackpad pinch arrives as ctrlKey+wheel with small deltas; a mouse
|
|
125
|
+
// wheel arrives as coarse notches. Both map to the same exponential.
|
|
126
|
+
const factor = Math.exp(-e.deltaY * (e.ctrlKey ? 0.01 : 0.0015));
|
|
127
|
+
zoomAt(factor, stagePoint(e));
|
|
128
|
+
};
|
|
129
|
+
stage.addEventListener("wheel", onWheel, { passive: false });
|
|
130
|
+
return () => stage.removeEventListener("wheel", onWheel);
|
|
131
|
+
}, [zoomAt]);
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
const onKey = (e) => {
|
|
134
|
+
if (e.key === "Escape")
|
|
135
|
+
onClose();
|
|
136
|
+
else if (e.key === "+" || e.key === "=")
|
|
137
|
+
zoomCenter(1.25);
|
|
138
|
+
else if (e.key === "-" || e.key === "_")
|
|
139
|
+
zoomCenter(0.8);
|
|
140
|
+
else if (e.key === "0")
|
|
141
|
+
fit();
|
|
142
|
+
};
|
|
143
|
+
document.addEventListener("keydown", onKey);
|
|
144
|
+
return () => document.removeEventListener("keydown", onKey);
|
|
145
|
+
}, [onClose, zoomCenter, fit]);
|
|
146
|
+
// Lock body scroll while open.
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
const prev = document.body.style.overflow;
|
|
149
|
+
document.body.style.overflow = "hidden";
|
|
150
|
+
return () => {
|
|
151
|
+
document.body.style.overflow = prev;
|
|
152
|
+
};
|
|
153
|
+
}, []);
|
|
154
|
+
// Re-fit on rotation / resize only while the view is untouched, so a resize
|
|
155
|
+
// never yanks a diagram the user has deliberately panned into place.
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
const onResize = () => {
|
|
158
|
+
if (!touched.current)
|
|
159
|
+
fit();
|
|
160
|
+
};
|
|
161
|
+
window.addEventListener("resize", onResize);
|
|
162
|
+
return () => window.removeEventListener("resize", onResize);
|
|
163
|
+
}, [fit]);
|
|
164
|
+
const onPointerDown = (e) => {
|
|
165
|
+
e.currentTarget.setPointerCapture(e.pointerId);
|
|
166
|
+
pointers.current.set(e.pointerId, stagePoint(e));
|
|
167
|
+
if (pointers.current.size === 2) {
|
|
168
|
+
const [a, b] = [...pointers.current.values()];
|
|
169
|
+
pinch.current = {
|
|
170
|
+
dist: Math.hypot(a.x - b.x, a.y - b.y),
|
|
171
|
+
center: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },
|
|
172
|
+
};
|
|
173
|
+
panFrom.current = null;
|
|
174
|
+
}
|
|
175
|
+
else if (pointers.current.size === 1) {
|
|
176
|
+
panFrom.current = { pointer: stagePoint(e), offset: view.current.offset };
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const onPointerMove = (e) => {
|
|
180
|
+
if (!pointers.current.has(e.pointerId))
|
|
181
|
+
return;
|
|
182
|
+
const p = stagePoint(e);
|
|
183
|
+
pointers.current.set(e.pointerId, p);
|
|
184
|
+
if (pointers.current.size >= 2 && pinch.current) {
|
|
185
|
+
const [a, b] = [...pointers.current.values()];
|
|
186
|
+
const dist = Math.hypot(a.x - b.x, a.y - b.y);
|
|
187
|
+
const center = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };
|
|
188
|
+
if (pinch.current.dist > 0) {
|
|
189
|
+
touched.current = true;
|
|
190
|
+
// Pan and zoom in one step: the midpoint drift moves the diagram, the
|
|
191
|
+
// distance ratio scales it about that same midpoint.
|
|
192
|
+
const drift = {
|
|
193
|
+
x: center.x - pinch.current.center.x,
|
|
194
|
+
y: center.y - pinch.current.center.y,
|
|
195
|
+
};
|
|
196
|
+
// Committed through apply(), not written straight to the ref: two
|
|
197
|
+
// fingers moving in parallel (or a pinch already clamped at min/max)
|
|
198
|
+
// produce no scale change, and zoomAt() returns early — the drift
|
|
199
|
+
// would then be stranded in the ref and the diagram would not pan.
|
|
200
|
+
apply({
|
|
201
|
+
scale: view.current.scale,
|
|
202
|
+
offset: {
|
|
203
|
+
x: view.current.offset.x + drift.x,
|
|
204
|
+
y: view.current.offset.y + drift.y,
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
zoomAt(dist / pinch.current.dist, center);
|
|
208
|
+
}
|
|
209
|
+
pinch.current = { dist, center };
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (panFrom.current) {
|
|
213
|
+
touched.current = true;
|
|
214
|
+
apply({
|
|
215
|
+
scale: view.current.scale,
|
|
216
|
+
offset: {
|
|
217
|
+
x: panFrom.current.offset.x + (p.x - panFrom.current.pointer.x),
|
|
218
|
+
y: panFrom.current.offset.y + (p.y - panFrom.current.pointer.y),
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
const endPointer = (e) => {
|
|
224
|
+
pointers.current.delete(e.pointerId);
|
|
225
|
+
if (pointers.current.size >= 2) {
|
|
226
|
+
// Still pinching, but with a DIFFERENT pair (a stray third touch got
|
|
227
|
+
// lifted). Rebase the baseline, or the next move would compare the new
|
|
228
|
+
// pair's spread against the old pair's and jump.
|
|
229
|
+
const [a, b] = [...pointers.current.values()];
|
|
230
|
+
pinch.current = {
|
|
231
|
+
dist: Math.hypot(a.x - b.x, a.y - b.y),
|
|
232
|
+
center: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },
|
|
233
|
+
};
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
pinch.current = null;
|
|
237
|
+
if (pointers.current.size === 1) {
|
|
238
|
+
// Lifting one finger of a pinch must not teleport the diagram: re-anchor
|
|
239
|
+
// the pan to whichever pointer is still down.
|
|
240
|
+
const [remaining] = [...pointers.current.values()];
|
|
241
|
+
panFrom.current = { pointer: remaining, offset: view.current.offset };
|
|
242
|
+
}
|
|
243
|
+
else if (pointers.current.size === 0) {
|
|
244
|
+
panFrom.current = null;
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
const onDoubleClick = (e) => {
|
|
248
|
+
touched.current = true;
|
|
249
|
+
// Compared against the FIT scale, not against 1: a diagram that fits at
|
|
250
|
+
// 125% would otherwise read as "already zoomed" and double-click would
|
|
251
|
+
// re-fit it to exactly where it already was.
|
|
252
|
+
if (view.current.scale > fitScale.current * 1.05)
|
|
253
|
+
fit();
|
|
254
|
+
else
|
|
255
|
+
zoomAt(2, stagePoint(e));
|
|
256
|
+
};
|
|
257
|
+
const btn = "flex h-9 w-9 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-surface-raised hover:text-foreground";
|
|
258
|
+
// Portalled to <body>: message bubbles animate through framer-motion, and a
|
|
259
|
+
// transformed ancestor becomes the containing block for `fixed`, which would
|
|
260
|
+
// pin this overlay to the bubble instead of the viewport.
|
|
261
|
+
return createPortal(_jsxs("div", { className: "fixed inset-0 z-50 flex flex-col bg-background/95 backdrop-blur-sm", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-border/60 px-3 py-2", style: { paddingTop: "calc(0.5rem + env(safe-area-inset-top))" }, children: [_jsxs("span", { className: "px-1 font-[family-name:var(--font-mono)] text-xs tabular-nums text-muted-foreground", children: [Math.round(scale * 100), "%"] }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("button", { type: "button", title: "Zoom out", onClick: () => zoomCenter(0.8), className: btn, children: _jsx(Minus, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", title: "Zoom in", onClick: () => zoomCenter(1.25), className: btn, children: _jsx(Plus, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", title: "Fit to screen", onClick: fit, className: btn, children: _jsx(Maximize2, { className: "h-4 w-4" }) }), _jsx(ShareMenu, { options: buildDiagramShareOptions(source), title: "Share diagram" }), _jsx("button", { type: "button", title: "Close", onClick: onClose, className: btn, children: _jsx(X, { className: "h-4 w-4" }) })] })] }), _jsx("div", { ref: stageRef, className: "relative flex-1 cursor-grab touch-none overflow-hidden active:cursor-grabbing [&_svg]:max-w-none", onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: endPointer, onPointerCancel: endPointer, onDoubleClick: onDoubleClick, children: _jsx("div", { ref: contentRef, className: "absolute left-0 top-0 origin-top-left", style: {
|
|
262
|
+
transform: `translate(${offset.x}px, ${offset.y}px) scale(${scale})`,
|
|
263
|
+
visibility: ready ? "visible" : "hidden",
|
|
264
|
+
}, dangerouslySetInnerHTML: { __html: sizedSvg } }) })] }), document.body);
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=mermaid-viewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaid-viewer.js","sourceRoot":"","sources":["../../../src/components/chat/mermaid-viewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-share.d.ts","sourceRoot":"","sources":["../../../src/components/chat/message-share.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"message-share.d.ts","sourceRoot":"","sources":["../../../src/components/chat/message-share.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,WAAW,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC5C;AAED,wBAAgB,wBAAwB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,GAAG,WAAW,EAAE,CA0D3F"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { uiConfig } from "../../config.js";
|
|
2
2
|
import { renderAndShare, shareFile, shareText, copyRichText } from "../../lib/share.js";
|
|
3
3
|
import { stripMarkdown } from "../../lib/strip-markdown.js";
|
|
4
|
+
import { inlineMermaidDiagrams } from "../../lib/mermaid.js";
|
|
4
5
|
export function buildMessageShareOptions({ content, renderedRef }) {
|
|
5
6
|
const plain = () => stripMarkdown(content);
|
|
6
7
|
return [
|
|
@@ -8,8 +9,10 @@ export function buildMessageShareOptions({ content, renderedRef }) {
|
|
|
8
9
|
id: "image",
|
|
9
10
|
label: "Image (PNG)",
|
|
10
11
|
hint: "Rendered snapshot",
|
|
11
|
-
run: () => renderAndShare({
|
|
12
|
-
|
|
12
|
+
run: async () => renderAndShare({
|
|
13
|
+
// The render page runs without JavaScript, so mermaid fences are
|
|
14
|
+
// pre-rendered to inline SVG here on the client.
|
|
15
|
+
content: await inlineMermaidDiagrams(content),
|
|
13
16
|
contentType: "markdown",
|
|
14
17
|
format: "png",
|
|
15
18
|
filename: "message",
|
|
@@ -20,8 +23,8 @@ export function buildMessageShareOptions({ content, renderedRef }) {
|
|
|
20
23
|
id: "pdf",
|
|
21
24
|
label: "PDF",
|
|
22
25
|
hint: "Vector PDF, A4",
|
|
23
|
-
run: () => renderAndShare({
|
|
24
|
-
content,
|
|
26
|
+
run: async () => renderAndShare({
|
|
27
|
+
content: await inlineMermaidDiagrams(content),
|
|
25
28
|
contentType: "markdown",
|
|
26
29
|
format: "pdf",
|
|
27
30
|
filename: "message",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-share.js","sourceRoot":"","sources":["../../../src/components/chat/message-share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"message-share.js","sourceRoot":"","sources":["../../../src/components/chat/message-share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAS7D,MAAM,UAAU,wBAAwB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAa;IAC1E,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO;QACL;YACE,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,mBAAmB;YACzB,GAAG,EAAE,KAAK,IAAI,EAAE,CACd,cAAc,CAAC;gBACb,iEAAiE;gBACjE,iDAAiD;gBACjD,OAAO,EAAE,MAAM,qBAAqB,CAAC,OAAO,CAAC;gBAC7C,WAAW,EAAE,UAAU;gBACvB,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,QAAQ,CAAC,UAAU;aAC3B,CAAC;SACL;QACD;YACE,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,KAAK,IAAI,EAAE,CACd,cAAc,CAAC;gBACb,OAAO,EAAE,MAAM,qBAAqB,CAAC,OAAO,CAAC;gBAC7C,WAAW,EAAE,UAAU;gBACvB,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,QAAQ,CAAC,UAAU;aAC3B,CAAC;SACL;QACD;YACE,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,mBAAmB;YACzB,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;SACxC;QACD;YACE,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,uBAAuB;YAC7B,GAAG,EAAE,GAAG,EAAE,CACR,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE;gBACtE,KAAK,EAAE,QAAQ,CAAC,UAAU;aAC3B,CAAC;SACL;QACD;YACE,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,mBAAmB;YAC1B,IAAI,EAAE,yBAAyB;YAC/B,GAAG,EAAE,KAAK,IAAI,EAAE;gBACd,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAI,EAAE,SAAS,IAAI,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC;gBAChE,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACrC,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share-block.d.ts","sourceRoot":"","sources":["../../../src/components/chat/share-block.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"share-block.d.ts","sourceRoot":"","sources":["../../../src/components/chat/share-block.tsx"],"names":[],"mappings":"AASA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAYlF,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,MAAgB,EAAE,KAAK,EAAE,EAAE,eAAe,+BAoC5E"}
|
|
@@ -5,6 +5,7 @@ import { BrainMarkdown } from "./brain-markdown.js";
|
|
|
5
5
|
import { ShareMenu } from "../share/share-menu.js";
|
|
6
6
|
import { renderAndShare, shareFile, shareText, copyRichText } from "../../lib/share.js";
|
|
7
7
|
import { stripMarkdown } from "../../lib/strip-markdown.js";
|
|
8
|
+
import { inlineMermaidDiagrams } from "../../lib/mermaid.js";
|
|
8
9
|
import { Share2 } from "lucide-react";
|
|
9
10
|
const FORMAT_LABELS = {
|
|
10
11
|
image: "Share as image",
|
|
@@ -32,7 +33,9 @@ async function runFormat(fmt, body, filename, title, bodyRef) {
|
|
|
32
33
|
switch (fmt) {
|
|
33
34
|
case "image":
|
|
34
35
|
return renderAndShare({
|
|
35
|
-
|
|
36
|
+
// The render page runs without JavaScript — mermaid fences are
|
|
37
|
+
// pre-rendered to inline SVG on the client.
|
|
38
|
+
content: await inlineMermaidDiagrams(body),
|
|
36
39
|
contentType: "markdown",
|
|
37
40
|
format: "png",
|
|
38
41
|
filename,
|
|
@@ -40,7 +43,7 @@ async function runFormat(fmt, body, filename, title, bodyRef) {
|
|
|
40
43
|
});
|
|
41
44
|
case "pdf":
|
|
42
45
|
return renderAndShare({
|
|
43
|
-
content: body,
|
|
46
|
+
content: await inlineMermaidDiagrams(body),
|
|
44
47
|
contentType: "markdown",
|
|
45
48
|
format: "pdf",
|
|
46
49
|
filename,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share-block.js","sourceRoot":"","sources":["../../../src/components/chat/share-block.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"share-block.js","sourceRoot":"","sources":["../../../src/components/chat/share-block.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAoB,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,MAAM,aAAa,GAAqC;IACtD,KAAK,EAAE,gBAAgB;IACvB,GAAG,EAAE,cAAc;IACnB,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,uBAAuB;IACjC,QAAQ,EAAE,mBAAmB;CAC9B,CAAC;AAEF,MAAM,KAAK,GAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAQnF,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,KAAK,EAAmB;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,SAAS,GAAkB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3E,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAC9C,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,4EAA4E,aACzF,eAAK,SAAS,EAAC,gGAAgG,aAC7G,eAAK,SAAS,EAAC,yCAAyC,aACtD,KAAC,MAAM,IAAC,SAAS,EAAC,sCAAsC,GAAG,EAC3D,eAAM,SAAS,EAAC,sCAAsC,YACnD,KAAK,IAAI,OAAO,GACZ,EACP,eAAM,SAAS,EAAC,4FAA4F,YACzG,MAAM,GACF,IACH,EACN,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,EACjC,SAAS,EAAC,uHAAuH,YAEhI,OAAO,CAAC,KAAK,GACP,EACT,KAAC,SAAS,IAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAC,eAAe,GAAG,IACnD,IACF,EACN,cAAK,GAAG,EAAE,OAAO,EAAE,SAAS,EAAC,WAAW,YACtC,KAAC,aAAa,IAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAC,aAAa,EAAC,SAAS,SAAG,GAC9D,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,GAAqB,EACrB,IAAY,EACZ,QAAgB,EAChB,KAAyB,EACzB,OAA+C;IAE/C,OAAO;QACL,EAAE,EAAE,GAAG;QACP,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC;QACzB,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,GAAqB,EACrB,IAAY,EACZ,QAAgB,EAChB,KAAyB,EACzB,OAA+C;IAE/C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,cAAc,CAAC;gBACpB,+DAA+D;gBAC/D,4CAA4C;gBAC5C,OAAO,EAAE,MAAM,qBAAqB,CAAC,IAAI,CAAC;gBAC1C,WAAW,EAAE,UAAU;gBACvB,MAAM,EAAE,KAAK;gBACb,QAAQ;gBACR,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC,UAAU;aACpC,CAAC,CAAC;QACL,KAAK,KAAK;YACR,OAAO,cAAc,CAAC;gBACpB,OAAO,EAAE,MAAM,qBAAqB,CAAC,IAAI,CAAC;gBAC1C,WAAW,EAAE,UAAU;gBACvB,MAAM,EAAE,KAAK;gBACb,QAAQ;gBACR,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC,UAAU;aACpC,CAAC,CAAC;QACL,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,KAAK,UAAU;YACb,OAAO,SAAS,CACd,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAC7D,EAAE,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAE,CAC7B,CAAC;QACJ,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,QAAQ,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5E,OAAO,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAS;IACjC,OAAO,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;AAClE,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-viewer.d.ts","sourceRoot":"","sources":["../../../src/components/files/file-viewer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-viewer.d.ts","sourceRoot":"","sources":["../../../src/components/files/file-viewer.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,UAAU,gCAsDzB"}
|
|
@@ -12,6 +12,9 @@ import { API_BASE } from "../../lib/backend.js";
|
|
|
12
12
|
import { fetchAsFile, shareFile, renderAndShare } from "../../lib/share.js";
|
|
13
13
|
import { splitFrontmatter } from "../../lib/frontmatter.js";
|
|
14
14
|
import { stripMarkdown } from "../../lib/strip-markdown.js";
|
|
15
|
+
import { inlineMermaidDiagrams, isMermaidPath } from "../../lib/mermaid.js";
|
|
16
|
+
import { MermaidBlock } from "../chat/mermaid-block.js";
|
|
17
|
+
import { buildDiagramShareOptions } from "../chat/mermaid-share.js";
|
|
15
18
|
export function FileViewer() {
|
|
16
19
|
const currentPath = useFileStore((s) => s.currentPath);
|
|
17
20
|
const content = useFileStore((s) => s.currentContent);
|
|
@@ -24,13 +27,19 @@ export function FileViewer() {
|
|
|
24
27
|
return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-2 px-6 text-center text-sm text-muted-foreground", children: [_jsx(FolderOpen, { className: "h-8 w-8 text-muted-foreground/40" }), _jsx("span", { children: "Select a file from the tree to view it." })] }));
|
|
25
28
|
}
|
|
26
29
|
const fileName = currentPath.split("/").pop() ?? currentPath;
|
|
27
|
-
const previewAvailable = content?.kind === "markdown" ||
|
|
30
|
+
const previewAvailable = content?.kind === "markdown" ||
|
|
31
|
+
content?.kind === "html" ||
|
|
32
|
+
(content?.kind === "text" && isMermaidPath(content.path));
|
|
28
33
|
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(Toolbar, { fileName: fileName, fullPath: currentPath, size: content?.size, viewMode: viewMode, setViewMode: setViewMode, previewAvailable: previewAvailable, content: content ?? null, onRevealInTree: () => setTreeExpanded(true) }), _jsxs("div", { className: "flex-1 overflow-auto", children: [loading && (_jsxs("div", { className: "flex items-center justify-center gap-2 py-8 text-sm text-muted-foreground", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), "Loading file..."] })), error && (_jsxs("div", { className: "m-4 flex items-start gap-2 rounded-lg border border-destructive/30 bg-destructive/5 p-4 text-sm text-destructive", children: [_jsx(AlertCircle, { className: "mt-0.5 h-4 w-4 shrink-0" }), _jsx("span", { children: error })] })), !loading && !error && content && _jsx(ViewerBody, { content: content, viewMode: viewMode })] })] }));
|
|
29
34
|
}
|
|
30
35
|
function ViewerBody({ content, viewMode }) {
|
|
31
36
|
if (content.kind === "binary") {
|
|
32
37
|
return _jsx(FileViewerBinary, { content: content });
|
|
33
38
|
}
|
|
39
|
+
// Standalone mermaid source files (.mmd / .mermaid) preview as a diagram.
|
|
40
|
+
if (viewMode === "preview" && content.kind === "text" && isMermaidPath(content.path)) {
|
|
41
|
+
return (_jsx("div", { className: "brain-prose max-w-none px-6 py-4", children: _jsx(MermaidBlock, { source: content.content ?? "" }) }));
|
|
42
|
+
}
|
|
34
43
|
if (viewMode === "raw" || (content.kind !== "markdown" && content.kind !== "html")) {
|
|
35
44
|
return _jsx(FileViewerRaw, { content: content.content ?? "", fileName: content.path });
|
|
36
45
|
}
|
|
@@ -107,8 +116,10 @@ function buildFileShareOptions(content, fileName) {
|
|
|
107
116
|
id: "md-png",
|
|
108
117
|
label: "Share as image",
|
|
109
118
|
hint: "Rendered PNG snapshot",
|
|
110
|
-
run: () => renderAndShare({
|
|
111
|
-
|
|
119
|
+
run: async () => renderAndShare({
|
|
120
|
+
// The render page runs without JavaScript — mermaid fences are
|
|
121
|
+
// pre-rendered to inline SVG on the client.
|
|
122
|
+
content: await inlineMermaidDiagrams(body),
|
|
112
123
|
contentType: "markdown",
|
|
113
124
|
format: "png",
|
|
114
125
|
filename: baseName(fileName),
|
|
@@ -119,8 +130,8 @@ function buildFileShareOptions(content, fileName) {
|
|
|
119
130
|
id: "md-pdf",
|
|
120
131
|
label: "Share as PDF",
|
|
121
132
|
hint: "Vector PDF, A4",
|
|
122
|
-
run: () => renderAndShare({
|
|
123
|
-
content: body,
|
|
133
|
+
run: async () => renderAndShare({
|
|
134
|
+
content: await inlineMermaidDiagrams(body),
|
|
124
135
|
contentType: "markdown",
|
|
125
136
|
format: "pdf",
|
|
126
137
|
filename: baseName(fileName),
|
|
@@ -166,6 +177,20 @@ function buildFileShareOptions(content, fileName) {
|
|
|
166
177
|
},
|
|
167
178
|
];
|
|
168
179
|
}
|
|
180
|
+
// A standalone .mmd/.mermaid file is a diagram, so it shares like one — the
|
|
181
|
+
// same PNG/PDF/SVG/source set the in-chat diagram offers, plus its source file.
|
|
182
|
+
if (content.kind === "text" && isMermaidPath(content.path)) {
|
|
183
|
+
const source = content.content ?? "";
|
|
184
|
+
return [
|
|
185
|
+
...buildDiagramShareOptions(source, { filename: baseName(fileName) }),
|
|
186
|
+
{
|
|
187
|
+
id: "mmd-file",
|
|
188
|
+
label: "Share source file",
|
|
189
|
+
hint: "Original .mmd source",
|
|
190
|
+
run: async () => shareFile(new File([source], fileName, { type: "text/plain" }), { title: fileName }),
|
|
191
|
+
},
|
|
192
|
+
];
|
|
193
|
+
}
|
|
169
194
|
// Raw text / unknown: no share for V1 (user limited to previewable types).
|
|
170
195
|
return [];
|
|
171
196
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-viewer.js","sourceRoot":"","sources":["../../../src/components/files/file-viewer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAoB,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"file-viewer.js","sourceRoot":"","sources":["../../../src/components/files/file-viewer.tsx"],"names":[],"mappings":"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"}
|