@printwithsynergy/artwork-pdf-editor 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/LICENSE +62 -0
  2. package/dist/components/AccessibilityHintsPanel.d.ts +142 -0
  3. package/dist/components/AccessibilityHintsPanel.d.ts.map +1 -0
  4. package/dist/components/AccessibilityHintsPanel.js +158 -0
  5. package/dist/components/AccessibilityHintsPanel.js.map +1 -0
  6. package/dist/components/AnnotationOverlay.d.ts +142 -0
  7. package/dist/components/AnnotationOverlay.d.ts.map +1 -0
  8. package/dist/components/AnnotationOverlay.js +141 -0
  9. package/dist/components/AnnotationOverlay.js.map +1 -0
  10. package/dist/components/AnnotationsSidebar.d.ts +98 -0
  11. package/dist/components/AnnotationsSidebar.d.ts.map +1 -0
  12. package/dist/components/AnnotationsSidebar.js +100 -0
  13. package/dist/components/AnnotationsSidebar.js.map +1 -0
  14. package/dist/components/BarcodeGeneratorPanel.d.ts +58 -0
  15. package/dist/components/BarcodeGeneratorPanel.d.ts.map +1 -0
  16. package/dist/components/BarcodeGeneratorPanel.js +91 -0
  17. package/dist/components/BarcodeGeneratorPanel.js.map +1 -0
  18. package/dist/components/BraillePanel.d.ts +99 -0
  19. package/dist/components/BraillePanel.d.ts.map +1 -0
  20. package/dist/components/BraillePanel.js +221 -0
  21. package/dist/components/BraillePanel.js.map +1 -0
  22. package/dist/components/BrandAssetsPanel.d.ts +130 -0
  23. package/dist/components/BrandAssetsPanel.d.ts.map +1 -0
  24. package/dist/components/BrandAssetsPanel.js +125 -0
  25. package/dist/components/BrandAssetsPanel.js.map +1 -0
  26. package/dist/components/BrandConsistencyPanel.d.ts +140 -0
  27. package/dist/components/BrandConsistencyPanel.d.ts.map +1 -0
  28. package/dist/components/BrandConsistencyPanel.js +158 -0
  29. package/dist/components/BrandConsistencyPanel.js.map +1 -0
  30. package/dist/components/ComplianceFindingsPanel.d.ts +62 -0
  31. package/dist/components/ComplianceFindingsPanel.d.ts.map +1 -0
  32. package/dist/components/ComplianceFindingsPanel.js +118 -0
  33. package/dist/components/ComplianceFindingsPanel.js.map +1 -0
  34. package/dist/components/DesignSuggestionsPanel.d.ts +148 -0
  35. package/dist/components/DesignSuggestionsPanel.d.ts.map +1 -0
  36. package/dist/components/DesignSuggestionsPanel.js +154 -0
  37. package/dist/components/DesignSuggestionsPanel.js.map +1 -0
  38. package/dist/components/DielineParametersPanel.d.ts +62 -0
  39. package/dist/components/DielineParametersPanel.d.ts.map +1 -0
  40. package/dist/components/DielineParametersPanel.js +170 -0
  41. package/dist/components/DielineParametersPanel.js.map +1 -0
  42. package/dist/components/DielinePreview.d.ts +150 -0
  43. package/dist/components/DielinePreview.d.ts.map +1 -0
  44. package/dist/components/DielinePreview.js +146 -0
  45. package/dist/components/DielinePreview.js.map +1 -0
  46. package/dist/components/EditorApp.d.ts +18 -3
  47. package/dist/components/EditorApp.d.ts.map +1 -1
  48. package/dist/components/EditorApp.js +42 -7
  49. package/dist/components/EditorApp.js.map +1 -1
  50. package/dist/components/EditorCanvas.d.ts +31 -2
  51. package/dist/components/EditorCanvas.d.ts.map +1 -1
  52. package/dist/components/EditorCanvas.js +97 -16
  53. package/dist/components/EditorCanvas.js.map +1 -1
  54. package/dist/components/EmailNotifyPanel.d.ts +165 -0
  55. package/dist/components/EmailNotifyPanel.d.ts.map +1 -0
  56. package/dist/components/EmailNotifyPanel.js +211 -0
  57. package/dist/components/EmailNotifyPanel.js.map +1 -0
  58. package/dist/components/FileDropZone.d.ts +9 -1
  59. package/dist/components/FileDropZone.d.ts.map +1 -1
  60. package/dist/components/FileDropZone.js +53 -5
  61. package/dist/components/FileDropZone.js.map +1 -1
  62. package/dist/components/FoldEditorPanel.d.ts +68 -0
  63. package/dist/components/FoldEditorPanel.d.ts.map +1 -0
  64. package/dist/components/FoldEditorPanel.js +65 -0
  65. package/dist/components/FoldEditorPanel.js.map +1 -0
  66. package/dist/components/FoldPreviewOverlay.d.ts +48 -0
  67. package/dist/components/FoldPreviewOverlay.d.ts.map +1 -0
  68. package/dist/components/FoldPreviewOverlay.js +182 -0
  69. package/dist/components/FoldPreviewOverlay.js.map +1 -0
  70. package/dist/components/Gs1DigitalLinkPanel.d.ts +103 -0
  71. package/dist/components/Gs1DigitalLinkPanel.d.ts.map +1 -0
  72. package/dist/components/Gs1DigitalLinkPanel.js +199 -0
  73. package/dist/components/Gs1DigitalLinkPanel.js.map +1 -0
  74. package/dist/components/HistoryPanel.d.ts +39 -0
  75. package/dist/components/HistoryPanel.d.ts.map +1 -0
  76. package/dist/components/HistoryPanel.js +72 -0
  77. package/dist/components/HistoryPanel.js.map +1 -0
  78. package/dist/components/IccSoftProofOverlay.d.ts +67 -0
  79. package/dist/components/IccSoftProofOverlay.d.ts.map +1 -0
  80. package/dist/components/IccSoftProofOverlay.js +119 -0
  81. package/dist/components/IccSoftProofOverlay.js.map +1 -0
  82. package/dist/components/ImposePanel.d.ts +71 -0
  83. package/dist/components/ImposePanel.d.ts.map +1 -0
  84. package/dist/components/ImposePanel.js +127 -0
  85. package/dist/components/ImposePanel.js.map +1 -0
  86. package/dist/components/InksPanel.d.ts +61 -0
  87. package/dist/components/InksPanel.d.ts.map +1 -0
  88. package/dist/components/InksPanel.js +84 -0
  89. package/dist/components/InksPanel.js.map +1 -0
  90. package/dist/components/JobSetupPanel.d.ts +118 -0
  91. package/dist/components/JobSetupPanel.d.ts.map +1 -0
  92. package/dist/components/JobSetupPanel.js +169 -0
  93. package/dist/components/JobSetupPanel.js.map +1 -0
  94. package/dist/components/LayersPanel.d.ts.map +1 -1
  95. package/dist/components/LayersPanel.js +1 -0
  96. package/dist/components/LayersPanel.js.map +1 -1
  97. package/dist/components/MarkLibraryPanel.d.ts +131 -0
  98. package/dist/components/MarkLibraryPanel.d.ts.map +1 -0
  99. package/dist/components/MarkLibraryPanel.js +184 -0
  100. package/dist/components/MarkLibraryPanel.js.map +1 -0
  101. package/dist/components/MisEstimateButton.d.ts +73 -0
  102. package/dist/components/MisEstimateButton.d.ts.map +1 -0
  103. package/dist/components/MisEstimateButton.js +57 -0
  104. package/dist/components/MisEstimateButton.js.map +1 -0
  105. package/dist/components/NutritionPanel.d.ts +118 -0
  106. package/dist/components/NutritionPanel.d.ts.map +1 -0
  107. package/dist/components/NutritionPanel.js +169 -0
  108. package/dist/components/NutritionPanel.js.map +1 -0
  109. package/dist/components/PageNavigator.d.ts.map +1 -1
  110. package/dist/components/PageNavigator.js +6 -1
  111. package/dist/components/PageNavigator.js.map +1 -1
  112. package/dist/components/PaletteManager.d.ts +32 -0
  113. package/dist/components/PaletteManager.d.ts.map +1 -0
  114. package/dist/components/PaletteManager.js +89 -0
  115. package/dist/components/PaletteManager.js.map +1 -0
  116. package/dist/components/PaletteToSpotPanel.d.ts +122 -0
  117. package/dist/components/PaletteToSpotPanel.d.ts.map +1 -0
  118. package/dist/components/PaletteToSpotPanel.js +160 -0
  119. package/dist/components/PaletteToSpotPanel.js.map +1 -0
  120. package/dist/components/PreflightAutoFixPanel.d.ts +110 -0
  121. package/dist/components/PreflightAutoFixPanel.d.ts.map +1 -0
  122. package/dist/components/PreflightAutoFixPanel.js +119 -0
  123. package/dist/components/PreflightAutoFixPanel.js.map +1 -0
  124. package/dist/components/PreflightDiffPanel.d.ts +127 -0
  125. package/dist/components/PreflightDiffPanel.d.ts.map +1 -0
  126. package/dist/components/PreflightDiffPanel.js +0 -0
  127. package/dist/components/PreflightDiffPanel.js.map +1 -0
  128. package/dist/components/ProcessRulesPanel.d.ts +81 -0
  129. package/dist/components/ProcessRulesPanel.d.ts.map +1 -0
  130. package/dist/components/ProcessRulesPanel.js +143 -0
  131. package/dist/components/ProcessRulesPanel.js.map +1 -0
  132. package/dist/components/SlackNotifyPanel.d.ts +139 -0
  133. package/dist/components/SlackNotifyPanel.d.ts.map +1 -0
  134. package/dist/components/SlackNotifyPanel.js +133 -0
  135. package/dist/components/SlackNotifyPanel.js.map +1 -0
  136. package/dist/components/SmartSpotMatchPanel.d.ts +143 -0
  137. package/dist/components/SmartSpotMatchPanel.d.ts.map +1 -0
  138. package/dist/components/SmartSpotMatchPanel.js +159 -0
  139. package/dist/components/SmartSpotMatchPanel.js.map +1 -0
  140. package/dist/components/StreamingRenderProgress.d.ts +60 -0
  141. package/dist/components/StreamingRenderProgress.d.ts.map +1 -0
  142. package/dist/components/StreamingRenderProgress.js +99 -0
  143. package/dist/components/StreamingRenderProgress.js.map +1 -0
  144. package/dist/components/SwatchesPicker.d.ts +83 -0
  145. package/dist/components/SwatchesPicker.d.ts.map +1 -0
  146. package/dist/components/SwatchesPicker.js +151 -0
  147. package/dist/components/SwatchesPicker.js.map +1 -0
  148. package/dist/components/TacOverlay.d.ts +47 -0
  149. package/dist/components/TacOverlay.d.ts.map +1 -0
  150. package/dist/components/TacOverlay.js +116 -0
  151. package/dist/components/TacOverlay.js.map +1 -0
  152. package/dist/components/TrapEditorPanel.d.ts +52 -0
  153. package/dist/components/TrapEditorPanel.d.ts.map +1 -0
  154. package/dist/components/TrapEditorPanel.js +64 -0
  155. package/dist/components/TrapEditorPanel.js.map +1 -0
  156. package/dist/components/TrapPreviewOverlay.d.ts +64 -0
  157. package/dist/components/TrapPreviewOverlay.d.ts.map +1 -0
  158. package/dist/components/TrapPreviewOverlay.js +120 -0
  159. package/dist/components/TrapPreviewOverlay.js.map +1 -0
  160. package/dist/components/VariantMatrixPanel.d.ts +61 -0
  161. package/dist/components/VariantMatrixPanel.d.ts.map +1 -0
  162. package/dist/components/VariantMatrixPanel.js +97 -0
  163. package/dist/components/VariantMatrixPanel.js.map +1 -0
  164. package/dist/components/VariantMatrixVersionPanel.d.ts +122 -0
  165. package/dist/components/VariantMatrixVersionPanel.d.ts.map +1 -0
  166. package/dist/components/VariantMatrixVersionPanel.js +162 -0
  167. package/dist/components/VariantMatrixVersionPanel.js.map +1 -0
  168. package/dist/components/WebhookNotifyPanel.d.ts +160 -0
  169. package/dist/components/WebhookNotifyPanel.d.ts.map +1 -0
  170. package/dist/components/WebhookNotifyPanel.js +100 -0
  171. package/dist/components/WebhookNotifyPanel.js.map +1 -0
  172. package/dist/components/WhiteUnderbasePanel.d.ts +107 -0
  173. package/dist/components/WhiteUnderbasePanel.d.ts.map +1 -0
  174. package/dist/components/WhiteUnderbasePanel.js +104 -0
  175. package/dist/components/WhiteUnderbasePanel.js.map +1 -0
  176. package/dist/hooks/useEditorMode.d.ts +25 -5
  177. package/dist/hooks/useEditorMode.d.ts.map +1 -1
  178. package/dist/hooks/useEditorMode.js +18 -5
  179. package/dist/hooks/useEditorMode.js.map +1 -1
  180. package/dist/index.d.ts +51 -2
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +51 -2
  183. package/dist/index.js.map +1 -1
  184. package/dist/lens/preflight-findings.d.ts.map +1 -1
  185. package/dist/lens/preflight-findings.js.map +1 -1
  186. package/dist/lib/barcode-scan.d.ts +154 -0
  187. package/dist/lib/barcode-scan.d.ts.map +1 -0
  188. package/dist/lib/barcode-scan.js +152 -0
  189. package/dist/lib/barcode-scan.js.map +1 -0
  190. package/dist/lib/color-math.d.ts +76 -0
  191. package/dist/lib/color-math.d.ts.map +1 -0
  192. package/dist/lib/color-math.js +96 -0
  193. package/dist/lib/color-math.js.map +1 -0
  194. package/dist/lib/dieline-template.d.ts +87 -0
  195. package/dist/lib/dieline-template.d.ts.map +1 -1
  196. package/dist/lib/dieline-template.js +163 -0
  197. package/dist/lib/dieline-template.js.map +1 -1
  198. package/dist/lib/editor-config.d.ts +390 -0
  199. package/dist/lib/editor-config.d.ts.map +1 -1
  200. package/dist/lib/editor-config.js +90 -0
  201. package/dist/lib/editor-config.js.map +1 -1
  202. package/dist/lib/fold-geometry.d.ts +144 -0
  203. package/dist/lib/fold-geometry.d.ts.map +1 -0
  204. package/dist/lib/fold-geometry.js +138 -0
  205. package/dist/lib/fold-geometry.js.map +1 -0
  206. package/dist/lib/merge-tokens.d.ts +81 -0
  207. package/dist/lib/merge-tokens.d.ts.map +1 -0
  208. package/dist/lib/merge-tokens.js +88 -0
  209. package/dist/lib/merge-tokens.js.map +1 -0
  210. package/dist/lib/palette-registry.d.ts +40 -0
  211. package/dist/lib/palette-registry.d.ts.map +1 -0
  212. package/dist/lib/palette-registry.js +50 -0
  213. package/dist/lib/palette-registry.js.map +1 -0
  214. package/dist/lib/panel-anchor.d.ts +101 -0
  215. package/dist/lib/panel-anchor.d.ts.map +1 -0
  216. package/dist/lib/panel-anchor.js +68 -0
  217. package/dist/lib/panel-anchor.js.map +1 -0
  218. package/dist/lib/preflight/checks.d.ts.map +1 -1
  219. package/dist/lib/preflight/checks.js +71 -0
  220. package/dist/lib/preflight/checks.js.map +1 -1
  221. package/dist/lib/preflight/types.d.ts.map +1 -1
  222. package/dist/lib/preflight/types.js +11 -0
  223. package/dist/lib/preflight/types.js.map +1 -1
  224. package/dist/lib/rasterize.d.ts +93 -0
  225. package/dist/lib/rasterize.d.ts.map +1 -0
  226. package/dist/lib/rasterize.js +117 -0
  227. package/dist/lib/rasterize.js.map +1 -0
  228. package/dist/lib/separations-registry.d.ts +99 -0
  229. package/dist/lib/separations-registry.d.ts.map +1 -0
  230. package/dist/lib/separations-registry.js +59 -0
  231. package/dist/lib/separations-registry.js.map +1 -0
  232. package/dist/lib/streaming-render.d.ts +100 -0
  233. package/dist/lib/streaming-render.d.ts.map +1 -0
  234. package/dist/lib/streaming-render.js +132 -0
  235. package/dist/lib/streaming-render.js.map +1 -0
  236. package/dist/lib/unwired.d.ts +29 -0
  237. package/dist/lib/unwired.d.ts.map +1 -0
  238. package/dist/lib/unwired.js +58 -0
  239. package/dist/lib/unwired.js.map +1 -0
  240. package/package.json +20 -11
  241. package/dist/components/SeparationsPanel.d.ts +0 -9
  242. package/dist/components/SeparationsPanel.d.ts.map +0 -1
  243. package/dist/components/SeparationsPanel.js +0 -168
  244. package/dist/components/SeparationsPanel.js.map +0 -1
