@printwithsynergy/artwork-pdf-editor 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +63 -2
  2. package/dist/components/EditorApp.d.ts +23 -4
  3. package/dist/components/EditorApp.d.ts.map +1 -1
  4. package/dist/components/EditorApp.js +72 -2
  5. package/dist/components/EditorApp.js.map +1 -1
  6. package/dist/components/EditorCanvas.d.ts +21 -1
  7. package/dist/components/EditorCanvas.d.ts.map +1 -1
  8. package/dist/components/EditorCanvas.js +22 -34
  9. package/dist/components/EditorCanvas.js.map +1 -1
  10. package/dist/components/PageNavigator.d.ts +26 -0
  11. package/dist/components/PageNavigator.d.ts.map +1 -0
  12. package/dist/components/PageNavigator.js +91 -0
  13. package/dist/components/PageNavigator.js.map +1 -0
  14. package/dist/data/dielines.json +35 -0
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +1 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/lens/dieline-overlay.d.ts +25 -0
  20. package/dist/lens/dieline-overlay.d.ts.map +1 -0
  21. package/dist/lens/dieline-overlay.js +50 -0
  22. package/dist/lens/dieline-overlay.js.map +1 -0
  23. package/dist/lens/index.d.ts +27 -0
  24. package/dist/lens/index.d.ts.map +1 -0
  25. package/dist/lens/index.js +28 -0
  26. package/dist/lens/index.js.map +1 -0
  27. package/dist/lens/preflight-findings.d.ts +21 -0
  28. package/dist/lens/preflight-findings.d.ts.map +1 -0
  29. package/dist/lens/preflight-findings.js +82 -0
  30. package/dist/lens/preflight-findings.js.map +1 -0
  31. package/dist/lib/dieline-template.d.ts +82 -0
  32. package/dist/lib/dieline-template.d.ts.map +1 -1
  33. package/dist/lib/dieline-template.js +66 -1
  34. package/dist/lib/dieline-template.js.map +1 -1
  35. package/dist/lib/editor-config.d.ts +0 -1
  36. package/dist/lib/editor-config.d.ts.map +1 -1
  37. package/dist/lib/editor-config.js +0 -2
  38. package/dist/lib/editor-config.js.map +1 -1
  39. package/package.json +11 -2
