@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/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":"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","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"]}
@@ -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 };
@@ -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 };