@imagecanvaskit/embed 1.0.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 +229 -0
- package/dist/index.cjs +338 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +333 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +186 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +31 -0
- package/dist/react.d.ts +31 -0
- package/dist/react.js +184 -0
- package/dist/react.js.map +1 -0
- package/dist/types-C7ZIsAaA.d.cts +215 -0
- package/dist/types-C7ZIsAaA.d.ts +215 -0
- package/dist/vanilla.cjs +155 -0
- package/dist/vanilla.cjs.map +1 -0
- package/dist/vanilla.d.cts +54 -0
- package/dist/vanilla.d.ts +54 -0
- package/dist/vanilla.js +151 -0
- package/dist/vanilla.js.map +1 -0
- package/package.json +75 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { forwardRef, useRef, useCallback, useEffect, useImperativeHandle } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/react.tsx
|
|
5
|
+
var DEFAULT_BASE_URL = "https://imagecanvaskit.com";
|
|
6
|
+
function buildEditorUrl(config) {
|
|
7
|
+
const baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
8
|
+
const params = new URLSearchParams();
|
|
9
|
+
params.set("embed", "true");
|
|
10
|
+
if (config.apiKey) params.set("apiKey", config.apiKey);
|
|
11
|
+
if (config.width) params.set("width", String(config.width));
|
|
12
|
+
if (config.height) params.set("height", String(config.height));
|
|
13
|
+
if (config.backgroundColor) params.set("bg", config.backgroundColor);
|
|
14
|
+
if (config.theme) params.set("theme", config.theme);
|
|
15
|
+
if (config.hideToolbar) params.set("hideToolbar", "true");
|
|
16
|
+
if (config.hideSidebar) params.set("hideSidebar", "true");
|
|
17
|
+
if (config.hideExport) params.set("hideExport", "true");
|
|
18
|
+
if (config.templateId) params.set("templateId", config.templateId);
|
|
19
|
+
if (config.endUserId) params.set("endUserId", config.endUserId);
|
|
20
|
+
if (config.exportFormats) params.set("formats", config.exportFormats.join(","));
|
|
21
|
+
if (config.whiteLabel) {
|
|
22
|
+
if (config.whiteLabel.logo) params.set("logo", config.whiteLabel.logo);
|
|
23
|
+
if (config.whiteLabel.primaryColor) params.set("primaryColor", config.whiteLabel.primaryColor);
|
|
24
|
+
if (config.whiteLabel.companyName) params.set("companyName", config.whiteLabel.companyName);
|
|
25
|
+
if (config.whiteLabel.hideBranding) params.set("hideBranding", "true");
|
|
26
|
+
}
|
|
27
|
+
return `${baseUrl}/editor?${params.toString()}`;
|
|
28
|
+
}
|
|
29
|
+
var ImageCanvasKit = forwardRef(
|
|
30
|
+
function ImageCanvasKit2(props, ref) {
|
|
31
|
+
const {
|
|
32
|
+
// Config
|
|
33
|
+
apiKey,
|
|
34
|
+
baseUrl,
|
|
35
|
+
width,
|
|
36
|
+
height,
|
|
37
|
+
backgroundColor,
|
|
38
|
+
theme,
|
|
39
|
+
hideToolbar,
|
|
40
|
+
hideSidebar,
|
|
41
|
+
hideExport,
|
|
42
|
+
templateId,
|
|
43
|
+
projectData,
|
|
44
|
+
endUserId,
|
|
45
|
+
exportFormats,
|
|
46
|
+
fonts,
|
|
47
|
+
whiteLabel,
|
|
48
|
+
// Callbacks
|
|
49
|
+
onReady,
|
|
50
|
+
onExport,
|
|
51
|
+
onSave,
|
|
52
|
+
onLoad,
|
|
53
|
+
onError,
|
|
54
|
+
onResize,
|
|
55
|
+
onObjectSelected,
|
|
56
|
+
onObjectDeselected,
|
|
57
|
+
onCanvasModified,
|
|
58
|
+
// Container props
|
|
59
|
+
className,
|
|
60
|
+
style,
|
|
61
|
+
iframeWidth = "100%",
|
|
62
|
+
iframeHeight = "600px"
|
|
63
|
+
} = props;
|
|
64
|
+
const iframeRef = useRef(null);
|
|
65
|
+
const config = {
|
|
66
|
+
apiKey,
|
|
67
|
+
baseUrl,
|
|
68
|
+
width,
|
|
69
|
+
height,
|
|
70
|
+
backgroundColor,
|
|
71
|
+
theme,
|
|
72
|
+
hideToolbar,
|
|
73
|
+
hideSidebar,
|
|
74
|
+
hideExport,
|
|
75
|
+
templateId,
|
|
76
|
+
endUserId,
|
|
77
|
+
exportFormats,
|
|
78
|
+
whiteLabel
|
|
79
|
+
};
|
|
80
|
+
const editorUrl = buildEditorUrl(config);
|
|
81
|
+
const sendCommand = useCallback((payload) => {
|
|
82
|
+
if (iframeRef.current?.contentWindow) {
|
|
83
|
+
iframeRef.current.contentWindow.postMessage(
|
|
84
|
+
{ source: "imagecanvaskit-embed", ...payload },
|
|
85
|
+
"*"
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}, []);
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
const handleMessage = (event) => {
|
|
91
|
+
if (baseUrl && !event.origin.includes(new URL(baseUrl).hostname)) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const data = event.data;
|
|
95
|
+
if (!data || typeof data !== "object" || !data.type) return;
|
|
96
|
+
switch (data.type) {
|
|
97
|
+
case "ready":
|
|
98
|
+
onReady?.(data);
|
|
99
|
+
if (projectData) {
|
|
100
|
+
sendCommand({ command: "load", projectData });
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
case "export":
|
|
104
|
+
onExport?.(data);
|
|
105
|
+
break;
|
|
106
|
+
case "save":
|
|
107
|
+
onSave?.(data);
|
|
108
|
+
break;
|
|
109
|
+
case "load":
|
|
110
|
+
onLoad?.(data);
|
|
111
|
+
break;
|
|
112
|
+
case "error":
|
|
113
|
+
onError?.(data);
|
|
114
|
+
break;
|
|
115
|
+
case "resize":
|
|
116
|
+
onResize?.(data);
|
|
117
|
+
break;
|
|
118
|
+
case "objectSelected":
|
|
119
|
+
onObjectSelected?.(data);
|
|
120
|
+
break;
|
|
121
|
+
case "objectDeselected":
|
|
122
|
+
onObjectDeselected?.(data);
|
|
123
|
+
break;
|
|
124
|
+
case "canvasModified":
|
|
125
|
+
onCanvasModified?.(data);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
window.addEventListener("message", handleMessage);
|
|
130
|
+
return () => window.removeEventListener("message", handleMessage);
|
|
131
|
+
}, [
|
|
132
|
+
baseUrl,
|
|
133
|
+
projectData,
|
|
134
|
+
onReady,
|
|
135
|
+
onExport,
|
|
136
|
+
onSave,
|
|
137
|
+
onLoad,
|
|
138
|
+
onError,
|
|
139
|
+
onResize,
|
|
140
|
+
onObjectSelected,
|
|
141
|
+
onObjectDeselected,
|
|
142
|
+
onCanvasModified,
|
|
143
|
+
sendCommand
|
|
144
|
+
]);
|
|
145
|
+
useImperativeHandle(
|
|
146
|
+
ref,
|
|
147
|
+
() => ({
|
|
148
|
+
sendCommand,
|
|
149
|
+
export: (options) => sendCommand({ command: "export", ...options }),
|
|
150
|
+
save: () => sendCommand({ command: "save" }),
|
|
151
|
+
load: (options) => sendCommand({ command: "load", ...options }),
|
|
152
|
+
clear: () => sendCommand({ command: "clear" }),
|
|
153
|
+
undo: () => sendCommand({ command: "undo" }),
|
|
154
|
+
redo: () => sendCommand({ command: "redo" }),
|
|
155
|
+
addText: (options) => sendCommand({ command: "addText", ...options }),
|
|
156
|
+
addImage: (options) => sendCommand({ command: "addImage", ...options }),
|
|
157
|
+
addShape: (options) => sendCommand({ command: "addShape", ...options }),
|
|
158
|
+
setBackground: (options) => sendCommand({ command: "setBackground", ...options }),
|
|
159
|
+
resize: (w, h) => sendCommand({ command: "resize", width: w, height: h }),
|
|
160
|
+
destroy: () => {
|
|
161
|
+
}
|
|
162
|
+
}),
|
|
163
|
+
[sendCommand]
|
|
164
|
+
);
|
|
165
|
+
return /* @__PURE__ */ jsx("div", { className, style, children: /* @__PURE__ */ jsx(
|
|
166
|
+
"iframe",
|
|
167
|
+
{
|
|
168
|
+
ref: iframeRef,
|
|
169
|
+
src: editorUrl,
|
|
170
|
+
width: iframeWidth,
|
|
171
|
+
height: iframeHeight,
|
|
172
|
+
style: {
|
|
173
|
+
border: "none",
|
|
174
|
+
display: "block"
|
|
175
|
+
},
|
|
176
|
+
allow: "clipboard-read; clipboard-write",
|
|
177
|
+
title: "ImageCanvasKit Editor"
|
|
178
|
+
}
|
|
179
|
+
) });
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
// src/vanilla.ts
|
|
184
|
+
var DEFAULT_BASE_URL2 = "https://imagecanvaskit.com";
|
|
185
|
+
function buildEditorUrl2(config) {
|
|
186
|
+
const baseUrl = config.baseUrl || DEFAULT_BASE_URL2;
|
|
187
|
+
const params = new URLSearchParams();
|
|
188
|
+
params.set("embed", "true");
|
|
189
|
+
if (config.apiKey) params.set("apiKey", config.apiKey);
|
|
190
|
+
if (config.width) params.set("width", String(config.width));
|
|
191
|
+
if (config.height) params.set("height", String(config.height));
|
|
192
|
+
if (config.backgroundColor) params.set("bg", config.backgroundColor);
|
|
193
|
+
if (config.theme) params.set("theme", config.theme);
|
|
194
|
+
if (config.hideToolbar) params.set("hideToolbar", "true");
|
|
195
|
+
if (config.hideSidebar) params.set("hideSidebar", "true");
|
|
196
|
+
if (config.hideExport) params.set("hideExport", "true");
|
|
197
|
+
if (config.templateId) params.set("templateId", config.templateId);
|
|
198
|
+
if (config.endUserId) params.set("endUserId", config.endUserId);
|
|
199
|
+
if (config.exportFormats) params.set("formats", config.exportFormats.join(","));
|
|
200
|
+
if (config.whiteLabel) {
|
|
201
|
+
if (config.whiteLabel.logo) params.set("logo", config.whiteLabel.logo);
|
|
202
|
+
if (config.whiteLabel.primaryColor) params.set("primaryColor", config.whiteLabel.primaryColor);
|
|
203
|
+
if (config.whiteLabel.companyName) params.set("companyName", config.whiteLabel.companyName);
|
|
204
|
+
if (config.whiteLabel.hideBranding) params.set("hideBranding", "true");
|
|
205
|
+
}
|
|
206
|
+
return `${baseUrl}/editor?${params.toString()}`;
|
|
207
|
+
}
|
|
208
|
+
function createEditor(options) {
|
|
209
|
+
const {
|
|
210
|
+
container,
|
|
211
|
+
width = "100%",
|
|
212
|
+
height = "600px",
|
|
213
|
+
canvasWidth,
|
|
214
|
+
canvasHeight,
|
|
215
|
+
onReady,
|
|
216
|
+
onExport,
|
|
217
|
+
onSave,
|
|
218
|
+
onLoad,
|
|
219
|
+
onError,
|
|
220
|
+
onResize,
|
|
221
|
+
onObjectSelected,
|
|
222
|
+
onObjectDeselected,
|
|
223
|
+
onCanvasModified,
|
|
224
|
+
projectData,
|
|
225
|
+
...config
|
|
226
|
+
} = options;
|
|
227
|
+
const editorConfig = {
|
|
228
|
+
...config,
|
|
229
|
+
width: canvasWidth,
|
|
230
|
+
height: canvasHeight
|
|
231
|
+
};
|
|
232
|
+
const containerEl = typeof container === "string" ? document.querySelector(container) : container;
|
|
233
|
+
if (!containerEl) {
|
|
234
|
+
throw new Error(`ImageCanvasKit: Container element not found: ${container}`);
|
|
235
|
+
}
|
|
236
|
+
const iframe = document.createElement("iframe");
|
|
237
|
+
iframe.src = buildEditorUrl2(editorConfig);
|
|
238
|
+
iframe.style.border = "none";
|
|
239
|
+
iframe.style.display = "block";
|
|
240
|
+
iframe.style.width = typeof width === "number" ? `${width}px` : width;
|
|
241
|
+
iframe.style.height = typeof height === "number" ? `${height}px` : height;
|
|
242
|
+
iframe.allow = "clipboard-read; clipboard-write";
|
|
243
|
+
iframe.title = "ImageCanvasKit Editor";
|
|
244
|
+
const sendCommand = (payload) => {
|
|
245
|
+
if (iframe.contentWindow) {
|
|
246
|
+
iframe.contentWindow.postMessage({ source: "imagecanvaskit-embed", ...payload }, "*");
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
const handleMessage = (event) => {
|
|
250
|
+
if (config.baseUrl && !event.origin.includes(new URL(config.baseUrl).hostname)) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const data = event.data;
|
|
254
|
+
if (!data || typeof data !== "object" || !data.type) return;
|
|
255
|
+
switch (data.type) {
|
|
256
|
+
case "ready":
|
|
257
|
+
onReady?.(data);
|
|
258
|
+
if (projectData) {
|
|
259
|
+
sendCommand({ command: "load", projectData });
|
|
260
|
+
}
|
|
261
|
+
break;
|
|
262
|
+
case "export":
|
|
263
|
+
onExport?.(data);
|
|
264
|
+
break;
|
|
265
|
+
case "save":
|
|
266
|
+
onSave?.(data);
|
|
267
|
+
break;
|
|
268
|
+
case "load":
|
|
269
|
+
onLoad?.(data);
|
|
270
|
+
break;
|
|
271
|
+
case "error":
|
|
272
|
+
onError?.(data);
|
|
273
|
+
break;
|
|
274
|
+
case "resize":
|
|
275
|
+
onResize?.(data);
|
|
276
|
+
break;
|
|
277
|
+
case "objectSelected":
|
|
278
|
+
onObjectSelected?.(data);
|
|
279
|
+
break;
|
|
280
|
+
case "objectDeselected":
|
|
281
|
+
onObjectDeselected?.(data);
|
|
282
|
+
break;
|
|
283
|
+
case "canvasModified":
|
|
284
|
+
onCanvasModified?.(data);
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
window.addEventListener("message", handleMessage);
|
|
289
|
+
containerEl.appendChild(iframe);
|
|
290
|
+
const instance = {
|
|
291
|
+
sendCommand,
|
|
292
|
+
export: (opts) => sendCommand({ command: "export", ...opts }),
|
|
293
|
+
save: () => sendCommand({ command: "save" }),
|
|
294
|
+
load: (opts) => sendCommand({ command: "load", ...opts }),
|
|
295
|
+
clear: () => sendCommand({ command: "clear" }),
|
|
296
|
+
undo: () => sendCommand({ command: "undo" }),
|
|
297
|
+
redo: () => sendCommand({ command: "redo" }),
|
|
298
|
+
addText: (opts) => sendCommand({ command: "addText", ...opts }),
|
|
299
|
+
addImage: (opts) => sendCommand({ command: "addImage", ...opts }),
|
|
300
|
+
addShape: (opts) => sendCommand({ command: "addShape", ...opts }),
|
|
301
|
+
setBackground: (opts) => sendCommand({ command: "setBackground", ...opts }),
|
|
302
|
+
resize: (w, h) => sendCommand({ command: "resize", width: w, height: h }),
|
|
303
|
+
destroy: () => {
|
|
304
|
+
window.removeEventListener("message", handleMessage);
|
|
305
|
+
iframe.remove();
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
return instance;
|
|
309
|
+
}
|
|
310
|
+
function base64ToBlob(base64, mimeType) {
|
|
311
|
+
const byteCharacters = atob(base64.split(",")[1] || base64);
|
|
312
|
+
const byteNumbers = new Array(byteCharacters.length);
|
|
313
|
+
for (let i = 0; i < byteCharacters.length; i++) {
|
|
314
|
+
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
315
|
+
}
|
|
316
|
+
const byteArray = new Uint8Array(byteNumbers);
|
|
317
|
+
return new Blob([byteArray], { type: mimeType });
|
|
318
|
+
}
|
|
319
|
+
function downloadImage(imageData, filename, mimeType) {
|
|
320
|
+
const blob = base64ToBlob(imageData, mimeType);
|
|
321
|
+
const url = URL.createObjectURL(blob);
|
|
322
|
+
const a = document.createElement("a");
|
|
323
|
+
a.href = url;
|
|
324
|
+
a.download = filename;
|
|
325
|
+
document.body.appendChild(a);
|
|
326
|
+
a.click();
|
|
327
|
+
document.body.removeChild(a);
|
|
328
|
+
URL.revokeObjectURL(url);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export { ImageCanvasKit, base64ToBlob, createEditor, downloadImage };
|
|
332
|
+
//# sourceMappingURL=index.js.map
|
|
333
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx","../src/vanilla.ts"],"names":["ImageCanvasKit","DEFAULT_BASE_URL","buildEditorUrl"],"mappings":";;;;AAyBA,IAAM,gBAAA,GAAmB,4BAAA;AAKzB,SAAS,eAAe,MAAA,EAAsC;AAC5D,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,gBAAA;AAClC,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,EAAA,MAAA,CAAO,GAAA,CAAI,SAAS,MAAM,CAAA;AAE1B,EAAA,IAAI,OAAO,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AACrD,EAAA,IAAI,MAAA,CAAO,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAC1D,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC7D,EAAA,IAAI,OAAO,eAAA,EAAiB,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,OAAO,eAAe,CAAA;AACnE,EAAA,IAAI,OAAO,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAO,KAAK,CAAA;AAClD,EAAA,IAAI,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,eAAe,MAAM,CAAA;AACxD,EAAA,IAAI,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,eAAe,MAAM,CAAA;AACxD,EAAA,IAAI,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,cAAc,MAAM,CAAA;AACtD,EAAA,IAAI,OAAO,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,OAAO,UAAU,CAAA;AACjE,EAAA,IAAI,OAAO,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,OAAO,SAAS,CAAA;AAC9D,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,CAAO,GAAA,CAAI,WAAW,MAAA,CAAO,aAAA,CAAc,IAAA,CAAK,GAAG,CAAC,CAAA;AAG9E,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,IAAI,MAAA,CAAO,WAAW,IAAA,EAAM,MAAA,CAAO,IAAI,MAAA,EAAQ,MAAA,CAAO,WAAW,IAAI,CAAA;AACrE,IAAA,IAAI,MAAA,CAAO,WAAW,YAAA,EAAc,MAAA,CAAO,IAAI,cAAA,EAAgB,MAAA,CAAO,WAAW,YAAY,CAAA;AAC7F,IAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa,MAAA,CAAO,IAAI,aAAA,EAAe,MAAA,CAAO,WAAW,WAAW,CAAA;AAC1F,IAAA,IAAI,OAAO,UAAA,CAAW,YAAA,EAAc,MAAA,CAAO,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,UAAU,CAAA,CAAA;AAC/C;AA2BO,IAAM,cAAA,GAAiB,UAAA;AAAA,EAC5B,SAASA,eAAAA,CAAe,KAAA,EAAO,GAAA,EAAK;AAClC,IAAA,MAAM;AAAA;AAAA,MAEJ,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA;AAAA,MAEA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA;AAAA,MAEA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA,GAAc,MAAA;AAAA,MACd,YAAA,GAAe;AAAA,KACjB,GAAI,KAAA;AAEJ,IAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAGhD,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MAEA,SAAA;AAAA,MACA,aAAA;AAAA,MAEA;AAAA,KACF;AAEA,IAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AAGvC,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,OAAA,KAA4B;AAC3D,MAAA,IAAI,SAAA,CAAU,SAAS,aAAA,EAAe;AACpC,QAAA,SAAA,CAAU,QAAQ,aAAA,CAAc,WAAA;AAAA,UAC9B,EAAE,MAAA,EAAQ,sBAAA,EAAwB,GAAG,OAAA,EAAQ;AAAA,UAC7C;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAGL,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAE7C,QAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,QAAQ,CAAA,EAAG;AAChE,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,SAAS,QAAA,IAAY,CAAC,KAAK,IAAA,EAAM;AAErD,QAAA,QAAQ,KAAK,IAAA;AAAM,UACjB,KAAK,OAAA;AACH,YAAA,OAAA,GAAU,IAA2C,CAAA;AAErD,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,WAAA,CAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAa,CAAA;AAAA,YAC9C;AACA,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,QAAA,GAAW,IAA4C,CAAA;AACvD,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,IAA0C,CAAA;AACnD,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,IAA0C,CAAA;AACnD,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,OAAA,GAAU,IAA2C,CAAA;AACrD,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,QAAA,GAAW,IAA4C,CAAA;AACvD,YAAA;AAAA,UACF,KAAK,gBAAA;AACH,YAAA,gBAAA,GAAmB,IAAoD,CAAA;AACvE,YAAA;AAAA,UACF,KAAK,kBAAA;AACH,YAAA,kBAAA,GAAqB,IAAiC,CAAA;AACtD,YAAA;AAAA,UACF,KAAK,gBAAA;AACH,YAAA,gBAAA,GAAmB,IAAoD,CAAA;AACvE,YAAA;AAAA;AACJ,MACF,CAAA;AAEA,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,MAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,IAClE,CAAA,EAAG;AAAA,MACD,OAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,mBAAA;AAAA,MACE,GAAA;AAAA,MACA,OAAO;AAAA,QACL,WAAA;AAAA,QACA,MAAA,EAAQ,CAAC,OAAA,KAAY,WAAA,CAAY,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,OAAA,EAAS,CAAA;AAAA,QAClE,MAAM,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,QAC3C,IAAA,EAAM,CAAC,OAAA,KAAY,WAAA,CAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAG,OAAA,EAAS,CAAA;AAAA,QAC9D,OAAO,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,QAC7C,MAAM,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,QAC3C,MAAM,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,QAC3C,OAAA,EAAS,CAAC,OAAA,KAAY,WAAA,CAAY,EAAE,OAAA,EAAS,SAAA,EAAW,GAAG,OAAA,EAAS,CAAA;AAAA,QACpE,QAAA,EAAU,CAAC,OAAA,KAAY,WAAA,CAAY,EAAE,OAAA,EAAS,UAAA,EAAY,GAAG,OAAA,EAAS,CAAA;AAAA,QACtE,QAAA,EAAU,CAAC,OAAA,KAAY,WAAA,CAAY,EAAE,OAAA,EAAS,UAAA,EAAY,GAAG,OAAA,EAAS,CAAA;AAAA,QACtE,aAAA,EAAe,CAAC,OAAA,KAAY,WAAA,CAAY,EAAE,OAAA,EAAS,eAAA,EAAiB,GAAG,OAAA,EAAS,CAAA;AAAA,QAChF,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,WAAA,CAAY,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,QACxE,SAAS,MAAM;AAAA,QAEf;AAAA,OACF,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EACzB,QAAA,kBAAA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,WAAA;AAAA,QACP,MAAA,EAAQ,YAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA,QACA,KAAA,EAAM,iCAAA;AAAA,QACN,KAAA,EAAM;AAAA;AAAA,KACR,EACF,CAAA;AAAA,EAEJ;AACF;;;AC1OA,IAAMC,iBAAAA,GAAmB,4BAAA;AAkBzB,SAASC,gBAAe,MAAA,EAAsC;AAC5D,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAWD,iBAAAA;AAClC,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,EAAA,MAAA,CAAO,GAAA,CAAI,SAAS,MAAM,CAAA;AAE1B,EAAA,IAAI,OAAO,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AACrD,EAAA,IAAI,MAAA,CAAO,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAC1D,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC7D,EAAA,IAAI,OAAO,eAAA,EAAiB,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,OAAO,eAAe,CAAA;AACnE,EAAA,IAAI,OAAO,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAO,KAAK,CAAA;AAClD,EAAA,IAAI,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,eAAe,MAAM,CAAA;AACxD,EAAA,IAAI,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,eAAe,MAAM,CAAA;AACxD,EAAA,IAAI,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,cAAc,MAAM,CAAA;AACtD,EAAA,IAAI,OAAO,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,OAAO,UAAU,CAAA;AACjE,EAAA,IAAI,OAAO,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,OAAO,SAAS,CAAA;AAC9D,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,CAAO,GAAA,CAAI,WAAW,MAAA,CAAO,aAAA,CAAc,IAAA,CAAK,GAAG,CAAC,CAAA;AAG9E,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,IAAI,MAAA,CAAO,WAAW,IAAA,EAAM,MAAA,CAAO,IAAI,MAAA,EAAQ,MAAA,CAAO,WAAW,IAAI,CAAA;AACrE,IAAA,IAAI,MAAA,CAAO,WAAW,YAAA,EAAc,MAAA,CAAO,IAAI,cAAA,EAAgB,MAAA,CAAO,WAAW,YAAY,CAAA;AAC7F,IAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa,MAAA,CAAO,IAAI,aAAA,EAAe,MAAA,CAAO,WAAW,WAAW,CAAA;AAC1F,IAAA,IAAI,OAAO,UAAA,CAAW,YAAA,EAAc,MAAA,CAAO,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,UAAU,CAAA,CAAA;AAC/C;AAyBO,SAAS,aAAa,OAAA,EAAsD;AACjF,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,KAAA,GAAQ,MAAA;AAAA,IACR,MAAA,GAAS,OAAA;AAAA,IACT,WAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,OAAA;AAGJ,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,GAAG,MAAA;AAAA,IACH,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAGA,EAAA,MAAM,cACJ,OAAO,SAAA,KAAc,WAAW,QAAA,CAAS,aAAA,CAA2B,SAAS,CAAA,GAAI,SAAA;AAEnF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,SAAS,CAAA,CAAE,CAAA;AAAA,EAC7E;AAGA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,GAAA,GAAMC,gBAAe,YAAY,CAAA;AACxC,EAAA,MAAA,CAAO,MAAM,MAAA,GAAS,MAAA;AACtB,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,OAAA;AACvB,EAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,OAAO,UAAU,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,KAAA;AAChE,EAAA,MAAA,CAAO,MAAM,MAAA,GAAS,OAAO,WAAW,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA,GAAO,MAAA;AACnE,EAAA,MAAA,CAAO,KAAA,GAAQ,iCAAA;AACf,EAAA,MAAA,CAAO,KAAA,GAAQ,uBAAA;AAMf,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAA4B;AAC/C,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,MAAA,CAAO,aAAA,CAAc,YAAY,EAAE,MAAA,EAAQ,wBAAwB,GAAG,OAAA,IAAW,GAAG,CAAA;AAAA,IACtF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAE7C,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,IAAI,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA,CAAE,QAAQ,CAAA,EAAG;AAC9E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,SAAS,QAAA,IAAY,CAAC,KAAK,IAAA,EAAM;AAErD,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,OAAA;AAEH,QAAA,OAAA,GAAU,IAA2C,CAAA;AAErD,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,WAAA,CAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAa,CAAA;AAAA,QAC9C;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,GAAW,IAA4C,CAAA;AACvD,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,MAAA,GAAS,IAA0C,CAAA;AACnD,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,MAAA,GAAS,IAA0C,CAAA;AACnD,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,OAAA,GAAU,IAA2C,CAAA;AACrD,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,GAAW,IAA4C,CAAA;AACvD,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,gBAAA,GAAmB,IAAoD,CAAA;AACvE,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,kBAAA,GAAqB,IAAiC,CAAA;AACtD,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,gBAAA,GAAmB,IAAoD,CAAA;AACvE,QAAA;AAAA;AACJ,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAGhD,EAAA,WAAA,CAAY,YAAY,MAAM,CAAA;AAG9B,EAAA,MAAM,QAAA,GAAmC;AAAA,IACvC,WAAA;AAAA,IACA,MAAA,EAAQ,CAAC,IAAA,KAAS,WAAA,CAAY,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,IAAA,EAAM,CAAA;AAAA,IAC5D,MAAM,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC3C,IAAA,EAAM,CAAC,IAAA,KAAS,WAAA,CAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAG,IAAA,EAAM,CAAA;AAAA,IACxD,OAAO,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,IAC7C,MAAM,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC3C,MAAM,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC3C,OAAA,EAAS,CAAC,IAAA,KAAS,WAAA,CAAY,EAAE,OAAA,EAAS,SAAA,EAAW,GAAG,IAAA,EAAM,CAAA;AAAA,IAC9D,QAAA,EAAU,CAAC,IAAA,KAAS,WAAA,CAAY,EAAE,OAAA,EAAS,UAAA,EAAY,GAAG,IAAA,EAAM,CAAA;AAAA,IAChE,QAAA,EAAU,CAAC,IAAA,KAAS,WAAA,CAAY,EAAE,OAAA,EAAS,UAAA,EAAY,GAAG,IAAA,EAAM,CAAA;AAAA,IAChE,aAAA,EAAe,CAAC,IAAA,KAAS,WAAA,CAAY,EAAE,OAAA,EAAS,eAAA,EAAiB,GAAG,IAAA,EAAM,CAAA;AAAA,IAC1E,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,WAAA,CAAY,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,IACxE,SAAS,MAAM;AACb,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,aAAa,CAAA;AACnD,MAAA,MAAA,CAAO,MAAA,EAAO;AAAA,IAChB;AAAA,GACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,YAAA,CAAa,QAAgB,QAAA,EAAwB;AACnE,EAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,KAAK,MAAM,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,IAAI,KAAA,CAAM,cAAA,CAAe,MAAM,CAAA;AACnD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,WAAA,CAAY,CAAC,CAAA,GAAI,cAAA,CAAe,UAAA,CAAW,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,WAAW,CAAA;AAC5C,EAAA,OAAO,IAAI,KAAK,CAAC,SAAS,GAAG,EAAE,IAAA,EAAM,UAAU,CAAA;AACjD;AAKO,SAAS,aAAA,CAAc,SAAA,EAAmB,QAAA,EAAkB,QAAA,EAAwB;AACzF,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,SAAA,EAAW,QAAQ,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,EAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,EAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,EAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACzB","file":"index.js","sourcesContent":["'use client';\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useCallback,\n} from 'react';\nimport type {\n ImageCanvasKitProps,\n ImageCanvasKitInstance,\n ImageCanvasKitConfig,\n CommandPayload,\n ImageCanvasKitEvent,\n ExportEventData,\n SaveEventData,\n LoadEventData,\n ErrorEventData,\n ReadyEventData,\n ResizeEventData,\n ObjectSelectedEventData,\n CanvasModifiedEventData,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://imagecanvaskit.com';\n\n/**\n * Build the editor URL with configuration parameters\n */\nfunction buildEditorUrl(config: ImageCanvasKitConfig): string {\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\n const params = new URLSearchParams();\n\n params.set('embed', 'true');\n\n if (config.apiKey) params.set('apiKey', config.apiKey);\n if (config.width) params.set('width', String(config.width));\n if (config.height) params.set('height', String(config.height));\n if (config.backgroundColor) params.set('bg', config.backgroundColor);\n if (config.theme) params.set('theme', config.theme);\n if (config.hideToolbar) params.set('hideToolbar', 'true');\n if (config.hideSidebar) params.set('hideSidebar', 'true');\n if (config.hideExport) params.set('hideExport', 'true');\n if (config.templateId) params.set('templateId', config.templateId);\n if (config.endUserId) params.set('endUserId', config.endUserId);\n if (config.exportFormats) params.set('formats', config.exportFormats.join(','));\n\n // White-label settings\n if (config.whiteLabel) {\n if (config.whiteLabel.logo) params.set('logo', config.whiteLabel.logo);\n if (config.whiteLabel.primaryColor) params.set('primaryColor', config.whiteLabel.primaryColor);\n if (config.whiteLabel.companyName) params.set('companyName', config.whiteLabel.companyName);\n if (config.whiteLabel.hideBranding) params.set('hideBranding', 'true');\n }\n\n return `${baseUrl}/editor?${params.toString()}`;\n}\n\n/**\n * ImageCanvasKit React Component\n *\n * Embeds the ImageCanvasKit editor in your React application.\n *\n * @example\n * ```tsx\n * import { ImageCanvasKit } from '@imagecanvaskit/embed';\n *\n * function App() {\n * const editorRef = useRef<ImageCanvasKitInstance>(null);\n *\n * return (\n * <ImageCanvasKit\n * ref={editorRef}\n * apiKey=\"your-api-key\"\n * width={1200}\n * height={800}\n * onExport={(e) => console.log('Exported:', e.data)}\n * onReady={() => console.log('Editor ready!')}\n * />\n * );\n * }\n * ```\n */\nexport const ImageCanvasKit = forwardRef<ImageCanvasKitInstance, ImageCanvasKitProps>(\n function ImageCanvasKit(props, ref) {\n const {\n // Config\n apiKey,\n baseUrl,\n width,\n height,\n backgroundColor,\n theme,\n hideToolbar,\n hideSidebar,\n hideExport,\n templateId,\n projectData,\n endUserId,\n exportFormats,\n fonts,\n whiteLabel,\n // Callbacks\n onReady,\n onExport,\n onSave,\n onLoad,\n onError,\n onResize,\n onObjectSelected,\n onObjectDeselected,\n onCanvasModified,\n // Container props\n className,\n style,\n iframeWidth = '100%',\n iframeHeight = '600px',\n } = props;\n\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n // Build config object\n const config: ImageCanvasKitConfig = {\n apiKey,\n baseUrl,\n width,\n height,\n backgroundColor,\n theme,\n hideToolbar,\n hideSidebar,\n hideExport,\n templateId,\n projectData,\n endUserId,\n exportFormats,\n fonts,\n whiteLabel,\n };\n\n const editorUrl = buildEditorUrl(config);\n\n // Send command to iframe\n const sendCommand = useCallback((payload: CommandPayload) => {\n if (iframeRef.current?.contentWindow) {\n iframeRef.current.contentWindow.postMessage(\n { source: 'imagecanvaskit-embed', ...payload },\n '*'\n );\n }\n }, []);\n\n // Handle incoming messages from iframe\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n // Verify origin in production\n if (baseUrl && !event.origin.includes(new URL(baseUrl).hostname)) {\n return;\n }\n\n const data = event.data as ImageCanvasKitEvent;\n if (!data || typeof data !== 'object' || !data.type) return;\n\n switch (data.type) {\n case 'ready':\n onReady?.(data as ImageCanvasKitEvent<ReadyEventData>);\n // Load project data if provided\n if (projectData) {\n sendCommand({ command: 'load', projectData });\n }\n break;\n case 'export':\n onExport?.(data as ImageCanvasKitEvent<ExportEventData>);\n break;\n case 'save':\n onSave?.(data as ImageCanvasKitEvent<SaveEventData>);\n break;\n case 'load':\n onLoad?.(data as ImageCanvasKitEvent<LoadEventData>);\n break;\n case 'error':\n onError?.(data as ImageCanvasKitEvent<ErrorEventData>);\n break;\n case 'resize':\n onResize?.(data as ImageCanvasKitEvent<ResizeEventData>);\n break;\n case 'objectSelected':\n onObjectSelected?.(data as ImageCanvasKitEvent<ObjectSelectedEventData>);\n break;\n case 'objectDeselected':\n onObjectDeselected?.(data as ImageCanvasKitEvent<void>);\n break;\n case 'canvasModified':\n onCanvasModified?.(data as ImageCanvasKitEvent<CanvasModifiedEventData>);\n break;\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [\n baseUrl,\n projectData,\n onReady,\n onExport,\n onSave,\n onLoad,\n onError,\n onResize,\n onObjectSelected,\n onObjectDeselected,\n onCanvasModified,\n sendCommand,\n ]);\n\n // Expose instance methods via ref\n useImperativeHandle(\n ref,\n () => ({\n sendCommand,\n export: (options) => sendCommand({ command: 'export', ...options }),\n save: () => sendCommand({ command: 'save' }),\n load: (options) => sendCommand({ command: 'load', ...options }),\n clear: () => sendCommand({ command: 'clear' }),\n undo: () => sendCommand({ command: 'undo' }),\n redo: () => sendCommand({ command: 'redo' }),\n addText: (options) => sendCommand({ command: 'addText', ...options }),\n addImage: (options) => sendCommand({ command: 'addImage', ...options }),\n addShape: (options) => sendCommand({ command: 'addShape', ...options }),\n setBackground: (options) => sendCommand({ command: 'setBackground', ...options }),\n resize: (w, h) => sendCommand({ command: 'resize', width: w, height: h }),\n destroy: () => {\n // Cleanup if needed\n },\n }),\n [sendCommand]\n );\n\n return (\n <div className={className} style={style}>\n <iframe\n ref={iframeRef}\n src={editorUrl}\n width={iframeWidth}\n height={iframeHeight}\n style={{\n border: 'none',\n display: 'block',\n }}\n allow=\"clipboard-read; clipboard-write\"\n title=\"ImageCanvasKit Editor\"\n />\n </div>\n );\n }\n);\n\n","/**\n * ImageCanvasKit Vanilla JS Embed\n *\n * For use in vanilla JavaScript, Vue, Angular, or any framework.\n */\n\nimport type {\n ImageCanvasKitConfig,\n ImageCanvasKitInstance,\n CommandPayload,\n EventCallbacks,\n ImageCanvasKitEvent,\n ExportEventData,\n SaveEventData,\n LoadEventData,\n ErrorEventData,\n ReadyEventData,\n ResizeEventData,\n ObjectSelectedEventData,\n CanvasModifiedEventData,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://imagecanvaskit.com';\n\nexport interface CreateEditorOptions extends Omit<ImageCanvasKitConfig, 'width' | 'height'>, EventCallbacks {\n /** Container element or selector */\n container: HTMLElement | string;\n /** Canvas width in pixels (passed to editor) */\n canvasWidth?: number;\n /** Canvas height in pixels (passed to editor) */\n canvasHeight?: number;\n /** iframe width (CSS value) */\n width?: string | number;\n /** iframe height (CSS value) */\n height?: string | number;\n}\n\n/**\n * Build the editor URL with configuration parameters\n */\nfunction buildEditorUrl(config: ImageCanvasKitConfig): string {\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\n const params = new URLSearchParams();\n\n params.set('embed', 'true');\n\n if (config.apiKey) params.set('apiKey', config.apiKey);\n if (config.width) params.set('width', String(config.width));\n if (config.height) params.set('height', String(config.height));\n if (config.backgroundColor) params.set('bg', config.backgroundColor);\n if (config.theme) params.set('theme', config.theme);\n if (config.hideToolbar) params.set('hideToolbar', 'true');\n if (config.hideSidebar) params.set('hideSidebar', 'true');\n if (config.hideExport) params.set('hideExport', 'true');\n if (config.templateId) params.set('templateId', config.templateId);\n if (config.endUserId) params.set('endUserId', config.endUserId);\n if (config.exportFormats) params.set('formats', config.exportFormats.join(','));\n\n // White-label settings\n if (config.whiteLabel) {\n if (config.whiteLabel.logo) params.set('logo', config.whiteLabel.logo);\n if (config.whiteLabel.primaryColor) params.set('primaryColor', config.whiteLabel.primaryColor);\n if (config.whiteLabel.companyName) params.set('companyName', config.whiteLabel.companyName);\n if (config.whiteLabel.hideBranding) params.set('hideBranding', 'true');\n }\n\n return `${baseUrl}/editor?${params.toString()}`;\n}\n\n/**\n * Create an ImageCanvasKit editor instance\n *\n * @example\n * ```js\n * import { createEditor } from '@imagecanvaskit/embed';\n *\n * const editor = createEditor({\n * container: '#editor-container',\n * apiKey: 'your-api-key',\n * width: '100%',\n * height: '600px',\n * onExport: (e) => console.log('Exported:', e.data),\n * onReady: () => console.log('Editor ready!'),\n * });\n *\n * // Later: trigger export\n * editor.export({ format: 'png' });\n *\n * // Cleanup\n * editor.destroy();\n * ```\n */\nexport function createEditor(options: CreateEditorOptions): ImageCanvasKitInstance {\n const {\n container,\n width = '100%',\n height = '600px',\n canvasWidth,\n canvasHeight,\n onReady,\n onExport,\n onSave,\n onLoad,\n onError,\n onResize,\n onObjectSelected,\n onObjectDeselected,\n onCanvasModified,\n projectData,\n ...config\n } = options;\n\n // Build config with canvas dimensions\n const editorConfig = {\n ...config,\n width: canvasWidth,\n height: canvasHeight,\n };\n\n // Get container element\n const containerEl =\n typeof container === 'string' ? document.querySelector<HTMLElement>(container) : container;\n\n if (!containerEl) {\n throw new Error(`ImageCanvasKit: Container element not found: ${container}`);\n }\n\n // Create iframe\n const iframe = document.createElement('iframe');\n iframe.src = buildEditorUrl(editorConfig);\n iframe.style.border = 'none';\n iframe.style.display = 'block';\n iframe.style.width = typeof width === 'number' ? `${width}px` : width;\n iframe.style.height = typeof height === 'number' ? `${height}px` : height;\n iframe.allow = 'clipboard-read; clipboard-write';\n iframe.title = 'ImageCanvasKit Editor';\n\n // Track ready state (for future use)\n let _isReady = false;\n\n // Send command to iframe\n const sendCommand = (payload: CommandPayload) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage({ source: 'imagecanvaskit-embed', ...payload }, '*');\n }\n };\n\n // Handle incoming messages\n const handleMessage = (event: MessageEvent) => {\n // Verify origin in production\n if (config.baseUrl && !event.origin.includes(new URL(config.baseUrl).hostname)) {\n return;\n }\n\n const data = event.data as ImageCanvasKitEvent;\n if (!data || typeof data !== 'object' || !data.type) return;\n\n switch (data.type) {\n case 'ready':\n _isReady = true;\n onReady?.(data as ImageCanvasKitEvent<ReadyEventData>);\n // Load project data if provided\n if (projectData) {\n sendCommand({ command: 'load', projectData });\n }\n break;\n case 'export':\n onExport?.(data as ImageCanvasKitEvent<ExportEventData>);\n break;\n case 'save':\n onSave?.(data as ImageCanvasKitEvent<SaveEventData>);\n break;\n case 'load':\n onLoad?.(data as ImageCanvasKitEvent<LoadEventData>);\n break;\n case 'error':\n onError?.(data as ImageCanvasKitEvent<ErrorEventData>);\n break;\n case 'resize':\n onResize?.(data as ImageCanvasKitEvent<ResizeEventData>);\n break;\n case 'objectSelected':\n onObjectSelected?.(data as ImageCanvasKitEvent<ObjectSelectedEventData>);\n break;\n case 'objectDeselected':\n onObjectDeselected?.(data as ImageCanvasKitEvent<void>);\n break;\n case 'canvasModified':\n onCanvasModified?.(data as ImageCanvasKitEvent<CanvasModifiedEventData>);\n break;\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n // Append iframe to container\n containerEl.appendChild(iframe);\n\n // Return instance API\n const instance: ImageCanvasKitInstance = {\n sendCommand,\n export: (opts) => sendCommand({ command: 'export', ...opts }),\n save: () => sendCommand({ command: 'save' }),\n load: (opts) => sendCommand({ command: 'load', ...opts }),\n clear: () => sendCommand({ command: 'clear' }),\n undo: () => sendCommand({ command: 'undo' }),\n redo: () => sendCommand({ command: 'redo' }),\n addText: (opts) => sendCommand({ command: 'addText', ...opts }),\n addImage: (opts) => sendCommand({ command: 'addImage', ...opts }),\n addShape: (opts) => sendCommand({ command: 'addShape', ...opts }),\n setBackground: (opts) => sendCommand({ command: 'setBackground', ...opts }),\n resize: (w, h) => sendCommand({ command: 'resize', width: w, height: h }),\n destroy: () => {\n window.removeEventListener('message', handleMessage);\n iframe.remove();\n },\n };\n\n return instance;\n}\n\n/**\n * Helper to convert base64 image data to Blob\n */\nexport function base64ToBlob(base64: string, mimeType: string): Blob {\n const byteCharacters = atob(base64.split(',')[1] || base64);\n const byteNumbers = new Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n const byteArray = new Uint8Array(byteNumbers);\n return new Blob([byteArray], { type: mimeType });\n}\n\n/**\n * Helper to download exported image\n */\nexport function downloadImage(imageData: string, filename: string, mimeType: string): void {\n const blob = base64ToBlob(imageData, mimeType);\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n"]}
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
var DEFAULT_BASE_URL = "https://imagecanvaskit.com";
|
|
7
|
+
function buildEditorUrl(config) {
|
|
8
|
+
const baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
9
|
+
const params = new URLSearchParams();
|
|
10
|
+
params.set("embed", "true");
|
|
11
|
+
if (config.apiKey) params.set("apiKey", config.apiKey);
|
|
12
|
+
if (config.width) params.set("width", String(config.width));
|
|
13
|
+
if (config.height) params.set("height", String(config.height));
|
|
14
|
+
if (config.backgroundColor) params.set("bg", config.backgroundColor);
|
|
15
|
+
if (config.theme) params.set("theme", config.theme);
|
|
16
|
+
if (config.hideToolbar) params.set("hideToolbar", "true");
|
|
17
|
+
if (config.hideSidebar) params.set("hideSidebar", "true");
|
|
18
|
+
if (config.hideExport) params.set("hideExport", "true");
|
|
19
|
+
if (config.templateId) params.set("templateId", config.templateId);
|
|
20
|
+
if (config.endUserId) params.set("endUserId", config.endUserId);
|
|
21
|
+
if (config.exportFormats) params.set("formats", config.exportFormats.join(","));
|
|
22
|
+
if (config.whiteLabel) {
|
|
23
|
+
if (config.whiteLabel.logo) params.set("logo", config.whiteLabel.logo);
|
|
24
|
+
if (config.whiteLabel.primaryColor) params.set("primaryColor", config.whiteLabel.primaryColor);
|
|
25
|
+
if (config.whiteLabel.companyName) params.set("companyName", config.whiteLabel.companyName);
|
|
26
|
+
if (config.whiteLabel.hideBranding) params.set("hideBranding", "true");
|
|
27
|
+
}
|
|
28
|
+
return `${baseUrl}/editor?${params.toString()}`;
|
|
29
|
+
}
|
|
30
|
+
var ImageCanvasKit = react.forwardRef(
|
|
31
|
+
function ImageCanvasKit2(props, ref) {
|
|
32
|
+
const {
|
|
33
|
+
// Config
|
|
34
|
+
apiKey,
|
|
35
|
+
baseUrl,
|
|
36
|
+
width,
|
|
37
|
+
height,
|
|
38
|
+
backgroundColor,
|
|
39
|
+
theme,
|
|
40
|
+
hideToolbar,
|
|
41
|
+
hideSidebar,
|
|
42
|
+
hideExport,
|
|
43
|
+
templateId,
|
|
44
|
+
projectData,
|
|
45
|
+
endUserId,
|
|
46
|
+
exportFormats,
|
|
47
|
+
fonts,
|
|
48
|
+
whiteLabel,
|
|
49
|
+
// Callbacks
|
|
50
|
+
onReady,
|
|
51
|
+
onExport,
|
|
52
|
+
onSave,
|
|
53
|
+
onLoad,
|
|
54
|
+
onError,
|
|
55
|
+
onResize,
|
|
56
|
+
onObjectSelected,
|
|
57
|
+
onObjectDeselected,
|
|
58
|
+
onCanvasModified,
|
|
59
|
+
// Container props
|
|
60
|
+
className,
|
|
61
|
+
style,
|
|
62
|
+
iframeWidth = "100%",
|
|
63
|
+
iframeHeight = "600px"
|
|
64
|
+
} = props;
|
|
65
|
+
const iframeRef = react.useRef(null);
|
|
66
|
+
const config = {
|
|
67
|
+
apiKey,
|
|
68
|
+
baseUrl,
|
|
69
|
+
width,
|
|
70
|
+
height,
|
|
71
|
+
backgroundColor,
|
|
72
|
+
theme,
|
|
73
|
+
hideToolbar,
|
|
74
|
+
hideSidebar,
|
|
75
|
+
hideExport,
|
|
76
|
+
templateId,
|
|
77
|
+
endUserId,
|
|
78
|
+
exportFormats,
|
|
79
|
+
whiteLabel
|
|
80
|
+
};
|
|
81
|
+
const editorUrl = buildEditorUrl(config);
|
|
82
|
+
const sendCommand = react.useCallback((payload) => {
|
|
83
|
+
if (iframeRef.current?.contentWindow) {
|
|
84
|
+
iframeRef.current.contentWindow.postMessage(
|
|
85
|
+
{ source: "imagecanvaskit-embed", ...payload },
|
|
86
|
+
"*"
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
}, []);
|
|
90
|
+
react.useEffect(() => {
|
|
91
|
+
const handleMessage = (event) => {
|
|
92
|
+
if (baseUrl && !event.origin.includes(new URL(baseUrl).hostname)) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const data = event.data;
|
|
96
|
+
if (!data || typeof data !== "object" || !data.type) return;
|
|
97
|
+
switch (data.type) {
|
|
98
|
+
case "ready":
|
|
99
|
+
onReady?.(data);
|
|
100
|
+
if (projectData) {
|
|
101
|
+
sendCommand({ command: "load", projectData });
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case "export":
|
|
105
|
+
onExport?.(data);
|
|
106
|
+
break;
|
|
107
|
+
case "save":
|
|
108
|
+
onSave?.(data);
|
|
109
|
+
break;
|
|
110
|
+
case "load":
|
|
111
|
+
onLoad?.(data);
|
|
112
|
+
break;
|
|
113
|
+
case "error":
|
|
114
|
+
onError?.(data);
|
|
115
|
+
break;
|
|
116
|
+
case "resize":
|
|
117
|
+
onResize?.(data);
|
|
118
|
+
break;
|
|
119
|
+
case "objectSelected":
|
|
120
|
+
onObjectSelected?.(data);
|
|
121
|
+
break;
|
|
122
|
+
case "objectDeselected":
|
|
123
|
+
onObjectDeselected?.(data);
|
|
124
|
+
break;
|
|
125
|
+
case "canvasModified":
|
|
126
|
+
onCanvasModified?.(data);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
window.addEventListener("message", handleMessage);
|
|
131
|
+
return () => window.removeEventListener("message", handleMessage);
|
|
132
|
+
}, [
|
|
133
|
+
baseUrl,
|
|
134
|
+
projectData,
|
|
135
|
+
onReady,
|
|
136
|
+
onExport,
|
|
137
|
+
onSave,
|
|
138
|
+
onLoad,
|
|
139
|
+
onError,
|
|
140
|
+
onResize,
|
|
141
|
+
onObjectSelected,
|
|
142
|
+
onObjectDeselected,
|
|
143
|
+
onCanvasModified,
|
|
144
|
+
sendCommand
|
|
145
|
+
]);
|
|
146
|
+
react.useImperativeHandle(
|
|
147
|
+
ref,
|
|
148
|
+
() => ({
|
|
149
|
+
sendCommand,
|
|
150
|
+
export: (options) => sendCommand({ command: "export", ...options }),
|
|
151
|
+
save: () => sendCommand({ command: "save" }),
|
|
152
|
+
load: (options) => sendCommand({ command: "load", ...options }),
|
|
153
|
+
clear: () => sendCommand({ command: "clear" }),
|
|
154
|
+
undo: () => sendCommand({ command: "undo" }),
|
|
155
|
+
redo: () => sendCommand({ command: "redo" }),
|
|
156
|
+
addText: (options) => sendCommand({ command: "addText", ...options }),
|
|
157
|
+
addImage: (options) => sendCommand({ command: "addImage", ...options }),
|
|
158
|
+
addShape: (options) => sendCommand({ command: "addShape", ...options }),
|
|
159
|
+
setBackground: (options) => sendCommand({ command: "setBackground", ...options }),
|
|
160
|
+
resize: (w, h) => sendCommand({ command: "resize", width: w, height: h }),
|
|
161
|
+
destroy: () => {
|
|
162
|
+
}
|
|
163
|
+
}),
|
|
164
|
+
[sendCommand]
|
|
165
|
+
);
|
|
166
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className, style, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
167
|
+
"iframe",
|
|
168
|
+
{
|
|
169
|
+
ref: iframeRef,
|
|
170
|
+
src: editorUrl,
|
|
171
|
+
width: iframeWidth,
|
|
172
|
+
height: iframeHeight,
|
|
173
|
+
style: {
|
|
174
|
+
border: "none",
|
|
175
|
+
display: "block"
|
|
176
|
+
},
|
|
177
|
+
allow: "clipboard-read; clipboard-write",
|
|
178
|
+
title: "ImageCanvasKit Editor"
|
|
179
|
+
}
|
|
180
|
+
) });
|
|
181
|
+
}
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
exports.ImageCanvasKit = ImageCanvasKit;
|
|
185
|
+
//# sourceMappingURL=react.cjs.map
|
|
186
|
+
//# sourceMappingURL=react.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx"],"names":["forwardRef","ImageCanvasKit","useRef","useCallback","useEffect","useImperativeHandle","jsx"],"mappings":"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","file":"react.cjs","sourcesContent":["'use client';\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useCallback,\n} from 'react';\nimport type {\n ImageCanvasKitProps,\n ImageCanvasKitInstance,\n ImageCanvasKitConfig,\n CommandPayload,\n ImageCanvasKitEvent,\n ExportEventData,\n SaveEventData,\n LoadEventData,\n ErrorEventData,\n ReadyEventData,\n ResizeEventData,\n ObjectSelectedEventData,\n CanvasModifiedEventData,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://imagecanvaskit.com';\n\n/**\n * Build the editor URL with configuration parameters\n */\nfunction buildEditorUrl(config: ImageCanvasKitConfig): string {\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\n const params = new URLSearchParams();\n\n params.set('embed', 'true');\n\n if (config.apiKey) params.set('apiKey', config.apiKey);\n if (config.width) params.set('width', String(config.width));\n if (config.height) params.set('height', String(config.height));\n if (config.backgroundColor) params.set('bg', config.backgroundColor);\n if (config.theme) params.set('theme', config.theme);\n if (config.hideToolbar) params.set('hideToolbar', 'true');\n if (config.hideSidebar) params.set('hideSidebar', 'true');\n if (config.hideExport) params.set('hideExport', 'true');\n if (config.templateId) params.set('templateId', config.templateId);\n if (config.endUserId) params.set('endUserId', config.endUserId);\n if (config.exportFormats) params.set('formats', config.exportFormats.join(','));\n\n // White-label settings\n if (config.whiteLabel) {\n if (config.whiteLabel.logo) params.set('logo', config.whiteLabel.logo);\n if (config.whiteLabel.primaryColor) params.set('primaryColor', config.whiteLabel.primaryColor);\n if (config.whiteLabel.companyName) params.set('companyName', config.whiteLabel.companyName);\n if (config.whiteLabel.hideBranding) params.set('hideBranding', 'true');\n }\n\n return `${baseUrl}/editor?${params.toString()}`;\n}\n\n/**\n * ImageCanvasKit React Component\n *\n * Embeds the ImageCanvasKit editor in your React application.\n *\n * @example\n * ```tsx\n * import { ImageCanvasKit } from '@imagecanvaskit/embed';\n *\n * function App() {\n * const editorRef = useRef<ImageCanvasKitInstance>(null);\n *\n * return (\n * <ImageCanvasKit\n * ref={editorRef}\n * apiKey=\"your-api-key\"\n * width={1200}\n * height={800}\n * onExport={(e) => console.log('Exported:', e.data)}\n * onReady={() => console.log('Editor ready!')}\n * />\n * );\n * }\n * ```\n */\nexport const ImageCanvasKit = forwardRef<ImageCanvasKitInstance, ImageCanvasKitProps>(\n function ImageCanvasKit(props, ref) {\n const {\n // Config\n apiKey,\n baseUrl,\n width,\n height,\n backgroundColor,\n theme,\n hideToolbar,\n hideSidebar,\n hideExport,\n templateId,\n projectData,\n endUserId,\n exportFormats,\n fonts,\n whiteLabel,\n // Callbacks\n onReady,\n onExport,\n onSave,\n onLoad,\n onError,\n onResize,\n onObjectSelected,\n onObjectDeselected,\n onCanvasModified,\n // Container props\n className,\n style,\n iframeWidth = '100%',\n iframeHeight = '600px',\n } = props;\n\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n // Build config object\n const config: ImageCanvasKitConfig = {\n apiKey,\n baseUrl,\n width,\n height,\n backgroundColor,\n theme,\n hideToolbar,\n hideSidebar,\n hideExport,\n templateId,\n projectData,\n endUserId,\n exportFormats,\n fonts,\n whiteLabel,\n };\n\n const editorUrl = buildEditorUrl(config);\n\n // Send command to iframe\n const sendCommand = useCallback((payload: CommandPayload) => {\n if (iframeRef.current?.contentWindow) {\n iframeRef.current.contentWindow.postMessage(\n { source: 'imagecanvaskit-embed', ...payload },\n '*'\n );\n }\n }, []);\n\n // Handle incoming messages from iframe\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n // Verify origin in production\n if (baseUrl && !event.origin.includes(new URL(baseUrl).hostname)) {\n return;\n }\n\n const data = event.data as ImageCanvasKitEvent;\n if (!data || typeof data !== 'object' || !data.type) return;\n\n switch (data.type) {\n case 'ready':\n onReady?.(data as ImageCanvasKitEvent<ReadyEventData>);\n // Load project data if provided\n if (projectData) {\n sendCommand({ command: 'load', projectData });\n }\n break;\n case 'export':\n onExport?.(data as ImageCanvasKitEvent<ExportEventData>);\n break;\n case 'save':\n onSave?.(data as ImageCanvasKitEvent<SaveEventData>);\n break;\n case 'load':\n onLoad?.(data as ImageCanvasKitEvent<LoadEventData>);\n break;\n case 'error':\n onError?.(data as ImageCanvasKitEvent<ErrorEventData>);\n break;\n case 'resize':\n onResize?.(data as ImageCanvasKitEvent<ResizeEventData>);\n break;\n case 'objectSelected':\n onObjectSelected?.(data as ImageCanvasKitEvent<ObjectSelectedEventData>);\n break;\n case 'objectDeselected':\n onObjectDeselected?.(data as ImageCanvasKitEvent<void>);\n break;\n case 'canvasModified':\n onCanvasModified?.(data as ImageCanvasKitEvent<CanvasModifiedEventData>);\n break;\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [\n baseUrl,\n projectData,\n onReady,\n onExport,\n onSave,\n onLoad,\n onError,\n onResize,\n onObjectSelected,\n onObjectDeselected,\n onCanvasModified,\n sendCommand,\n ]);\n\n // Expose instance methods via ref\n useImperativeHandle(\n ref,\n () => ({\n sendCommand,\n export: (options) => sendCommand({ command: 'export', ...options }),\n save: () => sendCommand({ command: 'save' }),\n load: (options) => sendCommand({ command: 'load', ...options }),\n clear: () => sendCommand({ command: 'clear' }),\n undo: () => sendCommand({ command: 'undo' }),\n redo: () => sendCommand({ command: 'redo' }),\n addText: (options) => sendCommand({ command: 'addText', ...options }),\n addImage: (options) => sendCommand({ command: 'addImage', ...options }),\n addShape: (options) => sendCommand({ command: 'addShape', ...options }),\n setBackground: (options) => sendCommand({ command: 'setBackground', ...options }),\n resize: (w, h) => sendCommand({ command: 'resize', width: w, height: h }),\n destroy: () => {\n // Cleanup if needed\n },\n }),\n [sendCommand]\n );\n\n return (\n <div className={className} style={style}>\n <iframe\n ref={iframeRef}\n src={editorUrl}\n width={iframeWidth}\n height={iframeHeight}\n style={{\n border: 'none',\n display: 'block',\n }}\n allow=\"clipboard-read; clipboard-write\"\n title=\"ImageCanvasKit Editor\"\n />\n </div>\n );\n }\n);\n\n"]}
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { m as ImageCanvasKitProps, l as ImageCanvasKitInstance } from './types-C7ZIsAaA.cjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* ImageCanvasKit React Component
|
|
6
|
+
*
|
|
7
|
+
* Embeds the ImageCanvasKit editor in your React application.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* import { ImageCanvasKit } from '@imagecanvaskit/embed';
|
|
12
|
+
*
|
|
13
|
+
* function App() {
|
|
14
|
+
* const editorRef = useRef<ImageCanvasKitInstance>(null);
|
|
15
|
+
*
|
|
16
|
+
* return (
|
|
17
|
+
* <ImageCanvasKit
|
|
18
|
+
* ref={editorRef}
|
|
19
|
+
* apiKey="your-api-key"
|
|
20
|
+
* width={1200}
|
|
21
|
+
* height={800}
|
|
22
|
+
* onExport={(e) => console.log('Exported:', e.data)}
|
|
23
|
+
* onReady={() => console.log('Editor ready!')}
|
|
24
|
+
* />
|
|
25
|
+
* );
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare const ImageCanvasKit: react.ForwardRefExoticComponent<ImageCanvasKitProps & react.RefAttributes<ImageCanvasKitInstance>>;
|
|
30
|
+
|
|
31
|
+
export { ImageCanvasKit };
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { m as ImageCanvasKitProps, l as ImageCanvasKitInstance } from './types-C7ZIsAaA.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* ImageCanvasKit React Component
|
|
6
|
+
*
|
|
7
|
+
* Embeds the ImageCanvasKit editor in your React application.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* import { ImageCanvasKit } from '@imagecanvaskit/embed';
|
|
12
|
+
*
|
|
13
|
+
* function App() {
|
|
14
|
+
* const editorRef = useRef<ImageCanvasKitInstance>(null);
|
|
15
|
+
*
|
|
16
|
+
* return (
|
|
17
|
+
* <ImageCanvasKit
|
|
18
|
+
* ref={editorRef}
|
|
19
|
+
* apiKey="your-api-key"
|
|
20
|
+
* width={1200}
|
|
21
|
+
* height={800}
|
|
22
|
+
* onExport={(e) => console.log('Exported:', e.data)}
|
|
23
|
+
* onReady={() => console.log('Editor ready!')}
|
|
24
|
+
* />
|
|
25
|
+
* );
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare const ImageCanvasKit: react.ForwardRefExoticComponent<ImageCanvasKitProps & react.RefAttributes<ImageCanvasKitInstance>>;
|
|
30
|
+
|
|
31
|
+
export { ImageCanvasKit };
|