@printwithsynergy/artwork-pdf-editor 0.1.6 → 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/README.md +63 -2
- 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 +39 -5
- package/dist/components/EditorApp.d.ts.map +1 -1
- package/dist/components/EditorApp.js +110 -5
- package/dist/components/EditorApp.js.map +1 -1
- package/dist/components/EditorCanvas.d.ts +51 -2
- package/dist/components/EditorCanvas.d.ts.map +1 -1
- package/dist/components/EditorCanvas.js +117 -48
- 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 +26 -0
- package/dist/components/PageNavigator.d.ts.map +1 -0
- package/dist/components/PageNavigator.js +96 -0
- package/dist/components/PageNavigator.js.map +1 -0
- 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/data/dielines.json +35 -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/dieline-overlay.d.ts +25 -0
- package/dist/lens/dieline-overlay.d.ts.map +1 -0
- package/dist/lens/dieline-overlay.js +50 -0
- package/dist/lens/dieline-overlay.js.map +1 -0
- package/dist/lens/index.d.ts +27 -0
- package/dist/lens/index.d.ts.map +1 -0
- package/dist/lens/index.js +28 -0
- package/dist/lens/index.js.map +1 -0
- package/dist/lens/preflight-findings.d.ts +21 -0
- package/dist/lens/preflight-findings.d.ts.map +1 -0
- package/dist/lens/preflight-findings.js +82 -0
- package/dist/lens/preflight-findings.js.map +1 -0
- 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 +169 -0
- package/dist/lib/dieline-template.d.ts.map +1 -1
- package/dist/lib/dieline-template.js +229 -1
- package/dist/lib/dieline-template.js.map +1 -1
- package/dist/lib/editor-config.d.ts +384 -1
- package/dist/lib/editor-config.d.ts.map +1 -1
- package/dist/lib/editor-config.js +89 -2
- 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 +29 -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":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AAmGb;uCACuC;AACvC,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,0EAA0E;AAC1E,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB;;;;wEAIwE;AACxE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AA2CnC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CACzC,aAA0C,EAC1C,UAAgD,EAChD,MAAc;IAEd,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,kDAAkD;IAClD,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACpC,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACpC,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACpC,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACnE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACvE,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,oEAAoE;IACpE,2DAA2D;IAC3D,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAiC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1E,MAAM,GAAG,GAA+B;YACtC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK;YACxC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK;YACxC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK;YAC3B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK;SAC9B,CAAC;QACF,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAE,SAAS;YACvB,6DAA6D;YAC7D,4DAA4D;YAC5D,8DAA8D;YAC9D,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,UAAU;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACnB,CAA6B,EAC7B,CAA6B;IAE7B,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC7B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC7B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,iEAAiE;IACjE,IACE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,sBAAsB;QAC/C,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,sBAAsB,EAC/C,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IACD,8DAA8D;IAC9D,IACE,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,sBAAsB;QAChD,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,sBAAsB,EAChD,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IAClC,CAAC;IACD,iCAAiC;IACjC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;QACrB,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;QACtB,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;QACrB,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;KACvB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,aAAa,EACb,UAAU,EACV,UAAU,EACV,MAAM,GAAG,eAAe,EACxB,aAAa,GACO;IACpB,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAEvF,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,CACL,kCACc,iBAAiB,gBAClB,iBAAiB,EAC5B,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,aAE5B,iBAAQ,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAC1E,WAAW,GACL,EACT,6BACc,uBAAuB,EACnC,KAAK,EAAE;wBACL,KAAK,EAAE,MAAM;wBACb,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,MAAM;wBACf,UAAU,EAAE,QAAQ;wBACpB,cAAc,EAAE,QAAQ;wBACxB,MAAM,EAAE,iBAAiB;wBACzB,YAAY,EAAE,CAAC;wBACf,KAAK,EAAE,MAAM;wBACb,QAAQ,EAAE,SAAS;wBACnB,SAAS,EAAE,QAAQ;wBACnB,OAAO,EAAE,QAAQ;wBACjB,SAAS,EAAE,YAAY;qBACxB,kCAGG,IACE,CACX,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,2BAA2B,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE9E,OAAO,CACL,kCACc,iBAAiB,gBAClB,iBAAiB,EAC5B,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,aAE5B,iBAAQ,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAC1E,WAAW,GACL,EACT,8BACc,qBAAqB,EACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,MAAM,IAAI,MAAM,EAAE,EAClC,IAAI,EAAC,KAAK,gBACE,0BAA0B,MAAM,CAAC,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAC1G,KAAK,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,aAE1E,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBACvB,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC;wBACxC,OAAO,CACL,8BAEe,yBAAyB,CAAC,CAAC,EAAE,EAAE,EAC5C,CAAC,EAAE,CAAC,CAAC,CAAC,EACN,CAAC,EAAE,CAAC,CAAC,CAAC,EACN,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,MAAM,EAAE,CAAC,CAAC,MAAM,EAChB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EACnC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EACrC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAR1B,CAAC,CAAC,EAAE,CAST,CACH,CAAC;oBACJ,CAAC,CAAC,EACD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACxB,8BAEe,yBAAyB,CAAC,CAAC,EAAE,EAAE,EAC5C,EAAE,EAAE,CAAC,CAAC,EAAE,EACR,EAAE,EAAE,CAAC,CAAC,EAAE,EACR,EAAE,EAAE,CAAC,CAAC,EAAE,EACR,EAAE,EAAE,CAAC,CAAC,EAAE,EACR,MAAM,EAAE,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAC1D,WAAW,EAAE,GAAG,EAChB,eAAe,EAAE,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IARxD,CAAC,CAAC,EAAE,CAST,CACH,CAAC,IACE,IACE,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type EditorMode } from "../hooks/useEditorMode";
|
|
2
|
-
import { type
|
|
2
|
+
import { type Page } from "../lib/dieline-template";
|
|
3
|
+
import { type EditorConfig, type PaletteId } from "../lib/editor-config";
|
|
3
4
|
import { type CanvasObj } from "./EditorCanvas";
|
|
4
5
|
import { type TopBarProps } from "./TopBar";
|
|
5
6
|
type Phase = "upload" | "checking" | "preflight" | "editor";
|
|
@@ -16,22 +17,55 @@ export type EditorAppProps = {
|
|
|
16
17
|
demo?: boolean;
|
|
17
18
|
/** Starting phase. Set `"editor"` to skip the upload step. */
|
|
18
19
|
initialPhase?: Phase;
|
|
19
|
-
/** Seed objects for the canvas — typically from `templateToInitialState`.
|
|
20
|
+
/** Seed objects for the canvas — typically from `templateToInitialState`.
|
|
21
|
+
* Single-page convenience; for multi-page documents pass `initialPages`. */
|
|
20
22
|
initialObjects?: CanvasObj[];
|
|
21
|
-
/** Seed page size for the canvas — typically from `templateToInitialState`.
|
|
23
|
+
/** Seed page size for the canvas — typically from `templateToInitialState`.
|
|
24
|
+
* Single-page convenience; for multi-page documents pass `initialPages`. */
|
|
22
25
|
initialPageSize?: {
|
|
23
26
|
width: number;
|
|
24
27
|
height: number;
|
|
25
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Multi-page seed. Each entry is a {@link Page} with its own
|
|
31
|
+
* `objects`, `pageSize`, and `bleedMm`. Takes precedence over the
|
|
32
|
+
* single-page `initialObjects` / `initialPageSize` props when supplied.
|
|
33
|
+
*
|
|
34
|
+
* A `PageNavigator` strip renders above the canvas on desktop and a
|
|
35
|
+
* "Pages" section appears in the mobile drawer; users can switch
|
|
36
|
+
* between pages, add (duplicate) pages, and delete pages. Per-page
|
|
37
|
+
* state (objects, pageSize, bleedMm) is preserved across switches.
|
|
38
|
+
* Each page has its own undo history.
|
|
39
|
+
*
|
|
40
|
+
* Pair with `templatesToPages` / `templateSetToPages` helpers to seed
|
|
41
|
+
* known multi-page documents (e.g. carton front + back).
|
|
42
|
+
*/
|
|
43
|
+
initialPages?: Page[];
|
|
26
44
|
/** Initial mode preference. `"auto"` resolves by viewport. */
|
|
27
45
|
preferMode?: EditorMode | "auto";
|
|
28
46
|
/** Per-instance flag overrides. Merged into mode + global defaults. */
|
|
29
47
|
config?: Partial<EditorConfig>;
|
|
30
|
-
/** Bleed margin in millimetres. Defaults to {@link DEFAULT_BLEED_MM} (0.125 in).
|
|
48
|
+
/** Bleed margin in millimetres. Defaults to {@link DEFAULT_BLEED_MM} (0.125 in).
|
|
49
|
+
* Ignored when `initialPages` is supplied (each page carries its own bleed). */
|
|
31
50
|
bleedMm?: number;
|
|
32
51
|
/** Host-supplied top bar configuration (logo, extra CTAs, etc.). */
|
|
33
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;
|
|
34
68
|
};
|
|
35
|
-
export declare function EditorApp({ demo, initialPhase, initialObjects, initialPageSize, 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;
|
|
36
70
|
export {};
|
|
37
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,EAAE,KAAK,YAAY,
|
|
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,20 +6,94 @@ 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
12
|
import { FileDropZone } from "./FileDropZone";
|
|
13
|
+
import { PageNavigator } from "./PageNavigator";
|
|
12
14
|
import { PreflightPanel } from "./PreflightPanel";
|
|
13
15
|
import { TopBar } from "./TopBar";
|
|
14
|
-
export function EditorApp({ demo = false, initialPhase = "upload", initialObjects, initialPageSize, 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, }) {
|
|
17
|
+
// Multi-page seed wins over the single-page convenience props. We
|
|
18
|
+
// wrap legacy `initialObjects` / `initialPageSize` into a single-page
|
|
19
|
+
// array so the rest of EditorApp can treat everything as multi-page.
|
|
20
|
+
const seededPages = (() => {
|
|
21
|
+
if (initialPages && initialPages.length > 0)
|
|
22
|
+
return initialPages;
|
|
23
|
+
return [
|
|
24
|
+
{
|
|
25
|
+
id: "page-1",
|
|
26
|
+
objects: initialObjects ?? [],
|
|
27
|
+
pageSize: initialPageSize ?? { width: 595, height: 842 },
|
|
28
|
+
bleedMm,
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
})();
|
|
32
|
+
const [pages, setPages] = useState(seededPages);
|
|
33
|
+
const [currentPageIndex, setCurrentPageIndex] = useState(0);
|
|
34
|
+
const clampedPageIndex = Math.min(Math.max(currentPageIndex, 0), pages.length - 1);
|
|
35
|
+
// `pages` is seeded with at least one entry and `handleDeletePage`
|
|
36
|
+
// refuses to drop the last one, so `pages[clampedPageIndex]` is always
|
|
37
|
+
// defined. The non-null assertion makes the invariant explicit; a
|
|
38
|
+
// misuse would crash here instead of silently swapping back to the
|
|
39
|
+
// seeded default.
|
|
40
|
+
// biome-ignore lint/style/noNonNullAssertion: pages is non-empty by construction
|
|
41
|
+
const activePage = pages[clampedPageIndex];
|
|
42
|
+
function updateActivePage(patch) {
|
|
43
|
+
setPages((prev) => prev.map((p, i) => (i === clampedPageIndex ? { ...p, ...patch } : p)));
|
|
44
|
+
}
|
|
45
|
+
function handleAddPage() {
|
|
46
|
+
// Duplicate the active page; user can edit / pick a new dieline from there.
|
|
47
|
+
setPages((prev) => {
|
|
48
|
+
const src = prev[clampedPageIndex];
|
|
49
|
+
if (!src)
|
|
50
|
+
return prev;
|
|
51
|
+
const dup = {
|
|
52
|
+
...src,
|
|
53
|
+
id: `page-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`,
|
|
54
|
+
objects: src.objects.map((o) => ({ ...o })),
|
|
55
|
+
};
|
|
56
|
+
const next = [...prev];
|
|
57
|
+
next.splice(clampedPageIndex + 1, 0, dup);
|
|
58
|
+
return next;
|
|
59
|
+
});
|
|
60
|
+
setCurrentPageIndex((i) => i + 1);
|
|
61
|
+
}
|
|
62
|
+
function handleDeletePage() {
|
|
63
|
+
// Deleting the current page should keep the user on the *next* page
|
|
64
|
+
// (now at the same index in the shorter array). Only fall back to the
|
|
65
|
+
// previous page when the deleted one was the last in the list.
|
|
66
|
+
if (pages.length <= 1)
|
|
67
|
+
return;
|
|
68
|
+
const deletedIdx = clampedPageIndex;
|
|
69
|
+
const nextPages = pages.filter((_, i) => i !== deletedIdx);
|
|
70
|
+
setPages(nextPages);
|
|
71
|
+
setCurrentPageIndex(Math.min(deletedIdx, nextPages.length - 1));
|
|
72
|
+
}
|
|
15
73
|
const { mode, setMode } = useEditorMode(preferMode);
|
|
16
74
|
const [phase, setPhase] = useState(initialPhase);
|
|
17
75
|
const [file, setFile] = useState(null);
|
|
18
76
|
const [report, setReport] = useState(null);
|
|
19
77
|
const { state: preflightState, run: runPreflight } = usePreflight();
|
|
20
78
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
79
|
+
const [panelVisibility, setPanelVisibility] = useState(initialPanelVisibility ?? {});
|
|
21
80
|
const isMobile = useIsMobile();
|
|
22
|
-
|
|
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;
|
|
23
97
|
async function handleFile(f) {
|
|
24
98
|
setFile(f);
|
|
25
99
|
setPhase("checking");
|
|
@@ -32,6 +106,17 @@ export function EditorApp({ demo = false, initialPhase = "upload", initialObject
|
|
|
32
106
|
setPhase("upload");
|
|
33
107
|
}
|
|
34
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
|
+
}
|
|
35
120
|
function handleSendToLint() {
|
|
36
121
|
alert("Job queued for lint node analysis.");
|
|
37
122
|
}
|
|
@@ -47,13 +132,33 @@ export function EditorApp({ demo = false, initialPhase = "upload", initialObject
|
|
|
47
132
|
flexDirection: "column",
|
|
48
133
|
alignItems: "center",
|
|
49
134
|
gap: "1.25rem",
|
|
50
|
-
}, 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: {
|
|
51
136
|
fontSize: "0.85rem",
|
|
52
137
|
color: "#fc5102",
|
|
53
138
|
fontWeight: 600,
|
|
54
139
|
textDecoration: "none",
|
|
55
140
|
opacity: 0.85,
|
|
56
|
-
}, 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: {
|
|
147
|
+
display: "flex",
|
|
148
|
+
flexDirection: "column",
|
|
149
|
+
width: "100%",
|
|
150
|
+
height: "100%",
|
|
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
|
|
154
|
+
? [
|
|
155
|
+
{
|
|
156
|
+
title: "Pages",
|
|
157
|
+
defaultOpen: true,
|
|
158
|
+
content: (_jsx(PageNavigator, { pages: pages, currentPageIndex: currentPageIndex, onSelect: setCurrentPageIndex, onAddPage: handleAddPage, ...(pages.length > 1 ? { onDeletePage: handleDeletePage } : {}), variant: "stack" })),
|
|
159
|
+
},
|
|
160
|
+
]
|
|
161
|
+
: [] }, activePage.id)] }))] }), demo && phase !== "editor" && (_jsx("footer", { style: {
|
|
57
162
|
background: "#1a0f08",
|
|
58
163
|
borderTop: "1px solid #3d1a00",
|
|
59
164
|
padding: "0.5rem 1.25rem",
|
|
@@ -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;AAChD,OAAO,
|
|
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;
|
|
@@ -42,7 +58,40 @@ type Props = {
|
|
|
42
58
|
isMobile?: boolean;
|
|
43
59
|
menuOpen?: boolean;
|
|
44
60
|
onMenuOpenChange?: (open: boolean) => void;
|
|
61
|
+
/** Fired whenever the canvas's objects change (drawing, drag, transform,
|
|
62
|
+
* delete, undo/redo, applyDieline). Used by the multi-page wrapper to
|
|
63
|
+
* keep the parent's `pages` array in sync. */
|
|
64
|
+
onObjectsChange?: (objects: CanvasObj[]) => void;
|
|
65
|
+
/** Fired whenever the page size changes (template apply, bleed override,
|
|
66
|
+
* uploaded-PDF parse). */
|
|
67
|
+
onPageSizeChange?: (pageSize: {
|
|
68
|
+
width: number;
|
|
69
|
+
height: number;
|
|
70
|
+
}) => void;
|
|
71
|
+
/** Fired whenever the bleed value changes (drawer input or URL prop sync). */
|
|
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;
|
|
86
|
+
/** Extra collapsible sections added to the *top* of the mobile drawer
|
|
87
|
+
* (used by `EditorApp` to insert the `PageNavigator` stack when the
|
|
88
|
+
* document is multi-page). */
|
|
89
|
+
prependDrawerSections?: Array<{
|
|
90
|
+
title: string;
|
|
91
|
+
content: import("react").ReactNode;
|
|
92
|
+
defaultOpen?: boolean;
|
|
93
|
+
}>;
|
|
45
94
|
};
|
|
46
|
-
export declare function EditorCanvas({ file, report, demo, initialObjects, initialPageSize, mode, onModeChange, config, bleedMm: bleedMmProp, isMobile, menuOpen, onMenuOpenChange, }: 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;
|
|
47
96
|
export {};
|
|
48
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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"}
|