@printwithsynergy/lens-pdf 0.3.0-beta.81
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/LICENSE +661 -0
- package/README.md +344 -0
- package/dist/browser/codexOverlay.d.ts +109 -0
- package/dist/browser/codexOverlay.d.ts.map +1 -0
- package/dist/browser/codexOverlay.js +256 -0
- package/dist/browser/codexOverlay.js.map +1 -0
- package/dist/browser/constants.d.ts +13 -0
- package/dist/browser/constants.d.ts.map +1 -0
- package/dist/browser/constants.js +13 -0
- package/dist/browser/constants.js.map +1 -0
- package/dist/browser/index.d.ts +211 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +1190 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/pantone-gold.d.ts +59 -0
- package/dist/browser/pantone-gold.d.ts.map +1 -0
- package/dist/browser/pantone-gold.js +237 -0
- package/dist/browser/pantone-gold.js.map +1 -0
- package/dist/components/AnnotationCanvas.d.ts +27 -0
- package/dist/components/AnnotationCanvas.d.ts.map +1 -0
- package/dist/components/AnnotationCanvas.js +401 -0
- package/dist/components/AnnotationCanvas.js.map +1 -0
- package/dist/components/AnnotationNotesPanel.d.ts +15 -0
- package/dist/components/AnnotationNotesPanel.d.ts.map +1 -0
- package/dist/components/AnnotationNotesPanel.js +235 -0
- package/dist/components/AnnotationNotesPanel.js.map +1 -0
- package/dist/components/AnnotationThread.d.ts +18 -0
- package/dist/components/AnnotationThread.d.ts.map +1 -0
- package/dist/components/AnnotationThread.js +163 -0
- package/dist/components/AnnotationThread.js.map +1 -0
- package/dist/components/AnnotationToolbar.d.ts +39 -0
- package/dist/components/AnnotationToolbar.d.ts.map +1 -0
- package/dist/components/AnnotationToolbar.js +258 -0
- package/dist/components/AnnotationToolbar.js.map +1 -0
- package/dist/components/BoxOverlay.d.ts +20 -0
- package/dist/components/BoxOverlay.d.ts.map +1 -0
- package/dist/components/BoxOverlay.js +107 -0
- package/dist/components/BoxOverlay.js.map +1 -0
- package/dist/components/ColorPickerTool.d.ts +11 -0
- package/dist/components/ColorPickerTool.d.ts.map +1 -0
- package/dist/components/ColorPickerTool.js +220 -0
- package/dist/components/ColorPickerTool.js.map +1 -0
- package/dist/components/DensitometerTool.d.ts +25 -0
- package/dist/components/DensitometerTool.d.ts.map +1 -0
- package/dist/components/DensitometerTool.js +246 -0
- package/dist/components/DensitometerTool.js.map +1 -0
- package/dist/components/DielineInfoPanel.d.ts +27 -0
- package/dist/components/DielineInfoPanel.d.ts.map +1 -0
- package/dist/components/DielineInfoPanel.js +23 -0
- package/dist/components/DielineInfoPanel.js.map +1 -0
- package/dist/components/DielineOverlay.d.ts +10 -0
- package/dist/components/DielineOverlay.d.ts.map +1 -0
- package/dist/components/DielineOverlay.js +57 -0
- package/dist/components/DielineOverlay.js.map +1 -0
- package/dist/components/FindingsSidebar.d.ts +50 -0
- package/dist/components/FindingsSidebar.d.ts.map +1 -0
- package/dist/components/FindingsSidebar.js +78 -0
- package/dist/components/FindingsSidebar.js.map +1 -0
- package/dist/components/LayerCanvas.d.ts +30 -0
- package/dist/components/LayerCanvas.d.ts.map +1 -0
- package/dist/components/LayerCanvas.js +84 -0
- package/dist/components/LayerCanvas.js.map +1 -0
- package/dist/components/LayerPanel.d.ts +9 -0
- package/dist/components/LayerPanel.d.ts.map +1 -0
- package/dist/components/LayerPanel.js +144 -0
- package/dist/components/LayerPanel.js.map +1 -0
- package/dist/components/LensPDF.d.ts +61 -0
- package/dist/components/LensPDF.d.ts.map +1 -0
- package/dist/components/LensPDF.js +49 -0
- package/dist/components/LensPDF.js.map +1 -0
- package/dist/components/LensPDFDemo.d.ts +160 -0
- package/dist/components/LensPDFDemo.d.ts.map +1 -0
- package/dist/components/LensPDFDemo.js +1060 -0
- package/dist/components/LensPDFDemo.js.map +1 -0
- package/dist/components/LensPDFDemo.styles.d.ts +38 -0
- package/dist/components/LensPDFDemo.styles.d.ts.map +1 -0
- package/dist/components/LensPDFDemo.styles.js +282 -0
- package/dist/components/LensPDFDemo.styles.js.map +1 -0
- package/dist/components/LensPDFViewer.d.ts +79 -0
- package/dist/components/LensPDFViewer.d.ts.map +1 -0
- package/dist/components/LensPDFViewer.js +254 -0
- package/dist/components/LensPDFViewer.js.map +1 -0
- package/dist/components/MeasureTool.d.ts +16 -0
- package/dist/components/MeasureTool.d.ts.map +1 -0
- package/dist/components/MeasureTool.js +137 -0
- package/dist/components/MeasureTool.js.map +1 -0
- package/dist/components/MobileBottomSheet.d.ts +12 -0
- package/dist/components/MobileBottomSheet.d.ts.map +1 -0
- package/dist/components/MobileBottomSheet.js +113 -0
- package/dist/components/MobileBottomSheet.js.map +1 -0
- package/dist/components/MobileDrawer.d.ts +31 -0
- package/dist/components/MobileDrawer.d.ts.map +1 -0
- package/dist/components/MobileDrawer.js +67 -0
- package/dist/components/MobileDrawer.js.map +1 -0
- package/dist/components/PageCanvas.d.ts +33 -0
- package/dist/components/PageCanvas.d.ts.map +1 -0
- package/dist/components/PageCanvas.js +385 -0
- package/dist/components/PageCanvas.js.map +1 -0
- package/dist/components/PageNavigator.d.ts +18 -0
- package/dist/components/PageNavigator.d.ts.map +1 -0
- package/dist/components/PageNavigator.js +44 -0
- package/dist/components/PageNavigator.js.map +1 -0
- package/dist/components/SeparationCanvas.d.ts +12 -0
- package/dist/components/SeparationCanvas.d.ts.map +1 -0
- package/dist/components/SeparationCanvas.js +174 -0
- package/dist/components/SeparationCanvas.js.map +1 -0
- package/dist/components/TACHeatmapOverlay.d.ts +17 -0
- package/dist/components/TACHeatmapOverlay.d.ts.map +1 -0
- package/dist/components/TACHeatmapOverlay.js +119 -0
- package/dist/components/TACHeatmapOverlay.js.map +1 -0
- package/dist/components/ZoomControls.d.ts +11 -0
- package/dist/components/ZoomControls.d.ts.map +1 -0
- package/dist/components/ZoomControls.js +26 -0
- package/dist/components/ZoomControls.js.map +1 -0
- package/dist/components/defaultShellPlugins.d.ts +3 -0
- package/dist/components/defaultShellPlugins.d.ts.map +1 -0
- package/dist/components/defaultShellPlugins.js +273 -0
- package/dist/components/defaultShellPlugins.js.map +1 -0
- package/dist/components/index.d.ts +32 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +32 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/presets.d.ts +8 -0
- package/dist/components/presets.d.ts.map +1 -0
- package/dist/components/presets.js +14 -0
- package/dist/components/presets.js.map +1 -0
- package/dist/components/shellPlugins.d.ts +105 -0
- package/dist/components/shellPlugins.d.ts.map +1 -0
- package/dist/components/shellPlugins.js +52 -0
- package/dist/components/shellPlugins.js.map +1 -0
- package/dist/components/useIsMobile.d.ts +16 -0
- package/dist/components/useIsMobile.d.ts.map +1 -0
- package/dist/components/useIsMobile.js +30 -0
- package/dist/components/useIsMobile.js.map +1 -0
- package/dist/fallback-pdfjs/index.d.ts +60 -0
- package/dist/fallback-pdfjs/index.d.ts.map +1 -0
- package/dist/fallback-pdfjs/index.js +163 -0
- package/dist/fallback-pdfjs/index.js.map +1 -0
- package/dist/host/LensPDFProvider.d.ts +36 -0
- package/dist/host/LensPDFProvider.d.ts.map +1 -0
- package/dist/host/LensPDFProvider.js +12 -0
- package/dist/host/LensPDFProvider.js.map +1 -0
- package/dist/host/index.d.ts +167 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +173 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pdfFallback.d.ts +50 -0
- package/dist/host/pdfFallback.d.ts.map +1 -0
- package/dist/host/pdfFallback.js +171 -0
- package/dist/host/pdfFallback.js.map +1 -0
- package/dist/host/pdfValidation.d.ts +45 -0
- package/dist/host/pdfValidation.d.ts.map +1 -0
- package/dist/host/pdfValidation.js +78 -0
- package/dist/host/pdfValidation.js.map +1 -0
- package/dist/host/shareLink.d.ts +80 -0
- package/dist/host/shareLink.d.ts.map +1 -0
- package/dist/host/shareLink.js +114 -0
- package/dist/host/shareLink.js.map +1 -0
- package/dist/host/useLensPDF.d.ts +73 -0
- package/dist/host/useLensPDF.d.ts.map +1 -0
- package/dist/host/useLensPDF.js +213 -0
- package/dist/host/useLensPDF.js.map +1 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/context.d.ts +70 -0
- package/dist/plugin/context.d.ts.map +1 -0
- package/dist/plugin/context.js +16 -0
- package/dist/plugin/context.js.map +1 -0
- package/dist/plugin/findings-location.d.ts +53 -0
- package/dist/plugin/findings-location.d.ts.map +1 -0
- package/dist/plugin/findings-location.js +72 -0
- package/dist/plugin/findings-location.js.map +1 -0
- package/dist/plugin/index.d.ts +19 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +16 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/registry.d.ts +61 -0
- package/dist/plugin/registry.d.ts.map +1 -0
- package/dist/plugin/registry.js +102 -0
- package/dist/plugin/registry.js.map +1 -0
- package/dist/plugin/services.d.ts +380 -0
- package/dist/plugin/services.d.ts.map +1 -0
- package/dist/plugin/services.js +104 -0
- package/dist/plugin/services.js.map +1 -0
- package/dist/plugin/types.d.ts +198 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin/types.js +24 -0
- package/dist/plugin/types.js.map +1 -0
- package/dist/types/index.d.ts +191 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +95 -0
- package/dist/types/index.js.map +1 -0
- package/dist/units/index.d.ts +64 -0
- package/dist/units/index.d.ts.map +1 -0
- package/dist/units/index.js +98 -0
- package/dist/units/index.js.map +1 -0
- package/docs/architecture.md +90 -0
- package/docs/components.md +569 -0
- package/docs/contributing.md +78 -0
- package/docs/fallback.md +174 -0
- package/docs/lens-pdf-viewer.md +128 -0
- package/docs/licensing.md +78 -0
- package/docs/measurement-units.md +87 -0
- package/docs/plugins.md +256 -0
- package/docs/security.md +69 -0
- package/docs/server.md +212 -0
- package/docs/services.md +210 -0
- package/docs/share-links.md +111 -0
- package/docs/theming.md +164 -0
- package/docs/validation.md +83 -0
- package/package.json +139 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ViewerConfig } from "../types";
|
|
2
|
+
type ViewerMode = "normal" | "separation" | "layers" | "annotation" | "comparison" | "health" | "chain";
|
|
3
|
+
type MeasureMode = "none" | "color_picker" | "densitometer" | "ruler";
|
|
4
|
+
interface MobileDrawerProps {
|
|
5
|
+
isOpen: boolean;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
config: ViewerConfig;
|
|
8
|
+
viewerMode: ViewerMode;
|
|
9
|
+
onToggleMode: (mode: ViewerMode) => void;
|
|
10
|
+
measureMode: MeasureMode;
|
|
11
|
+
onToggleMeasure: (mode: MeasureMode) => void;
|
|
12
|
+
showTacHeatmap: boolean;
|
|
13
|
+
onToggleTacHeatmap: () => void;
|
|
14
|
+
showBoxOverlay: boolean;
|
|
15
|
+
onToggleBoxOverlay: () => void;
|
|
16
|
+
fileName?: string;
|
|
17
|
+
findingSummary: {
|
|
18
|
+
error: number;
|
|
19
|
+
warning: number;
|
|
20
|
+
advisory: number;
|
|
21
|
+
};
|
|
22
|
+
zoom: number;
|
|
23
|
+
onZoomChange: (zoom: number) => void;
|
|
24
|
+
jobId: string;
|
|
25
|
+
onExpandSheet: () => void;
|
|
26
|
+
onOpenShare?: () => void;
|
|
27
|
+
hasChain?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function MobileDrawer({ isOpen, onClose, config, viewerMode, onToggleMode, measureMode, onToggleMeasure, showTacHeatmap, onToggleTacHeatmap, showBoxOverlay, onToggleBoxOverlay, fileName, findingSummary, zoom, onZoomChange, jobId: _jobId, onExpandSheet, onOpenShare, hasChain, }: MobileDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=MobileDrawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileDrawer.d.ts","sourceRoot":"","sources":["../../components/MobileDrawer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAc7C,KAAK,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AACxG,KAAK,WAAW,GAAG,MAAM,GAAG,cAAc,GAAG,cAAc,GAAG,OAAO,CAAC;AAEtE,UAAU,iBAAiB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAkKD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,MAAM,EACN,UAAU,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,EACb,WAAW,EACX,QAAQ,GACT,EAAE,iBAAiB,2CA+NnB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { isUnwired, logUnwiredHide, useViewerHost, useViewerServices } from "../host/index.js";
|
|
5
|
+
import { ZoomControls } from "./ZoomControls.js";
|
|
6
|
+
// Brand fallback chain: the host's own `config.brand_name` wins; if
|
|
7
|
+
// it's null, fall back to whatever the page is hosted on (informative
|
|
8
|
+
// even on first paint), and only when *that* is missing (SSR, blank
|
|
9
|
+
// hostname) use a fully generic last-resort label. The viewer is a
|
|
10
|
+
// pure renderer — no product brand belongs in its defaults.
|
|
11
|
+
function brandFallback() {
|
|
12
|
+
if (typeof window === "undefined")
|
|
13
|
+
return "PDF Viewer";
|
|
14
|
+
return window.location.hostname || "PDF Viewer";
|
|
15
|
+
}
|
|
16
|
+
/* ── Section with collapsible header ── */
|
|
17
|
+
function DrawerSection({ title, defaultOpen = true, children, }) {
|
|
18
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
19
|
+
return (_jsxs("div", { className: "mb-1", children: [_jsxs("button", { onClick: () => setOpen((v) => !v), className: "flex w-full items-center justify-between px-3 py-2 text-[10px] font-semibold uppercase tracking-wider text-slate-500 hover:text-slate-300", children: [_jsx("span", { children: title }), _jsx("svg", { className: `h-3.5 w-3.5 transition-transform ${open ? "rotate-180" : ""}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M19 9l-7 7-7-7" }) })] }), open && _jsx("div", { className: "px-1", children: children })] }));
|
|
20
|
+
}
|
|
21
|
+
/* ── Individual drawer item ── */
|
|
22
|
+
function DrawerItem({ label, icon, active, onClick, }) {
|
|
23
|
+
return (_jsxs("button", { onClick: onClick, className: "flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left text-sm text-slate-200 transition-colors hover:bg-slate-800", children: [_jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center text-slate-400", children: icon }), _jsx("span", { className: active ? "font-medium text-white" : "", children: label }), active && (_jsx("span", { className: "ml-auto h-2 w-2 shrink-0 rounded-full bg-blue-400" }))] }));
|
|
24
|
+
}
|
|
25
|
+
/* ── Link item (for exports) ── */
|
|
26
|
+
function DrawerLink({ label, icon, href, onClick, }) {
|
|
27
|
+
return (_jsxs("a", { href: href, target: "_blank", rel: "noopener noreferrer", onClick: onClick, className: "flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left text-sm text-slate-200 transition-colors hover:bg-slate-800", children: [_jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center text-slate-400", children: icon }), _jsx("span", { children: label }), _jsx("svg", { className: "ml-auto h-3.5 w-3.5 text-slate-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6M15 3h6v6M10 14L21 3" }) })] }));
|
|
28
|
+
}
|
|
29
|
+
/* ── SVG Icons ── */
|
|
30
|
+
const Icons = {
|
|
31
|
+
findings: (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" }) })),
|
|
32
|
+
separations: (_jsxs("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: [_jsx("circle", { cx: "9", cy: "9", r: "5" }), _jsx("circle", { cx: "15", cy: "9", r: "5" }), _jsx("circle", { cx: "12", cy: "15", r: "5" })] })),
|
|
33
|
+
layers: (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" }) })),
|
|
34
|
+
annotate: (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z" }) })),
|
|
35
|
+
compare: (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M16 3h5v5M4 20L21 3M21 16v5h-5M15 15l6 6M4 4l5 5" }) })),
|
|
36
|
+
heatmap: (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M12 2a7 7 0 00-2 13.75V18h4v-2.25A7 7 0 0012 2zM9 21h6" }) })),
|
|
37
|
+
boxes: (_jsxs("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }), _jsx("rect", { x: "7", y: "7", width: "10", height: "10", rx: "1", strokeDasharray: "3 2" })] })),
|
|
38
|
+
color_picker: (_jsxs("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: [_jsx("path", { d: "M16.5 3.5l4 4-10 10-4 1 1-4 10-10z" }), _jsx("path", { d: "M12.5 7.5l4 4" })] })),
|
|
39
|
+
densitometer: (_jsxs("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: [_jsx("circle", { cx: "12", cy: "12", r: "9" }), _jsx("path", { d: "M12 3v18M3 12h18", strokeOpacity: "0.4" }), _jsx("path", { d: "M7 8l10 8", strokeOpacity: "0.4" })] })),
|
|
40
|
+
ruler: (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M2 12h20M6 8v8M10 9v6M14 8v8M18 9v6" }) })),
|
|
41
|
+
report: (_jsxs("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: [_jsx("path", { d: "M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z" }), _jsx("polyline", { points: "14 2 14 8 20 8" })] })),
|
|
42
|
+
download: (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3" }) })),
|
|
43
|
+
};
|
|
44
|
+
export function MobileDrawer({ isOpen, onClose, config, viewerMode, onToggleMode, measureMode, onToggleMeasure, showTacHeatmap, onToggleTacHeatmap, showBoxOverlay, onToggleBoxOverlay, fileName, findingSummary, zoom, onZoomChange, jobId: _jobId, onExpandSheet, onOpenShare, hasChain, }) {
|
|
45
|
+
const { readOnly, debug } = useViewerHost();
|
|
46
|
+
const { reports } = useViewerServices();
|
|
47
|
+
const reportsUnwired = isUnwired(reports);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (reportsUnwired && debug)
|
|
50
|
+
logUnwiredHide("MobileDrawer", "reports");
|
|
51
|
+
}, [reportsUnwired, debug]);
|
|
52
|
+
const handlePanelMode = (fn) => {
|
|
53
|
+
fn();
|
|
54
|
+
onExpandSheet();
|
|
55
|
+
onClose();
|
|
56
|
+
};
|
|
57
|
+
const handleTool = (fn) => {
|
|
58
|
+
fn();
|
|
59
|
+
onClose();
|
|
60
|
+
};
|
|
61
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: `fixed inset-0 z-50 bg-black/50 transition-opacity duration-300 ${isOpen ? "opacity-100" : "pointer-events-none opacity-0"}`, onClick: onClose }), _jsxs("div", { className: `fixed inset-y-0 left-0 z-[60] w-[280px] bg-slate-900 shadow-xl transition-transform duration-300 ease-in-out ${isOpen ? "translate-x-0" : "-translate-x-full"}`, children: [_jsxs("div", { className: "flex h-12 items-center justify-between border-b border-white/[0.06] px-4", children: [_jsx("span", { className: "text-sm font-bold text-white", children: config.anonymous
|
|
62
|
+
? "PDF Report"
|
|
63
|
+
: config.brand_name || brandFallback() }), _jsx("button", { onClick: onClose, className: "rounded p-1 text-slate-400 hover:bg-slate-800 hover:text-white", children: _jsx("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M6 18L18 6M6 6l12 12" }) }) })] }), _jsxs("div", { className: "overflow-y-auto", style: { height: "calc(100% - 48px)" }, children: [_jsxs("div", { className: "border-b border-white/[0.06] px-4 py-3", children: [fileName && (_jsx("div", { className: "mb-1 truncate text-xs text-slate-400", children: fileName })), _jsxs("div", { className: "flex gap-3 text-xs font-medium", children: [_jsxs("span", { className: "text-red-400", children: [findingSummary.error, " errors"] }), _jsxs("span", { className: "text-amber-400", children: [findingSummary.warning, " warnings"] }), _jsxs("span", { className: "text-blue-400", children: [findingSummary.advisory, " info"] })] })] }), _jsxs(DrawerSection, { title: "View", defaultOpen: true, children: [_jsx(DrawerItem, { label: "Health Report", icon: Icons.report, active: viewerMode === "health", onClick: () => handlePanelMode(() => onToggleMode("health")) }), hasChain && (_jsx(DrawerItem, { label: "Approval Chain", icon: (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" }) })), active: viewerMode === "chain", onClick: () => handlePanelMode(() => onToggleMode("chain")) })), _jsx(DrawerItem, { label: "Findings", icon: Icons.findings, active: viewerMode === "normal", onClick: () => handlePanelMode(() => onToggleMode("normal")) }), config.enable_separations && (_jsx(DrawerItem, { label: "Ink Separations", icon: Icons.separations, active: viewerMode === "separation", onClick: () => handlePanelMode(() => onToggleMode("separation")) })), config.enable_layers && (_jsx(DrawerItem, { label: "PDF Layers", icon: Icons.layers, active: viewerMode === "layers", onClick: () => handlePanelMode(() => onToggleMode("layers")) }))] }), !readOnly && (config.enable_annotations || config.enable_comparison) && (_jsxs(DrawerSection, { title: "Review", defaultOpen: true, children: [config.enable_annotations && (_jsx(DrawerItem, { label: "Annotations", icon: Icons.annotate, active: viewerMode === "annotation", onClick: () => handlePanelMode(() => onToggleMode("annotation")) })), config.enable_comparison && (_jsx(DrawerItem, { label: "Compare Versions", icon: Icons.compare, active: viewerMode === "comparison", onClick: () => handlePanelMode(() => onToggleMode("comparison")) }))] })), _jsxs(DrawerSection, { title: "Analysis Tools", defaultOpen: true, children: [config.enable_tac_heatmap && (_jsx(DrawerItem, { label: "TAC Heatmap", icon: Icons.heatmap, active: showTacHeatmap, onClick: () => handleTool(onToggleTacHeatmap) })), _jsx(DrawerItem, { label: "Trim / Bleed Boxes", icon: Icons.boxes, active: showBoxOverlay, onClick: () => handleTool(onToggleBoxOverlay) }), config.enable_measurement && (_jsxs(_Fragment, { children: [_jsx(DrawerItem, { label: "Color Picker", icon: Icons.color_picker, active: measureMode === "color_picker", onClick: () => handleTool(() => onToggleMeasure("color_picker")) }), _jsx(DrawerItem, { label: "Densitometer (C/M/Y/K + TAC)", icon: Icons.densitometer, active: measureMode === "densitometer", onClick: () => handleTool(() => onToggleMeasure("densitometer")) }), _jsx(DrawerItem, { label: "Ruler", icon: Icons.ruler, active: measureMode === "ruler", onClick: () => handleTool(() => onToggleMeasure("ruler")) })] }))] }), _jsx(DrawerSection, { title: "Zoom", defaultOpen: false, children: _jsx("div", { className: "px-3 py-2", children: _jsx(ZoomControls, { zoom: zoom, onZoomChange: onZoomChange, compact: true, dark: true }) }) }), (onOpenShare ||
|
|
64
|
+
(!reportsUnwired &&
|
|
65
|
+
(config.enable_html_report_link || config.enable_download))) && (_jsxs(DrawerSection, { title: "Share & Export", defaultOpen: false, children: [onOpenShare && (_jsx(DrawerItem, { label: "Email Share", icon: (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" }) })), active: false, onClick: () => handleTool(onOpenShare) })), !reportsUnwired && config.enable_html_report_link && (_jsx(DrawerLink, { label: "View HTML Report", icon: Icons.report, href: reports.getHtmlReportUrl(), onClick: onClose })), !reportsUnwired && config.enable_download && (_jsx(DrawerLink, { label: "Download PDF", icon: Icons.download, href: reports.getPdfDownloadUrl(), onClick: onClose }))] }))] })] })] }));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=MobileDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileDrawer.js","sourceRoot":"","sources":["../../components/MobileDrawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { OverlayItem } from "../plugin/types";
|
|
2
|
+
import type { PageInfo } from "../types";
|
|
3
|
+
interface PageCanvasProps {
|
|
4
|
+
jobId: string;
|
|
5
|
+
page: PageInfo;
|
|
6
|
+
zoom: number;
|
|
7
|
+
/**
|
|
8
|
+
* Generic overlay items to render on top of the page tile. Hosts
|
|
9
|
+
* convert their domain records (findings, annotations, brand-spec
|
|
10
|
+
* violations) into `OverlayItem`s before passing them in.
|
|
11
|
+
*/
|
|
12
|
+
items: readonly OverlayItem[];
|
|
13
|
+
/** Currently-selected overlay item (or null). Drives the highlight
|
|
14
|
+
* + tooltip + page-level indicator branches. */
|
|
15
|
+
selectedItem: OverlayItem | null;
|
|
16
|
+
/** Fires when the user clicks an item's bbox on the canvas. */
|
|
17
|
+
onItemClick: (item: OverlayItem) => void;
|
|
18
|
+
onZoomChange?: (zoom: number) => void;
|
|
19
|
+
onPageChange?: (delta: number) => void;
|
|
20
|
+
tileDpi?: number;
|
|
21
|
+
tileCdnBase?: string | null;
|
|
22
|
+
/**
|
|
23
|
+
* WS-17B — when true, the canvas is clipped to the page's
|
|
24
|
+
* TrimBox (falls back to BleedBox, then CropBox). Hides the
|
|
25
|
+
* white bleed strip that sits outside the trim line on finished-
|
|
26
|
+
* goods review. Default false so pre-WS-17 viewers still see
|
|
27
|
+
* the full MediaBox unchanged.
|
|
28
|
+
*/
|
|
29
|
+
cropToTrim?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare function PageCanvas({ jobId: _jobId, page, zoom, items, selectedItem, onItemClick, onZoomChange, onPageChange, tileDpi, tileCdnBase, cropToTrim, }: PageCanvasProps): import("react/jsx-runtime").JSX.Element | null;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=PageCanvas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageCanvas.d.ts","sourceRoot":"","sources":["../../components/PageCanvas.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AASzC,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B;oDACgD;IAChD,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,+DAA+D;IAC/D,WAAW,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAyBD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EAAE,MAAM,EACb,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,WAAW,EACX,UAAkB,GACnB,EAAE,eAAe,kDA8bjB"}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { DEFAULT_DPI, SEVERITY_COLORS } from "../types/index.js";
|
|
5
|
+
import { logUnwiredHide, useFallbackMode, useViewerHost, useViewerServices, } from "../host/index.js";
|
|
6
|
+
const TIER_HEX = {
|
|
7
|
+
error: "#ef4444",
|
|
8
|
+
warning: "#f59e0b",
|
|
9
|
+
advisory: "#3b82f6",
|
|
10
|
+
info: "#64748b",
|
|
11
|
+
neutral: "#64748b",
|
|
12
|
+
};
|
|
13
|
+
// Fallback fill/stroke palette for tiers that don't have a SEVERITY_COLORS
|
|
14
|
+
// entry. SEVERITY_COLORS only ships error/warning/advisory; info/neutral
|
|
15
|
+
// hit this fallback.
|
|
16
|
+
const TIER_FALLBACK_COLORS = {
|
|
17
|
+
fill: "rgba(100, 116, 139, 0.15)",
|
|
18
|
+
stroke: "#64748b",
|
|
19
|
+
};
|
|
20
|
+
function colorsForTier(tier) {
|
|
21
|
+
if (tier === "error")
|
|
22
|
+
return SEVERITY_COLORS.error;
|
|
23
|
+
if (tier === "warning")
|
|
24
|
+
return SEVERITY_COLORS.warning;
|
|
25
|
+
if (tier === "advisory")
|
|
26
|
+
return SEVERITY_COLORS.advisory;
|
|
27
|
+
return TIER_FALLBACK_COLORS;
|
|
28
|
+
}
|
|
29
|
+
export function PageCanvas({ jobId: _jobId, page, zoom, items, selectedItem, onItemClick, onZoomChange, onPageChange, tileDpi, tileCdnBase, cropToTrim = false, }) {
|
|
30
|
+
const { pageImages } = useViewerServices();
|
|
31
|
+
const { debug, pdfFallback } = useViewerHost();
|
|
32
|
+
const mode = useFallbackMode(pageImages);
|
|
33
|
+
const canvasRef = useRef(null);
|
|
34
|
+
const [tileImg, setTileImg] = useState(null);
|
|
35
|
+
const [loading, setLoading] = useState(true);
|
|
36
|
+
// Tooltip state: shows item info near the clicked bbox
|
|
37
|
+
const [tooltip, setTooltip] = useState(null);
|
|
38
|
+
// Root wrapper — we attach a non-passive touchmove listener here so
|
|
39
|
+
// pinch-zoom (2-finger) can preventDefault without blocking the browser's
|
|
40
|
+
// native 1 & 2-finger pan (which scrolls the outer overflow-auto container).
|
|
41
|
+
const wrapperRef = useRef(null);
|
|
42
|
+
// Pinch-zoom state: initial finger distance + zoom at gesture start.
|
|
43
|
+
const pinchRef = useRef(null);
|
|
44
|
+
const pinchDist = (touches) => {
|
|
45
|
+
if (touches.length < 2)
|
|
46
|
+
return 0;
|
|
47
|
+
const dx = touches[1].clientX - touches[0].clientX;
|
|
48
|
+
const dy = touches[1].clientY - touches[0].clientY;
|
|
49
|
+
return Math.hypot(dx, dy);
|
|
50
|
+
};
|
|
51
|
+
// Native (non-React) touch listeners so preventDefault is honored on
|
|
52
|
+
// pinch-zoom (React synthesises passive listeners in modern versions).
|
|
53
|
+
// 1-finger drag is left alone so the outer scroll container handles pan.
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
const el = wrapperRef.current;
|
|
56
|
+
if (!el || !onZoomChange)
|
|
57
|
+
return;
|
|
58
|
+
const onStart = (e) => {
|
|
59
|
+
if (e.touches.length === 2) {
|
|
60
|
+
pinchRef.current = { startDist: pinchDist(e.touches), startZoom: zoom };
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const onMove = (e) => {
|
|
64
|
+
if (e.touches.length !== 2 || !pinchRef.current || pinchRef.current.startDist <= 0)
|
|
65
|
+
return;
|
|
66
|
+
// Only preventDefault on pinch — leaves 1-finger pan native.
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
const scale = pinchDist(e.touches) / pinchRef.current.startDist;
|
|
69
|
+
const next = Math.round(Math.max(25, Math.min(400, pinchRef.current.startZoom * scale)));
|
|
70
|
+
onZoomChange(next);
|
|
71
|
+
};
|
|
72
|
+
const onEnd = (e) => {
|
|
73
|
+
if (e.touches.length < 2)
|
|
74
|
+
pinchRef.current = null;
|
|
75
|
+
};
|
|
76
|
+
el.addEventListener("touchstart", onStart, { passive: true });
|
|
77
|
+
el.addEventListener("touchmove", onMove, { passive: false });
|
|
78
|
+
el.addEventListener("touchend", onEnd, { passive: true });
|
|
79
|
+
el.addEventListener("touchcancel", onEnd, { passive: true });
|
|
80
|
+
return () => {
|
|
81
|
+
el.removeEventListener("touchstart", onStart);
|
|
82
|
+
el.removeEventListener("touchmove", onMove);
|
|
83
|
+
el.removeEventListener("touchend", onEnd);
|
|
84
|
+
el.removeEventListener("touchcancel", onEnd);
|
|
85
|
+
};
|
|
86
|
+
}, [zoom, onZoomChange]);
|
|
87
|
+
// onPageChange is kept in the prop list for call-site compatibility, but
|
|
88
|
+
// swipe-to-change-page would fight native touch-pan. Consumers that need
|
|
89
|
+
// page navigation use the toolbar arrows / keyboard.
|
|
90
|
+
void onPageChange;
|
|
91
|
+
const [pulsePhase, setPulsePhase] = useState(0);
|
|
92
|
+
// Scale factor: zoom% maps to DPI scaling
|
|
93
|
+
const scale = zoom / 100;
|
|
94
|
+
const dpi = tileDpi ?? DEFAULT_DPI;
|
|
95
|
+
// PDF points to pixels at the given DPI
|
|
96
|
+
const ptsToPixels = dpi / 72;
|
|
97
|
+
const canvasWidth = Math.round(page.width_pts * ptsToPixels * scale);
|
|
98
|
+
const canvasHeight = Math.round(page.height_pts * ptsToPixels * scale);
|
|
99
|
+
// Ask the page-image service for a tile rendered at the *effective*
|
|
100
|
+
// DPI (base DPI scaled by current zoom, bucketed so the slider
|
|
101
|
+
// doesn't flood the cache with near-duplicate builds, capped so we
|
|
102
|
+
// don't exhaust memory on extreme zoom). Hosts that ship a multi-
|
|
103
|
+
// DPI cache (e.g. `createBrowserViewerServices`) hand back a tile
|
|
104
|
+
// matching this bucket so the canvas draws pixel-perfect instead of
|
|
105
|
+
// CSS-stretching a low-resolution raster.
|
|
106
|
+
const DPI_BUCKET = 50;
|
|
107
|
+
const DPI_FLOOR = 72;
|
|
108
|
+
const DPI_CEIL = 450;
|
|
109
|
+
const requestedDpi = Math.min(DPI_CEIL, Math.max(DPI_FLOOR, Math.round((dpi * Math.max(0.1, scale)) / DPI_BUCKET) * DPI_BUCKET));
|
|
110
|
+
const trimViewport = (() => {
|
|
111
|
+
if (!cropToTrim)
|
|
112
|
+
return null;
|
|
113
|
+
const box = page.trim_box ?? page.bleed_box ?? page.crop_box;
|
|
114
|
+
if (!box)
|
|
115
|
+
return null;
|
|
116
|
+
const mb = page.media_box;
|
|
117
|
+
const mbW = mb.x1 - mb.x0;
|
|
118
|
+
const mbH = mb.y1 - mb.y0;
|
|
119
|
+
if (mbW <= 0 || mbH <= 0)
|
|
120
|
+
return null;
|
|
121
|
+
const leftPx = ((box.x0 - mb.x0) / mbW) * canvasWidth;
|
|
122
|
+
const topPx = ((mb.y1 - box.y1) / mbH) * canvasHeight;
|
|
123
|
+
const widthPx = ((box.x1 - box.x0) / mbW) * canvasWidth;
|
|
124
|
+
const heightPx = ((box.y1 - box.y0) / mbH) * canvasHeight;
|
|
125
|
+
if (Math.abs(leftPx) < 0.5 &&
|
|
126
|
+
Math.abs(topPx) < 0.5 &&
|
|
127
|
+
Math.abs(widthPx - canvasWidth) < 0.5 &&
|
|
128
|
+
Math.abs(heightPx - canvasHeight) < 0.5) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
leftPx: Math.max(0, leftPx),
|
|
133
|
+
topPx: Math.max(0, topPx),
|
|
134
|
+
widthPx: Math.max(1, widthPx),
|
|
135
|
+
heightPx: Math.max(1, heightPx),
|
|
136
|
+
};
|
|
137
|
+
})();
|
|
138
|
+
// Load tile image — prefer the host-supplied CDN URL when set, fall
|
|
139
|
+
// back to whatever `pageImages.getPageImageUrl` returns. When the
|
|
140
|
+
// host hasn't wired pageImages but ``pdfFallback`` is set, we ask
|
|
141
|
+
// the fallback adapter to render the page in-browser
|
|
142
|
+
// and use the resulting data URL.
|
|
143
|
+
const proxyUrl = pageImages.getPageImageUrl({
|
|
144
|
+
pageNum: page.page_num,
|
|
145
|
+
dpi: requestedDpi,
|
|
146
|
+
});
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
if (mode === "hidden") {
|
|
149
|
+
if (debug)
|
|
150
|
+
logUnwiredHide("PageCanvas", "pageImages");
|
|
151
|
+
setLoading(false);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
let cancelled = false;
|
|
155
|
+
setLoading(true);
|
|
156
|
+
const startLoad = (src) => {
|
|
157
|
+
const img = new Image();
|
|
158
|
+
const cdnUrl = mode === "wired" && tileCdnBase
|
|
159
|
+
? `${tileCdnBase}p${page.page_num}_d${requestedDpi}.png`
|
|
160
|
+
: null;
|
|
161
|
+
img.onload = () => {
|
|
162
|
+
if (cancelled)
|
|
163
|
+
return;
|
|
164
|
+
setTileImg(img);
|
|
165
|
+
setLoading(false);
|
|
166
|
+
};
|
|
167
|
+
img.onerror = () => {
|
|
168
|
+
if (cancelled)
|
|
169
|
+
return;
|
|
170
|
+
if (cdnUrl && img.src === cdnUrl) {
|
|
171
|
+
img.src = src;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
setLoading(false);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
img.src = cdnUrl ?? src;
|
|
178
|
+
};
|
|
179
|
+
if (mode === "fallback" && pdfFallback) {
|
|
180
|
+
pdfFallback
|
|
181
|
+
.renderPageToUrl({ pageNum: page.page_num, dpi: requestedDpi })
|
|
182
|
+
.then((url) => {
|
|
183
|
+
if (!cancelled)
|
|
184
|
+
startLoad(url);
|
|
185
|
+
})
|
|
186
|
+
.catch(() => {
|
|
187
|
+
if (!cancelled)
|
|
188
|
+
setLoading(false);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
startLoad(proxyUrl);
|
|
193
|
+
}
|
|
194
|
+
return () => {
|
|
195
|
+
cancelled = true;
|
|
196
|
+
};
|
|
197
|
+
}, [proxyUrl, page.page_num, requestedDpi, tileCdnBase, mode, pdfFallback, debug]);
|
|
198
|
+
// Animate pulse for selected item
|
|
199
|
+
useEffect(() => {
|
|
200
|
+
if (!selectedItem?.bbox || selectedItem.page !== page.page_num)
|
|
201
|
+
return;
|
|
202
|
+
let raf;
|
|
203
|
+
let start = null;
|
|
204
|
+
const animate = (ts) => {
|
|
205
|
+
if (start === null)
|
|
206
|
+
start = ts;
|
|
207
|
+
const elapsed = ts - start;
|
|
208
|
+
// Oscillate between 0 and 1 over 1.5s
|
|
209
|
+
setPulsePhase((Math.sin((elapsed / 750) * Math.PI) + 1) / 2);
|
|
210
|
+
raf = requestAnimationFrame(animate);
|
|
211
|
+
};
|
|
212
|
+
raf = requestAnimationFrame(animate);
|
|
213
|
+
return () => cancelAnimationFrame(raf);
|
|
214
|
+
}, [selectedItem, page.page_num]);
|
|
215
|
+
// Show tooltip when selectedItem changes (from panel click or canvas click)
|
|
216
|
+
useEffect(() => {
|
|
217
|
+
if (!selectedItem || selectedItem.page !== page.page_num) {
|
|
218
|
+
setTooltip(null);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
let x;
|
|
222
|
+
let y;
|
|
223
|
+
if (selectedItem.bbox) {
|
|
224
|
+
const [x0, , x1, y1] = selectedItem.bbox;
|
|
225
|
+
x = ((x0 + x1) / 2) * ptsToPixels * scale;
|
|
226
|
+
y = (page.height_pts - y1) * ptsToPixels * scale;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
// No bbox: show tooltip centered at top of page
|
|
230
|
+
x = canvasWidth / 2;
|
|
231
|
+
y = 40;
|
|
232
|
+
}
|
|
233
|
+
setTooltip({ item: selectedItem, x, y });
|
|
234
|
+
// No auto-dismiss: tooltip stays until user clicks elsewhere or changes selection
|
|
235
|
+
}, [selectedItem, page.page_num, page.height_pts, ptsToPixels, scale, canvasWidth]);
|
|
236
|
+
// Render canvas
|
|
237
|
+
const draw = useCallback(() => {
|
|
238
|
+
const canvas = canvasRef.current;
|
|
239
|
+
if (!canvas || !tileImg)
|
|
240
|
+
return;
|
|
241
|
+
const ctx = canvas.getContext("2d");
|
|
242
|
+
if (!ctx)
|
|
243
|
+
return;
|
|
244
|
+
canvas.width = canvasWidth;
|
|
245
|
+
canvas.height = canvasHeight;
|
|
246
|
+
// Draw the page tile, scaled to the canvas size
|
|
247
|
+
ctx.drawImage(tileImg, 0, 0, canvasWidth, canvasHeight);
|
|
248
|
+
// Draw item overlays
|
|
249
|
+
const pageItems = items.filter((it) => it.page === page.page_num && it.bbox);
|
|
250
|
+
const hasSelected = selectedItem &&
|
|
251
|
+
selectedItem.page === page.page_num &&
|
|
252
|
+
selectedItem.bbox;
|
|
253
|
+
// Counter for badge numbering
|
|
254
|
+
let badgeIndex = 0;
|
|
255
|
+
for (const item of pageItems) {
|
|
256
|
+
if (!item.bbox)
|
|
257
|
+
continue;
|
|
258
|
+
badgeIndex++;
|
|
259
|
+
const [x0, y0, x1, y1] = item.bbox;
|
|
260
|
+
// Convert PDF coordinates (origin lower-left) to canvas (origin upper-left)
|
|
261
|
+
const px0 = x0 * ptsToPixels * scale;
|
|
262
|
+
const py0 = (page.height_pts - y1) * ptsToPixels * scale;
|
|
263
|
+
const pw = (x1 - x0) * ptsToPixels * scale;
|
|
264
|
+
const ph = (y1 - y0) * ptsToPixels * scale;
|
|
265
|
+
const colors = colorsForTier(item.tier);
|
|
266
|
+
const tierHex = item.color ?? TIER_HEX[item.tier ?? "neutral"];
|
|
267
|
+
const isSelected = selectedItem?.id === item.id;
|
|
268
|
+
if (hasSelected && !isSelected) {
|
|
269
|
+
// Dimmed: other items when one is selected
|
|
270
|
+
ctx.globalAlpha = 0.3;
|
|
271
|
+
ctx.fillStyle = colors.fill;
|
|
272
|
+
ctx.fillRect(px0, py0, pw, ph);
|
|
273
|
+
ctx.strokeStyle = colors.stroke;
|
|
274
|
+
ctx.lineWidth = 1;
|
|
275
|
+
ctx.strokeRect(px0, py0, pw, ph);
|
|
276
|
+
ctx.globalAlpha = 1;
|
|
277
|
+
}
|
|
278
|
+
else if (isSelected) {
|
|
279
|
+
// Selected item: prominent highlight with animated glow
|
|
280
|
+
const glowAlpha = 0.15 + pulsePhase * 0.2;
|
|
281
|
+
ctx.fillStyle = colors.fill.replace(/[\d.]+\)$/, `${glowAlpha.toFixed(2)})`);
|
|
282
|
+
ctx.fillRect(px0, py0, pw, ph);
|
|
283
|
+
// Animated outer glow
|
|
284
|
+
const glowSize = 4 + pulsePhase * 4;
|
|
285
|
+
ctx.shadowColor = tierHex;
|
|
286
|
+
ctx.shadowBlur = glowSize;
|
|
287
|
+
ctx.strokeStyle = tierHex;
|
|
288
|
+
ctx.lineWidth = 4;
|
|
289
|
+
ctx.strokeRect(px0, py0, pw, ph);
|
|
290
|
+
ctx.shadowColor = "transparent";
|
|
291
|
+
ctx.shadowBlur = 0;
|
|
292
|
+
// Numbered badge at top-right corner
|
|
293
|
+
const badgeRadius = 10;
|
|
294
|
+
const bx = px0 + pw - 2;
|
|
295
|
+
const by = py0 - 2;
|
|
296
|
+
ctx.fillStyle = tierHex;
|
|
297
|
+
ctx.beginPath();
|
|
298
|
+
ctx.arc(bx, by, badgeRadius, 0, Math.PI * 2);
|
|
299
|
+
ctx.fill();
|
|
300
|
+
ctx.fillStyle = "#ffffff";
|
|
301
|
+
ctx.font = "bold 11px sans-serif";
|
|
302
|
+
ctx.textAlign = "center";
|
|
303
|
+
ctx.textBaseline = "middle";
|
|
304
|
+
ctx.fillText(String(badgeIndex), bx, by);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
// No selection active: show all at normal opacity
|
|
308
|
+
ctx.fillStyle = colors.fill;
|
|
309
|
+
ctx.fillRect(px0, py0, pw, ph);
|
|
310
|
+
ctx.strokeStyle = colors.stroke;
|
|
311
|
+
ctx.lineWidth = 1.5;
|
|
312
|
+
ctx.strokeRect(px0, py0, pw, ph);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}, [
|
|
316
|
+
tileImg,
|
|
317
|
+
canvasWidth,
|
|
318
|
+
canvasHeight,
|
|
319
|
+
items,
|
|
320
|
+
page,
|
|
321
|
+
ptsToPixels,
|
|
322
|
+
scale,
|
|
323
|
+
selectedItem,
|
|
324
|
+
pulsePhase,
|
|
325
|
+
]);
|
|
326
|
+
useEffect(() => {
|
|
327
|
+
draw();
|
|
328
|
+
}, [draw]);
|
|
329
|
+
// Handle click on canvas to detect item and show tooltip
|
|
330
|
+
const handleClick = (e) => {
|
|
331
|
+
const canvas = canvasRef.current;
|
|
332
|
+
if (!canvas)
|
|
333
|
+
return;
|
|
334
|
+
const rect = canvas.getBoundingClientRect();
|
|
335
|
+
const clickX = (e.clientX - rect.left) * (canvas.width / rect.width);
|
|
336
|
+
const clickY = (e.clientY - rect.top) * (canvas.height / rect.height);
|
|
337
|
+
// Convert to PDF coordinates
|
|
338
|
+
const pdfX = clickX / (ptsToPixels * scale);
|
|
339
|
+
const pdfY = page.height_pts - clickY / (ptsToPixels * scale);
|
|
340
|
+
// Find clicked item
|
|
341
|
+
const pageItems = items.filter((it) => it.page === page.page_num && it.bbox);
|
|
342
|
+
for (const item of pageItems) {
|
|
343
|
+
if (!item.bbox)
|
|
344
|
+
continue;
|
|
345
|
+
const [x0, y0, x1, y1] = item.bbox;
|
|
346
|
+
if (pdfX >= x0 && pdfX <= x1 && pdfY >= y0 && pdfY <= y1) {
|
|
347
|
+
onItemClick(item);
|
|
348
|
+
// Tooltip shown by the selectedItem useEffect
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// Clicked empty area: dismiss tooltip
|
|
353
|
+
setTooltip(null);
|
|
354
|
+
};
|
|
355
|
+
if (mode === "hidden")
|
|
356
|
+
return null;
|
|
357
|
+
const outerWidth = trimViewport ? trimViewport.widthPx : canvasWidth;
|
|
358
|
+
const outerHeight = trimViewport ? trimViewport.heightPx : canvasHeight;
|
|
359
|
+
const tooltipTier = tooltip?.item.tier ?? "neutral";
|
|
360
|
+
const selectedItemTier = selectedItem?.tier ?? "neutral";
|
|
361
|
+
return (_jsxs("div", { ref: wrapperRef, className: "relative inline-block overflow-hidden", style: {
|
|
362
|
+
touchAction: onZoomChange ? "pan-x pan-y" : undefined,
|
|
363
|
+
width: outerWidth,
|
|
364
|
+
height: outerHeight,
|
|
365
|
+
}, children: [loading && (_jsx("div", { className: "flex items-center justify-center bg-muted/50", style: { width: outerWidth, height: outerHeight }, children: _jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsxs("svg", { className: "h-8 w-8 animate-spin text-slate-400", fill: "none", viewBox: "0 0 24 24", children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })] }), _jsxs("span", { className: "text-xs text-slate-500", children: ["Page ", page.page_num] })] }) })), _jsxs("div", { className: "absolute", style: {
|
|
366
|
+
left: trimViewport ? -trimViewport.leftPx : 0,
|
|
367
|
+
top: trimViewport ? -trimViewport.topPx : 0,
|
|
368
|
+
width: canvasWidth,
|
|
369
|
+
height: canvasHeight,
|
|
370
|
+
}, children: [_jsx("canvas", { ref: canvasRef, onClick: handleClick, className: `cursor-crosshair ${loading ? "hidden" : ""}`, style: {
|
|
371
|
+
width: canvasWidth,
|
|
372
|
+
height: canvasHeight,
|
|
373
|
+
} }), selectedItem && !selectedItem.bbox && selectedItem.page === page.page_num && (_jsx("div", { className: "pointer-events-none absolute inset-0 animate-pulse rounded border-2", style: {
|
|
374
|
+
borderColor: TIER_HEX[selectedItemTier],
|
|
375
|
+
boxShadow: `inset 0 0 30px ${TIER_HEX[selectedItemTier]}30`,
|
|
376
|
+
} })), tooltip && (_jsxs("div", { className: "pointer-events-none absolute z-40 max-w-[280px] rounded-lg bg-black/90 px-3 py-2 text-xs text-white shadow-xl", style: {
|
|
377
|
+
left: Math.max(8, Math.min(tooltip.x - 100, canvasWidth - 288)),
|
|
378
|
+
top: Math.max(8, tooltip.y - 8),
|
|
379
|
+
transform: "translateY(-100%)",
|
|
380
|
+
}, children: [_jsxs("div", { className: "mb-1 flex items-center gap-2", children: [_jsx("span", { className: "inline-block h-2 w-2 shrink-0 rounded-full", style: { backgroundColor: TIER_HEX[tooltipTier] } }), _jsx("span", { className: "font-bold uppercase", style: { color: TIER_HEX[tooltipTier] }, children: tooltipTier }), tooltip.item.code && (_jsx("code", { className: "ml-auto text-[10px] text-gray-400", children: tooltip.item.code }))] }), _jsx("p", { className: "break-words leading-snug text-gray-200", children: (() => {
|
|
381
|
+
const text = tooltip.item.description ?? tooltip.item.label ?? "";
|
|
382
|
+
return text.length > 160 ? text.slice(0, 160) + "..." : text;
|
|
383
|
+
})() })] }))] })] }));
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=PageCanvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageCanvas.js","sourceRoot":"","sources":["../../components/PageCanvas.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { OverlayItem } from "../plugin/types";
|
|
2
|
+
import type { PageInfo } from "../types";
|
|
3
|
+
interface PageNavigatorProps {
|
|
4
|
+
pages: PageInfo[];
|
|
5
|
+
currentPage: number;
|
|
6
|
+
/**
|
|
7
|
+
* Generic overlay items rendered as per-page badge counts. Hosts
|
|
8
|
+
* convert their domain records (findings, annotations, brand-spec
|
|
9
|
+
* violations) into `OverlayItem`s before passing them in.
|
|
10
|
+
*/
|
|
11
|
+
items: readonly OverlayItem[];
|
|
12
|
+
onPageChange: (page: number) => void;
|
|
13
|
+
/** When true, render as a horizontal strip (for left panel header). */
|
|
14
|
+
horizontal?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function PageNavigator({ pages, currentPage, items, onPageChange, horizontal, }: PageNavigatorProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=PageNavigator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageNavigator.d.ts","sourceRoot":"","sources":["../../components/PageNavigator.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIzC,UAAU,kBAAkB;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,KAAK,EACL,YAAY,EACZ,UAAU,GACX,EAAE,kBAAkB,2CAoHpB"}
|