@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.
Files changed (213) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +344 -0
  3. package/dist/browser/codexOverlay.d.ts +109 -0
  4. package/dist/browser/codexOverlay.d.ts.map +1 -0
  5. package/dist/browser/codexOverlay.js +256 -0
  6. package/dist/browser/codexOverlay.js.map +1 -0
  7. package/dist/browser/constants.d.ts +13 -0
  8. package/dist/browser/constants.d.ts.map +1 -0
  9. package/dist/browser/constants.js +13 -0
  10. package/dist/browser/constants.js.map +1 -0
  11. package/dist/browser/index.d.ts +211 -0
  12. package/dist/browser/index.d.ts.map +1 -0
  13. package/dist/browser/index.js +1190 -0
  14. package/dist/browser/index.js.map +1 -0
  15. package/dist/browser/pantone-gold.d.ts +59 -0
  16. package/dist/browser/pantone-gold.d.ts.map +1 -0
  17. package/dist/browser/pantone-gold.js +237 -0
  18. package/dist/browser/pantone-gold.js.map +1 -0
  19. package/dist/components/AnnotationCanvas.d.ts +27 -0
  20. package/dist/components/AnnotationCanvas.d.ts.map +1 -0
  21. package/dist/components/AnnotationCanvas.js +401 -0
  22. package/dist/components/AnnotationCanvas.js.map +1 -0
  23. package/dist/components/AnnotationNotesPanel.d.ts +15 -0
  24. package/dist/components/AnnotationNotesPanel.d.ts.map +1 -0
  25. package/dist/components/AnnotationNotesPanel.js +235 -0
  26. package/dist/components/AnnotationNotesPanel.js.map +1 -0
  27. package/dist/components/AnnotationThread.d.ts +18 -0
  28. package/dist/components/AnnotationThread.d.ts.map +1 -0
  29. package/dist/components/AnnotationThread.js +163 -0
  30. package/dist/components/AnnotationThread.js.map +1 -0
  31. package/dist/components/AnnotationToolbar.d.ts +39 -0
  32. package/dist/components/AnnotationToolbar.d.ts.map +1 -0
  33. package/dist/components/AnnotationToolbar.js +258 -0
  34. package/dist/components/AnnotationToolbar.js.map +1 -0
  35. package/dist/components/BoxOverlay.d.ts +20 -0
  36. package/dist/components/BoxOverlay.d.ts.map +1 -0
  37. package/dist/components/BoxOverlay.js +107 -0
  38. package/dist/components/BoxOverlay.js.map +1 -0
  39. package/dist/components/ColorPickerTool.d.ts +11 -0
  40. package/dist/components/ColorPickerTool.d.ts.map +1 -0
  41. package/dist/components/ColorPickerTool.js +220 -0
  42. package/dist/components/ColorPickerTool.js.map +1 -0
  43. package/dist/components/DensitometerTool.d.ts +25 -0
  44. package/dist/components/DensitometerTool.d.ts.map +1 -0
  45. package/dist/components/DensitometerTool.js +246 -0
  46. package/dist/components/DensitometerTool.js.map +1 -0
  47. package/dist/components/DielineInfoPanel.d.ts +27 -0
  48. package/dist/components/DielineInfoPanel.d.ts.map +1 -0
  49. package/dist/components/DielineInfoPanel.js +23 -0
  50. package/dist/components/DielineInfoPanel.js.map +1 -0
  51. package/dist/components/DielineOverlay.d.ts +10 -0
  52. package/dist/components/DielineOverlay.d.ts.map +1 -0
  53. package/dist/components/DielineOverlay.js +57 -0
  54. package/dist/components/DielineOverlay.js.map +1 -0
  55. package/dist/components/FindingsSidebar.d.ts +50 -0
  56. package/dist/components/FindingsSidebar.d.ts.map +1 -0
  57. package/dist/components/FindingsSidebar.js +78 -0
  58. package/dist/components/FindingsSidebar.js.map +1 -0
  59. package/dist/components/LayerCanvas.d.ts +30 -0
  60. package/dist/components/LayerCanvas.d.ts.map +1 -0
  61. package/dist/components/LayerCanvas.js +84 -0
  62. package/dist/components/LayerCanvas.js.map +1 -0
  63. package/dist/components/LayerPanel.d.ts +9 -0
  64. package/dist/components/LayerPanel.d.ts.map +1 -0
  65. package/dist/components/LayerPanel.js +144 -0
  66. package/dist/components/LayerPanel.js.map +1 -0
  67. package/dist/components/LensPDF.d.ts +61 -0
  68. package/dist/components/LensPDF.d.ts.map +1 -0
  69. package/dist/components/LensPDF.js +49 -0
  70. package/dist/components/LensPDF.js.map +1 -0
  71. package/dist/components/LensPDFDemo.d.ts +160 -0
  72. package/dist/components/LensPDFDemo.d.ts.map +1 -0
  73. package/dist/components/LensPDFDemo.js +1060 -0
  74. package/dist/components/LensPDFDemo.js.map +1 -0
  75. package/dist/components/LensPDFDemo.styles.d.ts +38 -0
  76. package/dist/components/LensPDFDemo.styles.d.ts.map +1 -0
  77. package/dist/components/LensPDFDemo.styles.js +282 -0
  78. package/dist/components/LensPDFDemo.styles.js.map +1 -0
  79. package/dist/components/LensPDFViewer.d.ts +79 -0
  80. package/dist/components/LensPDFViewer.d.ts.map +1 -0
  81. package/dist/components/LensPDFViewer.js +254 -0
  82. package/dist/components/LensPDFViewer.js.map +1 -0
  83. package/dist/components/MeasureTool.d.ts +16 -0
  84. package/dist/components/MeasureTool.d.ts.map +1 -0
  85. package/dist/components/MeasureTool.js +137 -0
  86. package/dist/components/MeasureTool.js.map +1 -0
  87. package/dist/components/MobileBottomSheet.d.ts +12 -0
  88. package/dist/components/MobileBottomSheet.d.ts.map +1 -0
  89. package/dist/components/MobileBottomSheet.js +113 -0
  90. package/dist/components/MobileBottomSheet.js.map +1 -0
  91. package/dist/components/MobileDrawer.d.ts +31 -0
  92. package/dist/components/MobileDrawer.d.ts.map +1 -0
  93. package/dist/components/MobileDrawer.js +67 -0
  94. package/dist/components/MobileDrawer.js.map +1 -0
  95. package/dist/components/PageCanvas.d.ts +33 -0
  96. package/dist/components/PageCanvas.d.ts.map +1 -0
  97. package/dist/components/PageCanvas.js +385 -0
  98. package/dist/components/PageCanvas.js.map +1 -0
  99. package/dist/components/PageNavigator.d.ts +18 -0
  100. package/dist/components/PageNavigator.d.ts.map +1 -0
  101. package/dist/components/PageNavigator.js +44 -0
  102. package/dist/components/PageNavigator.js.map +1 -0
  103. package/dist/components/SeparationCanvas.d.ts +12 -0
  104. package/dist/components/SeparationCanvas.d.ts.map +1 -0
  105. package/dist/components/SeparationCanvas.js +174 -0
  106. package/dist/components/SeparationCanvas.js.map +1 -0
  107. package/dist/components/TACHeatmapOverlay.d.ts +17 -0
  108. package/dist/components/TACHeatmapOverlay.d.ts.map +1 -0
  109. package/dist/components/TACHeatmapOverlay.js +119 -0
  110. package/dist/components/TACHeatmapOverlay.js.map +1 -0
  111. package/dist/components/ZoomControls.d.ts +11 -0
  112. package/dist/components/ZoomControls.d.ts.map +1 -0
  113. package/dist/components/ZoomControls.js +26 -0
  114. package/dist/components/ZoomControls.js.map +1 -0
  115. package/dist/components/defaultShellPlugins.d.ts +3 -0
  116. package/dist/components/defaultShellPlugins.d.ts.map +1 -0
  117. package/dist/components/defaultShellPlugins.js +273 -0
  118. package/dist/components/defaultShellPlugins.js.map +1 -0
  119. package/dist/components/index.d.ts +32 -0
  120. package/dist/components/index.d.ts.map +1 -0
  121. package/dist/components/index.js +32 -0
  122. package/dist/components/index.js.map +1 -0
  123. package/dist/components/presets.d.ts +8 -0
  124. package/dist/components/presets.d.ts.map +1 -0
  125. package/dist/components/presets.js +14 -0
  126. package/dist/components/presets.js.map +1 -0
  127. package/dist/components/shellPlugins.d.ts +105 -0
  128. package/dist/components/shellPlugins.d.ts.map +1 -0
  129. package/dist/components/shellPlugins.js +52 -0
  130. package/dist/components/shellPlugins.js.map +1 -0
  131. package/dist/components/useIsMobile.d.ts +16 -0
  132. package/dist/components/useIsMobile.d.ts.map +1 -0
  133. package/dist/components/useIsMobile.js +30 -0
  134. package/dist/components/useIsMobile.js.map +1 -0
  135. package/dist/fallback-pdfjs/index.d.ts +60 -0
  136. package/dist/fallback-pdfjs/index.d.ts.map +1 -0
  137. package/dist/fallback-pdfjs/index.js +163 -0
  138. package/dist/fallback-pdfjs/index.js.map +1 -0
  139. package/dist/host/LensPDFProvider.d.ts +36 -0
  140. package/dist/host/LensPDFProvider.d.ts.map +1 -0
  141. package/dist/host/LensPDFProvider.js +12 -0
  142. package/dist/host/LensPDFProvider.js.map +1 -0
  143. package/dist/host/index.d.ts +167 -0
  144. package/dist/host/index.d.ts.map +1 -0
  145. package/dist/host/index.js +173 -0
  146. package/dist/host/index.js.map +1 -0
  147. package/dist/host/pdfFallback.d.ts +50 -0
  148. package/dist/host/pdfFallback.d.ts.map +1 -0
  149. package/dist/host/pdfFallback.js +171 -0
  150. package/dist/host/pdfFallback.js.map +1 -0
  151. package/dist/host/pdfValidation.d.ts +45 -0
  152. package/dist/host/pdfValidation.d.ts.map +1 -0
  153. package/dist/host/pdfValidation.js +78 -0
  154. package/dist/host/pdfValidation.js.map +1 -0
  155. package/dist/host/shareLink.d.ts +80 -0
  156. package/dist/host/shareLink.d.ts.map +1 -0
  157. package/dist/host/shareLink.js +114 -0
  158. package/dist/host/shareLink.js.map +1 -0
  159. package/dist/host/useLensPDF.d.ts +73 -0
  160. package/dist/host/useLensPDF.d.ts.map +1 -0
  161. package/dist/host/useLensPDF.js +213 -0
  162. package/dist/host/useLensPDF.js.map +1 -0
  163. package/dist/index.d.ts +68 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +62 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/plugin/context.d.ts +70 -0
  168. package/dist/plugin/context.d.ts.map +1 -0
  169. package/dist/plugin/context.js +16 -0
  170. package/dist/plugin/context.js.map +1 -0
  171. package/dist/plugin/findings-location.d.ts +53 -0
  172. package/dist/plugin/findings-location.d.ts.map +1 -0
  173. package/dist/plugin/findings-location.js +72 -0
  174. package/dist/plugin/findings-location.js.map +1 -0
  175. package/dist/plugin/index.d.ts +19 -0
  176. package/dist/plugin/index.d.ts.map +1 -0
  177. package/dist/plugin/index.js +16 -0
  178. package/dist/plugin/index.js.map +1 -0
  179. package/dist/plugin/registry.d.ts +61 -0
  180. package/dist/plugin/registry.d.ts.map +1 -0
  181. package/dist/plugin/registry.js +102 -0
  182. package/dist/plugin/registry.js.map +1 -0
  183. package/dist/plugin/services.d.ts +380 -0
  184. package/dist/plugin/services.d.ts.map +1 -0
  185. package/dist/plugin/services.js +104 -0
  186. package/dist/plugin/services.js.map +1 -0
  187. package/dist/plugin/types.d.ts +198 -0
  188. package/dist/plugin/types.d.ts.map +1 -0
  189. package/dist/plugin/types.js +24 -0
  190. package/dist/plugin/types.js.map +1 -0
  191. package/dist/types/index.d.ts +191 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +95 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/dist/units/index.d.ts +64 -0
  196. package/dist/units/index.d.ts.map +1 -0
  197. package/dist/units/index.js +98 -0
  198. package/dist/units/index.js.map +1 -0
  199. package/docs/architecture.md +90 -0
  200. package/docs/components.md +569 -0
  201. package/docs/contributing.md +78 -0
  202. package/docs/fallback.md +174 -0
  203. package/docs/lens-pdf-viewer.md +128 -0
  204. package/docs/licensing.md +78 -0
  205. package/docs/measurement-units.md +87 -0
  206. package/docs/plugins.md +256 -0
  207. package/docs/security.md +69 -0
  208. package/docs/server.md +212 -0
  209. package/docs/services.md +210 -0
  210. package/docs/share-links.md +111 -0
  211. package/docs/theming.md +164 -0
  212. package/docs/validation.md +83 -0
  213. 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":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,oEAAoE;AACpE,sEAAsE;AACtE,oEAAoE;AACpE,mEAAmE;AACnE,4DAA4D;AAC5D,SAAS,aAAa;IACpB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,YAAY,CAAC;IACvD,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,YAAY,CAAC;AAClD,CAAC;AA2BD,2CAA2C;AAC3C,SAAS,aAAa,CAAC,EACrB,KAAK,EACL,WAAW,GAAG,IAAI,EAClB,QAAQ,GAKT;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACjC,SAAS,EAAC,2IAA2I,aAErJ,yBAAO,KAAK,GAAQ,EACpB,cACE,SAAS,EAAE,oCAAoC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EACzE,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,WAAW,EACnB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,YAEd,eAAM,CAAC,EAAC,gBAAgB,GAAG,GACvB,IACC,EACR,IAAI,IAAI,cAAK,SAAS,EAAC,MAAM,YAAE,QAAQ,GAAO,IAC3C,CACP,CAAC;AACJ,CAAC;AAED,kCAAkC;AAClC,SAAS,UAAU,CAAC,EAClB,KAAK,EACL,IAAI,EACJ,MAAM,EACN,OAAO,GAMR;IACC,OAAO,CACL,kBACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,6HAA6H,aAEvI,eAAM,SAAS,EAAC,kEAAkE,YAC/E,IAAI,GACA,EACP,eAAM,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,YAAG,KAAK,GAAQ,EACtE,MAAM,IAAI,CACT,eAAM,SAAS,EAAC,mDAAmD,GAAG,CACvE,IACM,CACV,CAAC;AACJ,CAAC;AAED,mCAAmC;AACnC,SAAS,UAAU,CAAC,EAClB,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,OAAO,GAMR;IACC,OAAO,CACL,aACE,IAAI,EAAE,IAAI,EACV,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,6HAA6H,aAEvI,eAAM,SAAS,EAAC,kEAAkE,YAC/E,IAAI,GACA,EACP,yBAAO,KAAK,GAAQ,EACpB,cAAK,SAAS,EAAC,oCAAoC,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YACtH,eAAM,CAAC,EAAC,0EAA0E,GAAG,GACjF,IACJ,CACL,CAAC;AACJ,CAAC;AAED,qBAAqB;AACrB,MAAM,KAAK,GAAG;IACZ,QAAQ,EAAE,CACR,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,iIAAiI,GAAG,GACxI,CACP;IACD,WAAW,EAAE,CACX,eAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,aAC3F,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,GAAG,EAAA,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,GAAG,EAAA,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,GAAG,IACzF,CACP;IACD,MAAM,EAAE,CACN,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,yDAAyD,GAAG,GAChE,CACP;IACD,QAAQ,EAAE,CACR,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,4GAA4G,GAAG,GACnH,CACP;IACD,OAAO,EAAE,CACP,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,kDAAkD,GAAG,GACzD,CACP;IACD,OAAO,EAAE,CACP,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,wDAAwD,GAAG,GAC/D,CACP;IACD,KAAK,EAAE,CACL,eAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,aAC3F,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,EAClD,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,eAAe,EAAC,KAAK,GAAG,IACpE,CACP;IACD,YAAY,EAAE,CACZ,eAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,aAC3F,eAAM,CAAC,EAAC,oCAAoC,GAAG,EAC/C,eAAM,CAAC,EAAC,eAAe,GAAG,IACtB,CACP;IACD,YAAY,EAAE,CACZ,eAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,aAC3F,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,GAAG,EAChC,eAAM,CAAC,EAAC,kBAAkB,EAAC,aAAa,EAAC,KAAK,GAAG,EACjD,eAAM,CAAC,EAAC,WAAW,EAAC,aAAa,EAAC,KAAK,GAAG,IACtC,CACP;IACD,KAAK,EAAE,CACL,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,qCAAqC,GAAG,GAC5C,CACP;IACD,MAAM,EAAE,CACN,eAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,aAC3F,eAAM,CAAC,EAAC,uDAAuD,GAAG,EAAA,mBAAU,MAAM,EAAC,gBAAgB,GAAG,IAClG,CACP;IACD,QAAQ,EAAE,CACR,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,8DAA8D,GAAG,GACrE,CACP;CACF,CAAC;AAEF,MAAM,UAAU,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,GACU;IAClB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAC;IAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAE1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,IAAI,KAAK;YAAE,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACzE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;IAE5B,MAAM,eAAe,GAAG,CAAC,EAAc,EAAE,EAAE;QACzC,EAAE,EAAE,CAAC;QACL,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,EAAc,EAAE,EAAE;QACpC,EAAE,EAAE,CAAC;QACL,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO,CACL,8BAEE,cACE,SAAS,EAAE,kEACT,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,+BAC3B,EAAE,EACF,OAAO,EAAE,OAAO,GAChB,EAGF,eACE,SAAS,EAAE,gHACT,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mBAC7B,EAAE,aAGF,eAAK,SAAS,EAAC,0EAA0E,aACvF,eAAM,SAAS,EAAC,8BAA8B,YAC3C,MAAM,CAAC,SAAS;oCACf,CAAC,CAAC,YAAY;oCACd,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,aAAa,EAAE,GACnC,EACP,iBACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,gEAAgE,YAE1E,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,sBAAsB,GAAG,GAC7B,GACC,IACL,EAEN,eAAK,SAAS,EAAC,iBAAiB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,aAErE,eAAK,SAAS,EAAC,wCAAwC,aACpD,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,sCAAsC,YAAE,QAAQ,GAAO,CACvE,EACD,eAAK,SAAS,EAAC,gCAAgC,aAC7C,gBAAM,SAAS,EAAC,cAAc,aAAE,cAAc,CAAC,KAAK,eAAe,EACnE,gBAAM,SAAS,EAAC,gBAAgB,aAAE,cAAc,CAAC,OAAO,iBAAiB,EACzE,gBAAM,SAAS,EAAC,eAAe,aAAE,cAAc,CAAC,QAAQ,aAAa,IACjE,IACF,EAGN,MAAC,aAAa,IAAC,KAAK,EAAC,MAAM,EAAC,WAAW,mBACrC,KAAC,UAAU,IACT,KAAK,EAAC,eAAe,EACrB,IAAI,EAAE,KAAK,CAAC,MAAM,EAClB,MAAM,EAAE,UAAU,KAAK,QAAQ,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,GAC5D,EACD,QAAQ,IAAI,CACX,KAAC,UAAU,IACT,KAAK,EAAC,gBAAgB,EACtB,IAAI,EAAE,CACJ,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,+CAA+C,GAAG,GACtD,CACP,EACD,MAAM,EAAE,UAAU,KAAK,OAAO,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAC3D,CACH,EACD,KAAC,UAAU,IACT,KAAK,EAAC,UAAU,EAChB,IAAI,EAAE,KAAK,CAAC,QAAQ,EACpB,MAAM,EAAE,UAAU,KAAK,QAAQ,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,GAC5D,EACD,MAAM,CAAC,kBAAkB,IAAI,CAC5B,KAAC,UAAU,IACT,KAAK,EAAC,iBAAiB,EACvB,IAAI,EAAE,KAAK,CAAC,WAAW,EACvB,MAAM,EAAE,UAAU,KAAK,YAAY,EACnC,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,GAChE,CACH,EACA,MAAM,CAAC,aAAa,IAAI,CACvB,KAAC,UAAU,IACT,KAAK,EAAC,YAAY,EAClB,IAAI,EAAE,KAAK,CAAC,MAAM,EAClB,MAAM,EAAE,UAAU,KAAK,QAAQ,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,GAC5D,CACH,IACa,EAGf,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,iBAAiB,CAAC,IAAI,CACvE,MAAC,aAAa,IAAC,KAAK,EAAC,QAAQ,EAAC,WAAW,mBACtC,MAAM,CAAC,kBAAkB,IAAI,CAC5B,KAAC,UAAU,IACT,KAAK,EAAC,aAAa,EACnB,IAAI,EAAE,KAAK,CAAC,QAAQ,EACpB,MAAM,EAAE,UAAU,KAAK,YAAY,EACnC,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,GAChE,CACH,EACA,MAAM,CAAC,iBAAiB,IAAI,CAC3B,KAAC,UAAU,IACT,KAAK,EAAC,kBAAkB,EACxB,IAAI,EAAE,KAAK,CAAC,OAAO,EACnB,MAAM,EAAE,UAAU,KAAK,YAAY,EACnC,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,GAChE,CACH,IACa,CACjB,EAGD,MAAC,aAAa,IAAC,KAAK,EAAC,gBAAgB,EAAC,WAAW,mBAC9C,MAAM,CAAC,kBAAkB,IAAI,CAC5B,KAAC,UAAU,IACT,KAAK,EAAC,aAAa,EACnB,IAAI,EAAE,KAAK,CAAC,OAAO,EACnB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAC7C,CACH,EACD,KAAC,UAAU,IACT,KAAK,EAAC,oBAAoB,EAC1B,IAAI,EAAE,KAAK,CAAC,KAAK,EACjB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAC7C,EACD,MAAM,CAAC,kBAAkB,IAAI,CAC5B,8BACE,KAAC,UAAU,IACT,KAAK,EAAC,cAAc,EACpB,IAAI,EAAE,KAAK,CAAC,YAAY,EACxB,MAAM,EAAE,WAAW,KAAK,cAAc,EACtC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,GAChE,EACF,KAAC,UAAU,IACT,KAAK,EAAC,8BAA8B,EACpC,IAAI,EAAE,KAAK,CAAC,YAAY,EACxB,MAAM,EAAE,WAAW,KAAK,cAAc,EACtC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,GAChE,EACF,KAAC,UAAU,IACT,KAAK,EAAC,OAAO,EACb,IAAI,EAAE,KAAK,CAAC,KAAK,EACjB,MAAM,EAAE,WAAW,KAAK,OAAO,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,GACzD,IACD,CACJ,IACa,EAGhB,KAAC,aAAa,IAAC,KAAK,EAAC,MAAM,EAAC,WAAW,EAAE,KAAK,YAC5C,cAAK,SAAS,EAAC,WAAW,YACxB,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,QAAC,IAAI,SAAG,GACjE,GACQ,EAQf,CAAC,WAAW;gCACX,CAAC,CAAC,cAAc;oCACd,CAAC,MAAM,CAAC,uBAAuB,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAClE,MAAC,aAAa,IAAC,KAAK,EAAC,gBAAoB,EAAC,WAAW,EAAE,KAAK,aACzD,WAAW,IAAI,CACd,KAAC,UAAU,IACT,KAAK,EAAC,aAAa,EACnB,IAAI,EAAE,CACJ,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,CAAC,EAAC,sGAAsG,GAAG,GAC7G,CACP,EACD,MAAM,EAAE,KAAK,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,GACtC,CACH,EACA,CAAC,cAAc,IAAI,MAAM,CAAC,uBAAuB,IAAI,CACpD,KAAC,UAAU,IACT,KAAK,EAAC,kBAAkB,EACxB,IAAI,EAAE,KAAK,CAAC,MAAM,EAClB,IAAI,EAAE,OAAO,CAAC,gBAAgB,EAAE,EAChC,OAAO,EAAE,OAAO,GAChB,CACH,EACA,CAAC,cAAc,IAAI,MAAM,CAAC,eAAe,IAAI,CAC5C,KAAC,UAAU,IACT,KAAK,EAAC,cAAc,EACpB,IAAI,EAAE,KAAK,CAAC,QAAQ,EACpB,IAAI,EAAE,OAAO,CAAC,iBAAiB,EAAE,EACjC,OAAO,EAAE,OAAO,GAChB,CACH,IACa,CACjB,IACG,IACF,IACL,CACJ,CAAC;AACJ,CAAC"}
@@ -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"}