@@ -0,0 +1,26 @@
1
+ import type { Page } from "../lib/dieline-template";
2
+ /**
3
+ * Multi-page navigation strip. Lives:
4
+ * • in the desktop toolbar (thin horizontal row)
5
+ * • in the mobile drawer's "Pages" section (full-width buttons)
6
+ *
7
+ * Stays purely presentational — receives the current pages array +
8
+ * active index + change callbacks from `EditorApp`. No state of its
9
+ * own.
10
+ *
11
+ * @public
12
+ */
13
+ export type PageNavigatorProps = {
14
+ pages: Page[];
15
+ currentPageIndex: number;
16
+ onSelect: (index: number) => void;
17
+ /** Append a duplicate of the current page. */
18
+ onAddPage?: () => void;
19
+ /** Remove the active page (disabled when only one remains). */
20
+ onDeletePage?: () => void;
21
+ /** Layout variant. `"strip"` is the thin desktop row; `"stack"` is the
22
+ * full-width vertical list in the mobile drawer. */
23
+ variant?: "strip" | "stack";
24
+ };
25
+ export declare function PageNavigator({ pages, currentPageIndex, onSelect, onAddPage, onDeletePage, variant, }: PageNavigatorProps): import("react/jsx-runtime").JSX.Element;
26
+ //# sourceMappingURL=PageNavigator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageNavigator.d.ts","sourceRoot":"","sources":["../../src/components/PageNavigator.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;yDACqD;IACrD,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC7B,CAAC;AAQF,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAiB,GAClB,EAAE,kBAAkB,2CAsLpB"}
@@ -0,0 +1,91 @@
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
+ const BG = "#120a04";
5
+ const PANEL_BG = "#1a0f08";
6
+ const BORDER = "#3d1a00";
7
+ const BRAND = "#fc5102";
8
+ const MUTED = "#888";
9
+ export function PageNavigator({ pages, currentPageIndex, onSelect, onAddPage, onDeletePage, variant = "strip", }) {
10
+ const canDelete = pages.length > 1 && onDeletePage !== undefined;
11
+ if (variant === "stack") {
12
+ return (_jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "0.2rem", padding: "0.4rem 0.65rem" }, children: [_jsx("div", { role: "tablist", "aria-label": "Pages", "aria-orientation": "vertical", style: { display: "flex", flexDirection: "column", gap: "0.2rem" }, children: pages.map((p, i) => {
13
+ const active = i === currentPageIndex;
14
+ return (_jsxs("button", { type: "button", role: "tab", "aria-selected": active, "aria-label": `Page ${i + 1}${p.name ? `: ${p.name}` : ""}`, onClick: () => onSelect(i), style: {
15
+ display: "flex",
16
+ alignItems: "center",
17
+ gap: "0.55rem",
18
+ padding: "0.45rem 0.6rem",
19
+ background: active ? "#241308" : "transparent",
20
+ border: `1px solid ${active ? BRAND : "transparent"}`,
21
+ borderRadius: 4,
22
+ color: active ? BRAND : "#ddd",
23
+ cursor: "pointer",
24
+ fontFamily: "inherit",
25
+ fontSize: "0.82rem",
26
+ textAlign: "left",
27
+ }, children: [_jsx("span", { "aria-hidden": true, style: { fontFamily: "monospace", color: MUTED, fontSize: "0.7rem" }, children: i + 1 }), _jsx("span", { style: { flex: 1 }, children: p.name ?? `Page ${i + 1}` }), active && (_jsx("span", { "aria-hidden": true, style: { color: BRAND }, children: "\u25CF" }))] }, p.id));
28
+ }) }), (onAddPage || canDelete) && (_jsxs("div", { style: { display: "flex", gap: "0.4rem", marginTop: "0.4rem" }, children: [onAddPage && (_jsx("button", { type: "button", onClick: onAddPage, style: stackActionStyle, "aria-label": "Add page", children: "+ Add page" })), canDelete && (_jsx("button", { type: "button", onClick: onDeletePage, style: { ...stackActionStyle, color: "#e57373", borderColor: "#5a1a1a" }, "aria-label": "Delete current page", children: "\u2715 Delete" }))] }))] }));
29
+ }
30
+ // strip — thin desktop row
31
+ return (_jsxs("div", { role: "tablist", "aria-label": "Pages", "aria-orientation": "horizontal", style: {
32
+ display: "flex",
33
+ alignItems: "center",
34
+ gap: "0.3rem",
35
+ padding: "0.25rem 0.6rem",
36
+ background: PANEL_BG,
37
+ borderBottom: `1px solid ${BORDER}`,
38
+ flexShrink: 0,
39
+ flexWrap: "wrap",
40
+ }, children: [_jsx("span", { "aria-hidden": true, style: {
41
+ fontSize: "0.7rem",
42
+ color: MUTED,
43
+ letterSpacing: "0.08em",
44
+ textTransform: "uppercase",
45
+ fontWeight: 600,
46
+ marginRight: "0.4rem",
47
+ }, children: "Pages" }), pages.map((p, i) => {
48
+ const active = i === currentPageIndex;
49
+ return (_jsxs("button", { type: "button", role: "tab", "aria-selected": active, "aria-label": `Page ${i + 1}${p.name ? `: ${p.name}` : ""}`, onClick: () => onSelect(i), title: p.name ?? `Page ${i + 1}`, style: {
50
+ background: active ? BRAND : "transparent",
51
+ color: active ? "#fff" : "#ccc",
52
+ border: `1px solid ${active ? BRAND : BORDER}`,
53
+ borderRadius: 4,
54
+ padding: "0.18rem 0.55rem",
55
+ fontSize: "0.75rem",
56
+ cursor: "pointer",
57
+ fontFamily: "inherit",
58
+ }, children: [i + 1, p.name ? (_jsx("span", { style: { marginLeft: "0.35rem", color: active ? "#fff" : MUTED }, children: p.name })) : null] }, p.id));
59
+ }), onAddPage && (_jsx("button", { type: "button", onClick: onAddPage, title: "Add page", style: {
60
+ background: "transparent",
61
+ color: MUTED,
62
+ border: `1px dashed ${BORDER}`,
63
+ borderRadius: 4,
64
+ padding: "0.18rem 0.55rem",
65
+ fontSize: "0.75rem",
66
+ cursor: "pointer",
67
+ fontFamily: "inherit",
68
+ marginLeft: "0.2rem",
69
+ }, children: "+" })), canDelete && (_jsx("button", { type: "button", onClick: onDeletePage, title: "Delete current page", style: {
70
+ background: "transparent",
71
+ color: "#e57373",
72
+ border: "1px solid #5a1a1a",
73
+ borderRadius: 4,
74
+ padding: "0.18rem 0.5rem",
75
+ fontSize: "0.7rem",
76
+ cursor: "pointer",
77
+ fontFamily: "inherit",
78
+ }, children: "\u2715" }))] }));
79
+ }
80
+ const stackActionStyle = {
81
+ flex: 1,
82
+ background: BG,
83
+ color: MUTED,
84
+ border: `1px solid ${BORDER}`,
85
+ borderRadius: 4,
86
+ padding: "0.35rem 0.5rem",
87
+ fontSize: "0.75rem",
88
+ cursor: "pointer",
89
+ fontFamily: "inherit",
90
+ };
91
+ //# sourceMappingURL=PageNavigator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageNavigator.js","sourceRoot":"","sources":["../../src/components/PageNavigator.tsx"],"names":[],"mappings":"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"}
@@ -182,5 +182,40 @@
182
182
  "previewSvg": "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 54.8 80.2'><rect x='2' y='2' width='50.8' height='76.2' fill='none' stroke='#333' stroke-width='0.5' rx='3'/><line x1='2' y1='12' x2='52.8' y2='12' stroke='#666' stroke-width='0.3'/><text x='27.4' y='47' text-anchor='middle' font-size='6' fill='#666'>Sachet</text><text x='27.4' y='56' text-anchor='middle' font-size='4' fill='#999'>2×3″</text></svg>",
