@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,220 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useState } from "react";
4
+ import { logUnwiredHide, useFallbackMode, useViewerHost, useViewerServices, } from "../host/index.js";
5
+ import { useIsMobile } from "./useIsMobile.js";
6
+ export function ColorPickerTool({ jobId: _jobId, pageNum, pageWidthPts, pageHeightPts, canvasWidth, canvasHeight, }) {
7
+ const { colorSample } = useViewerServices();
8
+ const { debug, pdfFallback } = useViewerHost();
9
+ const mode = useFallbackMode(colorSample);
10
+ const isMobile = useIsMobile();
11
+ const [sample, setSample] = useState(null);
12
+ const [position, setPosition] = useState(null);
13
+ const [loading, setLoading] = useState(false);
14
+ // Ink swatches: fixed CMYK primaries for process channels, deterministic
15
+ // hash-to-hue for spot channels so each spot stays visually stable across
16
+ // samples.
17
+ const swatchFor = (name) => {
18
+ const n = name.toLowerCase();
19
+ if (n === "cyan" || n === "c")
20
+ return "#00b7eb";
21
+ if (n === "magenta" || n === "m")
22
+ return "#e91e63";
23
+ if (n === "yellow" || n === "y")
24
+ return "#fdd835";
25
+ if (n === "black" || n === "k")
26
+ return "#111827";
27
+ let h = 0;
28
+ for (let i = 0; i < name.length; i++)
29
+ h = (h * 31 + name.charCodeAt(i)) >>> 0;
30
+ return `hsl(${h % 360}, 70%, 45%)`;
31
+ };
32
+ const processAbbr = (name) => {
33
+ const lower = name.toLowerCase();
34
+ if (lower === "cyan")
35
+ return "C";
36
+ if (lower === "magenta")
37
+ return "M";
38
+ if (lower === "yellow")
39
+ return "Y";
40
+ if (lower === "black")
41
+ return "K";
42
+ return name.charAt(0).toUpperCase();
43
+ };
44
+ useEffect(() => {
45
+ if (mode === "hidden" && debug)
46
+ logUnwiredHide("ColorPickerTool", "colorSample");
47
+ }, [mode, debug]);
48
+ const pickAt = useCallback(async (clickX, clickY) => {
49
+ // Convert to PDF coordinates (origin lower-left)
50
+ const pdfX = (clickX / canvasWidth) * pageWidthPts;
51
+ const pdfY = pageHeightPts - (clickY / canvasHeight) * pageHeightPts;
52
+ setPosition({ x: clickX, y: clickY });
53
+ setLoading(true);
54
+ try {
55
+ const data = mode === "fallback" && pdfFallback
56
+ ? await pdfFallback.sampleColorAt({ pageNum, pdfX, pdfY })
57
+ : await colorSample.sampleAt({ pageNum, pdfX, pdfY });
58
+ if (data)
59
+ setSample(data);
60
+ }
61
+ finally {
62
+ setLoading(false);
63
+ }
64
+ }, [colorSample, pdfFallback, mode, pageNum, pageWidthPts, pageHeightPts, canvasWidth, canvasHeight]);
65
+ if (mode === "hidden")
66
+ return null;
67
+ const handleClick = useCallback((e) => {
68
+ const rect = e.currentTarget.getBoundingClientRect();
69
+ void pickAt(e.clientX - rect.left, e.clientY - rect.top);
70
+ }, [pickAt]);
71
+ const handleTouch = useCallback((e) => {
72
+ if (e.touches.length !== 1)
73
+ return;
74
+ e.preventDefault();
75
+ const touch = e.touches[0];
76
+ const rect = e.currentTarget.getBoundingClientRect();
77
+ void pickAt(touch.clientX - rect.left, touch.clientY - rect.top);
78
+ }, [pickAt]);
79
+ // Readout placement: floating tooltip on desktop (anchored near the
80
+ // click), bottom sheet on mobile so the readout never falls behind
81
+ // the user's finger or off-screen.
82
+ const readoutStyle = isMobile
83
+ ? {
84
+ position: "fixed",
85
+ left: 0,
86
+ right: 0,
87
+ bottom: 0,
88
+ zIndex: 60,
89
+ pointerEvents: "none",
90
+ padding: "12px 16px 16px",
91
+ background: "rgba(10, 8, 16, 0.96)",
92
+ borderTop: "1px solid rgba(255, 255, 255, 0.12)",
93
+ color: "#fff",
94
+ boxShadow: "0 -8px 24px rgba(0, 0, 0, 0.45)",
95
+ fontSize: 13,
96
+ }
97
+ : {
98
+ position: "absolute",
99
+ left: position
100
+ ? Math.min(position.x + 16, canvasWidth - 230)
101
+ : 0,
102
+ top: position
103
+ ? Math.min(position.y + 16, canvasHeight - 200)
104
+ : 0,
105
+ zIndex: 30,
106
+ pointerEvents: "none",
107
+ minWidth: 200,
108
+ padding: "8px 12px",
109
+ borderRadius: 8,
110
+ border: "1px solid rgba(255, 255, 255, 0.2)",
111
+ background: "rgba(0, 0, 0, 0.92)",
112
+ color: "#fff",
113
+ boxShadow: "0 12px 32px rgba(0, 0, 0, 0.55)",
114
+ fontSize: 12,
115
+ };
116
+ return (_jsxs("div", { style: {
117
+ position: "absolute",
118
+ inset: 0,
119
+ cursor: "crosshair",
120
+ zIndex: 25,
121
+ touchAction: "none",
122
+ }, onClick: handleClick, onTouchStart: handleTouch, children: [position && sample && (_jsxs("div", { style: readoutStyle, children: [_jsxs("div", { style: {
123
+ display: "flex",
124
+ alignItems: "center",
125
+ gap: 8,
126
+ marginBottom: 4,
127
+ }, children: [_jsx("div", { style: {
128
+ width: 16,
129
+ height: 16,
130
+ borderRadius: 3,
131
+ border: "1px solid rgba(255, 255, 255, 0.3)",
132
+ backgroundColor: sample.hex,
133
+ } }), _jsx("span", { style: {
134
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace",
135
+ fontWeight: 700,
136
+ }, children: sample.hex.toUpperCase() })] }), _jsxs("div", { style: { fontSize: 10, color: "#cbd5e1", lineHeight: 1.5 }, children: [_jsxs("div", { children: ["RGB: ", sample.rgb[0], ", ", sample.rgb[1], ", ", sample.rgb[2]] }), sample.tac !== null && _jsxs("div", { children: ["TAC: ", sample.tac.toFixed(1), "%"] })] }), sample.inks && sample.inks.length > 0 && (_jsxs("div", { style: {
137
+ marginTop: 6,
138
+ paddingTop: 6,
139
+ borderTop: "1px solid rgba(255, 255, 255, 0.1)",
140
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace",
141
+ fontSize: 10,
142
+ }, children: [_jsx("div", { style: {
143
+ display: "grid",
144
+ gridTemplateColumns: "1fr 1fr",
145
+ columnGap: 8,
146
+ rowGap: 2,
147
+ }, children: sample.inks
148
+ .filter((i) => i.type === "process")
149
+ .map((ink) => (_jsxs("div", { style: {
150
+ display: "flex",
151
+ alignItems: "center",
152
+ justifyContent: "space-between",
153
+ gap: 6,
154
+ }, children: [_jsx("span", { style: {
155
+ display: "inline-block",
156
+ width: 10,
157
+ height: 10,
158
+ borderRadius: 2,
159
+ border: "1px solid rgba(255,255,255,0.3)",
160
+ backgroundColor: swatchFor(ink.name),
161
+ flexShrink: 0,
162
+ } }), _jsx("span", { style: { color: "#cbd5e1", width: 18 }, children: processAbbr(ink.name) }), _jsxs("span", { style: {
163
+ fontVariantNumeric: "tabular-nums",
164
+ color: "#f1f5f9",
165
+ marginLeft: "auto",
166
+ }, children: [ink.percent.toFixed(1), "%"] })] }, ink.name))) }), sample.inks.some((i) => i.type === "spot") && (_jsx("div", { style: {
167
+ marginTop: 4,
168
+ paddingTop: 4,
169
+ borderTop: "1px solid rgba(255, 255, 255, 0.1)",
170
+ display: "flex",
171
+ flexDirection: "column",
172
+ gap: 2,
173
+ }, children: sample.inks
174
+ .filter((i) => i.type === "spot")
175
+ .map((ink) => (_jsxs("div", { style: {
176
+ display: "flex",
177
+ alignItems: "center",
178
+ justifyContent: "space-between",
179
+ gap: 8,
180
+ }, children: [_jsx("span", { style: {
181
+ display: "inline-block",
182
+ width: 10,
183
+ height: 10,
184
+ borderRadius: 2,
185
+ border: "1px solid rgba(255,255,255,0.3)",
186
+ backgroundColor: swatchFor(ink.name),
187
+ flexShrink: 0,
188
+ } }), _jsx("span", { style: {
189
+ overflow: "hidden",
190
+ textOverflow: "ellipsis",
191
+ whiteSpace: "nowrap",
192
+ color: "#e2e8f0",
193
+ }, title: ink.name, children: ink.name }), _jsxs("span", { style: { fontVariantNumeric: "tabular-nums", color: "#f1f5f9" }, children: [ink.percent.toFixed(1), "%"] })] }, ink.name))) }))] }))] })), position && loading && !sample && (_jsx("div", { style: {
194
+ position: isMobile ? "fixed" : "absolute",
195
+ left: isMobile ? 16 : position.x + 16,
196
+ ...(isMobile
197
+ ? { bottom: 16, right: 16 }
198
+ : { top: position.y + 16 }),
199
+ zIndex: 60,
200
+ pointerEvents: "none",
201
+ padding: "4px 10px",
202
+ borderRadius: 4,
203
+ background: "rgba(0, 0, 0, 0.85)",
204
+ color: "#fff",
205
+ fontSize: 11,
206
+ border: "1px solid rgba(255, 255, 255, 0.15)",
207
+ }, children: "Sampling..." })), position && (_jsx("div", { style: {
208
+ position: "absolute",
209
+ left: position.x - 8,
210
+ top: position.y - 8,
211
+ zIndex: 20,
212
+ pointerEvents: "none",
213
+ width: 16,
214
+ height: 16,
215
+ border: "2px solid white",
216
+ borderRadius: "50%",
217
+ boxShadow: "0 0 0 1px rgba(0,0,0,0.5)",
218
+ } }))] }));
219
+ }
220
+ //# sourceMappingURL=ColorPickerTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorPickerTool.js","sourceRoot":"","sources":["../../components/ColorPickerTool.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ interface DensitometerToolProps {
2
+ jobId: string;
3
+ pageNum: number;
4
+ pageWidthPts: number;
5
+ pageHeightPts: number;
6
+ canvasWidth: number;
7
+ canvasHeight: number;
8
+ /** TAC limit in percent (default 300). Matches separations config. */
9
+ tacLimit?: number;
10
+ }
11
+ /**
12
+ * Real CMYK + spot-channel densitometer. Samples each ink channel at the
13
+ * clicked point and reports:
14
+ *
15
+ * C 62.3% M 18.1%
16
+ * Y 4.7% K 91.5%
17
+ * ────────────────
18
+ * TAC 176.6% (under 300)
19
+ *
20
+ * Falls back to a friendly "no separations" message on RGB/greyscale
21
+ * source PDFs where the engine can't split CMYK.
22
+ */
23
+ export declare function DensitometerTool({ jobId: _jobId, pageNum, pageWidthPts, pageHeightPts, canvasWidth, canvasHeight, tacLimit, }: DensitometerToolProps): import("react/jsx-runtime").JSX.Element | null;
24
+ export {};
25
+ //# sourceMappingURL=DensitometerTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DensitometerTool.d.ts","sourceRoot":"","sources":["../../components/DensitometerTool.tsx"],"names":[],"mappings":"AAQA,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EACP,YAAY,EACZ,aAAa,EACb,WAAW,EACX,YAAY,EACZ,QAAc,GACf,EAAE,qBAAqB,kDAmWvB"}
@@ -0,0 +1,246 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useState } from "react";
4
+ import { isUnwired, logUnwiredHide, useViewerHost, useViewerServices } from "../host/index.js";
5
+ import { useIsMobile } from "./useIsMobile.js";
6
+ /**
7
+ * Real CMYK + spot-channel densitometer. Samples each ink channel at the
8
+ * clicked point and reports:
9
+ *
10
+ * C 62.3% M 18.1%
11
+ * Y 4.7% K 91.5%
12
+ * ────────────────
13
+ * TAC 176.6% (under 300)
14
+ *
15
+ * Falls back to a friendly "no separations" message on RGB/greyscale
16
+ * source PDFs where the engine can't split CMYK.
17
+ */
18
+ export function DensitometerTool({ jobId: _jobId, pageNum, pageWidthPts, pageHeightPts, canvasWidth, canvasHeight, tacLimit = 300, }) {
19
+ const { densitometer } = useViewerServices();
20
+ const { debug } = useViewerHost();
21
+ const hidden = isUnwired(densitometer);
22
+ const isMobile = useIsMobile();
23
+ const [sample, setSample] = useState(null);
24
+ const [position, setPosition] = useState(null);
25
+ const [loading, setLoading] = useState(false);
26
+ const [error, setError] = useState(null);
27
+ useEffect(() => {
28
+ if (hidden && debug)
29
+ logUnwiredHide("DensitometerTool", "densitometer");
30
+ }, [hidden, debug]);
31
+ const pickAt = useCallback(async (clickX, clickY) => {
32
+ const pdfX = (clickX / canvasWidth) * pageWidthPts;
33
+ const pdfY = pageHeightPts - (clickY / canvasHeight) * pageHeightPts;
34
+ setPosition({ x: clickX, y: clickY });
35
+ setLoading(true);
36
+ setError(null);
37
+ setSample(null);
38
+ try {
39
+ const data = await densitometer.sampleAt({
40
+ pageNum,
41
+ pdfX,
42
+ pdfY,
43
+ tacLimit,
44
+ });
45
+ setSample(data);
46
+ }
47
+ catch (e) {
48
+ setError(e instanceof Error ? e.message : "Sampling failed");
49
+ }
50
+ finally {
51
+ setLoading(false);
52
+ }
53
+ }, [densitometer, pageNum, pageWidthPts, pageHeightPts, canvasWidth, canvasHeight, tacLimit]);
54
+ const handleClick = useCallback((e) => {
55
+ const rect = e.currentTarget.getBoundingClientRect();
56
+ void pickAt(e.clientX - rect.left, e.clientY - rect.top);
57
+ }, [pickAt]);
58
+ const handleTouch = useCallback((e) => {
59
+ if (e.touches.length !== 1)
60
+ return;
61
+ e.preventDefault();
62
+ const touch = e.touches[0];
63
+ const rect = e.currentTarget.getBoundingClientRect();
64
+ void pickAt(touch.clientX - rect.left, touch.clientY - rect.top);
65
+ }, [pickAt]);
66
+ // Map channel name to a solid swatch colour for the readout. Process
67
+ // channels use the standard CMYK primaries; any spot channel hashes
68
+ // its name to a stable distinct hue so each spot lands on a unique
69
+ // swatch.
70
+ const swatchFor = (name) => {
71
+ const n = name.toLowerCase();
72
+ if (n === "cyan" || n === "c")
73
+ return "#00b7eb";
74
+ if (n === "magenta" || n === "m")
75
+ return "#e91e63";
76
+ if (n === "yellow" || n === "y")
77
+ return "#fdd835";
78
+ if (n === "black" || n === "k")
79
+ return "#111827";
80
+ let h = 0;
81
+ for (let i = 0; i < name.length; i++)
82
+ h = (h * 31 + name.charCodeAt(i)) >>> 0;
83
+ return `hsl(${h % 360}, 70%, 45%)`;
84
+ };
85
+ // First-letter shorthand for the four CMYK process inks; full name
86
+ // for any detected spot ink ("PANTONE 185 C" displays in full).
87
+ const labelFor = (name) => {
88
+ const lower = name.toLowerCase();
89
+ if (lower === "cyan")
90
+ return { abbr: "C", full: "Cyan" };
91
+ if (lower === "magenta")
92
+ return { abbr: "M", full: "Magenta" };
93
+ if (lower === "yellow")
94
+ return { abbr: "Y", full: "Yellow" };
95
+ if (lower === "black")
96
+ return { abbr: "K", full: "Black" };
97
+ return { abbr: name, full: name };
98
+ };
99
+ const isProcess = (name) => {
100
+ const n = name.toLowerCase();
101
+ return n === "cyan" || n === "magenta" || n === "yellow" || n === "black";
102
+ };
103
+ if (hidden)
104
+ return null;
105
+ const monoFont = "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace";
106
+ // Floating tooltip on desktop, bottom sheet on mobile.
107
+ const readoutStyle = isMobile
108
+ ? {
109
+ position: "fixed",
110
+ left: 0,
111
+ right: 0,
112
+ bottom: 0,
113
+ zIndex: 60,
114
+ pointerEvents: "none",
115
+ padding: "12px 16px 16px",
116
+ background: "rgba(10, 8, 16, 0.96)",
117
+ borderTop: "1px solid rgba(255, 255, 255, 0.12)",
118
+ color: "#fff",
119
+ boxShadow: "0 -8px 24px rgba(0, 0, 0, 0.45)",
120
+ fontSize: 13,
121
+ maxHeight: "55vh",
122
+ overflowY: "auto",
123
+ }
124
+ : {
125
+ position: "absolute",
126
+ left: position
127
+ ? Math.min(position.x + 16, canvasWidth - 230)
128
+ : 0,
129
+ top: position
130
+ ? Math.min(position.y + 16, canvasHeight - 140)
131
+ : 0,
132
+ zIndex: 30,
133
+ pointerEvents: "none",
134
+ minWidth: 200,
135
+ padding: "8px 12px",
136
+ borderRadius: 8,
137
+ border: "1px solid rgba(255, 255, 255, 0.2)",
138
+ background: "rgba(0, 0, 0, 0.92)",
139
+ color: "#fff",
140
+ boxShadow: "0 12px 32px rgba(0, 0, 0, 0.55)",
141
+ fontSize: 12,
142
+ };
143
+ return (_jsxs("div", { style: {
144
+ position: "absolute",
145
+ inset: 0,
146
+ cursor: "crosshair",
147
+ zIndex: 25,
148
+ touchAction: "none",
149
+ }, onClick: handleClick, onTouchStart: handleTouch, children: [position && (sample || loading || error) && (_jsxs("div", { style: readoutStyle, children: [loading && (_jsx("div", { style: { fontSize: 11, color: "#cbd5e1" }, children: "Sampling separations\u2026" })), error && !loading && (_jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 4 }, children: [_jsx("div", { style: { fontWeight: 600, color: "#fcd34d" }, children: "Densitometer" }), _jsx("div", { style: { fontSize: 11, color: "#cbd5e1" }, children: error })] })), sample && !loading && (_jsxs(_Fragment, { children: [_jsxs("div", { style: {
150
+ display: "flex",
151
+ alignItems: "center",
152
+ justifyContent: "space-between",
153
+ marginBottom: 6,
154
+ }, children: [_jsx("span", { style: {
155
+ fontSize: 11,
156
+ fontWeight: 600,
157
+ textTransform: "uppercase",
158
+ letterSpacing: 1,
159
+ color: "#cbd5e1",
160
+ }, children: "Densitometer" }), _jsxs("span", { style: { fontSize: 10, color: "#94a3b8" }, children: ["@", sample.dpi, "dpi"] })] }), _jsx("div", { style: {
161
+ display: "grid",
162
+ gridTemplateColumns: "1fr 1fr",
163
+ columnGap: 12,
164
+ rowGap: 4,
165
+ marginBottom: 8,
166
+ fontFamily: monoFont,
167
+ fontSize: 11,
168
+ }, children: sample.channels
169
+ .filter((ch) => isProcess(ch.name))
170
+ .map((ch) => {
171
+ const lbl = labelFor(ch.name);
172
+ return (_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, title: lbl.full, children: [_jsx("span", { style: {
173
+ display: "inline-block",
174
+ width: 10,
175
+ height: 10,
176
+ borderRadius: 2,
177
+ border: "1px solid rgba(255, 255, 255, 0.3)",
178
+ backgroundColor: swatchFor(ch.name),
179
+ } }), _jsx("span", { style: { width: 24, color: "#cbd5e1" }, children: lbl.abbr }), _jsxs("span", { style: {
180
+ flex: 1,
181
+ textAlign: "right",
182
+ fontVariantNumeric: "tabular-nums",
183
+ }, children: [ch.percent.toFixed(1), "%"] })] }, ch.name));
184
+ }) }), sample.channels.some((ch) => !isProcess(ch.name)) && (_jsxs("div", { style: {
185
+ marginBottom: 8,
186
+ paddingTop: 6,
187
+ borderTop: "1px solid rgba(255, 255, 255, 0.1)",
188
+ display: "flex",
189
+ flexDirection: "column",
190
+ gap: 4,
191
+ fontFamily: monoFont,
192
+ fontSize: 11,
193
+ }, children: [_jsx("div", { style: {
194
+ fontSize: 10,
195
+ fontWeight: 600,
196
+ textTransform: "uppercase",
197
+ letterSpacing: 1,
198
+ color: "#94a3b8",
199
+ }, children: "Spots" }), sample.channels
200
+ .filter((ch) => !isProcess(ch.name))
201
+ .map((ch) => (_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [_jsx("span", { style: {
202
+ display: "inline-block",
203
+ width: 10,
204
+ height: 10,
205
+ flexShrink: 0,
206
+ borderRadius: 2,
207
+ border: "1px solid rgba(255, 255, 255, 0.3)",
208
+ backgroundColor: swatchFor(ch.name),
209
+ } }), _jsx("span", { style: {
210
+ flex: 1,
211
+ overflow: "hidden",
212
+ textOverflow: "ellipsis",
213
+ whiteSpace: "nowrap",
214
+ color: "#e2e8f0",
215
+ }, title: ch.name, children: ch.name }), _jsxs("span", { style: {
216
+ fontVariantNumeric: "tabular-nums",
217
+ color: "#cbd5e1",
218
+ }, children: [ch.percent.toFixed(1), "%"] })] }, ch.name)))] })), _jsxs("div", { style: {
219
+ paddingTop: 6,
220
+ borderTop: "1px solid rgba(255, 255, 255, 0.15)",
221
+ }, children: [_jsxs("div", { style: {
222
+ display: "flex",
223
+ alignItems: "center",
224
+ justifyContent: "space-between",
225
+ fontFamily: monoFont,
226
+ fontSize: 11,
227
+ }, children: [_jsx("span", { style: { color: "#cbd5e1" }, children: "TAC" }), _jsxs("span", { style: {
228
+ fontVariantNumeric: "tabular-nums",
229
+ fontWeight: 700,
230
+ color: sample.limit_exceeded ? "#fb7185" : "#6ee7b7",
231
+ }, children: [sample.tac.toFixed(1), "%"] })] }), _jsx("div", { style: { textAlign: "right", fontSize: 10, color: "#94a3b8" }, children: sample.limit_exceeded
232
+ ? `over ${sample.tac_limit}% limit`
233
+ : `under ${sample.tac_limit}% limit` })] })] }))] })), position && (_jsx("div", { style: {
234
+ position: "absolute",
235
+ left: position.x - 8,
236
+ top: position.y - 8,
237
+ zIndex: 20,
238
+ pointerEvents: "none",
239
+ width: 16,
240
+ height: 16,
241
+ border: "2px solid white",
242
+ borderRadius: "50%",
243
+ boxShadow: "0 0 0 1px rgba(0,0,0,0.5)",
244
+ } }))] }));
245
+ }
246
+ //# sourceMappingURL=DensitometerTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DensitometerTool.js","sourceRoot":"","sources":["../../components/DensitometerTool.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Dieline info panel — built-in summary card for ``DielineResult``.
3
+ *
4
+ * Renders the detected dieline's source, confidence, spot name (when
5
+ * present), and a table of per-region sizes in mm + inches. Hosts
6
+ * drop this into their info-panel column the same way they'd drop
7
+ * the FindingsSidebar in alongside the canvas.
8
+ *
9
+ * The component is opinionated about layout (a vertical card with a
10
+ * header + a table) and uses brand-* / slate-* tokens; consumers
11
+ * that need different chrome can reach the raw data via the
12
+ * ``dieline`` prop they already pass to LensPDF.
13
+ *
14
+ * @public
15
+ */
16
+ import * as React from "react";
17
+ import type { DielineResult } from "../types";
18
+ export interface DielineInfoPanelProps {
19
+ /** The DielineResult passed to ``<LensPDF dieline={...}>``. */
20
+ dieline: DielineResult | null | undefined;
21
+ /** Optional CSS class for the wrapping ``<aside>``. */
22
+ className?: string;
23
+ /** Optional heading override. Default: ``"Dieline"``. */
24
+ title?: string;
25
+ }
26
+ export declare function DielineInfoPanel({ dieline, className, title, }: DielineInfoPanelProps): React.ReactElement | null;
27
+ //# sourceMappingURL=DielineInfoPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DielineInfoPanel.d.ts","sourceRoot":"","sources":["../../components/DielineInfoPanel.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAUD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,SAAS,EACT,KAAiB,GAClB,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAoEnD"}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ function formatMm(widthPts, heightPts) {
4
+ return `${(widthPts * 25.4 / 72).toFixed(2)} × ${(heightPts * 25.4 / 72).toFixed(2)} mm`;
5
+ }
6
+ function formatInches(widthPts, heightPts) {
7
+ return `${(widthPts / 72).toFixed(3)} × ${(heightPts / 72).toFixed(3)} in`;
8
+ }
9
+ export function DielineInfoPanel({ dieline, className, title = "Dieline", }) {
10
+ if (!dieline)
11
+ return null;
12
+ if (dieline.source === "missing")
13
+ return null;
14
+ const regions = dieline.regions ?? [];
15
+ return (_jsxs("aside", { className: className ??
16
+ "rounded-lg border border-slate-800 bg-slate-900 p-3 text-xs text-slate-200", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between gap-2 border-b border-slate-800 pb-2", children: [_jsx("p", { className: "text-[10px] font-semibold uppercase tracking-wider text-brand-300", children: title }), dieline.multi_color ? (_jsx("span", { className: "rounded bg-red-500/20 px-1.5 py-0.5 text-[9px] font-semibold text-red-300", title: "The dieline layer paints in more than one ink colour. Usually misplaced artwork.", children: "multi-colour" })) : null] }), _jsxs("dl", { className: "mb-2 grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-[11px]", children: [_jsx("dt", { className: "text-slate-500", children: "Source" }), _jsx("dd", { className: "font-mono text-slate-200", children: dieline.source }), dieline.spot_name ? (_jsxs(_Fragment, { children: [_jsx("dt", { className: "text-slate-500", children: "Spot name" }), _jsx("dd", { className: "font-mono text-slate-200", children: dieline.spot_name })] })) : null, _jsx("dt", { className: "text-slate-500", children: "Confidence" }), _jsx("dd", { className: "font-mono text-slate-200", children: dieline.confidence.toFixed(2) })] }), regions.length > 0 ? (_jsxs(_Fragment, { children: [_jsxs("p", { className: "mb-1 text-[10px] font-semibold uppercase tracking-wider text-slate-500", children: ["Regions \u00B7 ", regions.length] }), _jsx("ul", { className: "space-y-1.5", children: regions.map((region, idx) => {
17
+ const widthPts = region.x1 - region.x0;
18
+ const heightPts = region.y1 - region.y0;
19
+ const label = regions.length > 1 ? `Dieline ${idx + 1}` : "Dieline";
20
+ return (_jsxs("li", { className: "rounded border border-slate-800 bg-slate-950 px-2 py-1.5", children: [_jsx("p", { className: "text-[11px] font-medium text-slate-200", children: label }), _jsx("p", { className: "font-mono text-[10px] text-slate-400", children: formatMm(widthPts, heightPts) }), _jsx("p", { className: "font-mono text-[10px] text-slate-500", children: formatInches(widthPts, heightPts) })] }, `die-region-${idx}`));
21
+ }) })] })) : (_jsx("p", { className: "text-[11px] text-slate-500", children: "No bounded regions detected." }))] }));
22
+ }
23
+ //# sourceMappingURL=DielineInfoPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DielineInfoPanel.js","sourceRoot":"","sources":["../../components/DielineInfoPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DielineResult, PageInfo } from "../types";
2
+ interface DielineOverlayProps {
3
+ page: PageInfo;
4
+ canvasWidth: number;
5
+ canvasHeight: number;
6
+ dieline: DielineResult | null | undefined;
7
+ }
8
+ export declare function DielineOverlay({ page, canvasWidth, canvasHeight, dieline, }: DielineOverlayProps): import("react/jsx-runtime").JSX.Element | null;
9
+ export {};
10
+ //# sourceMappingURL=DielineOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DielineOverlay.d.ts","sourceRoot":"","sources":["../../components/DielineOverlay.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAExD,UAAU,mBAAmB;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;CAC3C;AAsCD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,OAAO,GACR,EAAE,mBAAmB,kDAuErB"}