@@ -0,0 +1,127 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useId } from "react";
5
+ const DEFAULT_PRESETS = [
6
+ // Letter (8.5 × 11 in) — 612 × 792 pt
7
+ { id: "letter", label: "Letter (8.5 × 11 in)", widthPt: 612, heightPt: 792 },
8
+ // Tabloid (11 × 17 in) — 792 × 1224 pt
9
+ { id: "tabloid", label: "Tabloid (11 × 17 in)", widthPt: 792, heightPt: 1224 },
10
+ // SRA3 (320 × 450 mm) — commercial digital press standard
11
+ { id: "sra3", label: "SRA3 (320 × 450 mm)", widthPt: 907.09, heightPt: 1275.59 },
12
+ // 28 × 40 in offset sheet
13
+ { id: "offset-28x40", label: "Offset sheet (28 × 40 in)", widthPt: 2016, heightPt: 2880 },
14
+ ];
15
+ const MM_PER_PT = 25.4 / 72;
16
+ /** Convert a PDF-points dimension to millimeters for human-readable
17
+ * display. Storage stays in points so the value can be POSTed to
18
+ * compile-pdf without rescaling. */
19
+ function ptToMm(pt) {
20
+ return pt * MM_PER_PT;
21
+ }
22
+ /** Tolerance for matching a preset by sheet dimensions. PDF-points
23
+ * fractions arise easily — SRA3 is 907.09 / 1275.59 pt — so strict
24
+ * equality breaks against hosts that compute from mm. 0.5 pt is
25
+ * smaller than half a hairline rule, well below user-visible. */
26
+ const PRESET_MATCH_TOLERANCE_PT = 0.5;
27
+ /** Parse a numeric input safely. Returns `fallback` for empty,
28
+ * whitespace-only, or non-finite input (e.g. when the user has
29
+ * typed only `-` mid-edit). Without this guard `Number.parseInt`
30
+ * would surface `NaN` and `Math.max` would propagate it, leaving
31
+ * the panel stuck in an unrecoverable state. */
32
+ function parseIntOr(value, fallback) {
33
+ const n = Number.parseInt(value, 10);
34
+ return Number.isFinite(n) ? n : fallback;
35
+ }
36
+ /** Same NaN-safe contract as {@link parseIntOr} but for floats —
37
+ * used by the gutter / margin spinners which accept 0.1 mm steps. */
38
+ function parseFloatOr(value, fallback) {
39
+ const n = Number.parseFloat(value);
40
+ return Number.isFinite(n) ? n : fallback;
41
+ }
42
+ /** Two-sided clamp: ensure `value` is in `[min, max]`. Used to keep
43
+ * the input handlers honest — the `<input min/max>` attributes only
44
+ * guide the spinner; users can still type out-of-range values
45
+ * directly, and we don't want those to propagate to the wire. */
46
+ function clamp(value, min, max) {
47
+ return Math.min(max, Math.max(min, value));
48
+ }
49
+ /**
50
+ * O1 sheet-imposition builder.
51
+ *
52
+ * Controlled component: surfaces sheet size, rows × cols, gutter /
53
+ * margin in mm, and registration / crop-mark toggles. Renders no
54
+ * chrome of its own — hosts wrap it in a modal, drawer, or
55
+ * right-rail container (matches the `JobSetupPanel` / `TrapEditorPanel`
56
+ * convention).
57
+ *
58
+ * Wire shape uses PDF points everywhere; the panel converts to mm
59
+ * for display so values can be POSTed to compile-pdf's
60
+ * `/v1/impose/apply` endpoint without rescaling.
61
+ *
62
+ * @public
63
+ */
64
+ export function ImposePanel({ value, onChange, presets = DEFAULT_PRESETS }) {
65
+ const sheetId = useId();
66
+ const rowsId = useId();
67
+ const colsId = useId();
68
+ const gutterId = useId();
69
+ const marginId = useId();
70
+ const mappingName = useId();
71
+ const firstPreset = presets[0] ?? DEFAULT_PRESETS[0];
72
+ if (!firstPreset) {
73
+ // Should be unreachable: DEFAULT_PRESETS is non-empty. Defensive
74
+ // fallback keeps TypeScript happy without a non-null assertion.
75
+ throw new Error("ImposePanel: presets must contain at least one entry");
76
+ }
77
+ const current = value ?? {
78
+ sheetWidthPt: firstPreset.widthPt,
79
+ sheetHeightPt: firstPreset.heightPt,
80
+ rows: 2,
81
+ cols: 2,
82
+ pageMapping: "sequential",
83
+ };
84
+ const update = (patch) => onChange({ ...current, ...patch });
85
+ // Match the currently-selected preset by tolerance — hosts that
86
+ // round-trip through mm can produce sub-point fractional drift
87
+ // that strict equality would reject, dropping the dropdown into
88
+ // the "custom" fallback even though the user picked SRA3.
89
+ const selectedPresetId = presets.find((p) => Math.abs(p.widthPt - current.sheetWidthPt) <= PRESET_MATCH_TOLERANCE_PT &&
90
+ Math.abs(p.heightPt - current.sheetHeightPt) <= PRESET_MATCH_TOLERANCE_PT)?.id ?? "custom";
91
+ return (_jsxs("div", { style: {
92
+ display: "flex",
93
+ flexDirection: "column",
94
+ gap: "0.75rem",
95
+ padding: "0.75rem",
96
+ fontSize: "0.85rem",
97
+ color: "#1f2937",
98
+ background: "#ffffff",
99
+ border: "1px solid #e5e7eb",
100
+ borderRadius: 6,
101
+ minWidth: 280,
102
+ }, children: [_jsxs("label", { htmlFor: sheetId, style: { display: "flex", flexDirection: "column", gap: "0.25rem" }, children: [_jsx("span", { style: { fontWeight: 600 }, children: "Sheet size" }), _jsxs("select", { id: sheetId, value: selectedPresetId, onChange: (e) => {
103
+ const next = presets.find((p) => p.id === e.target.value);
104
+ if (next)
105
+ update({ sheetWidthPt: next.widthPt, sheetHeightPt: next.heightPt });
106
+ }, style: selectStyle, children: [presets.map((p) => (_jsx("option", { value: p.id, children: p.label }, p.id))), selectedPresetId === "custom" && (_jsxs("option", { value: "custom", children: ["Custom (", ptToMm(current.sheetWidthPt).toFixed(0), " \u00D7", " ", ptToMm(current.sheetHeightPt).toFixed(0), " mm)"] }))] })] }), _jsxs("div", { style: { display: "flex", gap: "0.5rem" }, children: [_jsxs("label", { htmlFor: rowsId, style: { display: "flex", flexDirection: "column", gap: "0.25rem", flex: 1 }, children: [_jsx("span", { style: { fontWeight: 600 }, children: "Rows" }), _jsx("input", { id: rowsId, type: "number", min: 1, max: 32, step: 1, value: current.rows, onChange: (e) => update({ rows: clamp(parseIntOr(e.target.value, current.rows), 1, 32) }), style: numberStyle })] }), _jsxs("label", { htmlFor: colsId, style: { display: "flex", flexDirection: "column", gap: "0.25rem", flex: 1 }, children: [_jsx("span", { style: { fontWeight: 600 }, children: "Columns" }), _jsx("input", { id: colsId, type: "number", min: 1, max: 32, step: 1, value: current.cols, onChange: (e) => update({ cols: clamp(parseIntOr(e.target.value, current.cols), 1, 32) }), style: numberStyle })] })] }), _jsxs("div", { style: { display: "flex", gap: "0.5rem" }, children: [_jsxs("label", { htmlFor: gutterId, style: { display: "flex", flexDirection: "column", gap: "0.25rem", flex: 1 }, children: [_jsx("span", { style: { fontWeight: 600 }, children: "Gutter (mm)" }), _jsx("input", { id: gutterId, type: "number", min: 0, max: 100, step: 0.1, value: current.gutterMm ?? 0, onChange: (e) => update({
107
+ gutterMm: clamp(parseFloatOr(e.target.value, current.gutterMm ?? 0), 0, 100),
108
+ }), style: numberStyle })] }), _jsxs("label", { htmlFor: marginId, style: { display: "flex", flexDirection: "column", gap: "0.25rem", flex: 1 }, children: [_jsx("span", { style: { fontWeight: 600 }, children: "Margin (mm)" }), _jsx("input", { id: marginId, type: "number", min: 0, max: 100, step: 0.1, value: current.marginMm ?? 0, onChange: (e) => update({
109
+ marginMm: clamp(parseFloatOr(e.target.value, current.marginMm ?? 0), 0, 100),
110
+ }), style: numberStyle })] })] }), _jsxs("fieldset", { style: { border: "none", padding: 0, margin: 0 }, children: [_jsx("legend", { style: { fontWeight: 600, padding: 0, marginBottom: "0.25rem" }, children: "Page mapping" }), _jsxs("div", { style: { display: "flex", gap: "1rem" }, children: [_jsxs("label", { style: { display: "flex", alignItems: "center", gap: "0.35rem" }, children: [_jsx("input", { type: "radio", name: mappingName, value: "sequential", checked: (current.pageMapping ?? "sequential") === "sequential", onChange: () => update({ pageMapping: "sequential" }) }), "Sequential"] }), _jsxs("label", { style: { display: "flex", alignItems: "center", gap: "0.35rem" }, children: [_jsx("input", { type: "radio", name: mappingName, value: "repeat", checked: current.pageMapping === "repeat", onChange: () => update({ pageMapping: "repeat" }) }), "Repeat page 0"] })] })] }), _jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "0.25rem" }, children: [_jsxs("label", { style: { display: "flex", alignItems: "center", gap: "0.35rem" }, children: [_jsx("input", { type: "checkbox", checked: current.registrationMarks ?? false, onChange: (e) => update({ registrationMarks: e.target.checked }) }), "Registration marks"] }), _jsxs("label", { style: { display: "flex", alignItems: "center", gap: "0.35rem" }, children: [_jsx("input", { type: "checkbox", checked: current.cropMarks ?? false, onChange: (e) => update({ cropMarks: e.target.checked }) }), "Crop marks"] })] })] }));
111
+ }
112
+ const selectStyle = {
113
+ padding: "0.25rem 0.5rem",
114
+ fontSize: "0.8rem",
115
+ border: "1px solid #d1d5db",
116
+ borderRadius: 4,
117
+ background: "#ffffff",
118
+ };
119
+ const numberStyle = {
120
+ padding: "0.25rem 0.5rem",
121
+ fontSize: "0.8rem",
122
+ border: "1px solid #d1d5db",
123
+ borderRadius: 4,
124
+ background: "#ffffff",
125
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
126
+ };
127
+ //# sourceMappingURL=ImposePanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImposePanel.js","sourceRoot":"","sources":["../../src/components/ImposePanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Wave 2 C1 — inks palette.
3
+ *
4
+ * Surfaces the live separations registered in the document plus the
5
+ * named inks discovered in the active rendered PDF (via the new
6
+ * compile-pdf `POST /v1/separations/list` endpoint, PR-F). Splits
7
+ * cleanly from the existing swatches palette which still handles
8
+ * PANTONE search:
9
+ *
10
+ * - **swatches** (PR-7 / C3): catalogue search, "register as spot"
11
+ * - **inks** (this panel, C1): the live ink list — what plates
12
+ * will the compiler actually produce?
13
+ *
14
+ * Adapter pattern: hosts wire an async function that returns the
15
+ * separations list. This keeps the editor package free of any
16
+ * runtime dep on `apps/service`'s `CompilePdfClient`. The host
17
+ * typically passes
18
+ * `(pdfB64) => client.separationsList(pdfB64).then((r) => r.separations)`.
19
+ *
20
+ * @public
21
+ */
22
+ export type Ink = {
23
+ /** Display name (e.g. "PANTONE 185 C", "Silver", "Cyan"). */
24
+ name: string;
25
+ /** "Separation" or "DeviceN" — mirrors the wire shape. */
26
+ color_space: "Separation" | "DeviceN";
27
+ /** 0-indexed page numbers on which this ink appears. */
28
+ occurs_on_pages: number[];
29
+ };
30
+ /**
31
+ * Host-supplied adapter. Returns the inks for `pdfB64` (typically by
32
+ * proxying to `CompilePdfClient.separationsList`). Rejects on
33
+ * transport errors; the panel renders the error inline.
34
+ *
35
+ * **Identity matters.** The panel re-fetches whenever the `loader`
36
+ * reference changes (the standard React-effect dependency rule);
37
+ * hosts that build the adapter inline should memoize it with
38
+ * `useCallback` so an unrelated parent re-render doesn't trigger a
39
+ * spurious `POST /v1/separations/list` round-trip.
40
+ *
41
+ * @public
42
+ */
43
+ export type InksLoaderFn = (pdfB64: string) => Promise<readonly Ink[]>;
44
+ /**
45
+ * @public
46
+ */
47
+ export type InksPanelProps = {
48
+ /** Latest rendered PDF — base64, no `data:` prefix. When
49
+ * `undefined` the panel shows an "export first" affordance. */
50
+ pdfB64: string | undefined;
51
+ /** Adapter that resolves to the inks list. */
52
+ loader: InksLoaderFn;
53
+ /** Optional callback fired when the user clicks an ink row;
54
+ * hosts wire this to highlight occurrences on the canvas. */
55
+ onSelect?: (ink: Ink) => void;
56
+ };
57
+ /**
58
+ * @public
59
+ */
60
+ export declare function InksPanel({ pdfB64, loader, onSelect }: InksPanelProps): import("react/jsx-runtime").JSX.Element;
61
+ //# sourceMappingURL=InksPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InksPanel.d.ts","sourceRoot":"","sources":["../../src/components/InksPanel.tsx"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,GAAG,GAAG;IAChB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,WAAW,EAAE,YAAY,GAAG,SAAS,CAAC;IACtC,wDAAwD;IACxD,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;oEACgE;IAChE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,8CAA8C;IAC9C,MAAM,EAAE,YAAY,CAAC;IACrB;kEAC8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,2CA2FrE"}
@@ -0,0 +1,84 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useEffect, useState } from "react";
5
+ /**
6
+ * @public
7
+ */
8
+ export function InksPanel({ pdfB64, loader, onSelect }) {
9
+ const [inks, setInks] = useState(null);
10
+ const [error, setError] = useState(null);
11
+ const [loading, setLoading] = useState(false);
12
+ useEffect(() => {
13
+ if (!pdfB64) {
14
+ setInks(null);
15
+ setError(null);
16
+ return;
17
+ }
18
+ let disposed = false;
19
+ setLoading(true);
20
+ setError(null);
21
+ loader(pdfB64)
22
+ .then((next) => {
23
+ if (disposed)
24
+ return;
25
+ setInks(next);
26
+ setLoading(false);
27
+ })
28
+ .catch((err) => {
29
+ if (disposed)
30
+ return;
31
+ setError(err instanceof Error ? err.message : String(err));
32
+ setLoading(false);
33
+ });
34
+ return () => {
35
+ disposed = true;
36
+ };
37
+ }, [pdfB64, loader]);
38
+ if (!pdfB64) {
39
+ return (_jsx("div", { "data-testid": "inks-panel", style: { padding: "0.5rem", opacity: 0.6 }, children: "Render the document to see its ink list." }));
40
+ }
41
+ if (loading) {
42
+ return (_jsx("div", { "data-testid": "inks-panel", style: { padding: "0.5rem", opacity: 0.6 }, children: "Loading inks\u2026" }));
43
+ }
44
+ if (error) {
45
+ return (_jsxs("div", { "data-testid": "inks-panel", role: "alert", style: { padding: "0.5rem", color: "#a00" }, children: ["Couldn't load inks: ", error] }));
46
+ }
47
+ if (!inks || inks.length === 0) {
48
+ return (_jsx("div", { "data-testid": "inks-panel", style: { padding: "0.5rem", opacity: 0.6 }, children: "No named separations in this document." }));
49
+ }
50
+ return (_jsxs("div", { "data-testid": "inks-panel", style: { padding: "0.5rem" }, children: [_jsxs("h3", { style: { margin: "0 0 0.5rem 0" }, children: ["Inks (", inks.length, ")"] }), _jsx("ul", { style: { listStyle: "none", padding: 0, margin: 0 }, children: inks.map((ink) => (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => onSelect?.(ink), "aria-label": `Select ${ink.name}`, style: {
51
+ display: "flex",
52
+ alignItems: "center",
53
+ gap: "0.5rem",
54
+ width: "100%",
55
+ padding: "0.25rem 0.5rem",
56
+ background: "transparent",
57
+ border: "none",
58
+ cursor: onSelect ? "pointer" : "default",
59
+ textAlign: "left",
60
+ }, children: [_jsx("span", { "aria-hidden": "true", style: swatchStyleFor(ink) }), _jsx("span", { style: { flex: 1 }, children: ink.name }), _jsxs("small", { style: { opacity: 0.6 }, children: [ink.color_space, " \u00B7 p", ink.occurs_on_pages.map((p) => p + 1).join(",")] })] }) }, ink.name))) })] }));
61
+ }
62
+ /** Best-effort swatch chip. We don't have a Lab→sRGB pipeline in the
63
+ * editor (codex-pdf owns colour conversion); show a process-color
64
+ * hint for the common CMYK names and a neutral chip otherwise. */
65
+ function swatchStyleFor(ink) {
66
+ const lower = ink.name.toLowerCase();
67
+ const base = {
68
+ width: "0.85rem",
69
+ height: "0.85rem",
70
+ borderRadius: "0.15rem",
71
+ border: "1px solid #888",
72
+ flexShrink: 0,
73
+ };
74
+ if (lower.includes("cyan"))
75
+ return { ...base, background: "#00aeef" };
76
+ if (lower.includes("magenta"))
77
+ return { ...base, background: "#ec008c" };
78
+ if (lower.includes("yellow"))
79
+ return { ...base, background: "#fff200" };
80
+ if (lower.includes("black") || lower.includes("key"))
81
+ return { ...base, background: "#000" };
82
+ return { ...base, background: "#ddd" };
83
+ }
84
+ //# sourceMappingURL=InksPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InksPanel.js","sourceRoot":"","sources":["../../src/components/InksPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Print process category. Mirrors `PrintContext.process` in
3
+ * `@artworkpdf/document-model` — kept as a structural literal so this
4
+ * package doesn't pull a document-model dependency.
5
+ *
6
+ * @public
7
+ */
8
+ export type PrintProcess = "offset" | "flexo" | "gravure" | "digital" | "screen";
9
+ /**
10
+ * Substrate finish category. Mirrors the document-model shape.
11
+ * @public
12
+ */
13
+ export type SubstrateFinish = "matte" | "gloss" | "satin" | "uncoated";
14
+ /**
15
+ * Substrate compositional class — collapses the long tail of named
16
+ * stocks into the four rule-relevant buckets that lint-pdf's
17
+ * `substrate_is` matcher (Wave 2 PR-C) operates on. Distinct from
18
+ * {@link SubstrateFinish}: a `coated` stock can be `gloss` or `matte`;
19
+ * `newsprint` is always `uncoated`. Mirrors `SubstrateClass` in
20
+ * `@artworkpdf/document-model/preflight`; duplicated here so this
21
+ * package stays consumable without the document-model peer dep.
22
+ *
23
+ * @public
24
+ */
25
+ export type SubstrateClass = "coated" | "uncoated" | "newsprint" | "synthetic";
26
+ /**
27
+ * Editable shape consumed by {@link JobSetupPanel}. Mirrors
28
+ * `PrintContext` in `@artworkpdf/document-model`; kept structural so
29
+ * this UI package stays consumable by hosts that don't import the
30
+ * document-model.
31
+ *
32
+ * Hosts thread this in as `value` + `onChange`; the panel is a
33
+ * controlled component — it owns no state of its own.
34
+ *
35
+ * @public
36
+ */
37
+ export type JobSetupValue = {
38
+ process: PrintProcess;
39
+ substrate: {
40
+ id: string;
41
+ color: string;
42
+ opacity: number;
43
+ finish: SubstrateFinish;
44
+ /**
45
+ * Rule-relevant substrate class (P1). When set, the value flows
46
+ * through {@link preflightContextOf} to lint-pdf's
47
+ * `/v1/preflight/process` `substrate` query parameter, narrowing
48
+ * the rule set to substrate-aware checks. Optional because legacy
49
+ * jobs predate the field — hosts that omit it get the
50
+ * substrate-agnostic ruleset.
51
+ */
52
+ class?: SubstrateClass;
53
+ };
54
+ /** ISO 3166-1 alpha-2 codes, e.g. `["US", "CA", "GB"]`. */
55
+ targetMarkets?: string[];
56
+ /** ICC profile name — free text in this wave; library-backed selector lands later. */
57
+ colorProfile?: string;
58
+ /** Total Area Coverage limit, percent (e.g. `300` for offset, `260` for newsprint). */
59
+ tacLimit?: number;
60
+ };
61
+ /**
62
+ * Narrow projection of {@link JobSetupValue} that drives
63
+ * process-aware preflight. Returned by {@link preflightContextOf};
64
+ * the two fields map 1:1 to lint-pdf's `?process=&substrate=` query
65
+ * parameters on `/v1/preflight/process` (Wave 2 PR-E).
66
+ *
67
+ * `substrate` is *optional* (not `SubstrateClass | undefined`) so a
68
+ * `JSON.stringify` / `URLSearchParams.append` round-trip on the
69
+ * client side omits the parameter entirely instead of serializing
70
+ * `substrate=undefined` — lint-pdf reads the absence as "run the
71
+ * substrate-agnostic ruleset".
72
+ *
73
+ * @public
74
+ */
75
+ export type PreflightContext = {
76
+ process: PrintProcess;
77
+ substrate?: SubstrateClass;
78
+ };
79
+ /**
80
+ * Project a {@link JobSetupValue} onto the two fields lint-pdf's
81
+ * process-aware preflight endpoint cares about. Pure function — call
82
+ * site decides whether to debounce, memoize, or feed straight into
83
+ * the preflight client.
84
+ *
85
+ * Omits the `substrate` key entirely when the host hasn't set
86
+ * `value.substrate.class`, so callers can spread the return value
87
+ * straight into a query-param builder without filtering `undefined`s.
88
+ *
89
+ * @public
90
+ */
91
+ export declare function preflightContextOf(value: JobSetupValue): PreflightContext;
92
+ /**
93
+ * Props for the print-context modal.
94
+ *
95
+ * `enable_print_context: false` hides the panel entirely; mount with
96
+ * `<JobSetupPanel />` only when {@link showFeature} returns true for
97
+ * `print_context`.
98
+ *
99
+ * @public
100
+ */
101
+ export type JobSetupPanelProps = {
102
+ value: JobSetupValue;
103
+ onChange: (next: JobSetupValue) => void;
104
+ onClose: () => void;
105
+ };
106
+ /**
107
+ * Modal panel for editing a document's print context (F2).
108
+ *
109
+ * Renders a five-field form: process, substrate (id/color/opacity/
110
+ * finish composite), color profile (ICC), TAC limit, and target
111
+ * markets. Writes propagate through `onChange` immediately —
112
+ * controlled component, no local state — so hosts can persist into
113
+ * `document.printContext` without an explicit save step.
114
+ *
115
+ * @public
116
+ */
117
+ export declare function JobSetupPanel({ value, onChange, onClose }: JobSetupPanelProps): import("react/jsx-runtime").JSX.Element;
118
+ //# sourceMappingURL=JobSetupPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobSetupPanel.d.ts","sourceRoot":"","sources":["../../src/components/JobSetupPanel.tsx"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,eAAe,CAAC;QACxB;;;;;;;WAOG;QACH,KAAK,CAAC,EAAE,cAAc,CAAC;KACxB,CAAC;IACF,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,CAIzE;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAgCF;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,kBAAkB,2CAiR7E"}
@@ -0,0 +1,169 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useEffect } from "react";
5
+ /**
6
+ * Project a {@link JobSetupValue} onto the two fields lint-pdf's
7
+ * process-aware preflight endpoint cares about. Pure function — call
8
+ * site decides whether to debounce, memoize, or feed straight into
9
+ * the preflight client.
10
+ *
11
+ * Omits the `substrate` key entirely when the host hasn't set
12
+ * `value.substrate.class`, so callers can spread the return value
13
+ * straight into a query-param builder without filtering `undefined`s.
14
+ *
15
+ * @public
16
+ */
17
+ export function preflightContextOf(value) {
18
+ const ctx = { process: value.process };
19
+ if (value.substrate.class !== undefined)
20
+ ctx.substrate = value.substrate.class;
21
+ return ctx;
22
+ }
23
+ const PANEL_BG = "#1a0f08";
24
+ const BORDER = "#3d1a00";
25
+ const BRAND = "#fc5102";
26
+ const TEXT = "#f4ece6";
27
+ const MUTED = "#888";
28
+ const labelStyle = {
29
+ display: "block",
30
+ fontSize: "0.7rem",
31
+ letterSpacing: "0.08em",
32
+ textTransform: "uppercase",
33
+ color: MUTED,
34
+ marginBottom: "0.25rem",
35
+ };
36
+ const inputStyle = {
37
+ width: "100%",
38
+ padding: "0.45rem 0.6rem",
39
+ background: "#0f0a05",
40
+ border: `1px solid ${BORDER}`,
41
+ borderRadius: 4,
42
+ color: TEXT,
43
+ fontSize: "0.85rem",
44
+ fontFamily: "inherit",
45
+ };
46
+ const PROCESSES = ["offset", "flexo", "gravure", "digital", "screen"];
47
+ const FINISHES = ["matte", "gloss", "satin", "uncoated"];
48
+ const SUBSTRATE_CLASSES = ["coated", "uncoated", "newsprint", "synthetic"];
49
+ /**
50
+ * Modal panel for editing a document's print context (F2).
51
+ *
52
+ * Renders a five-field form: process, substrate (id/color/opacity/
53
+ * finish composite), color profile (ICC), TAC limit, and target
54
+ * markets. Writes propagate through `onChange` immediately —
55
+ * controlled component, no local state — so hosts can persist into
56
+ * `document.printContext` without an explicit save step.
57
+ *
58
+ * @public
59
+ */
60
+ export function JobSetupPanel({ value, onChange, onClose }) {
61
+ function patch(p) {
62
+ onChange({ ...value, ...p });
63
+ }
64
+ function patchSubstrate(p) {
65
+ onChange({ ...value, substrate: { ...value.substrate, ...p } });
66
+ }
67
+ // Close on Escape — matches PaletteManager pattern + standard
68
+ // modal a11y. Focus trapping is deferred (substantial; tracked as
69
+ // a follow-up).
70
+ useEffect(() => {
71
+ function handleEscape(e) {
72
+ if (e.key === "Escape")
73
+ onClose();
74
+ }
75
+ document.addEventListener("keydown", handleEscape);
76
+ return () => document.removeEventListener("keydown", handleEscape);
77
+ }, [onClose]);
78
+ return (_jsx("div", { role: "dialog", "aria-label": "Job setup \u2014 print context", "aria-modal": "true",
79
+ // Click on the backdrop (this element) closes; clicks inside
80
+ // the inner panel stopPropagate via the panel's own handler.
81
+ onClick: (e) => {
82
+ if (e.target === e.currentTarget)
83
+ onClose();
84
+ }, style: {
85
+ position: "fixed",
86
+ inset: 0,
87
+ background: "rgba(0,0,0,0.55)",
88
+ display: "flex",
89
+ alignItems: "center",
90
+ justifyContent: "center",
91
+ zIndex: 100,
92
+ }, children: _jsxs("div", { style: {
93
+ background: PANEL_BG,
94
+ border: `1px solid ${BORDER}`,
95
+ borderRadius: 8,
96
+ padding: "1.25rem",
97
+ width: "min(440px, 92vw)",
98
+ maxHeight: "85vh",
99
+ overflow: "auto",
100
+ color: TEXT,
101
+ fontFamily: "inherit",
102
+ }, children: [_jsxs("div", { style: { display: "flex", alignItems: "center", marginBottom: "1rem" }, children: [_jsx("h2", { style: { margin: 0, fontSize: "1rem", fontWeight: 700, color: BRAND }, children: "Job setup" }), _jsx("span", { style: { flex: 1 } }), _jsx("button", { type: "button", onClick: onClose, "aria-label": "Close job setup", style: {
103
+ background: "transparent",
104
+ border: `1px solid ${BORDER}`,
105
+ color: TEXT,
106
+ borderRadius: 4,
107
+ padding: "0.25rem 0.55rem",
108
+ cursor: "pointer",
109
+ fontSize: "0.85rem",
110
+ fontFamily: "inherit",
111
+ }, children: "\u00D7" })] }), _jsxs("div", { style: { display: "grid", gap: "0.85rem" }, children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "js-process", style: labelStyle, children: "Print process" }), _jsx("select", { id: "js-process", value: value.process, onChange: (e) => patch({ process: e.target.value }), style: inputStyle, children: PROCESSES.map((p) => (_jsx("option", { value: p, children: p }, p))) })] }), _jsxs("fieldset", { style: { border: `1px solid ${BORDER}`, borderRadius: 6, padding: "0.6rem 0.75rem" }, children: [_jsx("legend", { style: { padding: "0 0.35rem", fontSize: "0.72rem", color: MUTED }, children: "Substrate" }), _jsxs("div", { style: { display: "grid", gap: "0.55rem" }, children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "js-substrate-id", style: labelStyle, children: "Id" }), _jsx("input", { id: "js-substrate-id", value: value.substrate.id, onChange: (e) => patchSubstrate({ id: e.target.value }), style: inputStyle })] }), _jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "0.55rem" }, children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "js-substrate-color", style: labelStyle, children: "Color" }), _jsx("input", { id: "js-substrate-color", value: value.substrate.color, onChange: (e) => patchSubstrate({ color: e.target.value }), style: inputStyle })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "js-substrate-opacity", style: labelStyle, children: "Opacity (0\u20131)" }), _jsx("input", { id: "js-substrate-opacity", type: "number", step: "0.01", min: "0", max: "1", value: value.substrate.opacity, onChange: (e) => {
112
+ // Empty → no-op (don't conflate "user clearing
113
+ // the field" with "fully transparent"). Out-of-
114
+ // range typed input gets clamped to [0,1]
115
+ // because HTML min/max only constrain the
116
+ // spinner, not raw keyboard input.
117
+ const v = e.target.value;
118
+ if (v === "")
119
+ return;
120
+ const n = Number(v);
121
+ if (Number.isNaN(n))
122
+ return;
123
+ const clamped = Math.min(1, Math.max(0, n));
124
+ patchSubstrate({ opacity: clamped });
125
+ }, style: inputStyle })] })] }), _jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "0.55rem" }, children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "js-substrate-finish", style: labelStyle, children: "Finish" }), _jsx("select", { id: "js-substrate-finish", value: value.substrate.finish, onChange: (e) => patchSubstrate({ finish: e.target.value }), style: inputStyle, children: FINISHES.map((f) => (_jsx("option", { value: f, children: f }, f))) })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "js-substrate-class", style: labelStyle, children: "Class (preflight)" }), _jsxs("select", { id: "js-substrate-class",
126
+ // Empty option == "no class set" — passed to lint-pdf as
127
+ // a missing query param, which falls back to the
128
+ // substrate-agnostic ruleset rather than failing.
129
+ value: value.substrate.class ?? "", onChange: (e) => {
130
+ const v = e.target.value;
131
+ if (v === "") {
132
+ const { class: _, ...rest } = value.substrate;
133
+ onChange({ ...value, substrate: rest });
134
+ }
135
+ else {
136
+ patchSubstrate({ class: v });
137
+ }
138
+ }, style: inputStyle, children: [_jsx("option", { value: "", children: "\u2014 none \u2014" }), SUBSTRATE_CLASSES.map((c) => (_jsx("option", { value: c, children: c }, c)))] })] })] })] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "js-icc", style: labelStyle, children: "Color profile (ICC)" }), _jsx("input", { id: "js-icc", value: value.colorProfile ?? "", onChange: (e) => {
139
+ const v = e.target.value;
140
+ if (v) {
141
+ patch({ colorProfile: v });
142
+ }
143
+ else {
144
+ const { colorProfile: _, ...rest } = value;
145
+ onChange(rest);
146
+ }
147
+ }, placeholder: "ISOcoated_v2_eci", style: inputStyle })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "js-tac", style: labelStyle, children: "TAC limit (%)" }), _jsx("input", { id: "js-tac", type: "number", min: "0", max: "400", value: value.tacLimit ?? "", onChange: (e) => {
148
+ if (e.target.value === "") {
149
+ const { tacLimit: _, ...rest } = value;
150
+ onChange(rest);
151
+ }
152
+ else {
153
+ patch({ tacLimit: Number(e.target.value) });
154
+ }
155
+ }, placeholder: "300", style: inputStyle })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "js-markets", style: labelStyle, children: "Target markets (comma-separated ISO 3166-1 alpha-2)" }), _jsx("input", { id: "js-markets", value: (value.targetMarkets ?? []).join(", "), onChange: (e) => {
156
+ const parts = e.target.value
157
+ .split(",")
158
+ .map((s) => s.trim().toUpperCase())
159
+ .filter(Boolean);
160
+ if (parts.length > 0) {
161
+ patch({ targetMarkets: parts });
162
+ }
163
+ else {
164
+ const { targetMarkets: _, ...rest } = value;
165
+ onChange(rest);
166
+ }
167
+ }, placeholder: "US, CA, GB", style: inputStyle })] })] })] }) }));
168
+ }
169
+ //# sourceMappingURL=JobSetupPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobSetupPanel.js","sourceRoot":"","sources":["../../src/components/JobSetupPanel.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LayersPanel.d.ts","sourceRoot":"","sources":["../../src/components/LayersPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAqBF,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,eAAe,GAChB,EAAE,KAAK,2CAyIP"}
1
+ {"version":3,"file":"LayersPanel.d.ts","sourceRoot":"","sources":["../../src/components/LayersPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAsBF,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,eAAe,GAChB,EAAE,KAAK,2CAyIP"}
@@ -11,6 +11,7 @@ const ICONS = {
11
11
  ellipse: "◯",
12
12
  text: "T",
13
13
  image: "▣",
14
+ path: "↯",
14
15
  };
15
16
  function label(o) {
16
17
  if (o.name)