@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,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex accuracy overlay for `<LensPDFDemo>`.
|
|
3
|
+
*
|
|
4
|
+
* When a host passes a `codex` client, `LensPDFDemo` fires
|
|
5
|
+
* `extractStream` in the background. This module wraps the codex
|
|
6
|
+
* render APIs (renderSeparations, renderHeatmap, renderLayer) into
|
|
7
|
+
* the `ViewerServices` slot interface so the viewer can swap in
|
|
8
|
+
* Ghostscript-accurate renders silently once they arrive.
|
|
9
|
+
*
|
|
10
|
+
* This module has **no import of `@printwithsynergy/codex-client`**.
|
|
11
|
+
* It defines a minimal structural interface — any object whose shape
|
|
12
|
+
* matches `MinimalCodexClient` (including `HttpClient` from
|
|
13
|
+
* `@printwithsynergy/codex-client`) satisfies it.
|
|
14
|
+
*
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
import { PROCESS_CHANNELS } from "./constants.js";
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Ink / layer extraction helpers
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Extract a `DetectedInk[]` from the `color_world` SSE event payload.
|
|
23
|
+
* Returns the 4 CMYK process channels plus any spot colorants the
|
|
24
|
+
* PDF declares (accurate — from pikepdf, not regex scanning).
|
|
25
|
+
*
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
export function extractInksFromColorWorld(colorWorld) {
|
|
29
|
+
const process = PROCESS_CHANNELS.map((name) => ({
|
|
30
|
+
name,
|
|
31
|
+
type: "process",
|
|
32
|
+
altRgb: _PROCESS_INK_RGB[name.toLowerCase()] ?? [0, 0, 0],
|
|
33
|
+
}));
|
|
34
|
+
const spots = [];
|
|
35
|
+
const colorants = colorWorld["spot_colorants"];
|
|
36
|
+
if (Array.isArray(colorants)) {
|
|
37
|
+
for (const c of colorants) {
|
|
38
|
+
if (!c || typeof c !== "object")
|
|
39
|
+
continue;
|
|
40
|
+
const name = String(c["name"] ?? "");
|
|
41
|
+
if (!name)
|
|
42
|
+
continue;
|
|
43
|
+
const rgb = c["rgb"];
|
|
44
|
+
let altRgb = [128, 128, 128];
|
|
45
|
+
if (Array.isArray(rgb) && rgb.length >= 3) {
|
|
46
|
+
altRgb = [
|
|
47
|
+
Math.round(Number(rgb[0]) * 255),
|
|
48
|
+
Math.round(Number(rgb[1]) * 255),
|
|
49
|
+
Math.round(Number(rgb[2]) * 255),
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
spots.push({ name, type: "spot", altRgb });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return [...process, ...spots];
|
|
56
|
+
}
|
|
57
|
+
/** @internal */
|
|
58
|
+
const _PROCESS_INK_RGB = {
|
|
59
|
+
cyan: [0, 174, 239],
|
|
60
|
+
magenta: [236, 0, 140],
|
|
61
|
+
yellow: [255, 242, 0],
|
|
62
|
+
black: [35, 31, 32],
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Extract a layer list from the `ocgs` SSE event payload.
|
|
66
|
+
*
|
|
67
|
+
* @public
|
|
68
|
+
*/
|
|
69
|
+
export function extractLayersFromOcgs(ocgs) {
|
|
70
|
+
const list = ocgs["ocgs"];
|
|
71
|
+
if (!Array.isArray(list))
|
|
72
|
+
return [];
|
|
73
|
+
const result = [];
|
|
74
|
+
for (let i = 0; i < list.length; i++) {
|
|
75
|
+
const item = list[i];
|
|
76
|
+
if (!item || typeof item !== "object")
|
|
77
|
+
continue;
|
|
78
|
+
const name = String(item["name"] ?? `Layer ${i + 1}`);
|
|
79
|
+
const defaultOn = item["default_on"];
|
|
80
|
+
result.push({
|
|
81
|
+
name,
|
|
82
|
+
ocg_index: i,
|
|
83
|
+
default_on: defaultOn !== false,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Build `separations`, `tacHeatmap`, and `layers` service slots backed
|
|
90
|
+
* by the codex render APIs. Lazy: each page's renders are fetched the
|
|
91
|
+
* first time they're requested, then cached as blob URLs.
|
|
92
|
+
*
|
|
93
|
+
* Hosts swap these into `ViewerServices` after `phase2_complete` fires
|
|
94
|
+
* so pdfjs approximations are replaced by Ghostscript renders.
|
|
95
|
+
*
|
|
96
|
+
* @public
|
|
97
|
+
*/
|
|
98
|
+
export function createCodexOverlayServices(client, sha256, tacLimit, layerData) {
|
|
99
|
+
const pdfRef = { sha256 };
|
|
100
|
+
// Blob URL caches
|
|
101
|
+
// Separations: keyed `${pageNum}|${channelName}` → url
|
|
102
|
+
const channelUrls = new Map();
|
|
103
|
+
const channelBuilds = new Map();
|
|
104
|
+
// Heatmaps: keyed `${pageNum}|${limit}` → url
|
|
105
|
+
const heatmapUrls = new Map();
|
|
106
|
+
const heatmapBuilds = new Map();
|
|
107
|
+
// Layers: keyed `${pageNum}|${layerIndex}` → url
|
|
108
|
+
const layerUrlMap = new Map();
|
|
109
|
+
const layerBuilds = new Map();
|
|
110
|
+
const blobs = [];
|
|
111
|
+
const subscribers = new Set();
|
|
112
|
+
function notify() {
|
|
113
|
+
for (const cb of subscribers)
|
|
114
|
+
cb();
|
|
115
|
+
}
|
|
116
|
+
function makeBlobUrl(bytes, type = "image/png") {
|
|
117
|
+
// Copy into a plain ArrayBuffer to satisfy Blob's type constraints
|
|
118
|
+
// (TypeScript requires ArrayBuffer, not SharedArrayBuffer).
|
|
119
|
+
const ab = bytes.buffer instanceof ArrayBuffer
|
|
120
|
+
? bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)
|
|
121
|
+
: new Uint8Array(bytes).buffer;
|
|
122
|
+
const blob = new Blob([ab], { type });
|
|
123
|
+
const url = URL.createObjectURL(blob);
|
|
124
|
+
blobs.push(url);
|
|
125
|
+
return url;
|
|
126
|
+
}
|
|
127
|
+
function base64ToUint8Array(b64) {
|
|
128
|
+
const raw = atob(b64);
|
|
129
|
+
const out = new Uint8Array(raw.length);
|
|
130
|
+
for (let i = 0; i < raw.length; i++)
|
|
131
|
+
out[i] = raw.charCodeAt(i);
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
// Fetch all channels for a page in one call, cache each individually.
|
|
135
|
+
function ensureChannelsForPage(pageNum) {
|
|
136
|
+
const buildKey = `page:${pageNum}`;
|
|
137
|
+
if (channelBuilds.has(buildKey))
|
|
138
|
+
return;
|
|
139
|
+
const promise = client
|
|
140
|
+
.renderSeparations(pdfRef, { page: pageNum })
|
|
141
|
+
.then((result) => {
|
|
142
|
+
for (const ch of result.channels) {
|
|
143
|
+
const key = `${pageNum}|${ch.name}`;
|
|
144
|
+
if (channelUrls.has(key))
|
|
145
|
+
continue;
|
|
146
|
+
try {
|
|
147
|
+
const bytes = base64ToUint8Array(ch.png_b64);
|
|
148
|
+
channelUrls.set(key, makeBlobUrl(bytes));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Skip bad channel silently.
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
channelBuilds.delete(buildKey);
|
|
155
|
+
notify();
|
|
156
|
+
})
|
|
157
|
+
.catch(() => {
|
|
158
|
+
channelBuilds.delete(buildKey);
|
|
159
|
+
});
|
|
160
|
+
channelBuilds.set(buildKey, promise);
|
|
161
|
+
}
|
|
162
|
+
function ensureHeatmap(pageNum, limit) {
|
|
163
|
+
const key = `${pageNum}|${limit}`;
|
|
164
|
+
if (heatmapUrls.has(key) || heatmapBuilds.has(key))
|
|
165
|
+
return;
|
|
166
|
+
const promise = client
|
|
167
|
+
.renderHeatmap(pdfRef, { page: pageNum, tacLimit: limit })
|
|
168
|
+
.then((result) => {
|
|
169
|
+
const url = makeBlobUrl(result.png);
|
|
170
|
+
heatmapUrls.set(key, url);
|
|
171
|
+
heatmapBuilds.delete(key);
|
|
172
|
+
notify();
|
|
173
|
+
return url;
|
|
174
|
+
})
|
|
175
|
+
.catch(() => {
|
|
176
|
+
heatmapBuilds.delete(key);
|
|
177
|
+
return "";
|
|
178
|
+
});
|
|
179
|
+
heatmapBuilds.set(key, promise);
|
|
180
|
+
}
|
|
181
|
+
const allLayerIndices = layerData.map((l) => l.ocg_index);
|
|
182
|
+
function ensureLayer(pageNum, layerIndex) {
|
|
183
|
+
const key = `${pageNum}|${layerIndex}`;
|
|
184
|
+
if (layerUrlMap.has(key) || layerBuilds.has(key))
|
|
185
|
+
return;
|
|
186
|
+
const promise = client
|
|
187
|
+
.renderLayer(pdfRef, { page: pageNum, layerIndex, allLayerIndices })
|
|
188
|
+
.then((bytes) => {
|
|
189
|
+
const url = makeBlobUrl(bytes);
|
|
190
|
+
layerUrlMap.set(key, url);
|
|
191
|
+
layerBuilds.delete(key);
|
|
192
|
+
notify();
|
|
193
|
+
return url;
|
|
194
|
+
})
|
|
195
|
+
.catch(() => {
|
|
196
|
+
layerBuilds.delete(key);
|
|
197
|
+
return "";
|
|
198
|
+
});
|
|
199
|
+
layerBuilds.set(key, promise);
|
|
200
|
+
}
|
|
201
|
+
const separations = {
|
|
202
|
+
getChannelImageUrl({ pageNum, channelName }) {
|
|
203
|
+
const key = `${pageNum}|${channelName}`;
|
|
204
|
+
const cached = channelUrls.get(key);
|
|
205
|
+
if (cached)
|
|
206
|
+
return cached;
|
|
207
|
+
ensureChannelsForPage(pageNum);
|
|
208
|
+
return "";
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
const tacHeatmap = {
|
|
212
|
+
getHeatmapImageUrl({ pageNum, tacLimit: tl }) {
|
|
213
|
+
const limit = tl ?? tacLimit;
|
|
214
|
+
const key = `${pageNum}|${limit}`;
|
|
215
|
+
const cached = heatmapUrls.get(key);
|
|
216
|
+
if (cached)
|
|
217
|
+
return cached;
|
|
218
|
+
ensureHeatmap(pageNum, limit);
|
|
219
|
+
return "";
|
|
220
|
+
},
|
|
221
|
+
listRuns: async (_args) => [],
|
|
222
|
+
};
|
|
223
|
+
const layers = {
|
|
224
|
+
getLayerImageUrl({ pageNum, layerIndex }) {
|
|
225
|
+
const key = `${pageNum}|${layerIndex}`;
|
|
226
|
+
const cached = layerUrlMap.get(key);
|
|
227
|
+
if (cached)
|
|
228
|
+
return cached;
|
|
229
|
+
ensureLayer(pageNum, layerIndex);
|
|
230
|
+
return "";
|
|
231
|
+
},
|
|
232
|
+
listLayers: async () => layerData,
|
|
233
|
+
};
|
|
234
|
+
return {
|
|
235
|
+
separations,
|
|
236
|
+
tacHeatmap,
|
|
237
|
+
layers,
|
|
238
|
+
subscribe(listener) {
|
|
239
|
+
subscribers.add(listener);
|
|
240
|
+
return () => subscribers.delete(listener);
|
|
241
|
+
},
|
|
242
|
+
dispose() {
|
|
243
|
+
for (const url of blobs)
|
|
244
|
+
URL.revokeObjectURL(url);
|
|
245
|
+
blobs.length = 0;
|
|
246
|
+
channelUrls.clear();
|
|
247
|
+
channelBuilds.clear();
|
|
248
|
+
heatmapUrls.clear();
|
|
249
|
+
heatmapBuilds.clear();
|
|
250
|
+
layerUrlMap.clear();
|
|
251
|
+
layerBuilds.clear();
|
|
252
|
+
subscribers.clear();
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=codexOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexOverlay.js","sourceRoot":"","sources":["../../browser/codexOverlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module-local constants extracted to break a circular import between
|
|
3
|
+
* `browser/index.ts` and `browser/codexOverlay.ts`. Astro / Node SSR
|
|
4
|
+
* evaluates ESM modules in a strict order, and re-exporting
|
|
5
|
+
* `codexOverlay` from `index` while `codexOverlay` reads
|
|
6
|
+
* `PROCESS_CHANNELS` back from `index` triggered a TDZ
|
|
7
|
+
* `Cannot access '_CHANNELS' before initialization` at request time.
|
|
8
|
+
*
|
|
9
|
+
* Keep this file dependency-free.
|
|
10
|
+
*/
|
|
11
|
+
/** Process inks the demo synthesises from RGB. */
|
|
12
|
+
export declare const PROCESS_CHANNELS: readonly ["Cyan", "Magenta", "Yellow", "Black"];
|
|
13
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../browser/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,iDAAkD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module-local constants extracted to break a circular import between
|
|
3
|
+
* `browser/index.ts` and `browser/codexOverlay.ts`. Astro / Node SSR
|
|
4
|
+
* evaluates ESM modules in a strict order, and re-exporting
|
|
5
|
+
* `codexOverlay` from `index` while `codexOverlay` reads
|
|
6
|
+
* `PROCESS_CHANNELS` back from `index` triggered a TDZ
|
|
7
|
+
* `Cannot access '_CHANNELS' before initialization` at request time.
|
|
8
|
+
*
|
|
9
|
+
* Keep this file dependency-free.
|
|
10
|
+
*/
|
|
11
|
+
/** Process inks the demo synthesises from RGB. */
|
|
12
|
+
export const PROCESS_CHANNELS = ["Cyan", "Magenta", "Yellow", "Black"];
|
|
13
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../browser/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@printwithsynergy/lens-pdf/browser`
|
|
3
|
+
*
|
|
4
|
+
* Browser-only ViewerServices factory. One call gives you a fully
|
|
5
|
+
* wired {@link ViewerServices} instance backed by pdf.js — every
|
|
6
|
+
* tool the package ships (page raster, layers, separations, TAC
|
|
7
|
+
* heatmap, color picker, densitometer, in-browser annotations)
|
|
8
|
+
* works against any PDF the browser can fetch, without a server
|
|
9
|
+
* backend.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { createBrowserViewerServices } from "@printwithsynergy/lens-pdf/browser";
|
|
13
|
+
* const services = createBrowserViewerServices({ pdfUrl: "/proofs/abc.pdf" });
|
|
14
|
+
* await services.prepare(1); // pre-warm separations + heatmap + layers for page 1
|
|
15
|
+
* // <ViewerServicesContext.Provider value={services}> ... </Provider>
|
|
16
|
+
* services.dispose(); // free blob URLs / pdf.js doc on unmount
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Server-only features (true ICC separations, preflight findings,
|
|
20
|
+
* server-persisted annotations, PDF report exports) are explicitly
|
|
21
|
+
* left as `markUnwired` no-ops; their components self-hide.
|
|
22
|
+
*
|
|
23
|
+
* The CMYK numbers here are **rich-black approximations**, not ICC.
|
|
24
|
+
* Solid black RGB(0,0,0) reads as C=100, M=100, Y=100, K=80, TAC≈380%
|
|
25
|
+
* — close enough to a press CMYK rich-black to make the TAC heatmap
|
|
26
|
+
* and densitometer behave like their real backends. Production
|
|
27
|
+
* hosts wire a Ghostscript / MuPDF backend for ICC-correct readings.
|
|
28
|
+
*
|
|
29
|
+
* **Security**: this factory fetches whatever URL the host hands it.
|
|
30
|
+
* Sign / scope / expire the URL the same way you would any other PDF
|
|
31
|
+
* download — the viewer is a pure renderer and trusts the host to
|
|
32
|
+
* enforce access control upstream.
|
|
33
|
+
*
|
|
34
|
+
* @public
|
|
35
|
+
*/
|
|
36
|
+
export type { MinimalCodexClient, CodexOverlayServices } from "./codexOverlay";
|
|
37
|
+
export { createCodexOverlayServices, extractInksFromColorWorld, extractLayersFromOcgs } from "./codexOverlay";
|
|
38
|
+
import { type ThemeTokens, type ViewerServices } from "../plugin/services";
|
|
39
|
+
export { PROCESS_CHANNELS } from "./constants";
|
|
40
|
+
export { pantoneGoldLookup, processPlateLookup, resolveSpotSwatch, rgbToHex, } from "./pantone-gold";
|
|
41
|
+
/**
|
|
42
|
+
* A single ink reported by the densitometer / color picker.
|
|
43
|
+
*
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
46
|
+
export interface DetectedInk {
|
|
47
|
+
/** Display name — `"Cyan"`, `"PANTONE 185 C"`, `"Reflex Blue"` … */
|
|
48
|
+
name: string;
|
|
49
|
+
/** `process` for CMYK plates pdf.js composites in RGB; `spot` for
|
|
50
|
+
* Separation / DeviceN colorants the host PDF declares. */
|
|
51
|
+
type: "process" | "spot";
|
|
52
|
+
/** Synthetic alternate sRGB triplet used to estimate coverage from
|
|
53
|
+
* the rasterised RGB pixel. For process inks this is the canonical
|
|
54
|
+
* CMYK→sRGB primary; for spots it's parsed from the PDF when
|
|
55
|
+
* available, otherwise hash-derived from the spot name so each
|
|
56
|
+
* spot still gets a stable, distinct hue. */
|
|
57
|
+
altRgb: [number, number, number];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Default URL for the pdf.js worker, served via unpkg pinned to the
|
|
61
|
+
* exact `pdfjs-dist` version this package was built against. Hosts
|
|
62
|
+
* that don't want a runtime CDN dep can override via the
|
|
63
|
+
* `workerSrc` option, set `pdfjs.GlobalWorkerOptions.workerSrc`
|
|
64
|
+
* directly before constructing the services, or self-host the file.
|
|
65
|
+
*
|
|
66
|
+
* @public
|
|
67
|
+
*/
|
|
68
|
+
export declare const defaultBrowserWorkerSrc: string;
|
|
69
|
+
/**
|
|
70
|
+
* Convert an sRGB triplet to a CMYK approximation. Uses an additive
|
|
71
|
+
* decomposition with a "rich-black" K plate:
|
|
72
|
+
*
|
|
73
|
+
* C = 1 - R/255
|
|
74
|
+
* M = 1 - G/255
|
|
75
|
+
* Y = 1 - B/255
|
|
76
|
+
* K = min(C, M, Y) × {@link K_FACTOR}
|
|
77
|
+
* TAC = (C + M + Y + K) × 100 // [0, 380]
|
|
78
|
+
*
|
|
79
|
+
* Returns each ink in [0, 1] and total area coverage as a percentage
|
|
80
|
+
* in [0, 380].
|
|
81
|
+
*
|
|
82
|
+
* This is intentionally NOT a GCR substitution — keeping the full
|
|
83
|
+
* C/M/Y values lets the TAC heatmap actually trip on solid-black
|
|
84
|
+
* artwork instead of bottoming out at 100 % from K alone, which is
|
|
85
|
+
* the behaviour print-prepress reviewers expect.
|
|
86
|
+
*
|
|
87
|
+
* @public
|
|
88
|
+
*/
|
|
89
|
+
export declare function rgbToCmyk(r: number, g: number, b: number): {
|
|
90
|
+
c: number;
|
|
91
|
+
m: number;
|
|
92
|
+
y: number;
|
|
93
|
+
k: number;
|
|
94
|
+
tac: number;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Best-effort spot-ink detector. Scans the raw PDF bytes (latin-1
|
|
98
|
+
* decoded) for `/Separation /Name …` and `/DeviceN [/N1 /N2 …]`
|
|
99
|
+
* declarations. Misses spots inside compressed object streams — for
|
|
100
|
+
* those the densitometer falls back to "process only" with no harm
|
|
101
|
+
* done. Hosts that need 100 % accurate ink lists wire a backend.
|
|
102
|
+
*
|
|
103
|
+
* @public
|
|
104
|
+
*/
|
|
105
|
+
export declare function detectSpotInksFromPdfBytes(bytes: Uint8Array): DetectedInk[];
|
|
106
|
+
/**
|
|
107
|
+
* Options for {@link createBrowserViewerServices}.
|
|
108
|
+
*
|
|
109
|
+
* @public
|
|
110
|
+
*/
|
|
111
|
+
export interface BrowserViewerServicesOptions {
|
|
112
|
+
/** Raw PDF URL the browser can fetch. */
|
|
113
|
+
pdfUrl: string;
|
|
114
|
+
/**
|
|
115
|
+
* Optional override for the pdf.js worker URL. Default:
|
|
116
|
+
* {@link defaultBrowserWorkerSrc}.
|
|
117
|
+
*/
|
|
118
|
+
workerSrc?: string;
|
|
119
|
+
/**
|
|
120
|
+
* Theme tokens to expose on `services.tokens`. Defaults to the
|
|
121
|
+
* package's neutral light palette.
|
|
122
|
+
*/
|
|
123
|
+
tokens?: ThemeTokens;
|
|
124
|
+
/**
|
|
125
|
+
* Default TAC limit (in percent) used when the host doesn't specify
|
|
126
|
+
* one explicitly. The TAC heatmap and densitometer both respect the
|
|
127
|
+
* per-call value first; this is only used when the call site omits
|
|
128
|
+
* it. Default 300 — typical sheet-fed press limit.
|
|
129
|
+
*/
|
|
130
|
+
tacLimit?: number;
|
|
131
|
+
/**
|
|
132
|
+
* Email used as the synthetic author for the in-browser annotation
|
|
133
|
+
* service. Default: `"you@browser.local"`.
|
|
134
|
+
*/
|
|
135
|
+
annotationAuthorEmail?: string;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Augmented `ViewerServices` returned by {@link createBrowserViewerServices}.
|
|
139
|
+
* Extends the wire protocol with lifecycle helpers, a subscription
|
|
140
|
+
* hook that fires whenever a lazily-built tile URL becomes available,
|
|
141
|
+
* and a `prepare()` method that pre-warms the analysis raster, every
|
|
142
|
+
* channel, the TAC heatmap, and (if the PDF has OCGs) every layer
|
|
143
|
+
* for a given page.
|
|
144
|
+
*
|
|
145
|
+
* @public
|
|
146
|
+
*/
|
|
147
|
+
export interface BrowserViewerServices extends ViewerServices {
|
|
148
|
+
/** How many pages the underlying PDF has (resolves once parsed). */
|
|
149
|
+
getPageCount(): Promise<number>;
|
|
150
|
+
/** Page dimensions in PDF points for `pageNum` (1-indexed). */
|
|
151
|
+
getPageDimensions(pageNum: number): Promise<{
|
|
152
|
+
widthPts: number;
|
|
153
|
+
heightPts: number;
|
|
154
|
+
}>;
|
|
155
|
+
/**
|
|
156
|
+
* Inks the densitometer + color picker will report on. Always
|
|
157
|
+
* includes the four CMYK process plates pdf.js composites in RGB,
|
|
158
|
+
* plus any spot inks we could extract from the raw PDF bytes
|
|
159
|
+
* (Separation / DeviceN declarations outside compressed streams).
|
|
160
|
+
* Resolves once the PDF has been parsed.
|
|
161
|
+
*/
|
|
162
|
+
getInks(): Promise<DetectedInk[]>;
|
|
163
|
+
/**
|
|
164
|
+
* Pre-build analysis raster + every CMYK channel image + the TAC
|
|
165
|
+
* heatmap + every layer image for `pageNum`. Resolves once they're
|
|
166
|
+
* all cached so the synchronous URL builders return real blob URLs
|
|
167
|
+
* rather than placeholders. Hosts mounting `<SeparationCanvas>`,
|
|
168
|
+
* `<TACHeatmapOverlay>`, or `<LayerCanvas>` should `await` this
|
|
169
|
+
* before mounting the canvas — those components cache the first
|
|
170
|
+
* loaded image and never retry on URL change.
|
|
171
|
+
*/
|
|
172
|
+
prepare(pageNum: number, opts?: {
|
|
173
|
+
tacLimit?: number;
|
|
174
|
+
}): Promise<{
|
|
175
|
+
widthPts: number;
|
|
176
|
+
heightPts: number;
|
|
177
|
+
layerCount: number;
|
|
178
|
+
}>;
|
|
179
|
+
/**
|
|
180
|
+
* Subscribe to "URL available" notifications. Components that read
|
|
181
|
+
* synchronous URL builders (`pageImages.getPageImageUrl` in
|
|
182
|
+
* particular) should re-render on each event so the next builder
|
|
183
|
+
* call returns the freshly-cached blob URL instead of the
|
|
184
|
+
* placeholder.
|
|
185
|
+
*/
|
|
186
|
+
subscribe(listener: () => void): () => void;
|
|
187
|
+
/** Free every blob URL the services minted. Call on unmount. */
|
|
188
|
+
dispose(): void;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Build a fully-wired {@link ViewerServices} backed by pdf.js. Every
|
|
192
|
+
* service the package consumes is implemented; consumers can drop the
|
|
193
|
+
* returned object straight into a `<ViewerServicesContext.Provider>`
|
|
194
|
+
* and every viewer-only feature works.
|
|
195
|
+
*
|
|
196
|
+
* @public
|
|
197
|
+
*/
|
|
198
|
+
export declare function createBrowserViewerServices(opts: BrowserViewerServicesOptions): BrowserViewerServices;
|
|
199
|
+
/**
|
|
200
|
+
* React hook that re-renders whenever a {@link BrowserViewerServices}
|
|
201
|
+
* instance fires a `subscribe` event (i.e. a lazily-built page tile,
|
|
202
|
+
* channel image, heatmap, or annotation has become available).
|
|
203
|
+
*
|
|
204
|
+
* Use this in the top-level component that holds the services instance
|
|
205
|
+
* so children re-read the synchronous URL builders and pick up freshly-
|
|
206
|
+
* cached blob URLs.
|
|
207
|
+
*
|
|
208
|
+
* @public
|
|
209
|
+
*/
|
|
210
|
+
export declare function useBrowserViewerServicesVersion(services: BrowserViewerServices | null | undefined): number;
|
|
211
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAIH,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE9G,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AA8B5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACT,MAAM,gBAAgB,CAAC;AAExB;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb;gEAC4D;IAC5D,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzB;;;;kDAI8C;IAC9C,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,QAA2E,CAAC;AAuEhH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CACvB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAM7D;AAgGD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,EAAE,CAsC3E;AA6HD;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,oEAAoE;IACpE,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,+DAA+D;IAC/D,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF;;;;;;OAMG;IACH,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC;;;;;;;;OAQG;IACH,OAAO,CACL,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,OAAO,CAAC;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,gEAAgE;IAChE,OAAO,IAAI,IAAI,CAAC;CACjB;AAMD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,4BAA4B,GACjC,qBAAqB,CAizBvB;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,GACjD,MAAM,CAOR"}
|