web-to-print 0.1.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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/app-globals-V2Kpy_OQ.js +5 -0
  3. package/dist/cjs/canvas-helpers-A6rp5rPD.js +765 -0
  4. package/dist/cjs/index-IFGFRm-i.js +1649 -0
  5. package/dist/cjs/index.cjs.js +232 -0
  6. package/dist/cjs/loader.cjs.js +13 -0
  7. package/dist/cjs/logo-BUX-b45R.js +18 -0
  8. package/dist/cjs/web-to-print.cjs.js +25 -0
  9. package/dist/cjs/wtp-editor_2.cjs.entry.js +12386 -0
  10. package/dist/cjs/wtp-logo-renderer.cjs.entry.js +353 -0
  11. package/dist/cjs/wtp-print-area-editor.cjs.entry.js +431 -0
  12. package/dist/collection/collection-manifest.json +16 -0
  13. package/dist/collection/components/wtp-editor/wtp-editor.css +124 -0
  14. package/dist/collection/components/wtp-editor/wtp-editor.js +1114 -0
  15. package/dist/collection/components/wtp-logo-renderer/wtp-logo-renderer.css +30 -0
  16. package/dist/collection/components/wtp-logo-renderer/wtp-logo-renderer.js +455 -0
  17. package/dist/collection/components/wtp-logo-upload/wtp-logo-upload.css +428 -0
  18. package/dist/collection/components/wtp-logo-upload/wtp-logo-upload.js +573 -0
  19. package/dist/collection/components/wtp-print-area-editor/wtp-print-area-editor.css +20 -0
  20. package/dist/collection/components/wtp-print-area-editor/wtp-print-area-editor.js +600 -0
  21. package/dist/collection/examples/schaeffler--big.svg +1 -0
  22. package/dist/collection/index.js +8 -0
  23. package/dist/collection/types/editor.js +1 -0
  24. package/dist/collection/types/index.js +2 -0
  25. package/dist/collection/types/labels.js +30 -0
  26. package/dist/collection/types/logo.js +13 -0
  27. package/dist/collection/utils/background-removal.js +717 -0
  28. package/dist/collection/utils/canvas-helpers.js +380 -0
  29. package/dist/collection/utils/format-detection.js +48 -0
  30. package/dist/collection/utils/html-render-helpers.js +106 -0
  31. package/dist/collection/utils/image-preview.js +54 -0
  32. package/dist/collection/utils/logo-validation.js +141 -0
  33. package/dist/collection/utils/pdf-export.js +224 -0
  34. package/dist/components/index.d.ts +35 -0
  35. package/dist/components/index.js +1 -0
  36. package/dist/components/p-5qCsRzlt.js +1 -0
  37. package/dist/components/p-Bn9gR_8e.js +1 -0
  38. package/dist/components/p-D8pVJRuX.js +1 -0
  39. package/dist/components/wtp-editor.d.ts +11 -0
  40. package/dist/components/wtp-editor.js +1 -0
  41. package/dist/components/wtp-logo-renderer.d.ts +11 -0
  42. package/dist/components/wtp-logo-renderer.js +1 -0
  43. package/dist/components/wtp-logo-upload.d.ts +11 -0
  44. package/dist/components/wtp-logo-upload.js +1 -0
  45. package/dist/components/wtp-print-area-editor.d.ts +11 -0
  46. package/dist/components/wtp-print-area-editor.js +1 -0
  47. package/dist/esm/app-globals-DQuL1Twl.js +3 -0
  48. package/dist/esm/canvas-helpers-CK8OAq2J.js +748 -0
  49. package/dist/esm/index-CUetmLbL.js +1641 -0
  50. package/dist/esm/index.js +228 -0
  51. package/dist/esm/loader.js +11 -0
  52. package/dist/esm/logo-D8pVJRuX.js +15 -0
  53. package/dist/esm/web-to-print.js +21 -0
  54. package/dist/esm/wtp-editor_2.entry.js +12383 -0
  55. package/dist/esm/wtp-logo-renderer.entry.js +351 -0
  56. package/dist/esm/wtp-print-area-editor.entry.js +429 -0
  57. package/dist/index.cjs.js +1 -0
  58. package/dist/index.js +1 -0
  59. package/dist/types/components/wtp-editor/wtp-editor.d.ts +101 -0
  60. package/dist/types/components/wtp-logo-renderer/wtp-logo-renderer.d.ts +55 -0
  61. package/dist/types/components/wtp-logo-upload/wtp-logo-upload.d.ts +76 -0
  62. package/dist/types/components/wtp-print-area-editor/wtp-print-area-editor.d.ts +43 -0
  63. package/dist/types/components.d.ts +507 -0
  64. package/dist/types/index.d.ts +11 -0
  65. package/dist/types/stencil-public-runtime.d.ts +1860 -0
  66. package/dist/types/types/editor.d.ts +79 -0
  67. package/dist/types/types/index.d.ts +5 -0
  68. package/dist/types/types/labels.d.ts +30 -0
  69. package/dist/types/types/logo.d.ts +47 -0
  70. package/dist/types/utils/background-removal.d.ts +95 -0
  71. package/dist/types/utils/canvas-helpers.d.ts +60 -0
  72. package/dist/types/utils/format-detection.d.ts +4 -0
  73. package/dist/types/utils/html-render-helpers.d.ts +44 -0
  74. package/dist/types/utils/image-preview.d.ts +13 -0
  75. package/dist/types/utils/logo-validation.d.ts +2 -0
  76. package/dist/types/utils/pdf-export.d.ts +32 -0
  77. package/dist/web-to-print/index.esm.js +1 -0
  78. package/dist/web-to-print/p-611ec561.entry.js +1 -0
  79. package/dist/web-to-print/p-703e4c52.entry.js +1 -0
  80. package/dist/web-to-print/p-CK8OAq2J.js +1 -0
  81. package/dist/web-to-print/p-CUetmLbL.js +2 -0
  82. package/dist/web-to-print/p-D8pVJRuX.js +1 -0
  83. package/dist/web-to-print/p-DQuL1Twl.js +1 -0
  84. package/dist/web-to-print/p-b532777b.entry.js +1 -0
  85. package/dist/web-to-print/web-to-print.esm.js +1 -0
  86. package/loader/cdn.js +1 -0
  87. package/loader/index.cjs.js +1 -0
  88. package/loader/index.d.ts +24 -0
  89. package/loader/index.es2017.js +1 -0
  90. package/loader/index.js +2 -0
  91. package/package.json +68 -0
  92. package/readme.md +490 -0
