@schlessera/brain-ui-react 0.12.1 → 0.13.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 +12 -5
- 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 +2 -1
- package/dist/components/chat/chat-page.js.map +1 -1
- package/dist/components/chat/mermaid-viewer.d.ts +11 -1
- package/dist/components/chat/mermaid-viewer.d.ts.map +1 -1
- package/dist/components/chat/mermaid-viewer.js +8 -250
- package/dist/components/chat/mermaid-viewer.js.map +1 -1
- package/dist/components/chat/message-bubble.d.ts.map +1 -1
- package/dist/components/chat/message-bubble.js +2 -1
- package/dist/components/chat/message-bubble.js.map +1 -1
- package/dist/components/chat/session-drawer.d.ts.map +1 -1
- package/dist/components/chat/session-drawer.js +11 -3
- package/dist/components/chat/session-drawer.js.map +1 -1
- package/dist/components/chat/share-card.d.ts +9 -0
- package/dist/components/chat/share-card.d.ts.map +1 -0
- package/dist/components/chat/share-card.js +58 -0
- package/dist/components/chat/share-card.js.map +1 -0
- package/dist/components/dev/share-harness.d.ts +4 -0
- package/dist/components/dev/share-harness.d.ts.map +1 -0
- package/dist/components/dev/share-harness.js +104 -0
- package/dist/components/dev/share-harness.js.map +1 -0
- package/dist/components/files/file-viewer-binary.d.ts.map +1 -1
- package/dist/components/files/file-viewer-binary.js +2 -1
- package/dist/components/files/file-viewer-binary.js.map +1 -1
- package/dist/components/files/file-viewer.d.ts.map +1 -1
- package/dist/components/files/file-viewer.js +11 -2
- package/dist/components/files/file-viewer.js.map +1 -1
- package/dist/components/images/image-share.d.ts +18 -0
- package/dist/components/images/image-share.d.ts.map +1 -0
- package/dist/components/images/image-share.js +47 -0
- package/dist/components/images/image-share.js.map +1 -0
- package/dist/components/images/image-viewer.d.ts +17 -0
- package/dist/components/images/image-viewer.d.ts.map +1 -0
- package/dist/components/images/image-viewer.js +20 -0
- package/dist/components/images/image-viewer.js.map +1 -0
- package/dist/components/images/zoomable-image.d.ts +35 -0
- package/dist/components/images/zoomable-image.d.ts.map +1 -0
- package/dist/components/images/zoomable-image.js +40 -0
- package/dist/components/images/zoomable-image.js.map +1 -0
- package/dist/components/viewer/zoom-viewer.d.ts +26 -0
- package/dist/components/viewer/zoom-viewer.d.ts.map +1 -0
- package/dist/components/viewer/zoom-viewer.js +254 -0
- package/dist/components/viewer/zoom-viewer.js.map +1 -0
- package/dist/hooks/use-share-intake.d.ts +6 -0
- package/dist/hooks/use-share-intake.d.ts.map +1 -0
- package/dist/hooks/use-share-intake.js +153 -0
- package/dist/hooks/use-share-intake.js.map +1 -0
- package/dist/hooks/use-websocket.d.ts +13 -0
- package/dist/hooks/use-websocket.d.ts.map +1 -1
- package/dist/hooks/use-websocket.js +24 -1
- package/dist/hooks/use-websocket.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/image-optimize.d.ts +62 -0
- package/dist/lib/image-optimize.d.ts.map +1 -0
- package/dist/lib/image-optimize.js +152 -0
- package/dist/lib/image-optimize.js.map +1 -0
- package/dist/lib/image-source.d.ts +13 -0
- package/dist/lib/image-source.d.ts.map +1 -0
- package/dist/lib/image-source.js +57 -0
- package/dist/lib/image-source.js.map +1 -0
- package/dist/lib/share-intake.d.ts +49 -0
- package/dist/lib/share-intake.d.ts.map +1 -0
- package/dist/lib/share-intake.js +203 -0
- package/dist/lib/share-intake.js.map +1 -0
- package/dist/stores/chat-store.d.ts +7 -1
- package/dist/stores/chat-store.d.ts.map +1 -1
- package/dist/stores/chat-store.js +13 -3
- package/dist/stores/chat-store.js.map +1 -1
- package/dist/stores/share-store.d.ts +29 -0
- package/dist/stores/share-store.d.ts.map +1 -0
- package/dist/stores/share-store.js +19 -0
- package/dist/stores/share-store.js.map +1 -0
- package/dist/styles.css +1 -1
- package/package.json +2 -2
- package/src/components/chat/brain-markdown.tsx +15 -9
- package/src/components/chat/chat-page.tsx +6 -0
- package/src/components/chat/mermaid-viewer.tsx +15 -310
- package/src/components/chat/message-bubble.tsx +6 -2
- package/src/components/chat/session-drawer.tsx +19 -3
- package/src/components/chat/share-card.tsx +185 -0
- package/src/components/dev/share-harness.tsx +243 -0
- package/src/components/files/file-viewer-binary.tsx +10 -1
- package/src/components/files/file-viewer.tsx +11 -2
- package/src/components/images/image-share.ts +57 -0
- package/src/components/images/image-viewer.tsx +50 -0
- package/src/components/images/zoomable-image.tsx +93 -0
- package/src/components/viewer/zoom-viewer.tsx +354 -0
- package/src/hooks/use-share-intake.ts +190 -0
- package/src/hooks/use-websocket.ts +24 -1
- package/src/index.ts +21 -1
- package/src/lib/image-optimize.ts +195 -0
- package/src/lib/image-source.ts +53 -0
- package/src/lib/share-intake.ts +231 -0
- package/src/stores/chat-store.ts +25 -4
- package/src/stores/share-store.ts +54 -0
|
@@ -10,6 +10,7 @@ import { isAskUserTool } from "../../lib/tool-names.js";
|
|
|
10
10
|
import { motion } from "framer-motion";
|
|
11
11
|
import { buildMessageShareOptions } from "./message-share.js";
|
|
12
12
|
import { ShareMenu } from "../share/share-menu.js";
|
|
13
|
+
import { ZoomableImage } from "../images/zoomable-image.js";
|
|
13
14
|
export function MessageBubble({ message, onToolApproval, onAskUserSubmit, onAskUserCancel, }) {
|
|
14
15
|
const isUser = message.role === "user";
|
|
15
16
|
return (_jsxs(motion.div, { initial: { opacity: 0, y: 6 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.2, ease: "easeOut" }, className: "py-4", children: [_jsxs("div", { className: "mb-2 flex items-center gap-3", children: [_jsx("span", { className: isUser
|
|
@@ -27,7 +28,7 @@ export function MessageBubble({ message, onToolApproval, onAskUserSubmit, onAskU
|
|
|
27
28
|
*/
|
|
28
29
|
function UserAttachments({ message }) {
|
|
29
30
|
if (message.attachments && message.attachments.length > 0) {
|
|
30
|
-
return (_jsx("div", { className: "flex flex-wrap gap-2", children: message.attachments.map((a, i) => (_jsx(
|
|
31
|
+
return (_jsx("div", { className: "flex flex-wrap gap-2", children: message.attachments.map((a, i) => (_jsx(ZoomableImage, { src: a.previewUrl, alt: "Attached image", toolbar: false, className: "h-20 w-20 cursor-zoom-in rounded-lg border border-border/60 object-cover" }, i))) }));
|
|
31
32
|
}
|
|
32
33
|
if (message.attachmentCount && message.attachmentCount > 0) {
|
|
33
34
|
return (_jsxs("div", { className: "inline-flex items-center gap-1.5 rounded-lg border border-border/40 bg-surface/50 px-2.5 py-1 text-xs text-muted-foreground", children: [_jsx(ImageIcon, { className: "h-3.5 w-3.5" }), message.attachmentCount, " image", message.attachmentCount === 1 ? "" : "s"] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-bubble.js","sourceRoot":"","sources":["../../../src/components/chat/message-bubble.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AAQ9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"message-bubble.js","sourceRoot":"","sources":["../../../src/components/chat/message-bubble.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-drawer.d.ts","sourceRoot":"","sources":["../../../src/components/chat/session-drawer.tsx"],"names":[],"mappings":"AAoBA,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,+
|
|
1
|
+
{"version":3,"file":"session-drawer.d.ts","sourceRoot":"","sources":["../../../src/components/chat/session-drawer.tsx"],"names":[],"mappings":"AAoBA,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,+BA6HA"}
|
|
@@ -11,6 +11,7 @@ export function SessionDrawer({ open, onClose, onResume, }) {
|
|
|
11
11
|
const clearMessages = useChatStore((s) => s.clearMessages);
|
|
12
12
|
const currentSessionId = useChatStore((s) => s.activeSessionId);
|
|
13
13
|
const runStates = useChatStore((s) => s.runStates);
|
|
14
|
+
const queueNotes = useChatStore((s) => s.queueNotes);
|
|
14
15
|
// A running/queued session other than the one in view is reattachable. Derive
|
|
15
16
|
// it from the live per-session run-state (kept current by the frame demux)
|
|
16
17
|
// rather than the deprecated status.activeSessionId, which multi-session
|
|
@@ -37,15 +38,22 @@ export function SessionDrawer({ open, onClose, onResume, }) {
|
|
|
37
38
|
onResume(session.id);
|
|
38
39
|
onClose();
|
|
39
40
|
}, className: cn("w-full rounded-lg px-3 py-2.5 text-left transition-colors hover:bg-surface-raised", session.id === currentSessionId &&
|
|
40
|
-
"border-l-2 border-primary bg-primary/5"), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "min-w-0 flex-1 truncate text-[13px] font-medium text-foreground", children: session.title || "Untitled" }), _jsx(RunBadge, { state: runStates[session.id] })] }), _jsxs("div", { className: "mt-0.5 flex items-center gap-2", children: [_jsx("span", { className: "text-[11px] text-muted-foreground", children: formatRelativeTime(session.lastActiveAt) }), session.totalCostUsd != null &&
|
|
41
|
+
"border-l-2 border-primary bg-primary/5"), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "min-w-0 flex-1 truncate text-[13px] font-medium text-foreground", children: session.title || "Untitled" }), _jsx(RunBadge, { state: runStates[session.id], note: queueNotes[session.id] })] }), _jsxs("div", { className: "mt-0.5 flex items-center gap-2", children: [_jsx("span", { className: "text-[11px] text-muted-foreground", children: formatRelativeTime(session.lastActiveAt) }), session.totalCostUsd != null &&
|
|
41
42
|
session.totalCostUsd > 0 && (_jsxs("span", { className: "text-[11px] text-muted-foreground/40", children: ["$", session.totalCostUsd.toFixed(2)] }))] })] }, session.id)))] }, group.label))))] })] }) }));
|
|
42
43
|
}
|
|
43
44
|
/** Live run-state pill on a session row (streaming / queued). */
|
|
44
|
-
function RunBadge({ state }) {
|
|
45
|
+
function RunBadge({ state, note, }) {
|
|
45
46
|
if (state !== "streaming" && state !== "queued")
|
|
46
47
|
return null;
|
|
47
48
|
const running = state === "streaming";
|
|
48
|
-
|
|
49
|
+
// A note only ever accompanies a queue under pressure, so it doubles as the
|
|
50
|
+
// "this is getting heavy" signal: the pill turns red and says how much.
|
|
51
|
+
const heavy = !running && Boolean(note);
|
|
52
|
+
return (_jsx("span", { title: note, className: cn("shrink-0 rounded-full px-1.5 py-0.5 text-[9px] font-medium uppercase tracking-wide", running
|
|
53
|
+
? "bg-primary/15 text-primary"
|
|
54
|
+
: heavy
|
|
55
|
+
? "bg-destructive/15 text-destructive"
|
|
56
|
+
: "bg-amber-500/15 text-amber-500"), children: running ? "Running" : "Queued" }));
|
|
49
57
|
}
|
|
50
58
|
function groupSessionsByDate(sessions) {
|
|
51
59
|
const dayMs = 86400000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-drawer.js","sourceRoot":"","sources":["../../../src/components/chat/session-drawer.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-drawer.js","sourceRoot":"","sources":["../../../src/components/chat/session-drawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drives the intake and renders the head of the queue.
|
|
3
|
+
*
|
|
4
|
+
* One card at a time, and the next only after the current one is gone: the
|
|
5
|
+
* client has a single unbound chat draft, so two turns started before the first
|
|
6
|
+
* `session_info` arrives would share a buffer and lose the second transcript.
|
|
7
|
+
*/
|
|
8
|
+
export declare function ShareIntake(): import("react").JSX.Element | null;
|
|
9
|
+
//# sourceMappingURL=share-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-card.d.ts","sourceRoot":"","sources":["../../../src/components/chat/share-card.tsx"],"names":[],"mappings":"AA8HA;;;;;;GAMG;AACH,wBAAgB,WAAW,uCAmD1B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { Loader2, Share2, X } from "lucide-react";
|
|
4
|
+
import { useShareIntake } from "../../hooks/use-share-intake.js";
|
|
5
|
+
import { useShareStore } from "../../stores/share-store.js";
|
|
6
|
+
/**
|
|
7
|
+
* What arrived from the system share sheet, waiting for a tap.
|
|
8
|
+
*
|
|
9
|
+
* This card is the security boundary, not a convenience. The share target is
|
|
10
|
+
* reachable by any website — a page that auto-submits a cross-site form to it
|
|
11
|
+
* is indistinguishable from a real share — so nothing is uploaded and no agent
|
|
12
|
+
* turn starts until the user has seen what arrived and confirmed it. Do not
|
|
13
|
+
* "streamline" this into an automatic send.
|
|
14
|
+
*/
|
|
15
|
+
function useThumbnails(files) {
|
|
16
|
+
const images = useMemo(() => files.filter((file) => file.type.startsWith("image/")).slice(0, 4), [files]);
|
|
17
|
+
const [thumbs, setThumbs] = useState([]);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const created = images.map((file) => ({
|
|
20
|
+
url: URL.createObjectURL(file),
|
|
21
|
+
name: file.name,
|
|
22
|
+
}));
|
|
23
|
+
setThumbs(created);
|
|
24
|
+
// These object URLs belong to this component alone — the ones handed to a
|
|
25
|
+
// sent message are made separately, and the chat store owns those.
|
|
26
|
+
return () => {
|
|
27
|
+
for (const thumb of created)
|
|
28
|
+
URL.revokeObjectURL(thumb.url);
|
|
29
|
+
setThumbs([]);
|
|
30
|
+
};
|
|
31
|
+
}, [images]);
|
|
32
|
+
return thumbs;
|
|
33
|
+
}
|
|
34
|
+
function ShareCard({ record, busy, onConfirm, onDismiss, }) {
|
|
35
|
+
const thumbs = useThumbnails(record.files);
|
|
36
|
+
const otherFiles = record.files.filter((file) => !file.type.startsWith("image/"));
|
|
37
|
+
return (_jsxs("div", { className: "mb-2 rounded-lg border border-border bg-surface p-3", children: [_jsxs("div", { className: "mb-2 flex items-center gap-2 text-xs text-muted-foreground", children: [_jsx(Share2, { className: "h-3.5 w-3.5" }), _jsx("span", { className: "flex-1", children: "Shared to your brain" }), _jsx("button", { type: "button", onClick: onDismiss, title: "Dismiss", className: "rounded p-0.5 transition-colors hover:text-foreground", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] }), _jsxs("div", { className: "flex gap-3", children: [thumbs.length > 0 && (_jsx("div", { className: "flex shrink-0 flex-wrap gap-1", children: thumbs.map((thumb) => (_jsx("img", { src: thumb.url, alt: thumb.name, className: "h-14 w-14 rounded-md border border-border object-cover" }, thumb.url))) })), _jsxs("div", { className: "min-w-0 flex-1 space-y-1 text-sm", children: [record.title && (_jsx("div", { className: "truncate font-medium text-foreground", children: record.title })), record.url && (_jsx("div", { className: "truncate text-xs text-muted-foreground", children: record.url })), record.text && (_jsx("div", { className: "line-clamp-3 text-xs text-muted-foreground", children: record.text })), otherFiles.map((file) => (_jsx("div", { className: "truncate text-xs text-muted-foreground", children: file.name }, file.name)))] })] }), _jsxs("div", { className: "mt-3 flex items-center gap-2", children: [_jsxs("button", { type: "button", onClick: onConfirm, disabled: busy, className: "flex items-center gap-2 rounded-lg bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground disabled:opacity-60", children: [busy && _jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), "Add to brain"] }), _jsx("button", { type: "button", onClick: onDismiss, disabled: busy, className: "rounded-lg border border-border px-3 py-1.5 text-sm text-muted-foreground disabled:opacity-60", children: "Dismiss" })] })] }));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Drives the intake and renders the head of the queue.
|
|
41
|
+
*
|
|
42
|
+
* One card at a time, and the next only after the current one is gone: the
|
|
43
|
+
* client has a single unbound chat draft, so two turns started before the first
|
|
44
|
+
* `session_info` arrives would share a buffer and lose the second transcript.
|
|
45
|
+
*/
|
|
46
|
+
export function ShareIntake() {
|
|
47
|
+
const { confirm, dismiss } = useShareIntake();
|
|
48
|
+
const queue = useShareStore((s) => s.queue);
|
|
49
|
+
const busy = useShareStore((s) => s.busy);
|
|
50
|
+
const error = useShareStore((s) => s.error);
|
|
51
|
+
const notes = useShareStore((s) => s.notes);
|
|
52
|
+
const setError = useShareStore((s) => s.setError);
|
|
53
|
+
const head = queue[0];
|
|
54
|
+
if (!head && !error)
|
|
55
|
+
return null;
|
|
56
|
+
return (_jsxs(_Fragment, { children: [error && (_jsxs("div", { className: "mb-2 flex items-start gap-2 rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2 text-[11px] text-destructive", children: [_jsx("div", { className: "flex-1", children: error }), _jsx("button", { type: "button", onClick: () => setError(null), title: "Dismiss", className: "shrink-0 rounded p-0.5 transition-colors hover:text-foreground", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] })), notes.length > 0 && (_jsx("div", { className: "mb-2 space-y-0.5 rounded-lg border border-border bg-surface px-3 py-2 text-[11px] text-muted-foreground", children: notes.map((note, i) => (_jsx("div", { children: note }, i))) })), head && (_jsx(ShareCard, { record: head, busy: busy, onConfirm: () => void confirm(head), onDismiss: () => dismiss(head) })), queue.length > 1 && (_jsxs("div", { className: "mb-2 text-[11px] text-muted-foreground", children: [queue.length - 1, " more share(s) waiting."] }))] }));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=share-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-card.js","sourceRoot":"","sources":["../../../src/components/chat/share-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-harness.d.ts","sourceRoot":"","sources":["../../../src/components/dev/share-harness.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,YAAY,CAAC,EAC3B,IAAgC,GACjC,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,+BAqLA"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { AlertTriangle, RefreshCw, Send, Trash2 } from "lucide-react";
|
|
4
|
+
import { DEFAULT_SHARE_TARGET_PATH, getShareStore, } from "@schlessera/brain-ui-sdk/share-target";
|
|
5
|
+
/**
|
|
6
|
+
* Dev-only stand-in for the system share sheet.
|
|
7
|
+
*
|
|
8
|
+
* A real share needs an installed PWA, and on Android the intent filters are
|
|
9
|
+
* baked into the WebAPK at install time — so every manifest change costs a
|
|
10
|
+
* reinstall and a wait. This posts the same multipart body to the same path
|
|
11
|
+
* from inside the page, which the service worker handles through exactly the
|
|
12
|
+
* same code path: same handler, same stash, same redirect. Everything except
|
|
13
|
+
* the manifest registration itself can be verified here.
|
|
14
|
+
*
|
|
15
|
+
* Two things to watch:
|
|
16
|
+
*
|
|
17
|
+
* - The page must be CONTROLLED by the service worker. If it is not, the POST
|
|
18
|
+
* goes to the network instead, which is what the warning below is for.
|
|
19
|
+
* - A `fetch()` is not a navigation. Its `mode` is "cors" rather than
|
|
20
|
+
* "navigate", and it carries the session cookie, which a real cross-site
|
|
21
|
+
* share never does. So this exercises the handler and the stash faithfully,
|
|
22
|
+
* but never the browser rendering the landing page — and it cannot tell you
|
|
23
|
+
* anything about how an UNAUTHENTICATED share behaves.
|
|
24
|
+
*/
|
|
25
|
+
function formatBytes(bytes) {
|
|
26
|
+
if (bytes < 1024)
|
|
27
|
+
return `${bytes} B`;
|
|
28
|
+
if (bytes < 1024 * 1024)
|
|
29
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
30
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
31
|
+
}
|
|
32
|
+
export function ShareHarness({ path = DEFAULT_SHARE_TARGET_PATH, }) {
|
|
33
|
+
const [title, setTitle] = useState("");
|
|
34
|
+
const [text, setText] = useState("An article worth keeping");
|
|
35
|
+
const [url, setUrl] = useState("https://example.com/post");
|
|
36
|
+
const [files, setFiles] = useState([]);
|
|
37
|
+
const [result, setResult] = useState(null);
|
|
38
|
+
const [error, setError] = useState(null);
|
|
39
|
+
const [pending, setPending] = useState([]);
|
|
40
|
+
const [controlled, setControlled] = useState(true);
|
|
41
|
+
const refresh = useCallback(async () => {
|
|
42
|
+
try {
|
|
43
|
+
setPending(await getShareStore().list());
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
47
|
+
}
|
|
48
|
+
}, []);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (typeof navigator === "undefined" || !("serviceWorker" in navigator)) {
|
|
51
|
+
setControlled(false);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Re-read on takeover: the interesting case is a page that starts
|
|
55
|
+
// uncontrolled and gains a worker, which is exactly when a fixed initial
|
|
56
|
+
// reading would leave the warning lying.
|
|
57
|
+
const update = () => setControlled(navigator.serviceWorker.controller !== null);
|
|
58
|
+
update();
|
|
59
|
+
navigator.serviceWorker.addEventListener("controllerchange", update);
|
|
60
|
+
void refresh();
|
|
61
|
+
return () => navigator.serviceWorker.removeEventListener("controllerchange", update);
|
|
62
|
+
}, [refresh]);
|
|
63
|
+
async function send() {
|
|
64
|
+
setError(null);
|
|
65
|
+
setResult(null);
|
|
66
|
+
const form = new FormData();
|
|
67
|
+
if (title)
|
|
68
|
+
form.set("title", title);
|
|
69
|
+
if (text)
|
|
70
|
+
form.set("text", text);
|
|
71
|
+
if (url)
|
|
72
|
+
form.set("url", url);
|
|
73
|
+
for (const file of files)
|
|
74
|
+
form.append("files", file);
|
|
75
|
+
try {
|
|
76
|
+
// The service worker answers with a 303 and fetch follows it, so the
|
|
77
|
+
// final URL is what the browser would have landed on after a real share
|
|
78
|
+
// — including the ?share= id.
|
|
79
|
+
const response = await fetch(path, { method: "POST", body: form });
|
|
80
|
+
if (response.ok) {
|
|
81
|
+
setResult(response.url);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
setError(`${response.status} ${response.statusText}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
// Refresh either way: a failed send can still have stashed something.
|
|
92
|
+
await refresh();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function drop(id) {
|
|
96
|
+
await getShareStore().delete(id);
|
|
97
|
+
await refresh();
|
|
98
|
+
}
|
|
99
|
+
return (_jsxs("div", { className: "mx-auto flex max-w-2xl flex-col gap-6 p-6 text-foreground", children: [_jsxs("header", { className: "flex flex-col gap-1", children: [_jsx("h1", { className: "text-xl font-semibold", children: "Share target harness" }), _jsxs("p", { className: "text-sm text-muted-foreground", children: ["Posts a multipart share to ", _jsx("code", { children: path }), " from inside the page. The service worker handles it exactly as it would a real share."] })] }), !controlled && (_jsxs("div", { className: "flex items-start gap-2 rounded-lg border border-border bg-surface-raised p-3 text-sm", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-4 w-4 shrink-0" }), _jsx("span", { children: "No service worker controls this page, so the POST goes to the network and the server answers with the no-worker fallback rather than stashing anything. Load a production build (the worker is disabled in dev) and reload once after it installs." })] })), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx(Field, { label: "title", value: title, onChange: setTitle }), _jsx(Field, { label: "text", value: text, onChange: setText }), _jsx(Field, { label: "url", value: url, onChange: setUrl }), _jsxs("label", { className: "flex flex-col gap-1 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: "files" }), _jsx("input", { type: "file", multiple: true, onChange: (e) => setFiles(Array.from(e.target.files ?? [])), className: "text-sm" })] }), _jsxs("button", { type: "button", onClick: () => void send(), className: "flex items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground", children: [_jsx(Send, { className: "h-4 w-4" }), "Share it"] })] }), error && (_jsx("p", { className: "rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-sm", children: error })), result && (_jsxs("div", { className: "flex flex-col gap-2 rounded-lg border border-border p-3 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: "Landed on" }), _jsx("code", { className: "break-all", children: result }), _jsx("button", { type: "button", onClick: () => window.location.assign(result), className: "self-start rounded-md border border-border px-3 py-1 text-sm", children: "Open it" })] })), _jsxs("section", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("h2", { className: "text-sm font-medium", children: ["Stashed shares (", pending.length, ")"] }), _jsxs("button", { type: "button", onClick: () => void refresh(), className: "flex items-center gap-1 text-sm text-muted-foreground", children: [_jsx(RefreshCw, { className: "h-3.5 w-3.5" }), "Refresh"] })] }), pending.length === 0 && (_jsx("p", { className: "text-sm text-muted-foreground", children: "Nothing stashed." })), pending.map((share) => (_jsxs("div", { className: "flex flex-col gap-1 rounded-lg border border-border p-3 text-sm", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("code", { className: "break-all text-xs text-muted-foreground", children: share.id }), _jsx("button", { type: "button", onClick: () => void drop(share.id), "aria-label": "Delete stashed share", className: "text-muted-foreground", children: _jsx(Trash2, { className: "h-4 w-4" }) })] }), share.title && _jsxs("div", { children: ["title: ", share.title] }), share.text && _jsxs("div", { children: ["text: ", share.text] }), share.url && _jsxs("div", { children: ["url: ", share.url] }), share.files.map((file, i) => (_jsxs("div", { className: "text-muted-foreground", children: [file.name, " (", file.type || "unknown", ", ", formatBytes(file.size), ")"] }, `${file.name}-${i}`)))] }, share.id)))] })] }));
|
|
100
|
+
}
|
|
101
|
+
function Field({ label, value, onChange, }) {
|
|
102
|
+
return (_jsxs("label", { className: "flex flex-col gap-1 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: label }), _jsx("input", { type: "text", value: value, onChange: (e) => onChange(e.target.value), className: "rounded-lg border border-border bg-surface px-3 py-2 text-sm" })] }));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=share-harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-harness.js","sourceRoot":"","sources":["../../../src/components/dev/share-harness.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-viewer-binary.d.ts","sourceRoot":"","sources":["../../../src/components/files/file-viewer-binary.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"file-viewer-binary.d.ts","sourceRoot":"","sources":["../../../src/components/files/file-viewer-binary.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAI7E,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,mBAAmB,CAAA;CAAE,+BA4D7E"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { FileWarning, Download } from "lucide-react";
|
|
3
3
|
import { API_BASE } from "../../lib/backend.js";
|
|
4
|
+
import { ZoomableImage } from "../images/zoomable-image.js";
|
|
4
5
|
export function FileViewerBinary({ content }) {
|
|
5
6
|
const isImage = content.mime?.startsWith("image/");
|
|
6
7
|
const rawUrl = `${API_BASE}/files/content?path=${encodeURIComponent(content.path)}&raw=1`;
|
|
7
8
|
if (isImage) {
|
|
8
9
|
const filename = content.path.split("/").pop() ?? content.path;
|
|
9
|
-
return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-3 p-6", children: [_jsx("div", { className: "flex max-h-full max-w-full overflow-auto rounded-lg border border-border bg-surface p-2", children: _jsx(
|
|
10
|
+
return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-3 p-6", children: [_jsx("div", { className: "flex max-h-full max-w-full overflow-auto rounded-lg border border-border bg-surface p-2", children: _jsx(ZoomableImage, { src: rawUrl, alt: content.path, className: "max-h-[70vh] max-w-full cursor-zoom-in object-contain", mime: content.mime, bytes: content.size }) }), _jsxs("div", { className: "flex flex-wrap items-center justify-center gap-2 text-xs text-muted-foreground", children: [_jsxs("span", { children: [content.mime, " \u00B7 ", formatSize(content.size)] }), _jsx("span", { className: "text-muted-foreground/40", children: "\u00B7" }), _jsxs("a", { href: rawUrl, download: filename, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 rounded text-muted-foreground transition-colors hover:text-foreground", children: [_jsx(Download, { className: "h-3 w-3" }), "Download"] })] })] }));
|
|
10
11
|
}
|
|
11
12
|
return (_jsxs("div", { className: "m-6 flex flex-col items-start gap-3 rounded-lg border border-border bg-surface p-6", children: [_jsxs("div", { className: "flex items-center gap-2 text-foreground", children: [_jsx(FileWarning, { className: "h-5 w-5 text-muted-foreground" }), _jsx("span", { className: "font-medium", children: "Preview not available" })] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: [content.mime ?? "unknown", " \u00B7 ", formatSize(content.size)] }), _jsxs("a", { href: rawUrl, download: content.path.split("/").pop() ?? content.path, target: "_blank", rel: "noopener noreferrer", className: "mt-1 inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs text-foreground transition-colors hover:bg-surface-raised", children: [_jsx(Download, { className: "h-3.5 w-3.5" }), "Download"] })] }));
|
|
12
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-viewer-binary.js","sourceRoot":"","sources":["../../../src/components/files/file-viewer-binary.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"file-viewer-binary.js","sourceRoot":"","sources":["../../../src/components/files/file-viewer-binary.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,UAAU,gBAAgB,CAAC,EAAE,OAAO,EAAoC;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,GAAG,QAAQ,uBAAuB,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;IAE1F,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;QAC/D,OAAO,CACL,eAAK,SAAS,EAAC,4DAA4D,aACzE,cAAK,SAAS,EAAC,yFAAyF,YAGtG,KAAC,aAAa,IACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,OAAO,CAAC,IAAI,EACjB,SAAS,EAAC,uDAAuD,EACjE,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,KAAK,EAAE,OAAO,CAAC,IAAI,GACnB,GACE,EACN,eAAK,SAAS,EAAC,gFAAgF,aAC7F,2BACG,OAAO,CAAC,IAAI,cAAK,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IACrC,EACP,eAAM,SAAS,EAAC,0BAA0B,uBAAS,EACnD,aACE,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,sGAAsG,aAEhH,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,gBAE9B,IACA,IACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,oFAAoF,aACjG,eAAK,SAAS,EAAC,yCAAyC,aACtD,KAAC,WAAW,IAAC,SAAS,EAAC,+BAA+B,GAAG,EACzD,eAAM,SAAS,EAAC,aAAa,sCAA6B,IACtD,EACN,eAAK,SAAS,EAAC,+BAA+B,aAC3C,OAAO,CAAC,IAAI,IAAI,SAAS,cAAK,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IACnD,EACN,aACE,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,IAAI,EACvD,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,mKAAmK,aAE7K,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,gBAElC,IACA,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,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":"AAmBA,wBAAgB,UAAU,gCAsDzB"}
|
|
@@ -15,6 +15,7 @@ import { stripMarkdown } from "../../lib/strip-markdown.js";
|
|
|
15
15
|
import { inlineMermaidDiagrams, isMermaidPath } from "../../lib/mermaid.js";
|
|
16
16
|
import { MermaidBlock } from "../chat/mermaid-block.js";
|
|
17
17
|
import { buildDiagramShareOptions } from "../chat/mermaid-share.js";
|
|
18
|
+
import { buildImageShareOptions } from "../images/image-share.js";
|
|
18
19
|
export function FileViewer() {
|
|
19
20
|
const currentPath = useFileStore((s) => s.currentPath);
|
|
20
21
|
const content = useFileStore((s) => s.currentContent);
|
|
@@ -69,9 +70,17 @@ function formatSize(bytes) {
|
|
|
69
70
|
}
|
|
70
71
|
function buildFileShareOptions(content, fileName) {
|
|
71
72
|
const rawUrl = `${API_BASE}/files/content?path=${encodeURIComponent(content.path)}&raw=1`;
|
|
72
|
-
// Single-action share for previewable images / PDFs: ship the bytes as-is.
|
|
73
73
|
if (content.kind === "binary") {
|
|
74
|
-
|
|
74
|
+
// An image gets both: the original bytes, and a lighter re-encode for
|
|
75
|
+
// messaging. The original is first, and nothing is downgraded unasked.
|
|
76
|
+
if (content.mime?.startsWith("image/")) {
|
|
77
|
+
return buildImageShareOptions(rawUrl, fileName, {
|
|
78
|
+
mime: content.mime,
|
|
79
|
+
bytes: content.size,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// A PDF ships as-is: there is no client-side recompression for one.
|
|
83
|
+
if (content.mime === "application/pdf") {
|
|
75
84
|
return [
|
|
76
85
|
{
|
|
77
86
|
id: "file",
|
|
@@ -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;AAC5D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"file-viewer.js","sourceRoot":"","sources":["../../../src/components/files/file-viewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ShareOption } from "../share/share-menu.js";
|
|
2
|
+
/**
|
|
3
|
+
* Share options for one image, used by both the file viewer's header menu and
|
|
4
|
+
* the full-screen image viewer.
|
|
5
|
+
*
|
|
6
|
+
* Two deliberate actions rather than one silently-processed payload:
|
|
7
|
+
*
|
|
8
|
+
* - **Original** ships the bytes untouched. This is the default and the first
|
|
9
|
+
* entry; a generated image is worth what its pixels are worth.
|
|
10
|
+
* - **Optimized** re-encodes down toward a messaging-friendly size, and only
|
|
11
|
+
* when that actually changes something — an image already inside the target
|
|
12
|
+
* falls back to the original rather than being recompressed for show.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildImageShareOptions(url: string, filename: string, opts?: {
|
|
15
|
+
mime?: string;
|
|
16
|
+
bytes?: number;
|
|
17
|
+
}): ShareOption[];
|
|
18
|
+
//# sourceMappingURL=image-share.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-share.d.ts","sourceRoot":"","sources":["../../../src/components/images/image-share.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3C,WAAW,EAAE,CA+Bf"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { fetchAsFile, shareFile } from "../../lib/share.js";
|
|
2
|
+
import { SHARE_OPTIMIZED, formatBytes, optimizeImage, optimizedFilename, } from "../../lib/image-optimize.js";
|
|
3
|
+
/**
|
|
4
|
+
* Share options for one image, used by both the file viewer's header menu and
|
|
5
|
+
* the full-screen image viewer.
|
|
6
|
+
*
|
|
7
|
+
* Two deliberate actions rather than one silently-processed payload:
|
|
8
|
+
*
|
|
9
|
+
* - **Original** ships the bytes untouched. This is the default and the first
|
|
10
|
+
* entry; a generated image is worth what its pixels are worth.
|
|
11
|
+
* - **Optimized** re-encodes down toward a messaging-friendly size, and only
|
|
12
|
+
* when that actually changes something — an image already inside the target
|
|
13
|
+
* falls back to the original rather than being recompressed for show.
|
|
14
|
+
*/
|
|
15
|
+
export function buildImageShareOptions(url, filename, opts = {}) {
|
|
16
|
+
const shareOriginal = async () => {
|
|
17
|
+
const file = await fetchAsFile(url, filename, opts.mime);
|
|
18
|
+
return shareFile(file, { title: filename });
|
|
19
|
+
};
|
|
20
|
+
return [
|
|
21
|
+
{
|
|
22
|
+
id: "image-original",
|
|
23
|
+
label: "Share original",
|
|
24
|
+
hint: opts.bytes ? `Full quality · ${formatBytes(opts.bytes)}` : "Full quality",
|
|
25
|
+
run: shareOriginal,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "image-optimized",
|
|
29
|
+
label: "Share optimized",
|
|
30
|
+
hint: `JPEG, up to ${SHARE_OPTIMIZED.maxEdge}px · under ${formatBytes(SHARE_OPTIMIZED.maxBytes)}`,
|
|
31
|
+
run: async () => {
|
|
32
|
+
const original = await fetchAsFile(url, filename, opts.mime);
|
|
33
|
+
const result = await optimizeImage(original, SHARE_OPTIMIZED);
|
|
34
|
+
// null means "nothing to gain" (already small enough) or "could not be
|
|
35
|
+
// decoded". Either way the original is the right thing to send, and
|
|
36
|
+
// silently sending nothing would be worse than sending more bytes.
|
|
37
|
+
if (!result)
|
|
38
|
+
return shareFile(original, { title: filename });
|
|
39
|
+
const file = new File([result.blob], optimizedFilename(filename), {
|
|
40
|
+
type: "image/jpeg",
|
|
41
|
+
});
|
|
42
|
+
return shareFile(file, { title: filename });
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=image-share.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-share.js","sourceRoot":"","sources":["../../../src/components/images/image-share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAGrC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAW,EACX,QAAgB,EAChB,OAA0C,EAAE;IAE5C,MAAM,aAAa,GAAG,KAAK,IAAsB,EAAE;QACjD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,OAAO;QACL;YACE,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc;YAC/E,GAAG,EAAE,aAAa;SACnB;QACD;YACE,EAAE,EAAE,iBAAiB;YACrB,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,eAAe,eAAe,CAAC,OAAO,cAAc,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE;YACjG,GAAG,EAAE,KAAK,IAAI,EAAE;gBACd,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAC9D,uEAAuE;gBACvE,oEAAoE;gBACpE,mEAAmE;gBACnE,IAAI,CAAC,MAAM;oBAAE,OAAO,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC7D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE;oBAChE,IAAI,EAAE,YAAY;iBACnB,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9C,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Full-screen, pan-and-zoom view of one image — the same surface the mermaid
|
|
3
|
+
* viewer uses, so a diagram and a picture behave identically.
|
|
4
|
+
*
|
|
5
|
+
* `maxFitScale: 1` because raster pixels are finite: opening a 400px image at
|
|
6
|
+
* 250% would show nothing but interpolation. Zooming past 100% is still
|
|
7
|
+
* available, it just is not where the viewer starts.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ImageViewer({ src, alt, filename, mime, bytes, onClose, }: {
|
|
10
|
+
src: string;
|
|
11
|
+
alt?: string;
|
|
12
|
+
filename: string;
|
|
13
|
+
mime?: string;
|
|
14
|
+
bytes?: number;
|
|
15
|
+
onClose: () => void;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=image-viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-viewer.d.ts","sourceRoot":"","sources":["../../../src/components/images/image-viewer.tsx"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,OAAO,GACR,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,+BAsBA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { ShareMenu } from "../share/share-menu.js";
|
|
4
|
+
import { ZoomViewer } from "../viewer/zoom-viewer.js";
|
|
5
|
+
import { buildImageShareOptions } from "./image-share.js";
|
|
6
|
+
/**
|
|
7
|
+
* Full-screen, pan-and-zoom view of one image — the same surface the mermaid
|
|
8
|
+
* viewer uses, so a diagram and a picture behave identically.
|
|
9
|
+
*
|
|
10
|
+
* `maxFitScale: 1` because raster pixels are finite: opening a 400px image at
|
|
11
|
+
* 250% would show nothing but interpolation. Zooming past 100% is still
|
|
12
|
+
* available, it just is not where the viewer starts.
|
|
13
|
+
*/
|
|
14
|
+
export function ImageViewer({ src, alt, filename, mime, bytes, onClose, }) {
|
|
15
|
+
// The natural size is unknown until the decode finishes, and `fit()` measures
|
|
16
|
+
// the DOM — so the load event is what tells the viewer to fit.
|
|
17
|
+
const [loaded, setLoaded] = useState(false);
|
|
18
|
+
return (_jsx(ZoomViewer, { onClose: onClose, refitKey: loaded ? src : null, maxFitScale: 1, label: `Image viewer: ${filename}`, actions: _jsx(ShareMenu, { options: buildImageShareOptions(src, filename, { mime, bytes }), title: "Share image" }), children: _jsx("img", { src: src, alt: alt ?? filename, onLoad: () => setLoaded(true), draggable: false }) }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=image-viewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-viewer.js","sourceRoot":"","sources":["../../../src/components/images/image-viewer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,GAAG,EACH,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,OAAO,GAQR;IACC,8EAA8E;IAC9E,+DAA+D;IAC/D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,OAAO,CACL,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAC7B,WAAW,EAAE,CAAC,EACd,KAAK,EAAE,iBAAiB,QAAQ,EAAE,EAClC,OAAO,EACL,KAAC,SAAS,IACR,OAAO,EAAE,sBAAsB,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAC/D,KAAK,EAAC,aAAa,GACnB,YAIJ,cAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,GAAI,GAC7E,CACd,CAAC;AACJ,CAAC"}
|