183
183
  "tags": ["sachet", "single-serve", "condiment", "sample", "hotel"]
184
184
  }
185
+ ],
186
+ "templateSets": [
187
+ {
188
+ "id": "carton-6x4x2-set",
189
+ "name": "Carton 6×4×2 (front + back)",
190
+ "description": "Two-sided dieline for a 6×4×2 straight-tuck carton. Front and back share the same trim.",
191
+ "category": "carton-set",
192
+ "pages": [
193
+ { "templateId": "carton-6x4x2", "name": "Front" },
194
+ { "templateId": "carton-6x4x2", "name": "Back" }
195
+ ],
196
+ "tags": ["carton", "box", "multi-page", "front-back"]
197
+ },
198
+ {
199
+ "id": "carton-8x6x3-set",
200
+ "name": "Carton 8×6×3 (front + back)",
201
+ "description": "Two-sided dieline for an 8×6×3 straight-tuck carton.",
202
+ "category": "carton-set",
203
+ "pages": [
204
+ { "templateId": "carton-8x6x3", "name": "Front" },
205
+ { "templateId": "carton-8x6x3", "name": "Back" }
206
+ ],
207
+ "tags": ["carton", "box", "multi-page", "front-back"]
208
+ },
209
+ {
210
+ "id": "standup-pouch-4x6-set",
211
+ "name": "Stand-Up Pouch 4×6 (front + back)",
212
+ "description": "Two-sided dieline for a 4×6 stand-up pouch — front graphic + back panel.",
213
+ "category": "pouch-set",
214
+ "pages": [
215
+ { "templateId": "standup-pouch-4x6", "name": "Front" },
216
+ { "templateId": "standup-pouch-4x6", "name": "Back" }
217
+ ],
218
+ "tags": ["pouch", "stand-up", "multi-page", "front-back"]
219
+ }
185
220
  ]
186
221
  }
package/dist/index.d.ts CHANGED
@@ -18,6 +18,6 @@ export { MobileToolDrawer, type MobileToolDrawerProps } from "./components/Mobil
18
18
  export { useIsMobile } from "./hooks/useIsMobile";
19
19
  export { type EditorMode, useEditorMode } from "./hooks/useEditorMode";
20
20
  export { type EditorConfig, DEFAULT_EDITOR_CONFIG, BASIC_MODE_OVERRIDES, PRO_MODE_OVERRIDES, resolveConfig, } from "./lib/editor-config";
21
- export { type DielineTemplate, TEMPLATES, getDefaultTemplate, getTemplateById, templateToInitialState, } from "./lib/dieline-template";
21
+ export { type DielineTemplate, type Page, type TemplateSet, TEMPLATES, TEMPLATE_SETS, getDefaultTemplate, getTemplateById, getTemplateSetById, templateToInitialState, templateToPage, templatesToPages, templateSetToPages, } from "./lib/dieline-template";
22
22
  export { DEFAULT_BLEED_MM, parseBleed, formatBleed } from "./lib/bleed";
23
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EACL,KAAK,YAAY,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,eAAe,EACpB,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EACL,KAAK,YAAY,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -18,6 +18,6 @@ export { MobileToolDrawer } from "./components/MobileToolDrawer";
18
18
  export { useIsMobile } from "./hooks/useIsMobile";
