@printwithsynergy/artwork-pdf-editor 0.2.0 → 0.3.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.
- package/LICENSE +62 -0
- package/dist/components/AccessibilityHintsPanel.d.ts +142 -0
- package/dist/components/AccessibilityHintsPanel.d.ts.map +1 -0
- package/dist/components/AccessibilityHintsPanel.js +158 -0
- package/dist/components/AccessibilityHintsPanel.js.map +1 -0
- package/dist/components/AnnotationOverlay.d.ts +142 -0
- package/dist/components/AnnotationOverlay.d.ts.map +1 -0
- package/dist/components/AnnotationOverlay.js +141 -0
- package/dist/components/AnnotationOverlay.js.map +1 -0
- package/dist/components/AnnotationsSidebar.d.ts +98 -0
- package/dist/components/AnnotationsSidebar.d.ts.map +1 -0
- package/dist/components/AnnotationsSidebar.js +100 -0
- package/dist/components/AnnotationsSidebar.js.map +1 -0
- package/dist/components/BarcodeGeneratorPanel.d.ts +58 -0
- package/dist/components/BarcodeGeneratorPanel.d.ts.map +1 -0
- package/dist/components/BarcodeGeneratorPanel.js +91 -0
- package/dist/components/BarcodeGeneratorPanel.js.map +1 -0
- package/dist/components/BraillePanel.d.ts +99 -0
- package/dist/components/BraillePanel.d.ts.map +1 -0
- package/dist/components/BraillePanel.js +221 -0
- package/dist/components/BraillePanel.js.map +1 -0
- package/dist/components/BrandAssetsPanel.d.ts +130 -0
- package/dist/components/BrandAssetsPanel.d.ts.map +1 -0
- package/dist/components/BrandAssetsPanel.js +125 -0
- package/dist/components/BrandAssetsPanel.js.map +1 -0
- package/dist/components/BrandConsistencyPanel.d.ts +140 -0
- package/dist/components/BrandConsistencyPanel.d.ts.map +1 -0
- package/dist/components/BrandConsistencyPanel.js +158 -0
- package/dist/components/BrandConsistencyPanel.js.map +1 -0
- package/dist/components/ComplianceFindingsPanel.d.ts +62 -0
- package/dist/components/ComplianceFindingsPanel.d.ts.map +1 -0
- package/dist/components/ComplianceFindingsPanel.js +118 -0
- package/dist/components/ComplianceFindingsPanel.js.map +1 -0
- package/dist/components/DesignSuggestionsPanel.d.ts +148 -0
- package/dist/components/DesignSuggestionsPanel.d.ts.map +1 -0
- package/dist/components/DesignSuggestionsPanel.js +154 -0
- package/dist/components/DesignSuggestionsPanel.js.map +1 -0
- package/dist/components/DielineParametersPanel.d.ts +62 -0
- package/dist/components/DielineParametersPanel.d.ts.map +1 -0
- package/dist/components/DielineParametersPanel.js +170 -0
- package/dist/components/DielineParametersPanel.js.map +1 -0
- package/dist/components/DielinePreview.d.ts +150 -0
- package/dist/components/DielinePreview.d.ts.map +1 -0
- package/dist/components/DielinePreview.js +146 -0
- package/dist/components/DielinePreview.js.map +1 -0
- package/dist/components/EditorApp.d.ts +18 -3
- package/dist/components/EditorApp.d.ts.map +1 -1
- package/dist/components/EditorApp.js +42 -7
- package/dist/components/EditorApp.js.map +1 -1
- package/dist/components/EditorCanvas.d.ts +31 -2
- package/dist/components/EditorCanvas.d.ts.map +1 -1
- package/dist/components/EditorCanvas.js +97 -16
- package/dist/components/EditorCanvas.js.map +1 -1
- package/dist/components/EmailNotifyPanel.d.ts +165 -0
- package/dist/components/EmailNotifyPanel.d.ts.map +1 -0
- package/dist/components/EmailNotifyPanel.js +211 -0
- package/dist/components/EmailNotifyPanel.js.map +1 -0
- package/dist/components/FileDropZone.d.ts +9 -1
- package/dist/components/FileDropZone.d.ts.map +1 -1
- package/dist/components/FileDropZone.js +53 -5
- package/dist/components/FileDropZone.js.map +1 -1
- package/dist/components/FoldEditorPanel.d.ts +68 -0
- package/dist/components/FoldEditorPanel.d.ts.map +1 -0
- package/dist/components/FoldEditorPanel.js +65 -0
- package/dist/components/FoldEditorPanel.js.map +1 -0
- package/dist/components/FoldPreviewOverlay.d.ts +48 -0
- package/dist/components/FoldPreviewOverlay.d.ts.map +1 -0
- package/dist/components/FoldPreviewOverlay.js +182 -0
- package/dist/components/FoldPreviewOverlay.js.map +1 -0
- package/dist/components/Gs1DigitalLinkPanel.d.ts +103 -0
- package/dist/components/Gs1DigitalLinkPanel.d.ts.map +1 -0
- package/dist/components/Gs1DigitalLinkPanel.js +199 -0
- package/dist/components/Gs1DigitalLinkPanel.js.map +1 -0
- package/dist/components/HistoryPanel.d.ts +39 -0
- package/dist/components/HistoryPanel.d.ts.map +1 -0
- package/dist/components/HistoryPanel.js +72 -0
- package/dist/components/HistoryPanel.js.map +1 -0
- package/dist/components/IccSoftProofOverlay.d.ts +67 -0
- package/dist/components/IccSoftProofOverlay.d.ts.map +1 -0
- package/dist/components/IccSoftProofOverlay.js +119 -0
- package/dist/components/IccSoftProofOverlay.js.map +1 -0
- package/dist/components/ImposePanel.d.ts +71 -0
- package/dist/components/ImposePanel.d.ts.map +1 -0
- package/dist/components/ImposePanel.js +127 -0
- package/dist/components/ImposePanel.js.map +1 -0
- package/dist/components/InksPanel.d.ts +61 -0
- package/dist/components/InksPanel.d.ts.map +1 -0
- package/dist/components/InksPanel.js +84 -0
- package/dist/components/InksPanel.js.map +1 -0
- package/dist/components/JobSetupPanel.d.ts +118 -0
- package/dist/components/JobSetupPanel.d.ts.map +1 -0
- package/dist/components/JobSetupPanel.js +169 -0
- package/dist/components/JobSetupPanel.js.map +1 -0
- package/dist/components/LayersPanel.d.ts.map +1 -1
- package/dist/components/LayersPanel.js +1 -0
- package/dist/components/LayersPanel.js.map +1 -1
- package/dist/components/MarkLibraryPanel.d.ts +131 -0
- package/dist/components/MarkLibraryPanel.d.ts.map +1 -0
- package/dist/components/MarkLibraryPanel.js +184 -0
- package/dist/components/MarkLibraryPanel.js.map +1 -0
- package/dist/components/MisEstimateButton.d.ts +73 -0
- package/dist/components/MisEstimateButton.d.ts.map +1 -0
- package/dist/components/MisEstimateButton.js +57 -0
- package/dist/components/MisEstimateButton.js.map +1 -0
- package/dist/components/NutritionPanel.d.ts +118 -0
- package/dist/components/NutritionPanel.d.ts.map +1 -0
- package/dist/components/NutritionPanel.js +169 -0
- package/dist/components/NutritionPanel.js.map +1 -0
- package/dist/components/PageNavigator.d.ts.map +1 -1
- package/dist/components/PageNavigator.js +6 -1
- package/dist/components/PageNavigator.js.map +1 -1
- package/dist/components/PaletteManager.d.ts +32 -0
- package/dist/components/PaletteManager.d.ts.map +1 -0
- package/dist/components/PaletteManager.js +89 -0
- package/dist/components/PaletteManager.js.map +1 -0
- package/dist/components/PaletteToSpotPanel.d.ts +122 -0
- package/dist/components/PaletteToSpotPanel.d.ts.map +1 -0
- package/dist/components/PaletteToSpotPanel.js +160 -0
- package/dist/components/PaletteToSpotPanel.js.map +1 -0
- package/dist/components/PreflightAutoFixPanel.d.ts +110 -0
- package/dist/components/PreflightAutoFixPanel.d.ts.map +1 -0
- package/dist/components/PreflightAutoFixPanel.js +119 -0
- package/dist/components/PreflightAutoFixPanel.js.map +1 -0
- package/dist/components/PreflightDiffPanel.d.ts +127 -0
- package/dist/components/PreflightDiffPanel.d.ts.map +1 -0
- package/dist/components/PreflightDiffPanel.js +0 -0
- package/dist/components/PreflightDiffPanel.js.map +1 -0
- package/dist/components/ProcessRulesPanel.d.ts +81 -0
- package/dist/components/ProcessRulesPanel.d.ts.map +1 -0
- package/dist/components/ProcessRulesPanel.js +143 -0
- package/dist/components/ProcessRulesPanel.js.map +1 -0
- package/dist/components/SlackNotifyPanel.d.ts +139 -0
- package/dist/components/SlackNotifyPanel.d.ts.map +1 -0
- package/dist/components/SlackNotifyPanel.js +133 -0
- package/dist/components/SlackNotifyPanel.js.map +1 -0
- package/dist/components/SmartSpotMatchPanel.d.ts +143 -0
- package/dist/components/SmartSpotMatchPanel.d.ts.map +1 -0
- package/dist/components/SmartSpotMatchPanel.js +159 -0
- package/dist/components/SmartSpotMatchPanel.js.map +1 -0
- package/dist/components/SwatchesPicker.d.ts +83 -0
- package/dist/components/SwatchesPicker.d.ts.map +1 -0
- package/dist/components/SwatchesPicker.js +151 -0
- package/dist/components/SwatchesPicker.js.map +1 -0
- package/dist/components/TacOverlay.d.ts +47 -0
- package/dist/components/TacOverlay.d.ts.map +1 -0
- package/dist/components/TacOverlay.js +116 -0
- package/dist/components/TacOverlay.js.map +1 -0
- package/dist/components/TrapEditorPanel.d.ts +52 -0
- package/dist/components/TrapEditorPanel.d.ts.map +1 -0
- package/dist/components/TrapEditorPanel.js +64 -0
- package/dist/components/TrapEditorPanel.js.map +1 -0
- package/dist/components/TrapPreviewOverlay.d.ts +64 -0
- package/dist/components/TrapPreviewOverlay.d.ts.map +1 -0
- package/dist/components/TrapPreviewOverlay.js +120 -0
- package/dist/components/TrapPreviewOverlay.js.map +1 -0
- package/dist/components/VariantMatrixPanel.d.ts +61 -0
- package/dist/components/VariantMatrixPanel.d.ts.map +1 -0
- package/dist/components/VariantMatrixPanel.js +97 -0
- package/dist/components/VariantMatrixPanel.js.map +1 -0
- package/dist/components/VariantMatrixVersionPanel.d.ts +122 -0
- package/dist/components/VariantMatrixVersionPanel.d.ts.map +1 -0
- package/dist/components/VariantMatrixVersionPanel.js +162 -0
- package/dist/components/VariantMatrixVersionPanel.js.map +1 -0
- package/dist/components/WebhookNotifyPanel.d.ts +160 -0
- package/dist/components/WebhookNotifyPanel.d.ts.map +1 -0
- package/dist/components/WebhookNotifyPanel.js +100 -0
- package/dist/components/WebhookNotifyPanel.js.map +1 -0
- package/dist/components/WhiteUnderbasePanel.d.ts +107 -0
- package/dist/components/WhiteUnderbasePanel.d.ts.map +1 -0
- package/dist/components/WhiteUnderbasePanel.js +104 -0
- package/dist/components/WhiteUnderbasePanel.js.map +1 -0
- package/dist/hooks/useEditorMode.d.ts +25 -5
- package/dist/hooks/useEditorMode.d.ts.map +1 -1
- package/dist/hooks/useEditorMode.js +18 -5
- package/dist/hooks/useEditorMode.js.map +1 -1
- package/dist/index.d.ts +49 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -2
- package/dist/index.js.map +1 -1
- package/dist/lens/preflight-findings.d.ts.map +1 -1
- package/dist/lens/preflight-findings.js.map +1 -1
- package/dist/lib/barcode-scan.d.ts +154 -0
- package/dist/lib/barcode-scan.d.ts.map +1 -0
- package/dist/lib/barcode-scan.js +152 -0
- package/dist/lib/barcode-scan.js.map +1 -0
- package/dist/lib/color-math.d.ts +76 -0
- package/dist/lib/color-math.d.ts.map +1 -0
- package/dist/lib/color-math.js +96 -0
- package/dist/lib/color-math.js.map +1 -0
- package/dist/lib/dieline-template.d.ts +87 -0
- package/dist/lib/dieline-template.d.ts.map +1 -1
- package/dist/lib/dieline-template.js +163 -0
- package/dist/lib/dieline-template.js.map +1 -1
- package/dist/lib/editor-config.d.ts +384 -0
- package/dist/lib/editor-config.d.ts.map +1 -1
- package/dist/lib/editor-config.js +89 -0
- package/dist/lib/editor-config.js.map +1 -1
- package/dist/lib/fold-geometry.d.ts +144 -0
- package/dist/lib/fold-geometry.d.ts.map +1 -0
- package/dist/lib/fold-geometry.js +138 -0
- package/dist/lib/fold-geometry.js.map +1 -0
- package/dist/lib/merge-tokens.d.ts +81 -0
- package/dist/lib/merge-tokens.d.ts.map +1 -0
- package/dist/lib/merge-tokens.js +88 -0
- package/dist/lib/merge-tokens.js.map +1 -0
- package/dist/lib/palette-registry.d.ts +40 -0
- package/dist/lib/palette-registry.d.ts.map +1 -0
- package/dist/lib/palette-registry.js +49 -0
- package/dist/lib/palette-registry.js.map +1 -0
- package/dist/lib/panel-anchor.d.ts +101 -0
- package/dist/lib/panel-anchor.d.ts.map +1 -0
- package/dist/lib/panel-anchor.js +68 -0
- package/dist/lib/panel-anchor.js.map +1 -0
- package/dist/lib/preflight/checks.d.ts.map +1 -1
- package/dist/lib/preflight/checks.js +71 -0
- package/dist/lib/preflight/checks.js.map +1 -1
- package/dist/lib/preflight/types.d.ts.map +1 -1
- package/dist/lib/preflight/types.js +11 -0
- package/dist/lib/preflight/types.js.map +1 -1
- package/dist/lib/rasterize.d.ts +93 -0
- package/dist/lib/rasterize.d.ts.map +1 -0
- package/dist/lib/rasterize.js +117 -0
- package/dist/lib/rasterize.js.map +1 -0
- package/dist/lib/separations-registry.d.ts +99 -0
- package/dist/lib/separations-registry.d.ts.map +1 -0
- package/dist/lib/separations-registry.js +59 -0
- package/dist/lib/separations-registry.js.map +1 -0
- package/dist/lib/unwired.d.ts +29 -0
- package/dist/lib/unwired.d.ts.map +1 -0
- package/dist/lib/unwired.js +58 -0
- package/dist/lib/unwired.js.map +1 -0
- package/package.json +20 -11
- package/dist/components/SeparationsPanel.d.ts +0 -9
- package/dist/components/SeparationsPanel.d.ts.map +0 -1
- package/dist/components/SeparationsPanel.js +0 -168
- package/dist/components/SeparationsPanel.js.map +0 -1
|
@@ -0,0 +1,146 @@
|
|
|
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
|
+
/** Default preview size. Tight enough for a sidebar slot, big enough
|
|
5
|
+
* to read panel roles at a glance. */
|
|
6
|
+
const DEFAULT_SIZE_PX = 160;
|
|
7
|
+
/** SVG gutter around the dieline so panel strokes don't kiss the edge. */
|
|
8
|
+
const GUTTER_PX = 8;
|
|
9
|
+
/** Pixel tolerance for treating two panel-bbox edges as "touching".
|
|
10
|
+
* In viewport-projected coords a half-pixel slop covers float drift
|
|
11
|
+
* from the bbox → scaled-corner pipeline without spuriously matching
|
|
12
|
+
* visibly-separated panels. Hosts that need a stricter test can drive
|
|
13
|
+
* `computeDielinePreviewLayout` themselves over their own constant. */
|
|
14
|
+
const ADJACENCY_TOLERANCE_PX = 0.5;
|
|
15
|
+
/**
|
|
16
|
+
* Pure geometry helper — projects the panel registry + fold config
|
|
17
|
+
* into the preview viewport at `sizePx` square. Exposed for tests
|
|
18
|
+
* and for hosts that want to drive their own SVG / canvas renderer
|
|
19
|
+
* over the same numbers.
|
|
20
|
+
*
|
|
21
|
+
* Returns an empty layout when `panels` is empty; collapses to a
|
|
22
|
+
* unit scale when every panel has zero extent (mid-edit guard).
|
|
23
|
+
*
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export function computeDielinePreviewLayout(panelMetadata, foldConfig, sizePx) {
|
|
27
|
+
if (panelMetadata.panels.length === 0) {
|
|
28
|
+
return { panels: [], hinges: [], scale: 1 };
|
|
29
|
+
}
|
|
30
|
+
// AABB across every panel's bbox in source units.
|
|
31
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
32
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
33
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
34
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
35
|
+
for (const p of panelMetadata.panels) {
|
|
36
|
+
if (p.bbox.x < minX)
|
|
37
|
+
minX = p.bbox.x;
|
|
38
|
+
if (p.bbox.y < minY)
|
|
39
|
+
minY = p.bbox.y;
|
|
40
|
+
if (p.bbox.x + p.bbox.width > maxX)
|
|
41
|
+
maxX = p.bbox.x + p.bbox.width;
|
|
42
|
+
if (p.bbox.y + p.bbox.height > maxY)
|
|
43
|
+
maxY = p.bbox.y + p.bbox.height;
|
|
44
|
+
}
|
|
45
|
+
const spanX = maxX - minX;
|
|
46
|
+
const spanY = maxY - minY;
|
|
47
|
+
const longest = Math.max(spanX, spanY);
|
|
48
|
+
// Defensive: degenerate registries (all-zero bboxes) get unit scale
|
|
49
|
+
// so we still render *something* and don't divide by zero.
|
|
50
|
+
const scale = longest > 0 ? (sizePx - 2 * GUTTER_PX) / longest : 1;
|
|
51
|
+
const panels = panelMetadata.panels.map((p) => {
|
|
52
|
+
const out = {
|
|
53
|
+
id: p.id,
|
|
54
|
+
x: GUTTER_PX + (p.bbox.x - minX) * scale,
|
|
55
|
+
y: GUTTER_PX + (p.bbox.y - minY) * scale,
|
|
56
|
+
width: p.bbox.width * scale,
|
|
57
|
+
height: p.bbox.height * scale,
|
|
58
|
+
};
|
|
59
|
+
if (p.name !== undefined)
|
|
60
|
+
out.name = p.name;
|
|
61
|
+
if (p.role !== undefined)
|
|
62
|
+
out.role = p.role;
|
|
63
|
+
return out;
|
|
64
|
+
});
|
|
65
|
+
const panelById = new Map(panels.map((p) => [p.id, p]));
|
|
66
|
+
const hinges = [];
|
|
67
|
+
if (foldConfig) {
|
|
68
|
+
for (const edge of foldConfig.edges) {
|
|
69
|
+
const a = panelById.get(edge.panelA);
|
|
70
|
+
const b = panelById.get(edge.panelB);
|
|
71
|
+
if (!a || !b)
|
|
72
|
+
continue;
|
|
73
|
+
// Hinge segment = the overlap of the two panels' bbox edges.
|
|
74
|
+
// For non-touching panels we still draw a connector between
|
|
75
|
+
// their bbox centers so the operator can see the fold intent.
|
|
76
|
+
hinges.push({
|
|
77
|
+
id: edge.id,
|
|
78
|
+
...hingeBetween(a, b),
|
|
79
|
+
direction: edge.direction ?? "mountain",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { panels, hinges, scale };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Compute the hinge segment between two laid-out panels. Returns the
|
|
87
|
+
* shared bbox edge when the panels touch; otherwise returns a connector
|
|
88
|
+
* between their centers so dangling-fold cases still render visibly.
|
|
89
|
+
*/
|
|
90
|
+
function hingeBetween(a, b) {
|
|
91
|
+
const aRight = a.x + a.width;
|
|
92
|
+
const aBottom = a.y + a.height;
|
|
93
|
+
const bRight = b.x + b.width;
|
|
94
|
+
const bBottom = b.y + b.height;
|
|
95
|
+
// Horizontal-adjacent: a is left of b, edge is x = aRight ≈ b.x.
|
|
96
|
+
if (Math.abs(aRight - b.x) < ADJACENCY_TOLERANCE_PX ||
|
|
97
|
+
Math.abs(bRight - a.x) < ADJACENCY_TOLERANCE_PX) {
|
|
98
|
+
const x = Math.abs(aRight - b.x) < ADJACENCY_TOLERANCE_PX ? aRight : a.x;
|
|
99
|
+
const y1 = Math.max(a.y, b.y);
|
|
100
|
+
const y2 = Math.min(aBottom, bBottom);
|
|
101
|
+
return { x1: x, y1, x2: x, y2 };
|
|
102
|
+
}
|
|
103
|
+
// Vertical-adjacent: a is above b, edge is y = aBottom ≈ b.y.
|
|
104
|
+
if (Math.abs(aBottom - b.y) < ADJACENCY_TOLERANCE_PX ||
|
|
105
|
+
Math.abs(bBottom - a.y) < ADJACENCY_TOLERANCE_PX) {
|
|
106
|
+
const y = Math.abs(aBottom - b.y) < ADJACENCY_TOLERANCE_PX ? aBottom : a.y;
|
|
107
|
+
const x1 = Math.max(a.x, b.x);
|
|
108
|
+
const x2 = Math.min(aRight, bRight);
|
|
109
|
+
return { x1, y1: y, x2, y2: y };
|
|
110
|
+
}
|
|
111
|
+
// Non-touching: connect centers.
|
|
112
|
+
return {
|
|
113
|
+
x1: a.x + a.width / 2,
|
|
114
|
+
y1: a.y + a.height / 2,
|
|
115
|
+
x2: b.x + b.width / 2,
|
|
116
|
+
y2: b.y + b.height / 2,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* @public
|
|
121
|
+
*/
|
|
122
|
+
export function DielinePreview({ panelMetadata, foldConfig, templateId, sizePx = DEFAULT_SIZE_PX, activePanelId, }) {
|
|
123
|
+
const headerLabel = templateId ? `Dieline preview — ${templateId}` : "Dieline preview";
|
|
124
|
+
if (!panelMetadata || panelMetadata.panels.length === 0) {
|
|
125
|
+
return (_jsxs("section", { "data-testid": "dieline-preview", "aria-label": "Dieline preview", style: { padding: "0.5rem" }, children: [_jsx("header", { style: { fontSize: "0.75rem", color: "#666", marginBottom: "0.5rem" }, children: headerLabel }), _jsx("div", { "data-testid": "dieline-preview-empty", style: {
|
|
126
|
+
width: sizePx,
|
|
127
|
+
height: sizePx,
|
|
128
|
+
display: "flex",
|
|
129
|
+
alignItems: "center",
|
|
130
|
+
justifyContent: "center",
|
|
131
|
+
border: "1px dashed #ccc",
|
|
132
|
+
borderRadius: 4,
|
|
133
|
+
color: "#888",
|
|
134
|
+
fontSize: "0.75rem",
|
|
135
|
+
textAlign: "center",
|
|
136
|
+
padding: "0.5rem",
|
|
137
|
+
boxSizing: "border-box",
|
|
138
|
+
}, children: "No dieline loaded" })] }));
|
|
139
|
+
}
|
|
140
|
+
const layout = computeDielinePreviewLayout(panelMetadata, foldConfig, sizePx);
|
|
141
|
+
return (_jsxs("section", { "data-testid": "dieline-preview", "aria-label": "Dieline preview", style: { padding: "0.5rem" }, children: [_jsx("header", { style: { fontSize: "0.75rem", color: "#666", marginBottom: "0.5rem" }, children: headerLabel }), _jsxs("svg", { "data-testid": "dieline-preview-svg", width: sizePx, height: sizePx, viewBox: `0 0 ${sizePx} ${sizePx}`, role: "img", "aria-label": `Dieline thumbnail with ${layout.panels.length} panel${layout.panels.length === 1 ? "" : "s"}`, style: { border: "1px solid #ddd", background: "#fafafa", borderRadius: 4 }, children: [layout.panels.map((p) => {
|
|
142
|
+
const isActive = p.id === activePanelId;
|
|
143
|
+
return (_jsx("rect", { "data-testid": `dieline-preview-panel-${p.id}`, x: p.x, y: p.y, width: p.width, height: p.height, fill: isActive ? "#e0ecff" : "#fff", stroke: isActive ? "#2563eb" : "#222", strokeWidth: isActive ? 1.5 : 1 }, p.id));
|
|
144
|
+
}), layout.hinges.map((h) => (_jsx("line", { "data-testid": `dieline-preview-hinge-${h.id}`, x1: h.x1, y1: h.y1, x2: h.x2, y2: h.y2, stroke: h.direction === "mountain" ? "#2563eb" : "#dc2626", strokeWidth: 1.5, strokeDasharray: h.direction === "valley" ? "3 2" : undefined }, h.id)))] })] }));
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=DielinePreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DielinePreview.js","sourceRoot":"","sources":["../../src/components/DielinePreview.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type EditorMode } from "../hooks/useEditorMode";
|
|
2
|
-
import type
|
|
3
|
-
import { type EditorConfig } from "../lib/editor-config";
|
|
2
|
+
import { type Page } from "../lib/dieline-template";
|
|
3
|
+
import { type EditorConfig, type PaletteId } from "../lib/editor-config";
|
|
4
4
|
import { type CanvasObj } from "./EditorCanvas";
|
|
5
5
|
import { type TopBarProps } from "./TopBar";
|
|
6
6
|
type Phase = "upload" | "checking" | "preflight" | "editor";
|
|
@@ -50,7 +50,22 @@ export type EditorAppProps = {
|
|
|
50
50
|
bleedMm?: number;
|
|
51
51
|
/** Host-supplied top bar configuration (logo, extra CTAs, etc.). */
|
|
52
52
|
topBar?: Partial<TopBarProps>;
|
|
53
|
+
/**
|
|
54
|
+
* Initial palette-visibility map. Each {@link PaletteId} entry is
|
|
55
|
+
* `true` (visible) or `false` (hidden); absent ids default to
|
|
56
|
+
* visible. Merged into `config.panelVisibility` once at mount; the
|
|
57
|
+
* host's `onPanelVisibilityChange` callback receives the merged
|
|
58
|
+
* next-state on every toggle.
|
|
59
|
+
*/
|
|
60
|
+
initialPanelVisibility?: Partial<Record<PaletteId, boolean>>;
|
|
61
|
+
/**
|
|
62
|
+
* Fires whenever the user toggles a palette via `PaletteManager`
|
|
63
|
+
* (desktop) or the mobile drawer's "Panels" section. The host is
|
|
64
|
+
* responsible for persisting (e.g. localStorage keyed by user +
|
|
65
|
+
* document) — the editor doesn't own this state.
|
|
66
|
+
*/
|
|
67
|
+
onPanelVisibilityChange?: (next: Partial<Record<PaletteId, boolean>>) => void;
|
|
53
68
|
};
|
|
54
|
-
export declare function EditorApp({ demo, initialPhase, initialObjects, initialPageSize, initialPages, preferMode, config: configOverrides, bleedMm, topBar, }: EditorAppProps): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
export declare function EditorApp({ demo, initialPhase, initialObjects, initialPageSize, initialPages, preferMode, config: configOverrides, bleedMm, topBar, initialPanelVisibility, onPanelVisibilityChange, }: EditorAppProps): import("react/jsx-runtime").JSX.Element;
|
|
55
70
|
export {};
|
|
56
71
|
//# sourceMappingURL=EditorApp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorApp.d.ts","sourceRoot":"","sources":["../../src/components/EditorApp.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,wBAAwB,CAAC;AAIxE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"EditorApp.d.ts","sourceRoot":"","sources":["../../src/components/EditorApp.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,wBAAwB,CAAC;AAIxE,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,SAAS,EAGf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,gBAAgB,CAAC;AAI9D,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpD,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;6DACyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB;iFAC6E;IAC7E,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;IAC7B;iFAC6E;IAC7E,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC;IACtB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACjC,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B;qFACiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;CAC/E,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,IAAY,EACZ,YAAuB,EACvB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,UAAmB,EACnB,MAAM,EAAE,eAAe,EACvB,OAA0B,EAC1B,MAAM,EACN,sBAAsB,EACtB,uBAAuB,GACxB,EAAE,cAAc,2CAmShB"}
|
|
@@ -6,13 +6,14 @@ import { useEditorMode } from "../hooks/useEditorMode";
|
|
|
6
6
|
import { useIsMobile } from "../hooks/useIsMobile";
|
|
7
7
|
import { usePreflight } from "../hooks/usePreflight";
|
|
8
8
|
import { DEFAULT_BLEED_MM } from "../lib/bleed";
|
|
9
|
-
import {
|
|
9
|
+
import { dielineToPage } from "../lib/dieline-template";
|
|
10
|
+
import { isPanelVisible, resolveConfig, } from "../lib/editor-config";
|
|
10
11
|
import { EditorCanvas } from "./EditorCanvas";
|
|
11
|
-
import { PageNavigator } from "./PageNavigator";
|
|
12
12
|
import { FileDropZone } from "./FileDropZone";
|
|
13
|
+
import { PageNavigator } from "./PageNavigator";
|
|
13
14
|
import { PreflightPanel } from "./PreflightPanel";
|
|
14
15
|
import { TopBar } from "./TopBar";
|
|
15
|
-
export function EditorApp({ demo = false, initialPhase = "upload", initialObjects, initialPageSize, initialPages, preferMode = "auto", config: configOverrides, bleedMm = DEFAULT_BLEED_MM, topBar, }) {
|
|
16
|
+
export function EditorApp({ demo = false, initialPhase = "upload", initialObjects, initialPageSize, initialPages, preferMode = "auto", config: configOverrides, bleedMm = DEFAULT_BLEED_MM, topBar, initialPanelVisibility, onPanelVisibilityChange, }) {
|
|
16
17
|
// Multi-page seed wins over the single-page convenience props. We
|
|
17
18
|
// wrap legacy `initialObjects` / `initialPageSize` into a single-page
|
|
18
19
|
// array so the rest of EditorApp can treat everything as multi-page.
|
|
@@ -75,8 +76,24 @@ export function EditorApp({ demo = false, initialPhase = "upload", initialObject
|
|
|
75
76
|
const [report, setReport] = useState(null);
|
|
76
77
|
const { state: preflightState, run: runPreflight } = usePreflight();
|
|
77
78
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
79
|
+
const [panelVisibility, setPanelVisibility] = useState(initialPanelVisibility ?? {});
|
|
78
80
|
const isMobile = useIsMobile();
|
|
79
|
-
|
|
81
|
+
// Per-instance overrides merge config.panelVisibility (if set) on
|
|
82
|
+
// top of the editor's mutable panelVisibility state. The mutable
|
|
83
|
+
// state wins so user toggles outlive a config-override prop change.
|
|
84
|
+
const baseConfig = resolveConfig(mode, configOverrides);
|
|
85
|
+
const config = {
|
|
86
|
+
...baseConfig,
|
|
87
|
+
panelVisibility: { ...baseConfig.panelVisibility, ...panelVisibility },
|
|
88
|
+
};
|
|
89
|
+
function updatePanelVisibility(next) {
|
|
90
|
+
setPanelVisibility(next);
|
|
91
|
+
onPanelVisibilityChange?.(next);
|
|
92
|
+
}
|
|
93
|
+
// Silence "unused" — kept for the upcoming PaletteManager + mobile
|
|
94
|
+
// "Panels" section wire-up; safe to expose now so hosts can preload
|
|
95
|
+
// visibility from a callback round-trip without later refactors.
|
|
96
|
+
void updatePanelVisibility;
|
|
80
97
|
async function handleFile(f) {
|
|
81
98
|
setFile(f);
|
|
82
99
|
setPhase("checking");
|
|
@@ -89,6 +106,17 @@ export function EditorApp({ demo = false, initialPhase = "upload", initialObject
|
|
|
89
106
|
setPhase("upload");
|
|
90
107
|
}
|
|
91
108
|
}
|
|
109
|
+
function handleDieline(dieline) {
|
|
110
|
+
// S2 ingress: a parsed CF2 / DDES / ARD dieline skips the PDF
|
|
111
|
+
// preflight phase (there's nothing to preflight — a dieline file
|
|
112
|
+
// has no rasters, fonts, or color spaces to validate). Seed the
|
|
113
|
+
// pages array directly from `dielineToPage` and jump to the
|
|
114
|
+
// editor.
|
|
115
|
+
const seeded = dielineToPage(dieline, bleedMm);
|
|
116
|
+
setPages([seeded]);
|
|
117
|
+
setCurrentPageIndex(0);
|
|
118
|
+
setPhase("editor");
|
|
119
|
+
}
|
|
92
120
|
function handleSendToLint() {
|
|
93
121
|
alert("Job queued for lint node analysis.");
|
|
94
122
|
}
|
|
@@ -104,18 +132,25 @@ export function EditorApp({ demo = false, initialPhase = "upload", initialObject
|
|
|
104
132
|
flexDirection: "column",
|
|
105
133
|
alignItems: "center",
|
|
106
134
|
gap: "1.25rem",
|
|
107
|
-
}, children: [_jsx(FileDropZone, { onFile: handleFile }), !demo && (_jsx("a", { href: "/demo", target: "_blank", rel: "noopener noreferrer", style: {
|
|
135
|
+
}, children: [_jsx(FileDropZone, { onFile: handleFile, onDieline: handleDieline }), !demo && (_jsx("a", { href: "/demo", target: "_blank", rel: "noopener noreferrer", style: {
|
|
108
136
|
fontSize: "0.85rem",
|
|
109
137
|
color: "#fc5102",
|
|
110
138
|
fontWeight: 600,
|
|
111
139
|
textDecoration: "none",
|
|
112
140
|
opacity: 0.85,
|
|
113
|
-
}, children: "Try the demo editor (no file needed) \u2192" }))] })), phase === "checking" && (_jsx("p", { style: { color: "#995b30" }, children: "Running preflight checks\u2026" })), phase === "preflight" &&
|
|
141
|
+
}, children: "Try the demo editor (no file needed) \u2192" }))] })), phase === "checking" && (_jsx("p", { style: { color: "#995b30" }, children: "Running preflight checks\u2026" })), phase === "preflight" &&
|
|
142
|
+
report &&
|
|
143
|
+
config.enable_preflight_banner &&
|
|
144
|
+
isPanelVisible(config, "preflight") && (_jsx(PreflightPanel, { report: report, onProceed: () => setPhase("editor"), onSendToLint: handleSendToLint })), phase === "preflight" &&
|
|
145
|
+
report &&
|
|
146
|
+
(!config.enable_preflight_banner || !isPanelVisible(config, "preflight")) && (_jsx(AutoAdvance, { onContinue: () => setPhase("editor") })), phase === "editor" && activePage && (_jsxs("div", { style: {
|
|
114
147
|
display: "flex",
|
|
115
148
|
flexDirection: "column",
|
|
116
149
|
width: "100%",
|
|
117
150
|
height: "100%",
|
|
118
|
-
}, children: [pages.length > 1 && !isMobile && (_jsx(PageNavigator, { pages: pages, currentPageIndex: currentPageIndex, onSelect: setCurrentPageIndex, onAddPage: handleAddPage, ...(pages.length > 1 ? { onDeletePage: handleDeletePage } : {}), variant: "strip" })), _jsx(EditorCanvas, { file: file, report: report, demo: demo, mode: mode, onModeChange: setMode, config: config, bleedMm: activePage.bleedMm, isMobile: isMobile, menuOpen: menuOpen, onMenuOpenChange: setMenuOpen, initialObjects: activePage.objects, initialPageSize: activePage.pageSize,
|
|
151
|
+
}, children: [pages.length > 1 && !isMobile && (_jsx(PageNavigator, { pages: pages, currentPageIndex: currentPageIndex, onSelect: setCurrentPageIndex, onAddPage: handleAddPage, ...(pages.length > 1 ? { onDeletePage: handleDeletePage } : {}), variant: "strip" })), _jsx(EditorCanvas, { file: file, report: report, demo: demo, mode: mode, onModeChange: setMode, config: config, bleedMm: activePage.bleedMm, isMobile: isMobile, menuOpen: menuOpen, onMenuOpenChange: setMenuOpen, initialObjects: activePage.objects, initialPageSize: activePage.pageSize, ...(activePage.separations !== undefined
|
|
152
|
+
? { initialSeparations: activePage.separations }
|
|
153
|
+
: {}), onObjectsChange: (objects) => updateActivePage({ objects }), onPageSizeChange: (pageSize) => updateActivePage({ pageSize }), onBleedMmChange: (bleedMmValue) => updateActivePage({ bleedMm: bleedMmValue }), onSeparationsChange: (separations) => updateActivePage({ separations }), prependDrawerSections: pages.length > 1 || isMobile
|
|
119
154
|
? [
|
|
120
155
|
{
|
|
121
156
|
title: "Pages",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorApp.js","sourceRoot":"","sources":["../../src/components/EditorApp.tsx"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAmB,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"EditorApp.js","sourceRoot":"","sources":["../../src/components/EditorApp.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import type { EditorConfig } from "../lib/editor-config";
|
|
2
2
|
import type { PreflightReport } from "../lib/preflight/types";
|
|
3
|
-
|
|
3
|
+
import { type EditorSeparation } from "../lib/separations-registry";
|
|
4
|
+
type ObjType = "rect" | "ellipse" | "text" | "image" | "path";
|
|
5
|
+
/**
|
|
6
|
+
* One renderable object on the editor canvas.
|
|
7
|
+
*
|
|
8
|
+
* Intentionally a flat, structural shape (not the richer
|
|
9
|
+
* `@artworkpdf/document-model` `ArtworkObject`) — the published
|
|
10
|
+
* package stays consumable by hosts that don't pull in the
|
|
11
|
+
* document-model dep. The structural fields here mirror the
|
|
12
|
+
* `JobSubmitRequest` payload sent to `apps/service`.
|
|
13
|
+
*
|
|
14
|
+
* `name` falls back to `type` when absent; `locked` makes the object
|
|
15
|
+
* non-interactive (used for the dieline trim rect so users can't
|
|
16
|
+
* drag the trim out of position).
|
|
17
|
+
*
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
4
20
|
export type CanvasObj = {
|
|
5
21
|
id: string;
|
|
6
22
|
type: ObjType;
|
|
@@ -54,6 +70,19 @@ type Props = {
|
|
|
54
70
|
}) => void;
|
|
55
71
|
/** Fired whenever the bleed value changes (drawer input or URL prop sync). */
|
|
56
72
|
onBleedMmChange?: (bleedMm: number) => void;
|
|
73
|
+
/** AI4: initial spots registered on this page. Threads through to
|
|
74
|
+
* compile-pdf's `separationsOverride` at export time.
|
|
75
|
+
*
|
|
76
|
+
* **Seed-only semantic:** like `initialObjects` and
|
|
77
|
+
* `initialPageSize`, this prop is read once at mount. EditorApp's
|
|
78
|
+
* multi-page wrapper re-mounts EditorCanvas on each page switch
|
|
79
|
+
* (via `key={activePage.id}`), so the per-page seed flows
|
|
80
|
+
* naturally. Hosts that mutate this prop on the live component
|
|
81
|
+
* without changing the `key` will not see the change reflected. */
|
|
82
|
+
initialSeparations?: EditorSeparation[];
|
|
83
|
+
/** Fired whenever the spot registry changes (register/unregister via
|
|
84
|
+
* the fill/stroke pickers' "as spot" affordance). */
|
|
85
|
+
onSeparationsChange?: (separations: EditorSeparation[]) => void;
|
|
57
86
|
/** Extra collapsible sections added to the *top* of the mobile drawer
|
|
58
87
|
* (used by `EditorApp` to insert the `PageNavigator` stack when the
|
|
59
88
|
* document is multi-page). */
|
|
@@ -63,6 +92,6 @@ type Props = {
|
|
|
63
92
|
defaultOpen?: boolean;
|
|
64
93
|
}>;
|
|
65
94
|
};
|
|
66
|
-
export declare function EditorCanvas({ file, report, demo, initialObjects, initialPageSize, mode, onModeChange, config, bleedMm: bleedMmProp, isMobile, menuOpen, onMenuOpenChange, onObjectsChange, onPageSizeChange, onBleedMmChange, prependDrawerSections, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
95
|
+
export declare function EditorCanvas({ file, report, demo, initialObjects, initialPageSize, mode, onModeChange, config, bleedMm: bleedMmProp, isMobile, menuOpen, onMenuOpenChange, onObjectsChange, onPageSizeChange, onBleedMmChange, initialSeparations, onSeparationsChange, prependDrawerSections, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
67
96
|
export {};
|
|
68
97
|
//# sourceMappingURL=EditorCanvas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorCanvas.d.ts","sourceRoot":"","sources":["../../src/components/EditorCanvas.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EditorCanvas.d.ts","sourceRoot":"","sources":["../../src/components/EditorCanvas.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,15 @@
|
|
|
3
3
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
4
4
|
import { PDFDocument } from "pdf-lib";
|
|
5
5
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
6
|
-
import { Ellipse, Image as KonvaImage, Layer, Line, Rect, Stage, Text, Transformer, } from "react-konva";
|
|
6
|
+
import { Ellipse, Image as KonvaImage, Layer, Line, Path, Rect, Stage, Text, Transformer, } from "react-konva";
|
|
7
7
|
import { DEFAULT_BLEED_MM, formatBleed } from "../lib/bleed";
|
|
8
8
|
import { templateToInitialState } from "../lib/dieline-template";
|
|
9
9
|
import { DielineLibraryModal } from "./DielineLibraryModal";
|
|
10
|
+
import { HistoryPanel } from "./HistoryPanel";
|
|
10
11
|
import { LayersPanel } from "./LayersPanel";
|
|
12
|
+
import { TacOverlay } from "./TacOverlay";
|
|
13
|
+
import { isPanelVisible, showFeature } from "../lib/editor-config";
|
|
14
|
+
import { findSpotByColor, registerSpot, } from "../lib/separations-registry";
|
|
11
15
|
import { MobileToolDrawer } from "./MobileToolDrawer";
|
|
12
16
|
// ── constants ─────────────────────────────────────────────────────────────────
|
|
13
17
|
const SERVICE_URL = (process.env.NEXT_PUBLIC_SERVICE_URL ?? "http://localhost:3001").replace(/\/$/, "");
|
|
@@ -73,10 +77,24 @@ function ObjNode({ obj, selected, onSelect, onDragEnd, onTransformEnd, onDblClic
|
|
|
73
77
|
if (obj.type === "image" && obj.imageEl) {
|
|
74
78
|
return (_jsx(KonvaImage, { ...sharedProps, image: obj.imageEl, width: obj.width, height: obj.height, stroke: selected ? BRAND : obj.stroke, strokeWidth: selected ? 1 : obj.strokeWidth }));
|
|
75
79
|
}
|
|
80
|
+
if (obj.type === "path" && obj.pathData) {
|
|
81
|
+
// Konva.Path renders the SVG `d` string directly. Used by S2 for
|
|
82
|
+
// imported CF2/DDES/ARD dieline paths (cut/crease/perf/bleed lines
|
|
83
|
+
// emitted by `dielineToPage`); the locked flag keeps users from
|
|
84
|
+
// dragging the structural reference geometry.
|
|
85
|
+
//
|
|
86
|
+
// Stroke is NOT overridden when selected — dieline paths encode
|
|
87
|
+
// cut/crease/perf/bleed semantics via stroke color (per
|
|
88
|
+
// DIELINE_PATH_STROKES); masking that with BRAND on selection
|
|
89
|
+
// would hide the structural information. In practice the locked
|
|
90
|
+
// flag means these can't be selected anyway, but keep the
|
|
91
|
+
// semantic stroke in case a future feature unlocks them.
|
|
92
|
+
return (_jsx(Path, { ...sharedProps, data: obj.pathData, stroke: obj.stroke, strokeWidth: obj.strokeWidth, fill: obj.fill === "transparent" ? "" : obj.fill }));
|
|
93
|
+
}
|
|
76
94
|
return null;
|
|
77
95
|
}
|
|
78
96
|
// ── main component ─────────────────────────────────────────────────────────────
|
|
79
|
-
export function EditorCanvas({ file, report, demo = false, initialObjects, initialPageSize, mode = "basic", onModeChange, config, bleedMm: bleedMmProp = DEFAULT_BLEED_MM, isMobile = false, menuOpen = false, onMenuOpenChange, onObjectsChange, onPageSizeChange, onBleedMmChange, prependDrawerSections = [], }) {
|
|
97
|
+
export function EditorCanvas({ file, report, demo = false, initialObjects, initialPageSize, mode = "basic", onModeChange, config, bleedMm: bleedMmProp = DEFAULT_BLEED_MM, isMobile = false, menuOpen = false, onMenuOpenChange, onObjectsChange, onPageSizeChange, onBleedMmChange, initialSeparations, onSeparationsChange, prependDrawerSections = [], }) {
|
|
80
98
|
const containerRef = useRef(null);
|
|
81
99
|
const stageRef = useRef(null);
|
|
82
100
|
const trRef = useRef(null);
|
|
@@ -89,6 +107,14 @@ export function EditorCanvas({ file, report, demo = false, initialObjects, initi
|
|
|
89
107
|
const [objects, setObjects] = useState(initialObjects ?? []);
|
|
90
108
|
const [history, setHistory] = useState([initialObjects ?? []]);
|
|
91
109
|
const [historyIdx, setHistoryIdx] = useState(0);
|
|
110
|
+
// AI4 spot registry — per-page; threaded into JobSubmitRequest's
|
|
111
|
+
// separationsOverride at export time. Pure local state; parent
|
|
112
|
+
// (EditorApp) round-trips via onSeparationsChange.
|
|
113
|
+
const [separations, setSeparationsState] = useState(initialSeparations ?? []);
|
|
114
|
+
function updateSeparations(next) {
|
|
115
|
+
setSeparationsState(next);
|
|
116
|
+
onSeparationsChange?.(next);
|
|
117
|
+
}
|
|
92
118
|
const [selectedId, setSelectedId] = useState(null);
|
|
93
119
|
const [tool, setTool] = useState("select");
|
|
94
120
|
const [drawing, setDrawing] = useState(null);
|
|
@@ -208,23 +234,40 @@ export function EditorCanvas({ file, report, demo = false, initialObjects, initi
|
|
|
208
234
|
}
|
|
209
235
|
}, [selectedId]);
|
|
210
236
|
// ── history helpers ─────────────────────────────────────────────────────────
|
|
237
|
+
// Maximum snapshots kept in the undo stack. Prevents unbounded
|
|
238
|
+
// memory growth in long-running editor sessions; X2's HistoryPanel
|
|
239
|
+
// (`packages/editor-app/src/components/HistoryPanel.tsx`) reads the
|
|
240
|
+
// capped stack so the rendered row count stays bounded too.
|
|
241
|
+
const HISTORY_MAX = 100;
|
|
211
242
|
function commit(next) {
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
|
|
243
|
+
const truncated = history.slice(0, historyIdx + 1).concat([next]);
|
|
244
|
+
// Drop oldest entries when over the cap. The cursor lands on the
|
|
245
|
+
// last entry (newest) because we just committed it.
|
|
246
|
+
const capped = truncated.length > HISTORY_MAX
|
|
247
|
+
? truncated.slice(truncated.length - HISTORY_MAX)
|
|
248
|
+
: truncated;
|
|
249
|
+
setHistory(capped);
|
|
250
|
+
setHistoryIdx(capped.length - 1);
|
|
215
251
|
setObjects(next);
|
|
216
252
|
}
|
|
253
|
+
function seekHistory(idx) {
|
|
254
|
+
const clamped = Math.max(0, Math.min(history.length - 1, idx));
|
|
255
|
+
const snapshot = history[clamped] ?? [];
|
|
256
|
+
setHistoryIdx(clamped);
|
|
257
|
+
setObjects(snapshot);
|
|
258
|
+
// Preserve selection only if the selected object still exists in
|
|
259
|
+
// the target snapshot — otherwise the selection points at a
|
|
260
|
+
// deleted id (e.g. undoing an "add"). Single consistent rule for
|
|
261
|
+
// all three history-navigation paths (seek / undo / redo).
|
|
262
|
+
if (selectedId && !snapshot.some((o) => o.id === selectedId)) {
|
|
263
|
+
setSelectedId(null);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
217
266
|
function undo() {
|
|
218
|
-
|
|
219
|
-
setHistoryIdx(idx);
|
|
220
|
-
setObjects(history[idx] ?? []);
|
|
221
|
-
setSelectedId(null);
|
|
267
|
+
seekHistory(historyIdx - 1);
|
|
222
268
|
}
|
|
223
269
|
function redo() {
|
|
224
|
-
|
|
225
|
-
setHistoryIdx(idx);
|
|
226
|
-
setObjects(history[idx] ?? []);
|
|
227
|
-
setSelectedId(null);
|
|
270
|
+
seekHistory(historyIdx + 1);
|
|
228
271
|
}
|
|
229
272
|
// ── keyboard shortcuts ──────────────────────────────────────────────────────
|
|
230
273
|
// biome-ignore lint/correctness/useExhaustiveDependencies: commit/undo/redo capture history via closure
|
|
@@ -531,6 +574,20 @@ export function EditorCanvas({ file, report, demo = false, initialObjects, initi
|
|
|
531
574
|
document: doc,
|
|
532
575
|
output: { format: "pdf-x4" },
|
|
533
576
|
...(report ? { preflightReport: report } : {}),
|
|
577
|
+
// AI4: thread the page's registered spots through as
|
|
578
|
+
// separationsOverride. Strip the editor-only `hex` field on
|
|
579
|
+
// the wire — compile-pdf's Separation shape doesn't carry it
|
|
580
|
+
// (the hex is the editor's lookup key, not a wire field). The
|
|
581
|
+
// remaining fields (name/colorSpace/pantone/lab/type) match
|
|
582
|
+
// document-model's Separation structurally.
|
|
583
|
+
...(separations.length > 0
|
|
584
|
+
? {
|
|
585
|
+
separationsOverride: separations.map((s) => {
|
|
586
|
+
const { hex: _hex, ...wire } = s;
|
|
587
|
+
return wire;
|
|
588
|
+
}),
|
|
589
|
+
}
|
|
590
|
+
: {}),
|
|
534
591
|
};
|
|
535
592
|
try {
|
|
536
593
|
const res = await fetch(`${SERVICE_URL}/jobs`, {
|
|
@@ -671,7 +728,31 @@ export function EditorCanvas({ file, report, demo = false, initialObjects, initi
|
|
|
671
728
|
padding: 0,
|
|
672
729
|
background: "none",
|
|
673
730
|
cursor: "pointer",
|
|
674
|
-
} })] }),
|
|
731
|
+
} })] }), (() => {
|
|
732
|
+
const existing = findSpotByColor(separations, fillColor);
|
|
733
|
+
if (existing) {
|
|
734
|
+
return (_jsxs("span", { title: `Registered as ${existing.name}`, style: {
|
|
735
|
+
fontSize: "0.72rem",
|
|
736
|
+
color: BRAND,
|
|
737
|
+
padding: "0 0.35rem",
|
|
738
|
+
}, children: ["\u2713 ", existing.name] }));
|
|
739
|
+
}
|
|
740
|
+
return (_jsx("button", { type: "button", onClick: () => {
|
|
741
|
+
const name = window.prompt(`Register ${fillColor} as a spot ink. Name:`);
|
|
742
|
+
if (name?.trim()) {
|
|
743
|
+
updateSeparations(registerSpot(separations, fillColor, name.trim()));
|
|
744
|
+
}
|
|
745
|
+
}, title: "Register this color as a spot ink", style: {
|
|
746
|
+
fontSize: "0.7rem",
|
|
747
|
+
color: MUTED,
|
|
748
|
+
background: "transparent",
|
|
749
|
+
border: `1px solid ${BORDER}`,
|
|
750
|
+
borderRadius: 3,
|
|
751
|
+
padding: "0.15rem 0.35rem",
|
|
752
|
+
cursor: "pointer",
|
|
753
|
+
fontFamily: "inherit",
|
|
754
|
+
}, children: "+ spot" }));
|
|
755
|
+
})(), _jsxs("label", { style: {
|
|
675
756
|
display: "flex",
|
|
676
757
|
alignItems: "center",
|
|
677
758
|
gap: "0.3rem",
|
|
@@ -709,14 +790,14 @@ export function EditorCanvas({ file, report, demo = false, initialObjects, initi
|
|
|
709
790
|
}, onToggleVisible: toggleVisible })), _jsxs("div", { ref: containerRef, style: { flex: 1, overflow: "hidden", position: "relative" }, children: [_jsx(Stage, { ref: stageRef, width: containerSize.width, height: containerSize.height, scaleX: zoom, scaleY: zoom, x: stagePos.x, y: stagePos.y, onMouseDown: onStagePointerDown, onMouseMove: onStagePointerMove, onMouseUp: onStagePointerUp, onTouchStart: onStagePointerDown, onTouchMove: onStagePointerMove, onTouchEnd: onStagePointerUp, onWheel: onWheel, style: { cursor }, children: _jsxs(Layer, { children: [_jsx(Rect, { x: 3, y: 3, width: pageSize.width, height: pageSize.height, fill: "rgba(0,0,0,0.08)" }), _jsx(Rect, { x: 0, y: 0, width: pageSize.width, height: pageSize.height, fill: "#ffffff", stroke: "#d4d4d8", strokeWidth: 0.5 / zoom, onClick: () => {
|
|
710
791
|
if (tool === "select")
|
|
711
792
|
setSelectedId(null);
|
|
712
|
-
} }), config.enable_canvas_grid && _jsx(GridLines, { pageSize: pageSize, zoom: zoom }), config.enable_bleed_visualization && (_jsxs(_Fragment, { children: [_jsx(Rect, { x: 0, y: 0, width: pageSize.width, height: pageSize.height, stroke: "#0ea5e9", strokeWidth: 1 / zoom, dash: [6 / zoom, 4 / zoom], listening: false }), _jsx(Text, { text: `BLEED ${formatBleed(bleedMm, "in")}`, x: 6, y: -14 / zoom, fontSize: 10 / zoom, fill: "#0ea5e9", listening: false })] })), visibleObjects.map((obj) => (_jsx(ObjNode, { obj: obj, selected: obj.id === selectedId, onSelect: () => setSelectedId(obj.id), onDragEnd: (x, y) => commit(objects.map((o) => (o.id === obj.id ? { ...o, x, y } : o))), onTransformEnd: (x, y, w, h) => commit(objects.map((o) => o.id === obj.id ? { ...o, x, y, width: w, height: h } : o)), onDblClick: (e) => obj.type === "text" && onTextDblClick(obj.id, e) }, obj.id))), _jsx(Transformer, { ref: trRef, borderStroke: BRAND, borderStrokeWidth: 1, anchorStroke: BRAND, anchorFill: "#fff", anchorSize: 8, rotateEnabled: false, keepRatio: false }), drawing && tool !== "select" && (_jsx(Rect, { x: drawing.w < 0 ? drawing.x + drawing.w : drawing.x, y: drawing.h < 0 ? drawing.y + drawing.h : drawing.y, width: Math.abs(drawing.w), height: Math.abs(drawing.h), fill: tool === "text" ? "rgba(252,81,2,0.08)" : `${fillColor}80`, stroke: BRAND, strokeWidth: 1 / zoom, dash: [4 / zoom, 4 / zoom] }))] }) }), objects.length === 0 && (_jsx("div", { style: {
|
|
793
|
+
} }), config.enable_canvas_grid && _jsx(GridLines, { pageSize: pageSize, zoom: zoom }), config.enable_bleed_visualization && (_jsxs(_Fragment, { children: [_jsx(Rect, { x: 0, y: 0, width: pageSize.width, height: pageSize.height, stroke: "#0ea5e9", strokeWidth: 1 / zoom, dash: [6 / zoom, 4 / zoom], listening: false }), _jsx(Text, { text: `BLEED ${formatBleed(bleedMm, "in")}`, x: 6, y: -14 / zoom, fontSize: 10 / zoom, fill: "#0ea5e9", listening: false })] })), visibleObjects.map((obj) => (_jsx(ObjNode, { obj: obj, selected: obj.id === selectedId, onSelect: () => setSelectedId(obj.id), onDragEnd: (x, y) => commit(objects.map((o) => (o.id === obj.id ? { ...o, x, y } : o))), onTransformEnd: (x, y, w, h) => commit(objects.map((o) => o.id === obj.id ? { ...o, x, y, width: w, height: h } : o)), onDblClick: (e) => obj.type === "text" && onTextDblClick(obj.id, e) }, obj.id))), _jsx(Transformer, { ref: trRef, borderStroke: BRAND, borderStrokeWidth: 1, anchorStroke: BRAND, anchorFill: "#fff", anchorSize: 8, rotateEnabled: false, keepRatio: false }), drawing && tool !== "select" && (_jsx(Rect, { x: drawing.w < 0 ? drawing.x + drawing.w : drawing.x, y: drawing.h < 0 ? drawing.y + drawing.h : drawing.y, width: Math.abs(drawing.w), height: Math.abs(drawing.h), fill: tool === "text" ? "rgba(252,81,2,0.08)" : `${fillColor}80`, stroke: BRAND, strokeWidth: 1 / zoom, dash: [4 / zoom, 4 / zoom] }))] }) }), showFeature(config, "total_ink_coverage_live") && (_jsx(TacOverlay, { stage: stageRef.current, width: containerSize.width, height: containerSize.height, trigger: objects })), objects.length === 0 && (_jsx("div", { style: {
|
|
713
794
|
position: "absolute",
|
|
714
795
|
inset: 0,
|
|
715
796
|
display: "flex",
|
|
716
797
|
alignItems: "center",
|
|
717
798
|
justifyContent: "center",
|
|
718
799
|
pointerEvents: "none",
|
|
719
|
-
}, children: _jsx("span", { style: { fontSize: "0.8rem", color: "#94a3b8" }, children: "Use the toolbar to draw shapes, add text, or import an image" }) }))] })] }), selected && (_jsxs("div", { style: {
|
|
800
|
+
}, children: _jsx("span", { style: { fontSize: "0.8rem", color: "#94a3b8" }, children: "Use the toolbar to draw shapes, add text, or import an image" }) }))] }), !isMobile && isPanelVisible(config, "history") && (_jsx(HistoryPanel, { cursor: historyIdx, objectCounts: history.map((snap) => snap.length), onSelect: seekHistory }))] }), selected && (_jsxs("div", { style: {
|
|
720
801
|
display: "flex",
|
|
721
802
|
alignItems: "center",
|
|
722
803
|
gap: "1rem",
|