@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.
- package/README.md +63 -2
- package/dist/components/EditorApp.d.ts +23 -4
- package/dist/components/EditorApp.d.ts.map +1 -1
- package/dist/components/EditorApp.js +72 -2
- package/dist/components/EditorApp.js.map +1 -1
- package/dist/components/EditorCanvas.d.ts +21 -1
- package/dist/components/EditorCanvas.d.ts.map +1 -1
- package/dist/components/EditorCanvas.js +22 -34
- package/dist/components/EditorCanvas.js.map +1 -1
- package/dist/components/PageNavigator.d.ts +26 -0
- package/dist/components/PageNavigator.d.ts.map +1 -0
- package/dist/components/PageNavigator.js +91 -0
- package/dist/components/PageNavigator.js.map +1 -0
- package/dist/data/dielines.json +35 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- 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/dieline-template.d.ts +82 -0
- package/dist/lib/dieline-template.d.ts.map +1 -1
- package/dist/lib/dieline-template.js +66 -1
- package/dist/lib/dieline-template.js.map +1 -1
- package/dist/lib/editor-config.d.ts +0 -1
- package/dist/lib/editor-config.d.ts.map +1 -1
- package/dist/lib/editor-config.js +0 -2
- package/dist/lib/editor-config.js.map +1 -1
- package/package.json +11 -2
|
@@ -5,7 +5,15 @@ const MM_TO_PT = 2.83465;
|
|
|
5
5
|
* rather than being lumped in with artwork spot inks. */
|
|
6
6
|
export const DIELINE_STROKE = "#fc5102";
|
|
7
7
|
export const DIELINE_NAME = "Die Line";
|
|
8
|
-
|
|
8
|
+
const LIBRARY = library;
|
|
9
|
+
export const TEMPLATES = LIBRARY.templates;
|
|
10
|
+
/**
|
|
11
|
+
* Bundled multi-page template sets (e.g. carton front + back). Empty if
|
|
12
|
+
* the library has none.
|
|
13
|
+
*
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export const TEMPLATE_SETS = LIBRARY.templateSets ?? [];
|
|
9
17
|
export function getDefaultTemplate() {
|
|
10
18
|
const flagged = TEMPLATES.find((t) => t.isDefault);
|
|
11
19
|
if (flagged)
|
|
@@ -20,6 +28,63 @@ export function getTemplateById(id) {
|
|
|
20
28
|
return undefined;
|
|
21
29
|
return TEMPLATES.find((t) => t.id === id);
|
|
22
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Lookup a multi-page template set by id (e.g. `"carton-6x4x2-set"`).
|
|
33
|
+
* Returns `undefined` for unknown / missing.
|
|
34
|
+
*
|
|
35
|
+
* @public
|
|
36
|
+
*/
|
|
37
|
+
export function getTemplateSetById(id) {
|
|
38
|
+
if (!id)
|
|
39
|
+
return undefined;
|
|
40
|
+
return TEMPLATE_SETS.find((s) => s.id === id);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Expand a {@link TemplateSet} into an ordered list of {@link Page}s.
|
|
44
|
+
* Each set entry resolves to its `DielineTemplate`; unknown ids are
|
|
45
|
+
* skipped (so callers always get a non-throwing result they can fall
|
|
46
|
+
* back from).
|
|
47
|
+
*
|
|
48
|
+
* @public
|
|
49
|
+
*/
|
|
50
|
+
export function templateSetToPages(set, bleedMmOverride) {
|
|
51
|
+
return set.pages
|
|
52
|
+
.map(({ templateId, name }) => {
|
|
53
|
+
const tpl = getTemplateById(templateId);
|
|
54
|
+
return tpl ? templateToPage(tpl, bleedMmOverride, name) : null;
|
|
55
|
+
})
|
|
56
|
+
.filter((p) => p !== null);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a {@link Page} from a {@link DielineTemplate}. Mirrors the
|
|
60
|
+
* single-page {@link templateToInitialState} output but in the new
|
|
61
|
+
* multi-page shape. Use this to seed `EditorAppProps.initialPages`.
|
|
62
|
+
*
|
|
63
|
+
* @public
|
|
64
|
+
*/
|
|
65
|
+
export function templateToPage(template, bleedMmOverride, name) {
|
|
66
|
+
const { objects, pageSize } = templateToInitialState(template, bleedMmOverride);
|
|
67
|
+
const page = {
|
|
68
|
+
id: `page-${template.id}-${Math.random().toString(36).slice(2, 8)}`,
|
|
69
|
+
objects,
|
|
70
|
+
pageSize,
|
|
71
|
+
bleedMm: bleedMmOverride ?? template.bleedMm,
|
|
72
|
+
templateId: template.id,
|
|
73
|
+
};
|
|
74
|
+
if (name !== undefined)
|
|
75
|
+
page.name = name;
|
|
76
|
+
return page;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Build a list of {@link Page}s from an ordered set of templates +
|
|
80
|
+
* per-page names. Convenience for multi-page document sets (e.g. a
|
|
81
|
+
* carton's front / back / spine).
|
|
82
|
+
*
|
|
83
|
+
* @public
|
|
84
|
+
*/
|
|
85
|
+
export function templatesToPages(entries, bleedMmOverride) {
|
|
86
|
+
return entries.map(({ template, name }) => templateToPage(template, bleedMmOverride, name));
|
|
87
|
+
}
|
|
23
88
|
export function templateToInitialState(template, bleedMmOverride) {
|
|
24
89
|
const bleedMm = bleedMmOverride ?? template.bleedMm;
|
|
25
90
|
const pageSize = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dieline-template.js","sourceRoot":"","sources":["../../src/lib/dieline-template.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAe5C,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEzB;;0DAE0D;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"dieline-template.js","sourceRoot":"","sources":["../../src/lib/dieline-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,7 +32,6 @@ export interface EditorConfig {
|
|
|
32
32
|
enable_dieline_chooser: boolean;
|
|
33
33
|
enable_bleed_input: boolean;
|
|
34
34
|
enable_layers_panel: boolean;
|
|
35
|
-
enable_separations_panel: boolean;
|
|
36
35
|
enable_preflight_banner: boolean;
|
|
37
36
|
enable_canvas_grid: boolean;
|
|
38
37
|
enable_bleed_visualization: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-config.d.ts","sourceRoot":"","sources":["../../src/lib/editor-config.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAE3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAG3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAG5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,
|
|
1
|
+
{"version":3,"file":"editor-config.d.ts","sourceRoot":"","sources":["../../src/lib/editor-config.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAE3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAG3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAG5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uBAAuB,EAAE,OAAO,CAAC;IAGjC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,0BAA0B,EAAE,OAAO,CAAC;CACrC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,YA2BnC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,OAAO,CAAC,YAAY,CAGtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,YAAY,CAAM,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,OAAO,GAAG,KAAK,EACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GACxC,YAAY,CAGd"}
|
|
@@ -29,7 +29,6 @@ export const DEFAULT_EDITOR_CONFIG = {
|
|
|
29
29
|
enable_bleed_input: true,
|
|
30
30
|
// Panels
|
|
31
31
|
enable_layers_panel: true,
|
|
32
|
-
enable_separations_panel: true,
|
|
33
32
|
enable_preflight_banner: true,
|
|
34
33
|
// Canvas
|
|
35
34
|
enable_canvas_grid: true,
|
|
@@ -44,7 +43,6 @@ export const DEFAULT_EDITOR_CONFIG = {
|
|
|
44
43
|
*/
|
|
45
44
|
export const BASIC_MODE_OVERRIDES = {
|
|
46
45
|
enable_layers_panel: false,
|
|
47
|
-
enable_separations_panel: false,
|
|
48
46
|
enable_source_link: false,
|
|
49
47
|
};
|
|
50
48
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-config.js","sourceRoot":"","sources":["../../src/lib/editor-config.ts"],"names":[],"mappings":"AAAA,6CAA6C;
|
|
1
|
+
{"version":3,"file":"editor-config.js","sourceRoot":"","sources":["../../src/lib/editor-config.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAgD7C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,SAAS;IACT,iBAAiB,EAAE,IAAI;IACvB,oBAAoB,EAAE,IAAI;IAC1B,kBAAkB,EAAE,IAAI;IACxB,kBAAkB,EAAE,IAAI;IACxB,sBAAsB,EAAE,IAAI;IAC5B,iBAAiB,EAAE,IAAI;IACvB,UAAU;IACV,kBAAkB,EAAE,IAAI;IACxB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;IACzB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,qBAAqB,EAAE,IAAI;IAC3B,kBAAkB,EAAE,IAAI;IACxB,oBAAoB,EAAE,IAAI;IAC1B,sBAAsB,EAAE,IAAI;IAC5B,kBAAkB,EAAE,IAAI;IACxB,SAAS;IACT,mBAAmB,EAAE,IAAI;IACzB,uBAAuB,EAAE,IAAI;IAC7B,SAAS;IACT,kBAAkB,EAAE,IAAI;IACxB,0BAA0B,EAAE,IAAI;CACjC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA0B;IACzD,mBAAmB,EAAE,KAAK;IAC1B,kBAAkB,EAAE,KAAK;CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA0B,EAAE,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAqB,EACrB,iBAAyC;IAEzC,MAAM,aAAa,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACnF,OAAO,EAAE,GAAG,qBAAqB,EAAE,GAAG,aAAa,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC9E,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@printwithsynergy/artwork-pdf-editor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "artworkPDF WYSIWYG editor as a host-customizable React component. Drop-in mountable in Next.js, Astro, Remix, etc.",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"type": "module",
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
".": {
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./lens": {
|
|
15
|
+
"types": "./dist/lens/index.d.ts",
|
|
16
|
+
"import": "./dist/lens/index.js"
|
|
13
17
|
}
|
|
14
18
|
},
|
|
15
19
|
"files": ["dist", "README.md", "LICENSE"],
|
|
@@ -26,9 +30,14 @@
|
|
|
26
30
|
"react": "^19.0.0",
|
|
27
31
|
"react-dom": "^19.0.0",
|
|
28
32
|
"react-konva": "^19.0.0",
|
|
29
|
-
"konva": "^10.3.0"
|
|
33
|
+
"konva": "^10.3.0",
|
|
34
|
+
"@printwithsynergy/lens-pdf": "^0.4.0-beta.17"
|
|
35
|
+
},
|
|
36
|
+
"peerDependenciesMeta": {
|
|
37
|
+
"@printwithsynergy/lens-pdf": { "optional": true }
|
|
30
38
|
},
|
|
31
39
|
"devDependencies": {
|
|
40
|
+
"@printwithsynergy/lens-pdf": "^0.4.0-beta.17",
|
|
32
41
|
"@types/react": "^19.0.0",
|
|
33
42
|
"@types/react-dom": "^19.0.0",
|
|
34
43
|
"konva": "^10.3.0",
|