19
19
  export { useEditorMode } from "./hooks/useEditorMode";
20
20
  export { DEFAULT_EDITOR_CONFIG, BASIC_MODE_OVERRIDES, PRO_MODE_OVERRIDES, resolveConfig, } from "./lib/editor-config";
21
- export { TEMPLATES, getDefaultTemplate, getTemplateById, templateToInitialState, } from "./lib/dieline-template";
21
+ export { TEMPLATES, TEMPLATE_SETS, getDefaultTemplate, getTemplateById, getTemplateSetById, templateToInitialState, templateToPage, templatesToPages, templateSetToPages, } from "./lib/dieline-template";
22
22
  export { DEFAULT_BLEED_MM, parseBleed, formatBleed } from "./lib/bleed";
23
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAuB,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAuC,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAA8B,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAmB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAEL,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAuB,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAuC,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAA8B,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAmB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAEL,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIL,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { OverlayPlugin } from "@printwithsynergy/lens-pdf";
2
+ import type { DielineTemplate } from "../lib/dieline-template";
3
+ /**
4
+ * Build a lens-pdf overlay plugin that renders the dieline trim + bleed
5
+ * lines over a rendered PDF. Mount via `register()` or pass into
6
+ * `<LensPDF plugins={...}>`.
7
+ *
8
+ * `pages` maps 1-indexed PDF page numbers to the dieline template +
9
+ * effective bleed used to render that page. The same artwork-pdf
10
+ * dieline-template helpers used during editing produce the values to
11
+ * pass here.
12
+ *
13
+ * @public
14
+ */
15
+ export declare function dielineOverlayPlugin(opts: {
16
+ pages: Record<number, {
17
+ template: DielineTemplate;
18
+ bleedMm: number;
19
+ }>;
20
+ /** Override the trim-line color. Defaults to artwork-pdf brand orange. */
21
+ trimColor?: string;
22
+ /** Override the bleed-line color. Defaults to lens-pdf cyan. */
23
+ bleedColor?: string;
24
+ }): OverlayPlugin;
25
+ //# sourceMappingURL=dieline-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dieline-overlay.d.ts","sourceRoot":"","sources":["../../src/lens/dieline-overlay.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAM/D;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,aAAa,CA+DhB"}
@@ -0,0 +1,50 @@
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
+ const MM_TO_PT = 2.83465;
5
+ const DIELINE_STROKE = "#fc5102";
6
+ const BLEED_STROKE = "#0ea5e9";
7
+ /**
8
+ * Build a lens-pdf overlay plugin that renders the dieline trim + bleed
9
+ * lines over a rendered PDF. Mount via `register()` or pass into
10
+ * `<LensPDF plugins={...}>`.
11
+ *
12
+ * `pages` maps 1-indexed PDF page numbers to the dieline template +
13
+ * effective bleed used to render that page. The same artwork-pdf
14
+ * dieline-template helpers used during editing produce the values to
15
+ * pass here.
16
+ *
17
+ * @public
18
+ */
19
+ export function dielineOverlayPlugin(opts) {
20
+ return {
21
+ id: "artworkpdf.overlay.dieline",
22
+ version: "1.0.0",
23
+ slot: "overlay.canvas",
24
+ mount(ctx) {
25
+ const entry = opts.pages[ctx.page];
26
+ if (!entry)
27
+ return null;
28
+ const { template, bleedMm } = entry;
29
+ const pageDims = ctx.document.pageDimensions[ctx.page - 1];
30
+ if (!pageDims)
31
+ return null;
32
+ const trimColor = opts.trimColor ?? DIELINE_STROKE;
33
+ const bleedColor = opts.bleedColor ?? BLEED_STROKE;
34
+ // Page = trim + 2 × bleed. Convert to PDF points using PDF dims.
35
+ // PDF point origin is bottom-left; lens-pdf overlay coordinates
36
+ // are top-left (CSS-style), so we mirror y to match.
37
+ const pageWidthPt = pageDims.width;
38
+ const pageHeightPt = pageDims.height;
39
+ const bleedPt = bleedMm * MM_TO_PT;
40
+ const trimWidthPt = template.trimBox.width * MM_TO_PT;
41
+ const trimHeightPt = template.trimBox.height * MM_TO_PT;
42
+ return (_jsxs("svg", { width: "100%", height: "100%", viewBox: `0 0 ${pageWidthPt} ${pageHeightPt}`, preserveAspectRatio: "none", style: {
43
+ position: "absolute",
44
+ inset: 0,
45
+ pointerEvents: "none",
46
+ }, "aria-hidden": true, children: [_jsx("title", { children: "Dieline overlay" }), _jsx("rect", { x: 0, y: 0, width: pageWidthPt, height: pageHeightPt, fill: "none", stroke: bleedColor, strokeWidth: 1, strokeDasharray: "6 4" }), _jsx("rect", { x: bleedPt, y: bleedPt, width: trimWidthPt, height: trimHeightPt, fill: "none", stroke: trimColor, strokeWidth: 1 })] }));
47
+ },
48
+ };
49
+ }
50
+ //# sourceMappingURL=dieline-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dieline-overlay.js","sourceRoot":"","sources":["../../src/lens/dieline-overlay.tsx"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AAIb,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,cAAc,GAAG,SAAS,CAAC;AACjC,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAMpC;IACC,OAAO;QACL,EAAE,EAAE,4BAA4B;QAChC,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,gBAAgB;QACtB,KAAK,CAAC,GAAkB;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YACxB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;YACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC;YAEnD,iEAAiE;YACjE,gEAAgE;YAChE,qDAAqD;YACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC;YACnC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;YACrC,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;YACnC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;YAExD,OAAO,CACL,eACE,KAAK,EAAC,MAAM,EACZ,MAAM,EAAC,MAAM,EACb,OAAO,EAAE,OAAO,WAAW,IAAI,YAAY,EAAE,EAC7C,mBAAmB,EAAC,MAAM,EAC1B,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,KAAK,EAAE,CAAC;oBACR,aAAa,EAAE,MAAM;iBACtB,kCAGD,8CAA8B,EAE9B,eACE,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,CAAC,EACd,eAAe,EAAC,KAAK,GACrB,EAEF,eACE,CAAC,EAAE,OAAO,EACV,CAAC,EAAE,OAAO,EACV,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,CAAC,GACd,IACE,CACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * artwork-pdf plugins for `@printwithsynergy/lens-pdf`.
3
+ *
4
+ * Use this subpath only when you also have `lens-pdf` installed.
5
+ * Hosts that mount the editor without lens-pdf don't need this.
6
+ *
7
+ * Quick start:
8
+ *
9
+ * ```tsx
10
+ * import { LensPDF } from "@printwithsynergy/lens-pdf";
11
+ * import { dielineOverlayPlugin, preflightFindingsPlugin }
12
+ * from "@printwithsynergy/artwork-pdf-editor/lens";
13
+ *
14
+ * <LensPDF
15
+ * pdfUrl={blobUrl}
16
+ * plugins={[
17
+ * dielineOverlayPlugin({ pages: { 1: { template: tpl, bleedMm: 3.175 } } }),
18
+ * preflightFindingsPlugin({ report }),
19
+ * ]}
20
+ * />
21
+ * ```
22
+ *
23
+ * @packageDocumentation
24
+ */
25
+ export { dielineOverlayPlugin } from "./dieline-overlay";
26
+ export { preflightFindingsPlugin } from "./preflight-findings";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lens/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,28 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ /**
3
+ * artwork-pdf plugins for `@printwithsynergy/lens-pdf`.
4
+ *
5
+ * Use this subpath only when you also have `lens-pdf` installed.
6
+ * Hosts that mount the editor without lens-pdf don't need this.
7
+ *
8
+ * Quick start:
9
+ *
10
+ * ```tsx
11
+ * import { LensPDF } from "@printwithsynergy/lens-pdf";
12
+ * import { dielineOverlayPlugin, preflightFindingsPlugin }
13
+ * from "@printwithsynergy/artwork-pdf-editor/lens";
14
+ *
15
+ * <LensPDF
16
+ * pdfUrl={blobUrl}
17
+ * plugins={[
18
+ * dielineOverlayPlugin({ pages: { 1: { template: tpl, bleedMm: 3.175 } } }),
19
+ * preflightFindingsPlugin({ report }),
20
+ * ]}
21
+ * />
22
+ * ```
23
+ *
24
+ * @packageDocumentation
25
+ */
26
+ export { dielineOverlayPlugin } from "./dieline-overlay";
27
+ export { preflightFindingsPlugin } from "./preflight-findings";
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lens/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { PanelPlugin } from "@printwithsynergy/lens-pdf";
2
+ import type { PreflightReport } from "../lib/preflight/types";
3
+ /**
4
+ * Build a lens-pdf panel plugin that surfaces an artwork-pdf
5
+ * `PreflightReport` in the right-hand panel. Reuses the same preflight
6
+ * types the editor's pre-render PreflightPanel consumed.
7
+ *
8
+ * Pass the latest report when registering (or via a closure that re-reads
9
+ * a host store). Each issue renders as a clickable row; in this first
10
+ * pass we just list them — wiring to canvas-highlight (an OverlayItem
11
+ * round-trip) comes in a follow-up.
12
+ *
13
+ * @public
14
+ */
15
+ export declare function preflightFindingsPlugin(opts: {
16
+ /** The artwork-pdf preflight report to display. */
17
+ report: PreflightReport | null;
18
+ /** Optional click handler. Receives the issue + 1-indexed page. */
19
+ onIssueClick?: (issue: PreflightReport["issues"][number]) => void;
20
+ }): PanelPlugin;
21
+ //# sourceMappingURL=preflight-findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight-findings.d.ts","sourceRoot":"","sources":["../../src/lens/preflight-findings.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,4BAA4B,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAO9D;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,mDAAmD;IACnD,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,mEAAmE;IACnE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CACnE,GAAG,WAAW,CA8Hd"}
@@ -0,0 +1,82 @@
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
+ const PANEL_BG = "#1a0f08";
5
+ const BORDER = "#3d1a00";
6
+ const BRAND = "#fc5102";
7
+ const MUTED = "#888";
8
+ /**
9
+ * Build a lens-pdf panel plugin that surfaces an artwork-pdf
10
+ * `PreflightReport` in the right-hand panel. Reuses the same preflight
11
+ * types the editor's pre-render PreflightPanel consumed.
12
+ *
13
+ * Pass the latest report when registering (or via a closure that re-reads
14
+ * a host store). Each issue renders as a clickable row; in this first
15
+ * pass we just list them — wiring to canvas-highlight (an OverlayItem
16
+ * round-trip) comes in a follow-up.
17
+ *
18
+ * @public
19
+ */
20
+ export function preflightFindingsPlugin(opts) {
21
+ return {
22
+ id: "artworkpdf.panel.preflight",
23
+ version: "1.0.0",
24
+ slot: "panel.right",
25
+ title: "Preflight",
26
+ order: 10,
27
+ mount(_ctx) {
28
+ const report = opts.report;
29
+ if (!report) {
30
+ return (_jsx("div", { style: {
31
+ padding: "0.75rem",
32
+ fontSize: "0.78rem",
33
+ color: MUTED,
34
+ background: PANEL_BG,
35
+ height: "100%",
36
+ }, children: "No preflight report attached to this document." }));
37
+ }
38
+ return (_jsxs("div", { style: {
39
+ background: PANEL_BG,
40
+ color: "#ddd",
41
+ height: "100%",
42
+ display: "flex",
43
+ flexDirection: "column",
44
+ fontSize: "0.8rem",
45
+ }, children: [_jsxs("header", { style: {
46
+ padding: "0.5rem 0.75rem",
47
+ borderBottom: `1px solid ${BORDER}`,
48
+ display: "flex",
49
+ alignItems: "center",
50
+ gap: "0.5rem",
51
+ }, children: [_jsx("span", { style: {
52
+ width: 8,
53
+ height: 8,
54
+ borderRadius: 4,
55
+ background: report.passed ? "#2e7d32" : "#b71c1c",
56
+ }, "aria-hidden": true }), _jsx("span", { style: { fontWeight: 600 }, children: report.passed ? "Passed" : "Issues found" }), _jsxs("span", { style: { marginLeft: "auto", color: MUTED, fontSize: "0.7rem" }, children: [report.issues.length, " issue", report.issues.length === 1 ? "" : "s"] })] }), _jsxs("ul", { style: {
57
+ flex: 1,
58
+ overflowY: "auto",
59
+ listStyle: "none",
60
+ margin: 0,
61
+ padding: 0,
62
+ }, children: [report.issues.length === 0 && (_jsx("li", { style: { padding: "0.75rem", color: MUTED }, children: "No issues." })), report.issues.map((issue, i) => (_jsx("li", { style: { borderBottom: `1px solid ${BORDER}` }, children: _jsxs("button", { type: "button", onClick: () => opts.onIssueClick?.(issue), style: {
63
+ width: "100%",
64
+ background: "transparent",
65
+ border: "none",
66
+ padding: "0.55rem 0.75rem",
67
+ textAlign: "left",
68
+ color: "#ddd",
69
+ cursor: opts.onIssueClick ? "pointer" : "default",
70
+ fontFamily: "inherit",
71
+ fontSize: "0.78rem",
72
+ }, children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [_jsx("span", { style: {
73
+ fontSize: "0.6rem",
74
+ letterSpacing: "0.08em",
75
+ textTransform: "uppercase",
76
+ color: issue.severity === "block" ? "#ef5350" : "#ffb74d",
77
+ fontWeight: 600,
78
+ }, children: issue.severity }), _jsx("span", { style: { color: BRAND, fontSize: "0.7rem", fontFamily: "monospace" }, children: issue.checkName }), issue.page !== undefined && (_jsxs("span", { style: { marginLeft: "auto", color: MUTED, fontSize: "0.7rem" }, children: ["p.", issue.page] }))] }), _jsx("div", { style: { marginTop: "0.2rem", lineHeight: 1.4 }, children: issue.message })] }) }, `${issue.checkName}-${i}`)))] })] }));
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=preflight-findings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight-findings.js","sourceRoot":"","sources":["../../src/lens/preflight-findings.tsx"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AAIb,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,MAAM,GAAG,SAAS,CAAC;AACzB,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,KAAK,GAAG,MAAM,CAAC;AAErB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAKvC;IACC,OAAO;QACL,EAAE,EAAE,4BAA4B;QAChC,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,EAAE;QACT,KAAK,CAAC,IAAmB;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CACL,cACE,KAAK,EAAE;wBACL,OAAO,EAAE,SAAS;wBAClB,QAAQ,EAAE,SAAS;wBACnB,KAAK,EAAE,KAAK;wBACZ,UAAU,EAAE,QAAQ;wBACpB,MAAM,EAAE,MAAM;qBACf,+DAGG,CACP,CAAC;YACJ,CAAC;YAED,OAAO,CACL,eACE,KAAK,EAAE;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,MAAM;oBACf,aAAa,EAAE,QAAQ;oBACvB,QAAQ,EAAE,QAAQ;iBACnB,aAED,kBACE,KAAK,EAAE;4BACL,OAAO,EAAE,gBAAgB;4BACzB,YAAY,EAAE,aAAa,MAAM,EAAE;4BACnC,OAAO,EAAE,MAAM;4BACf,UAAU,EAAE,QAAQ;4BACpB,GAAG,EAAE,QAAQ;yBACd,aAED,eACE,KAAK,EAAE;oCACL,KAAK,EAAE,CAAC;oCACR,MAAM,EAAE,CAAC;oCACT,YAAY,EAAE,CAAC;oCACf,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;iCAClD,wBAED,EACF,eAAM,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,YAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,GACrC,EACP,gBAAM,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAClE,MAAM,CAAC,MAAM,CAAC,MAAM,YAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAC7D,IACA,EAET,cACE,KAAK,EAAE;4BACL,IAAI,EAAE,CAAC;4BACP,SAAS,EAAE,MAAM;4BACjB,SAAS,EAAE,MAAM;4BACjB,MAAM,EAAE,CAAC;4BACT,OAAO,EAAE,CAAC;yBACX,aAEA,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAC7B,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,2BAAiB,CACjE,EACA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/B,aAEE,KAAK,EAAE,EAAE,YAAY,EAAE,aAAa,MAAM,EAAE,EAAE,YAE9C,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,EACzC,KAAK,EAAE;wCACL,KAAK,EAAE,MAAM;wCACb,UAAU,EAAE,aAAa;wCACzB,MAAM,EAAE,MAAM;wCACd,OAAO,EAAE,iBAAiB;wCAC1B,SAAS,EAAE,MAAM;wCACjB,KAAK,EAAE,MAAM;wCACb,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;wCACjD,UAAU,EAAE,SAAS;wCACrB,QAAQ,EAAE,SAAS;qCACpB,aAED,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,aAClE,eACE,KAAK,EAAE;wDACL,QAAQ,EAAE,QAAQ;wDAClB,aAAa,EAAE,QAAQ;wDACvB,aAAa,EAAE,WAAW;wDAC1B,KAAK,EAAE,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;wDACzD,UAAU,EAAE,GAAG;qDAChB,YAEA,KAAK,CAAC,QAAQ,GACV,EACP,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,YACvE,KAAK,CAAC,SAAS,GACX,EACN,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAC3B,gBAAM,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAChE,KAAK,CAAC,IAAI,IACR,CACR,IACG,EACN,cAAK,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,YACjD,KAAK,CAAC,OAAO,GACV,IACC,IA1CJ,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,CA2C3B,CACN,CAAC,IACC,IACD,CACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -25,9 +25,91 @@ export type DielineTemplate = {
25
25
  * rather than being lumped in with artwork spot inks. */