@@ -0,0 +1,228 @@
1
+ export { a as DEFAULT_BG_REMOVAL_CONFIG, D as DEFAULT_VALIDATION_CONFIG } from './logo-D8pVJRuX.js';
2
+ import { u as upscaleSvgDataUrl, p as printAreaToPixelCorners } from './canvas-helpers-CK8OAq2J.js';
3
+
4
+ const DEFAULT_PDF_CONFIG = {
5
+ pageFormat: 'a4',
6
+ orientation: 'portrait',
7
+ marginMm: 15,
8
+ showPrintAreaGuides: true,
9
+ title: 'Logo Print Specification',
10
+ };
11
+ /**
12
+ * Get the jsPDF constructor from the global scope.
13
+ * jsPDF must be loaded via script tag (e.g. from unpkg CDN) before calling exportProductPdf().
14
+ * This avoids bundling jsPDF into the Stencil build (which fails due to Rollup/CommonJS conflicts).
15
+ */
16
+ function getJsPDF() {
17
+ const global = typeof window !== 'undefined' ? window : undefined;
18
+ const jspdfModule = global?.['jspdf'];
19
+ if (jspdfModule?.jsPDF != null) {
20
+ return jspdfModule.jsPDF;
21
+ }
22
+ throw new Error('jsPDF is required for PDF export. Load it via: <script src="https://unpkg.com/jspdf@4.1.0/dist/jspdf.umd.min.js"></script>');
23
+ }
24
+ /** Detect image format from a data URL for jsPDF's addImage(). */
25
+ function dataUrlToImageFormat(dataUrl) {
26
+ if (dataUrl.startsWith('data:image/jpeg') || dataUrl.startsWith('data:image/jpg')) {
27
+ return 'JPEG';
28
+ }
29
+ return 'PNG';
30
+ }
31
+ /** Returns true if the data URL is an SVG (which jsPDF cannot embed directly). */
32
+ function isSvgDataUrl(dataUrl) {
33
+ return dataUrl.startsWith('data:image/svg+xml');
34
+ }
35
+ /**
36
+ * Rasterize a data URL to PNG via an offscreen canvas.
37
+ * SVG data URLs must be rasterized because jsPDF only supports PNG/JPEG.
38
+ * For SVGs, upscaleSvgDataUrl is applied first so the browser rasterizes
39
+ * the vector artwork at high resolution (maxSize px) instead of the often
40
+ * tiny intrinsic SVG dimensions.
41
+ * Non-SVG data URLs are returned unchanged.
42
+ */
43
+ function rasterizeDataUrl(dataUrl, maxSize = 4000) {
44
+ if (!isSvgDataUrl(dataUrl))
45
+ return Promise.resolve(dataUrl);
46
+ // Upscale SVG so the browser rasterizes vectors at high resolution
47
+ const { dataUrl: upscaledUrl } = upscaleSvgDataUrl(dataUrl, maxSize);
48
+ return new Promise((resolve, reject) => {
49
+ const img = new Image();
50
+ img.onload = () => {
51
+ const w = img.naturalWidth || maxSize;
52
+ const h = img.naturalHeight || maxSize;
53
+ const canvas = document.createElement('canvas');
54
+ canvas.width = w;
55
+ canvas.height = h;
56
+ const ctx = canvas.getContext('2d');
57
+ if (ctx == null) {
58
+ reject(new Error('Failed to get 2D context for SVG rasterization'));
59
+ return;
60
+ }
61
+ ctx.drawImage(img, 0, 0, w, h);
62
+ resolve(canvas.toDataURL('image/png'));
63
+ };
64
+ img.onerror = () => reject(new Error('Failed to load image for rasterization'));
65
+ img.src = upscaledUrl;
66
+ });
67
+ }
68
+ /** Merge partial config with defaults. */
69
+ function buildPdfConfig(partial) {
70
+ return { ...DEFAULT_PDF_CONFIG, ...partial };
71
+ }
72
+ /** Format a file size in bytes as a human-readable string. */
73
+ function formatFileSize(bytes) {
74
+ if (bytes < 1024)
75
+ return `${bytes} B`;
76
+ if (bytes < 1024 * 1024)
77
+ return `${(bytes / 1024).toFixed(1)} KB`;
78
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
79
+ }
80
+ /** Render page 1: logo at full quality with metadata table. */
81
+ function renderLogoPage(doc, logo, rasterLogoDataUrl, config) {
82
+ const pageW = doc.internal.pageSize.getWidth();
83
+ const pageH = doc.internal.pageSize.getHeight();
84
+ const margin = config.marginMm;
85
+ const contentW = pageW - 2 * margin;
86
+ // Title
87
+ doc.setFontSize(18);
88
+ doc.setFont('helvetica', 'bold');
89
+ doc.text(config.title, pageW / 2, margin + 8, { align: 'center' });
90
+ // Logo image — centered, filling available width while maintaining aspect ratio
91
+ const logoFormat = dataUrlToImageFormat(rasterLogoDataUrl);
92
+ const logoY = margin + 16;
93
+ const maxLogoH = pageH * 0.5;
94
+ const aspectRatio = logo.metadata.width / Math.max(logo.metadata.height, 1);
95
+ let imgW = contentW;
96
+ let imgH = imgW / aspectRatio;
97
+ if (imgH > maxLogoH) {
98
+ imgH = maxLogoH;
99
+ imgW = imgH * aspectRatio;
100
+ }
101
+ const imgX = (pageW - imgW) / 2;
102
+ doc.addImage(rasterLogoDataUrl, logoFormat, imgX, logoY, imgW, imgH);
103
+ // Metadata table below the logo
104
+ const tableY = logoY + imgH + 10;
105
+ const meta = logo.metadata;
106
+ const rows = [
107
+ ['Format', meta.format.toUpperCase()],
108
+ ['Dimensions', `${meta.width} x ${meta.height} px`],
109
+ ['DPI', meta.dpiX !== null ? `${meta.dpiX} x ${meta.dpiY ?? meta.dpiX}` : 'Not available'],
110
+ ['File Size', formatFileSize(meta.fileSize)],
111
+ ['Transparency', meta.hasTransparency ? 'Yes' : 'No'],
112
+ ['File Name', meta.fileName],
113
+ ];
114
+ doc.setFontSize(10);
115
+ const rowH = 7;
116
+ const col1W = 30;
117
+ rows.forEach((row, i) => {
118
+ const y = tableY + i * rowH;
119
+ doc.setFont('helvetica', 'bold');
120
+ doc.text(row[0], margin, y);
121
+ doc.setFont('helvetica', 'normal');
122
+ doc.text(row[1], margin + col1W, y);
123
+ });
124
+ // Separator line above the table
125
+ doc.setDrawColor(200, 200, 200);
126
+ doc.setLineWidth(0.3);
127
+ doc.line(margin, tableY - 4, margin + contentW, tableY - 4);
128
+ }
129
+ /** Draw dashed print area guide overlay on the product mockup. */
130
+ function drawPrintAreaGuide(doc, printArea, imgX, imgY, imgW, imgH, canvasW, canvasH) {
131
+ const corners = printAreaToPixelCorners(printArea, canvasW, canvasH);
132
+ const scaleX = imgW / canvasW;
133
+ const scaleY = imgH / canvasH;
134
+ const pdfCorners = corners.map(c => ({
135
+ x: imgX + c.x * scaleX,
136
+ y: imgY + c.y * scaleY,
137
+ }));
138
+ doc.setDrawColor(37, 99, 235);
139
+ doc.setLineWidth(0.4);
140
+ doc.setLineDashPattern([2, 1.5], 0);
141
+ for (let i = 0; i < 4; i++) {
142
+ const from = pdfCorners[i];
143
+ const to = pdfCorners[(i + 1) % 4];
144
+ doc.line(from.x, from.y, to.x, to.y);
145
+ }
146
+ doc.setLineDashPattern([], 0);
147
+ }
148
+ /** Render page 2: product mockup with header and print area guides. */
149
+ function renderProductPage(doc, article, viewIndex, mockupDataUrl, canvasW, canvasH, config) {
150
+ const pageW = doc.internal.pageSize.getWidth();
151
+ const pageH = doc.internal.pageSize.getHeight();
152
+ const margin = config.marginMm;
153
+ const contentW = pageW - 2 * margin;
154
+ doc.setFontSize(16);
155
+ doc.setFont('helvetica', 'bold');
156
+ doc.text(article.name, pageW / 2, margin + 8, { align: 'center' });
157
+ // Article details table
158
+ const view = article.views[viewIndex];
159
+ const detailRows = [['Article ID', article.id]];
160
+ if (view?.impMethod)
161
+ detailRows.push(['Print Method', view.impMethod]);
162
+ if (view?.impLocation)
163
+ detailRows.push(['Print Location', view.impLocation]);
164
+ if (view?.impDiameterMm && view.impDiameterMm > 0) {
165
+ detailRows.push(['Print Area', `\u00D8 ${view.impDiameterMm} mm`]);
166
+ }
167
+ else if (view?.impWidthMm && view?.impHeightMm) {
168
+ detailRows.push(['Print Area', `${view.impWidthMm} \u00D7 ${view.impHeightMm} mm`]);
169
+ }
170
+ if (view?.maxColours)
171
+ detailRows.push(['Max Colors', `${view.maxColours}`]);
172
+ const detailRowH = 6;
173
+ const detailCol1W = 30;
174
+ const detailTableY = margin + 16;
175
+ doc.setFontSize(9);
176
+ detailRows.forEach((row, i) => {
177
+ const y = detailTableY + i * detailRowH;
178
+ doc.setFont('helvetica', 'bold');
179
+ doc.text(row[0], margin, y);
180
+ doc.setFont('helvetica', 'normal');
181
+ doc.text(row[1], margin + detailCol1W, y);
182
+ });
183
+ doc.setDrawColor(200, 200, 200);
184
+ doc.setLineWidth(0.3);
185
+ doc.line(margin, detailTableY + detailRows.length * detailRowH + 2, margin + contentW, detailTableY + detailRows.length * detailRowH + 2);
186
+ const mockupFormat = dataUrlToImageFormat(mockupDataUrl);
187
+ const mockupY = detailTableY + detailRows.length * detailRowH + 6;
188
+ const maxMockupH = pageH - mockupY - margin;
189
+ const aspectRatio = canvasW / Math.max(canvasH, 1);
190
+ let imgW = contentW;
191
+ let imgH = imgW / aspectRatio;
192
+ if (imgH > maxMockupH) {
193
+ imgH = maxMockupH;
194
+ imgW = imgH * aspectRatio;
195
+ }
196
+ const imgX = (pageW - imgW) / 2;
197
+ doc.addImage(mockupDataUrl, mockupFormat, imgX, mockupY, imgW, imgH);
198
+ if (config.showPrintAreaGuides && view?.printArea != null) {
199
+ drawPrintAreaGuide(doc, view.printArea, imgX, mockupY, imgW, imgH, canvasW, canvasH);
200
+ }
201
+ }
202
+ /**
203
+ * Generate and download a print-shop-ready PDF for a product.
204
+ *
205
+ * Page 1: Logo at full quality with metadata table.
206
+ * Page 2: High-resolution product mockup with print area guides.
207
+ *
208
+ * Requires jsPDF to be loaded globally via script tag before calling this function.
209
+ */
210
+ async function exportProductPdf(logo, article, viewIndex, productMockupDataUrl, canvasWidth, canvasHeight, config) {
211
+ const cfg = buildPdfConfig(config);
212
+ const JsPDF = getJsPDF();
213
+ // Rasterize SVG data URLs — jsPDF only accepts PNG/JPEG
214
+ const rasterLogoDataUrl = await rasterizeDataUrl(logo.dataUrl);
215
+ const doc = new JsPDF({
216
+ orientation: cfg.orientation,
217
+ unit: 'mm',
218
+ format: cfg.pageFormat,
219
+ });
220
+ // Page 1: Logo source
221
+ renderLogoPage(doc, logo, rasterLogoDataUrl, cfg);
222
+ // Page 2: Product mockup
223
+ doc.addPage();
224
+ renderProductPage(doc, article, viewIndex, productMockupDataUrl, canvasWidth, canvasHeight, cfg);
225
+ doc.save(`${article.id}.pdf`);
226
+ }
227
+
228
+ export { exportProductPdf };
@@ -0,0 +1,11 @@
1
+ import { b as bootstrapLazy } from './index-CUetmLbL.js';
2
+ export { s as setNonce } from './index-CUetmLbL.js';
3
+ import { g as globalScripts } from './app-globals-DQuL1Twl.js';
4
+
5
+ const defineCustomElements = async (win, options) => {
6
+ if (typeof window === 'undefined') return undefined;
7
+ await globalScripts();
8
+ return bootstrapLazy([["wtp-editor_2",[[514,"wtp-editor",{"width":[2],"height":[2],"productImage":[1,"product-image"],"initialState":[1,"initial-state"],"fonts":[16],"printArea":[16],"debug":[4],"labels":[16],"selectedObjectId":[32],"selectedObjectType":[32],"selectedFont":[32],"selectedTextColor":[32],"addLogo":[64],"addText":[64],"removeObject":[64],"exportState":[64],"loadState":[64],"resetCanvas":[64],"exportImage":[64],"exportImageHighRes":[64],"getObjects":[64],"updateText":[64]},null,{"productImage":[{"onProductImageChange":0}],"width":[{"onSizeChange":0}],"height":[{"onSizeChange":0}],"debug":[{"onDebugChange":0}],"printArea":[{"onPrintAreaChange":0}]}],[769,"wtp-logo-upload",{"config":[16],"accept":[1],"multiple":[4],"disabled":[4],"enableBackgroundRemoval":[4,"enable-background-removal"],"bgRemovalConfig":[16],"labels":[16],"isDragOver":[32],"previews":[32],"selectedIndex":[32],"rejections":[32],"isProcessing":[32],"pendingChoices":[32],"urlInput":[32],"urlError":[32],"isUrlFetching":[32]}]]],["wtp-logo-renderer",[[514,"wtp-logo-renderer",{"productImage":[1,"product-image"],"width":[2],"height":[2],"logos":[16],"backgroundColor":[1,"background-color"],"printArea":[1040],"layers":[32],"containerWidth":[32],"containerHeight":[32],"exportImage":[64]},null,{"productImage":[{"onProductImageChange":0}],"logos":[{"onLogosChange":0}],"printArea":[{"onPrintAreaChange":0}],"width":[{"onSizeChange":0}],"height":[{"onSizeChange":0}],"backgroundColor":[{"onBackgroundColorChange":0}]}]]],["wtp-print-area-editor",[[514,"wtp-print-area-editor",{"productImage":[1,"product-image"],"width":[2],"height":[2],"printArea":[1040],"getPrintArea":[64],"setPrintArea":[64]},null,{"productImage":[{"onProductImageChange":0}],"width":[{"onSizeChange":0}],"height":[{"onSizeChange":0}],"printArea":[{"onPrintAreaChange":0}]}]]]], options);
9
+ };
10
+
11
+ export { defineCustomElements };
@@ -0,0 +1,15 @@
1
+ const DEFAULT_VALIDATION_CONFIG = {
2
+ minDpi: 300,
3
+ maxFileSize: 50 * 1024 * 1024, // 50MB
4
+ minWidth: 100,
5
+ minHeight: 100,
6
+ allowedFormats: ['png', 'jpeg', 'svg', 'tiff', 'avif'],
7
+ };
8
+ const DEFAULT_BG_REMOVAL_CONFIG = {
9
+ tolerance: 40,
10
+ minEdgeRatio: 0.3,
11
+ autoCrop: true,
12
+ autoCropPadding: 2,
13
+ };
14
+
15
+ export { DEFAULT_VALIDATION_CONFIG as D, DEFAULT_BG_REMOVAL_CONFIG as a };
@@ -0,0 +1,21 @@
1
+ import { p as promiseResolve, b as bootstrapLazy } from './index-CUetmLbL.js';
2
+ export { s as setNonce } from './index-CUetmLbL.js';
3
+ import { g as globalScripts } from './app-globals-DQuL1Twl.js';
4
+
5
+ /*
6
+ Stencil Client Patch Browser v4.43.4 | MIT Licensed | https://stenciljs.com
7
+ */
8
+
9
+ var patchBrowser = () => {
10
+ const importMeta = import.meta.url;
11
+ const opts = {};
12
+ if (importMeta !== "") {
13
+ opts.resourcesUrl = new URL(".", importMeta).href;
14
+ }
15
+ return promiseResolve(opts);
16
+ };
17
+
18
+ patchBrowser().then(async (options) => {
19
+ await globalScripts();
20
+ return bootstrapLazy([["wtp-editor_2",[[514,"wtp-editor",{"width":[2],"height":[2],"productImage":[1,"product-image"],"initialState":[1,"initial-state"],"fonts":[16],"printArea":[16],"debug":[4],"labels":[16],"selectedObjectId":[32],"selectedObjectType":[32],"selectedFont":[32],"selectedTextColor":[32],"addLogo":[64],"addText":[64],"removeObject":[64],"exportState":[64],"loadState":[64],"resetCanvas":[64],"exportImage":[64],"exportImageHighRes":[64],"getObjects":[64],"updateText":[64]},null,{"productImage":[{"onProductImageChange":0}],"width":[{"onSizeChange":0}],"height":[{"onSizeChange":0}],"debug":[{"onDebugChange":0}],"printArea":[{"onPrintAreaChange":0}]}],[769,"wtp-logo-upload",{"config":[16],"accept":[1],"multiple":[4],"disabled":[4],"enableBackgroundRemoval":[4,"enable-background-removal"],"bgRemovalConfig":[16],"labels":[16],"isDragOver":[32],"previews":[32],"selectedIndex":[32],"rejections":[32],"isProcessing":[32],"pendingChoices":[32],"urlInput":[32],"urlError":[32],"isUrlFetching":[32]}]]],["wtp-logo-renderer",[[514,"wtp-logo-renderer",{"productImage":[1,"product-image"],"width":[2],"height":[2],"logos":[16],"backgroundColor":[1,"background-color"],"printArea":[1040],"layers":[32],"containerWidth":[32],"containerHeight":[32],"exportImage":[64]},null,{"productImage":[{"onProductImageChange":0}],"logos":[{"onLogosChange":0}],"printArea":[{"onPrintAreaChange":0}],"width":[{"onSizeChange":0}],"height":[{"onSizeChange":0}],"backgroundColor":[{"onBackgroundColorChange":0}]}]]],["wtp-print-area-editor",[[514,"wtp-print-area-editor",{"productImage":[1,"product-image"],"width":[2],"height":[2],"printArea":[1040],"getPrintArea":[64],"setPrintArea":[64]},null,{"productImage":[{"onProductImageChange":0}],"width":[{"onSizeChange":0}],"height":[{"onSizeChange":0}],"printArea":[{"onPrintAreaChange":0}]}]]]], options);
21
+ });