26
26
  export declare const DIELINE_STROKE = "#fc5102";
27
27
  export declare const DIELINE_NAME = "Die Line";
28
+ /**
29
+ * A multi-page dieline set — an ordered list of {@link DielineTemplate}
30
+ * ids that compose a single multi-page artwork document (e.g. a carton's
31
+ * front + back, or pouch front + back).
32
+ *
33
+ * @public
34
+ */
35
+ export type TemplateSet = {
36
+ id: string;
37
+ name: string;
38
+ description: string;
39
+ category: string;
40
+ pages: Array<{
41
+ templateId: string;
42
+ name?: string;
43
+ }>;
44
+ tags: string[];
45
+ isDefault?: boolean;
46
+ };
28
47
  export declare const TEMPLATES: DielineTemplate[];
48
+ /**
49
+ * Bundled multi-page template sets (e.g. carton front + back). Empty if
50
+ * the library has none.
51
+ *
52
+ * @public
53
+ */
54
+ export declare const TEMPLATE_SETS: TemplateSet[];
29
55
  export declare function getDefaultTemplate(): DielineTemplate;
30
56
  export declare function getTemplateById(id: string | undefined): DielineTemplate | undefined;
57
+ /**
58
+ * Lookup a multi-page template set by id (e.g. `"carton-6x4x2-set"`).
59
+ * Returns `undefined` for unknown / missing.
60
+ *
61
+ * @public
62
+ */
63
+ export declare function getTemplateSetById(id: string | undefined): TemplateSet | undefined;
64
+ /**
65
+ * Expand a {@link TemplateSet} into an ordered list of {@link Page}s.
66
+ * Each set entry resolves to its `DielineTemplate`; unknown ids are
67
+ * skipped (so callers always get a non-throwing result they can fall
68
+ * back from).
69
+ *
70
+ * @public
71
+ */
72
+ export declare function templateSetToPages(set: TemplateSet, bleedMmOverride?: number): Page[];
73
+ /**
74
+ * One page of a multi-page artwork document. Carries the dieline rect
75
+ * + any user-drawn objects, plus the per-page geometry (pageSize, bleed).
76
+ * Used as the array element of {@link EditorAppProps.initialPages}.
77
+ *
78
+ * @public
79
+ */
80
+ export type Page = {
81
+ /** Stable id (e.g. `uuid()` or ``page-${i}``) — used as a React key. */
82
+ id: string;
83
+ objects: CanvasObj[];
84
+ pageSize: {
85
+ width: number;
86
+ height: number;
87
+ };
88
+ bleedMm: number;
89
+ /** Source template id, when this page was seeded from a known dieline. */
90
+ templateId?: string;
91
+ /** Human label shown in the page navigator (e.g. "Front", "Back"). */
92
+ name?: string;
93
+ };
94
+ /**
95
+ * Build a {@link Page} from a {@link DielineTemplate}. Mirrors the
96
+ * single-page {@link templateToInitialState} output but in the new
97
+ * multi-page shape. Use this to seed `EditorAppProps.initialPages`.
98
+ *
99
+ * @public
100
+ */
101
+ export declare function templateToPage(template: DielineTemplate, bleedMmOverride?: number, name?: string): Page;
102
+ /**
103
+ * Build a list of {@link Page}s from an ordered set of templates +
104
+ * per-page names. Convenience for multi-page document sets (e.g. a
105
+ * carton's front / back / spine).
106
+ *
107
+ * @public
108
+ */
109
+ export declare function templatesToPages(entries: ReadonlyArray<{
110
+ template: DielineTemplate;
111
+ name?: string;
112
+ }>, bleedMmOverride?: number): Page[];
31
113
  export declare function templateToInitialState(template: DielineTemplate, bleedMmOverride?: number): {
32
114
  objects: CanvasObj[];
33
115
  pageSize: {
@@ -1 +1 @@
1
- {"version":3,"file":"dieline-template.d.ts","sourceRoot":"","sources":["../../src/lib/dieline-template.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAIF;;0DAE0D;AAC1D,eAAO,MAAM,cAAc,YAAY,CAAC;AACxC,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC,eAAO,MAAM,SAAS,EAAE,eAAe,EAA4D,CAAC;AAEpG,wBAAgB,kBAAkB,IAAI,eAAe,CAMpD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAGnF;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EACzB,eAAe,CAAC,EAAE,MAAM,GACvB;IACD,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,CAyBA"}
1
+ {"version":3,"file":"dieline-template.d.ts","sourceRoot":"","sources":["../../src/lib/dieline-template.ts"],"names":[],"mappings":"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"}