labellife-design-tool 1.3.0 → 1.3.2
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/lib/lib/index.js +371 -368
- package/dist/lib/wordpress.js +386 -370
- package/dist/types/CanvasEditor.d.ts +4 -3
- package/dist/types/CanvasEditor.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/lib/lib/index.js
CHANGED
|
@@ -547,11 +547,8 @@ function initJsxCompat() {
|
|
|
547
547
|
}
|
|
548
548
|
|
|
549
549
|
// src/CanvasEditor.tsx
|
|
550
|
-
import React17, { useRef as useRef4, useEffect as useEffect4, useMemo, useCallback as useCallback4 } from "react";
|
|
550
|
+
import React17, { useRef as useRef4, useEffect as useEffect4, useMemo, useCallback as useCallback4, forwardRef, useImperativeHandle } from "react";
|
|
551
551
|
import { Stage, Layer, Rect as Rect2 } from "react-konva";
|
|
552
|
-
import {
|
|
553
|
-
PlusCircle
|
|
554
|
-
} from "lucide-react";
|
|
555
552
|
|
|
556
553
|
// src/elements/EditableTextElement.tsx
|
|
557
554
|
import React, { useRef, useEffect } from "react";
|
|
@@ -2717,350 +2714,87 @@ var RightSidebar = ({
|
|
|
2717
2714
|
}), /* @__PURE__ */ React16.createElement("span", null, "Delete"))));
|
|
2718
2715
|
};
|
|
2719
2716
|
var RightSidebar_default = RightSidebar;
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
2724
|
-
|
|
2725
|
-
|
|
2726
|
-
_selectedIds;
|
|
2727
|
-
_tool;
|
|
2728
|
-
_zoom;
|
|
2729
|
-
_selectedShape;
|
|
2730
|
-
_listeners = {};
|
|
2731
|
-
constructor(initialDesign) {
|
|
2732
|
-
this._design = {
|
|
2733
|
-
id: initialDesign?.id || `design-${Date.now()}`,
|
|
2734
|
-
name: initialDesign?.name || "Untitled Design",
|
|
2735
|
-
width: initialDesign?.width || 800,
|
|
2736
|
-
height: initialDesign?.height || 600,
|
|
2737
|
-
pages: initialDesign?.pages || [],
|
|
2738
|
-
fonts: initialDesign?.fonts || [],
|
|
2739
|
-
colors: initialDesign?.colors || [],
|
|
2740
|
-
templateInputs: initialDesign?.templateInputs
|
|
2741
|
-
};
|
|
2742
|
-
this._activePageId = initialDesign?.pages?.[0]?.id || null;
|
|
2743
|
-
this._activePanelId = null;
|
|
2744
|
-
this._selectedId = null;
|
|
2745
|
-
this._selectedIds = [];
|
|
2746
|
-
this._tool = "select";
|
|
2747
|
-
this._zoom = 1;
|
|
2748
|
-
this._selectedShape = "rect";
|
|
2749
|
-
}
|
|
2750
|
-
on(event, callback) {
|
|
2751
|
-
this._listeners[event] = callback;
|
|
2752
|
-
}
|
|
2753
|
-
off(event) {
|
|
2754
|
-
delete this._listeners[event];
|
|
2755
|
-
}
|
|
2756
|
-
emit(event, ...args) {
|
|
2757
|
-
const callback = this._listeners[event];
|
|
2758
|
-
if (callback) {
|
|
2759
|
-
callback(...args);
|
|
2760
|
-
}
|
|
2761
|
-
}
|
|
2762
|
-
get design() {
|
|
2763
|
-
return this._design;
|
|
2764
|
-
}
|
|
2765
|
-
get width() {
|
|
2766
|
-
return this._design.width;
|
|
2767
|
-
}
|
|
2768
|
-
get height() {
|
|
2769
|
-
return this._design.height;
|
|
2770
|
-
}
|
|
2771
|
-
get activePage() {
|
|
2772
|
-
const page = this._design.pages.find((p) => p.id === this._activePageId) || null;
|
|
2773
|
-
if (!page)
|
|
2774
|
-
return null;
|
|
2775
|
-
return {
|
|
2776
|
-
...page,
|
|
2777
|
-
addElement: (element) => {
|
|
2778
|
-
this.addElement(element);
|
|
2779
|
-
}
|
|
2780
|
-
};
|
|
2781
|
-
}
|
|
2782
|
-
get activePageId() {
|
|
2783
|
-
return this._activePageId;
|
|
2784
|
-
}
|
|
2785
|
-
get activePanelId() {
|
|
2786
|
-
return this._activePanelId;
|
|
2787
|
-
}
|
|
2788
|
-
get selectedId() {
|
|
2789
|
-
return this._selectedId;
|
|
2790
|
-
}
|
|
2791
|
-
get selectedIds() {
|
|
2792
|
-
return this._selectedIds;
|
|
2793
|
-
}
|
|
2794
|
-
get tool() {
|
|
2795
|
-
return this._tool;
|
|
2796
|
-
}
|
|
2797
|
-
get zoom() {
|
|
2798
|
-
return this._zoom;
|
|
2799
|
-
}
|
|
2800
|
-
get selectedShape() {
|
|
2801
|
-
return this._selectedShape;
|
|
2802
|
-
}
|
|
2803
|
-
setDesign(design) {
|
|
2804
|
-
this._design = design;
|
|
2805
|
-
if (design.pages.find((p) => p.id === this._activePageId)) {} else if (design.pages.length > 0) {
|
|
2806
|
-
this._activePageId = design.pages[0].id;
|
|
2807
|
-
}
|
|
2808
|
-
this.emit("designChanged", this._design);
|
|
2809
|
-
this.emit("activePageChanged", this._activePageId);
|
|
2810
|
-
}
|
|
2811
|
-
updateDesign(updates) {
|
|
2812
|
-
this._design = { ...this._design, ...updates };
|
|
2813
|
-
this.emit("designChanged", this._design);
|
|
2814
|
-
}
|
|
2815
|
-
setSize(width, height) {
|
|
2816
|
-
this._design.width = width;
|
|
2817
|
-
this._design.height = height;
|
|
2818
|
-
this.emit("designChanged", this._design);
|
|
2717
|
+
|
|
2718
|
+
// src/CanvasEditor.tsx
|
|
2719
|
+
var CanvasEditor = forwardRef(({ name, config, store }, ref) => {
|
|
2720
|
+
if (!store) {
|
|
2721
|
+
console.error("CanvasEditor: store prop is required but was not provided");
|
|
2722
|
+
return /* @__PURE__ */ React17.createElement("div", null, "Error: Store is required");
|
|
2819
2723
|
}
|
|
2820
|
-
|
|
2821
|
-
|
|
2822
|
-
|
|
2823
|
-
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
|
|
2827
|
-
|
|
2724
|
+
const stageRef = useRef4(null);
|
|
2725
|
+
const fileInputRef = useRef4(null);
|
|
2726
|
+
const jsonInputRef = useRef4(null);
|
|
2727
|
+
const containerRef = useRef4(null);
|
|
2728
|
+
const currentPage = store.design?.pages.find((p) => p.id === store.activePageId) || store.design?.pages[0] || null;
|
|
2729
|
+
const selectedElement = currentPage?.elements.find((el) => el.id === store.selectedId) || null;
|
|
2730
|
+
useEffect4(() => {
|
|
2731
|
+
const handleDesignChange = (newDesign) => {};
|
|
2732
|
+
const handleActivePageChange = (pageId) => {};
|
|
2733
|
+
const handleActivePanelChange = (panelId) => {};
|
|
2734
|
+
const handleSelectedIdChange = (selectedId) => {};
|
|
2735
|
+
const handleSelectedIdsChange = (selectedIds) => {};
|
|
2736
|
+
const handleToolChange = (tool) => {};
|
|
2737
|
+
const handleZoomChange = (zoom) => {};
|
|
2738
|
+
const handleSelectedShapeChange = (shape) => {};
|
|
2739
|
+
store.on("designChanged", handleDesignChange);
|
|
2740
|
+
store.on("activePageChanged", handleActivePageChange);
|
|
2741
|
+
store.on("activePanelChanged", handleActivePanelChange);
|
|
2742
|
+
store.on("selectedIdChanged", handleSelectedIdChange);
|
|
2743
|
+
store.on("selectedIdsChanged", handleSelectedIdsChange);
|
|
2744
|
+
store.on("toolChanged", handleToolChange);
|
|
2745
|
+
store.on("zoomChanged", handleZoomChange);
|
|
2746
|
+
store.on("selectedShapeChanged", handleSelectedShapeChange);
|
|
2747
|
+
return () => {
|
|
2748
|
+
store.off("designChanged");
|
|
2749
|
+
store.off("activePageChanged");
|
|
2750
|
+
store.off("activePanelChanged");
|
|
2751
|
+
store.off("selectedIdChanged");
|
|
2752
|
+
store.off("selectedIdsChanged");
|
|
2753
|
+
store.off("toolChanged");
|
|
2754
|
+
store.off("zoomChanged");
|
|
2755
|
+
store.off("selectedShapeChanged");
|
|
2828
2756
|
};
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
|
|
2832
|
-
|
|
2757
|
+
}, [store]);
|
|
2758
|
+
const handleStageClick = useCallback4((e) => {
|
|
2759
|
+
const clickedOnEmpty = e.target === e.target.getStage();
|
|
2760
|
+
if (clickedOnEmpty) {
|
|
2761
|
+
store.setSelectedId(null);
|
|
2762
|
+
store.setSelectedIds([]);
|
|
2833
2763
|
}
|
|
2834
|
-
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
deletePages(pageIds) {
|
|
2838
|
-
const remainingPages = this._design.pages.filter((p) => !pageIds.includes(p.id));
|
|
2839
|
-
if (remainingPages.length === 0) {
|
|
2840
|
-
console.warn("Cannot delete all pages. At least one page must remain.");
|
|
2764
|
+
}, [store]);
|
|
2765
|
+
const addText = useCallback4(() => {
|
|
2766
|
+
if (!store?.activePage)
|
|
2841
2767
|
return;
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
this
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
if (!
|
|
2853
|
-
console.warn("addElement: No active page!");
|
|
2768
|
+
store.activePage.addElement({
|
|
2769
|
+
type: "text",
|
|
2770
|
+
text: "Edit this text",
|
|
2771
|
+
x: (store.design?.width || 800) / 2 - 50,
|
|
2772
|
+
y: (store.design?.height || 600) / 2 - 15,
|
|
2773
|
+
width: 100,
|
|
2774
|
+
height: 30
|
|
2775
|
+
});
|
|
2776
|
+
}, [store]);
|
|
2777
|
+
const addShape = useCallback4((shapeType) => {
|
|
2778
|
+
if (!store?.activePage)
|
|
2854
2779
|
return;
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
width: element.width || 100,
|
|
2863
|
-
height: element.height || 100,
|
|
2864
|
-
rotation: element.rotation || 0,
|
|
2865
|
-
visible: element.visible !== false,
|
|
2866
|
-
locked: element.locked || false,
|
|
2867
|
-
opacity: element.opacity || 1,
|
|
2868
|
-
...element
|
|
2869
|
-
};
|
|
2870
|
-
page.elements.push(newElement);
|
|
2871
|
-
this.emit("designChanged", this._design);
|
|
2872
|
-
}
|
|
2873
|
-
openSidePanel(panelId) {
|
|
2874
|
-
this._activePanelId = panelId;
|
|
2875
|
-
this.emit("activePanelChanged", panelId);
|
|
2876
|
-
}
|
|
2877
|
-
setSelectedId(selectedId) {
|
|
2878
|
-
this._selectedId = selectedId;
|
|
2879
|
-
this.emit("selectedIdChanged", selectedId);
|
|
2880
|
-
}
|
|
2881
|
-
setSelectedIds(selectedIds) {
|
|
2882
|
-
this._selectedIds = selectedIds;
|
|
2883
|
-
this.emit("selectedIdsChanged", selectedIds);
|
|
2884
|
-
}
|
|
2885
|
-
setTool(tool) {
|
|
2886
|
-
this._tool = tool;
|
|
2887
|
-
this.emit("toolChanged", tool);
|
|
2888
|
-
}
|
|
2889
|
-
setZoom(zoom) {
|
|
2890
|
-
this._zoom = zoom;
|
|
2891
|
-
this.emit("zoomChanged", zoom);
|
|
2892
|
-
}
|
|
2893
|
-
setSelectedShape(shape) {
|
|
2894
|
-
this._selectedShape = shape;
|
|
2895
|
-
this.emit("selectedShapeChanged", shape);
|
|
2896
|
-
}
|
|
2897
|
-
async toBlob(type = "png") {
|
|
2898
|
-
return new Promise((resolve, reject) => {
|
|
2899
|
-
try {
|
|
2900
|
-
Promise.resolve().then(() => exports_exportImportUtils).then(({ canvasToBlob: canvasToBlob2 }) => {
|
|
2901
|
-
const canvas = document.createElement("canvas");
|
|
2902
|
-
canvas.width = this._design.width;
|
|
2903
|
-
canvas.height = this._design.height;
|
|
2904
|
-
const ctx = canvas.getContext("2d");
|
|
2905
|
-
if (!ctx) {
|
|
2906
|
-
reject(new Error("Failed to get canvas context"));
|
|
2907
|
-
return;
|
|
2908
|
-
}
|
|
2909
|
-
ctx.fillStyle = "#ffffff";
|
|
2910
|
-
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
2911
|
-
const mimeType = type === "jpg" ? "image/jpeg" : "image/png";
|
|
2912
|
-
const quality = type === "jpg" ? 0.9 : undefined;
|
|
2913
|
-
canvas.toBlob((blob) => {
|
|
2914
|
-
if (blob) {
|
|
2915
|
-
resolve(blob);
|
|
2916
|
-
} else {
|
|
2917
|
-
reject(new Error("Failed to create blob"));
|
|
2918
|
-
}
|
|
2919
|
-
}, mimeType, quality);
|
|
2920
|
-
});
|
|
2921
|
-
} catch (error) {
|
|
2922
|
-
reject(error);
|
|
2923
|
-
}
|
|
2780
|
+
store.activePage.addElement({
|
|
2781
|
+
type: "shape",
|
|
2782
|
+
shapeType,
|
|
2783
|
+
x: (store.design?.width || 800) / 2 - 50,
|
|
2784
|
+
y: (store.design?.height || 600) / 2 - 50,
|
|
2785
|
+
width: 100,
|
|
2786
|
+
height: 100
|
|
2924
2787
|
});
|
|
2925
|
-
}
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
for (const page of this._design.pages) {
|
|
2936
|
-
const elementIndex = page.elements.findIndex((e) => e.id === elementId);
|
|
2937
|
-
if (elementIndex !== -1) {
|
|
2938
|
-
page.elements[elementIndex] = { ...page.elements[elementIndex], ...updates };
|
|
2939
|
-
this.emit("designChanged", this._design);
|
|
2940
|
-
return;
|
|
2941
|
-
}
|
|
2942
|
-
}
|
|
2943
|
-
}
|
|
2944
|
-
deleteElement(elementId) {
|
|
2945
|
-
for (const page of this._design.pages) {
|
|
2946
|
-
const elementIndex = page.elements.findIndex((e) => e.id === elementId);
|
|
2947
|
-
if (elementIndex !== -1) {
|
|
2948
|
-
page.elements.splice(elementIndex, 1);
|
|
2949
|
-
this.emit("designChanged", this._design);
|
|
2950
|
-
return;
|
|
2951
|
-
}
|
|
2952
|
-
}
|
|
2953
|
-
}
|
|
2954
|
-
async loadJSON(jsonData) {
|
|
2955
|
-
return new Promise((resolve, reject) => {
|
|
2956
|
-
try {
|
|
2957
|
-
Promise.resolve().then(() => exports_exportImportUtils).then(({ importFromJSONData: importFromJSONData2 }) => {
|
|
2958
|
-
importFromJSONData2(jsonData, (loadedDesign) => {
|
|
2959
|
-
this.setDesign(loadedDesign);
|
|
2960
|
-
resolve();
|
|
2961
|
-
}, (errorMessage) => {
|
|
2962
|
-
reject(new Error(errorMessage));
|
|
2963
|
-
}, () => {
|
|
2964
|
-
reject(new Error("Templates requiring user inputs are not yet supported in standalone store"));
|
|
2965
|
-
});
|
|
2966
|
-
});
|
|
2967
|
-
} catch (error) {
|
|
2968
|
-
reject(error);
|
|
2969
|
-
}
|
|
2970
|
-
});
|
|
2971
|
-
}
|
|
2972
|
-
}
|
|
2973
|
-
var createSimpleStore = (initialDesign) => {
|
|
2974
|
-
return new SimpleCanvasStore(initialDesign);
|
|
2975
|
-
};
|
|
2976
|
-
|
|
2977
|
-
// src/CanvasEditor.tsx
|
|
2978
|
-
var CanvasEditor = ({
|
|
2979
|
-
name,
|
|
2980
|
-
config,
|
|
2981
|
-
store: externalStore
|
|
2982
|
-
}) => {
|
|
2983
|
-
const store = externalStore || createSimpleStore({
|
|
2984
|
-
name,
|
|
2985
|
-
width: 800,
|
|
2986
|
-
height: 600
|
|
2987
|
-
});
|
|
2988
|
-
const stageRef = useRef4(null);
|
|
2989
|
-
const fileInputRef = useRef4(null);
|
|
2990
|
-
const jsonInputRef = useRef4(null);
|
|
2991
|
-
const containerRef = useRef4(null);
|
|
2992
|
-
const currentPage = store.design.pages.find((p) => p.id === store.activePageId) || store.design.pages[0] || null;
|
|
2993
|
-
const selectedElement = currentPage?.elements.find((el) => el.id === store.selectedId) || null;
|
|
2994
|
-
useEffect4(() => {
|
|
2995
|
-
if (externalStore) {
|
|
2996
|
-
const handleDesignChange = (newDesign) => {};
|
|
2997
|
-
const handleActivePageChange = (pageId) => {};
|
|
2998
|
-
const handleActivePanelChange = (panelId) => {};
|
|
2999
|
-
const handleSelectedIdChange = (selectedId) => {};
|
|
3000
|
-
const handleSelectedIdsChange = (selectedIds) => {};
|
|
3001
|
-
const handleToolChange = (tool) => {};
|
|
3002
|
-
const handleZoomChange = (zoom) => {};
|
|
3003
|
-
const handleSelectedShapeChange = (shape) => {};
|
|
3004
|
-
externalStore.on("designChanged", handleDesignChange);
|
|
3005
|
-
externalStore.on("activePageChanged", handleActivePageChange);
|
|
3006
|
-
externalStore.on("activePanelChanged", handleActivePanelChange);
|
|
3007
|
-
externalStore.on("selectedIdChanged", handleSelectedIdChange);
|
|
3008
|
-
externalStore.on("selectedIdsChanged", handleSelectedIdsChange);
|
|
3009
|
-
externalStore.on("toolChanged", handleToolChange);
|
|
3010
|
-
externalStore.on("zoomChanged", handleZoomChange);
|
|
3011
|
-
externalStore.on("selectedShapeChanged", handleSelectedShapeChange);
|
|
3012
|
-
return () => {
|
|
3013
|
-
externalStore.off("designChanged");
|
|
3014
|
-
externalStore.off("activePageChanged");
|
|
3015
|
-
externalStore.off("activePanelChanged");
|
|
3016
|
-
externalStore.off("selectedIdChanged");
|
|
3017
|
-
externalStore.off("selectedIdsChanged");
|
|
3018
|
-
externalStore.off("toolChanged");
|
|
3019
|
-
externalStore.off("zoomChanged");
|
|
3020
|
-
externalStore.off("selectedShapeChanged");
|
|
3021
|
-
};
|
|
3022
|
-
}
|
|
3023
|
-
}, [externalStore]);
|
|
3024
|
-
const handleStageClick = useCallback4((e) => {
|
|
3025
|
-
const clickedOnEmpty = e.target === e.target.getStage();
|
|
3026
|
-
if (clickedOnEmpty) {
|
|
3027
|
-
store.setSelectedId(null);
|
|
3028
|
-
store.setSelectedIds([]);
|
|
3029
|
-
}
|
|
3030
|
-
}, [store]);
|
|
3031
|
-
const addText = useCallback4(() => {
|
|
3032
|
-
if (!store.activePage)
|
|
3033
|
-
return;
|
|
3034
|
-
store.activePage.addElement({
|
|
3035
|
-
type: "text",
|
|
3036
|
-
text: "Edit this text",
|
|
3037
|
-
x: store.design.width / 2 - 50,
|
|
3038
|
-
y: store.design.height / 2 - 15,
|
|
3039
|
-
width: 100,
|
|
3040
|
-
height: 30
|
|
3041
|
-
});
|
|
3042
|
-
}, [store]);
|
|
3043
|
-
const addShape = useCallback4((shapeType) => {
|
|
3044
|
-
if (!store.activePage)
|
|
3045
|
-
return;
|
|
3046
|
-
store.activePage.addElement({
|
|
3047
|
-
type: "shape",
|
|
3048
|
-
shapeType,
|
|
3049
|
-
x: store.design.width / 2 - 50,
|
|
3050
|
-
y: store.design.height / 2 - 50,
|
|
3051
|
-
width: 100,
|
|
3052
|
-
height: 100
|
|
3053
|
-
});
|
|
3054
|
-
}, [store]);
|
|
3055
|
-
const updateElement = useCallback4((id, attrs) => {
|
|
3056
|
-
store.updateElement(id, attrs);
|
|
3057
|
-
}, [store]);
|
|
3058
|
-
const deleteSelected = useCallback4(() => {
|
|
3059
|
-
if (store.selectedId || store.selectedIds.length > 0) {
|
|
3060
|
-
const idsToDelete = store.selectedIds.length > 0 ? store.selectedIds : [store.selectedId];
|
|
3061
|
-
idsToDelete.forEach((id) => store.deleteElement(id));
|
|
3062
|
-
store.setSelectedId(null);
|
|
3063
|
-
store.setSelectedIds([]);
|
|
2788
|
+
}, [store]);
|
|
2789
|
+
const updateElement = useCallback4((id, attrs) => {
|
|
2790
|
+
store.updateElement(id, attrs);
|
|
2791
|
+
}, [store]);
|
|
2792
|
+
const deleteSelected = useCallback4(() => {
|
|
2793
|
+
if (store.selectedId || store.selectedIds.length > 0) {
|
|
2794
|
+
const idsToDelete = store.selectedIds.length > 0 ? store.selectedIds : [store.selectedId];
|
|
2795
|
+
idsToDelete.forEach((id) => store.deleteElement(id));
|
|
2796
|
+
store.setSelectedId(null);
|
|
2797
|
+
store.setSelectedIds([]);
|
|
3064
2798
|
}
|
|
3065
2799
|
}, [store]);
|
|
3066
2800
|
const duplicateSelected = useCallback4(() => {
|
|
@@ -3078,12 +2812,6 @@ var CanvasEditor = ({
|
|
|
3078
2812
|
}, [selectedElement, store]);
|
|
3079
2813
|
const moveElementUp = useCallback4((id) => {}, [store]);
|
|
3080
2814
|
const moveElementDown = useCallback4((id) => {}, [store]);
|
|
3081
|
-
const addPage = useCallback4(() => {
|
|
3082
|
-
store.addPage();
|
|
3083
|
-
}, [store]);
|
|
3084
|
-
const deletePage = useCallback4((pageId) => {
|
|
3085
|
-
store.deletePages([pageId]);
|
|
3086
|
-
}, [store]);
|
|
3087
2815
|
const panelConfigs = useMemo(() => {
|
|
3088
2816
|
const builtInConfigs = {
|
|
3089
2817
|
elements: { id: "elements", title: "Elements", component: ElementPanel_default, props: { onAddShape: addShape, store } },
|
|
@@ -3172,12 +2900,12 @@ var CanvasEditor = ({
|
|
|
3172
2900
|
reader.onload = (event) => {
|
|
3173
2901
|
const img = new window.Image;
|
|
3174
2902
|
img.onload = () => {
|
|
3175
|
-
if (store
|
|
2903
|
+
if (store?.activePage) {
|
|
3176
2904
|
store.activePage.addElement({
|
|
3177
2905
|
type: "image",
|
|
3178
2906
|
src: event.target?.result,
|
|
3179
|
-
x: store.design
|
|
3180
|
-
y: store.design
|
|
2907
|
+
x: (store.design?.width || 800) / 2 - img.width / 2,
|
|
2908
|
+
y: (store.design?.height || 600) / 2 - img.height / 2,
|
|
3181
2909
|
width: img.width,
|
|
3182
2910
|
height: img.height
|
|
3183
2911
|
});
|
|
@@ -3188,6 +2916,31 @@ var CanvasEditor = ({
|
|
|
3188
2916
|
reader.readAsDataURL(file);
|
|
3189
2917
|
}
|
|
3190
2918
|
}, [store]);
|
|
2919
|
+
useImperativeHandle(ref, () => ({
|
|
2920
|
+
stage: stageRef.current,
|
|
2921
|
+
exportToPNG: () => {
|
|
2922
|
+
Promise.resolve().then(() => exports_exportImportUtils).then(({ exportToPNG: exportToPNG2 }) => {
|
|
2923
|
+
exportToPNG2(stageRef.current, store.design);
|
|
2924
|
+
});
|
|
2925
|
+
},
|
|
2926
|
+
exportToJPG: () => {
|
|
2927
|
+
Promise.resolve().then(() => exports_exportImportUtils).then(({ exportToJPG: exportToJPG2 }) => {
|
|
2928
|
+
exportToJPG2(stageRef.current, store.design);
|
|
2929
|
+
});
|
|
2930
|
+
},
|
|
2931
|
+
exportToJSON: () => {
|
|
2932
|
+
Promise.resolve().then(() => exports_exportImportUtils).then(({ exportToJSON: exportToJSON2 }) => {
|
|
2933
|
+
exportToJSON2(store.design);
|
|
2934
|
+
});
|
|
2935
|
+
},
|
|
2936
|
+
getDesign: () => store.design,
|
|
2937
|
+
setCanvasSize: (width, height) => {
|
|
2938
|
+
store.updateDesign({ width, height });
|
|
2939
|
+
},
|
|
2940
|
+
loadDesign: async (jsonData) => {
|
|
2941
|
+
await store.loadJSON(jsonData);
|
|
2942
|
+
}
|
|
2943
|
+
}), [stageRef.current, store.design]);
|
|
3191
2944
|
return /* @__PURE__ */ React17.createElement("div", {
|
|
3192
2945
|
className: "w-full h-full flex flex-col bg-gray-900"
|
|
3193
2946
|
}, /* @__PURE__ */ React17.createElement(Header_default, {
|
|
@@ -3222,10 +2975,9 @@ var CanvasEditor = ({
|
|
|
3222
2975
|
className: "text-center"
|
|
3223
2976
|
}, /* @__PURE__ */ React17.createElement("p", {
|
|
3224
2977
|
className: "mb-4"
|
|
3225
|
-
}, "No pages available"), /* @__PURE__ */ React17.createElement("
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
}, "Add Page"))) : /* @__PURE__ */ React17.createElement("div", {
|
|
2978
|
+
}, "No pages available"), /* @__PURE__ */ React17.createElement("p", {
|
|
2979
|
+
className: "text-sm"
|
|
2980
|
+
}, "Please add pages through your store management"))) : /* @__PURE__ */ React17.createElement("div", {
|
|
3229
2981
|
className: "absolute inset-0 flex items-center justify-center"
|
|
3230
2982
|
}, /* @__PURE__ */ React17.createElement("div", {
|
|
3231
2983
|
className: "bg-white shadow-2xl",
|
|
@@ -3235,15 +2987,15 @@ var CanvasEditor = ({
|
|
|
3235
2987
|
}
|
|
3236
2988
|
}, /* @__PURE__ */ React17.createElement(Stage, {
|
|
3237
2989
|
ref: stageRef,
|
|
3238
|
-
width: store.design
|
|
3239
|
-
height: store.design
|
|
2990
|
+
width: store.design?.width || 800,
|
|
2991
|
+
height: store.design?.height || 600,
|
|
3240
2992
|
onClick: handleStageClick,
|
|
3241
2993
|
onTap: handleStageClick
|
|
3242
2994
|
}, /* @__PURE__ */ React17.createElement(Layer, null, /* @__PURE__ */ React17.createElement(React17.Fragment, null, /* @__PURE__ */ React17.createElement(Rect2, {
|
|
3243
2995
|
x: 0,
|
|
3244
2996
|
y: 0,
|
|
3245
|
-
width: store.design
|
|
3246
|
-
height: store.design
|
|
2997
|
+
width: store.design?.width || 800,
|
|
2998
|
+
height: store.design?.height || 600,
|
|
3247
2999
|
fill: currentPage.backgroundImageObject ? undefined : currentPage.background,
|
|
3248
3000
|
fillPatternImage: currentPage.backgroundImageObject,
|
|
3249
3001
|
fillPatternRepeat: "no-repeat"
|
|
@@ -3287,17 +3039,11 @@ var CanvasEditor = ({
|
|
|
3287
3039
|
}
|
|
3288
3040
|
})))))), config?.multiPage && /* @__PURE__ */ React17.createElement("div", {
|
|
3289
3041
|
className: "absolute bottom-4 left-4 flex items-center space-x-2"
|
|
3290
|
-
}, store.design
|
|
3042
|
+
}, (store.design?.pages || []).map((page, index) => /* @__PURE__ */ React17.createElement("button", {
|
|
3291
3043
|
key: page.id,
|
|
3292
3044
|
onClick: () => store.setActivePage(page.id),
|
|
3293
3045
|
className: `px-3 py-1 rounded text-sm ${page.id === store.activePageId ? "bg-blue-600 text-white" : "bg-gray-800 text-gray-300 hover:bg-gray-700"}`
|
|
3294
|
-
}, "Page ", index + 1)), /* @__PURE__ */ React17.createElement(
|
|
3295
|
-
onClick: addPage,
|
|
3296
|
-
className: "px-3 py-1 rounded text-sm bg-gray-800 text-gray-300 hover:bg-gray-700",
|
|
3297
|
-
title: "Add Page"
|
|
3298
|
-
}, /* @__PURE__ */ React17.createElement(PlusCircle, {
|
|
3299
|
-
className: "w-4 h-4"
|
|
3300
|
-
})))), /* @__PURE__ */ React17.createElement(RightSidebar_default, {
|
|
3046
|
+
}, "Page ", index + 1)))), /* @__PURE__ */ React17.createElement(RightSidebar_default, {
|
|
3301
3047
|
currentPageElements: currentPage?.elements || [],
|
|
3302
3048
|
selectedElement,
|
|
3303
3049
|
selectedId: store.selectedId,
|
|
@@ -3320,8 +3066,265 @@ var CanvasEditor = ({
|
|
|
3320
3066
|
onChange: handleImportJSON,
|
|
3321
3067
|
style: { display: "none" }
|
|
3322
3068
|
}));
|
|
3323
|
-
};
|
|
3069
|
+
});
|
|
3070
|
+
CanvasEditor.displayName = "CanvasEditor";
|
|
3324
3071
|
var CanvasEditor_default = CanvasEditor;
|
|
3072
|
+
// src/store/simpleStore.ts
|
|
3073
|
+
class SimpleCanvasStore {
|
|
3074
|
+
_design;
|
|
3075
|
+
_activePageId;
|
|
3076
|
+
_activePanelId;
|
|
3077
|
+
_selectedId;
|
|
3078
|
+
_selectedIds;
|
|
3079
|
+
_tool;
|
|
3080
|
+
_zoom;
|
|
3081
|
+
_selectedShape;
|
|
3082
|
+
_listeners = {};
|
|
3083
|
+
constructor(initialDesign) {
|
|
3084
|
+
this._design = {
|
|
3085
|
+
id: initialDesign?.id || `design-${Date.now()}`,
|
|
3086
|
+
name: initialDesign?.name || "Untitled Design",
|
|
3087
|
+
width: initialDesign?.width || 800,
|
|
3088
|
+
height: initialDesign?.height || 600,
|
|
3089
|
+
pages: initialDesign?.pages || [],
|
|
3090
|
+
fonts: initialDesign?.fonts || [],
|
|
3091
|
+
colors: initialDesign?.colors || [],
|
|
3092
|
+
templateInputs: initialDesign?.templateInputs
|
|
3093
|
+
};
|
|
3094
|
+
this._activePageId = initialDesign?.pages?.[0]?.id || null;
|
|
3095
|
+
this._activePanelId = null;
|
|
3096
|
+
this._selectedId = null;
|
|
3097
|
+
this._selectedIds = [];
|
|
3098
|
+
this._tool = "select";
|
|
3099
|
+
this._zoom = 1;
|
|
3100
|
+
this._selectedShape = "rect";
|
|
3101
|
+
}
|
|
3102
|
+
on(event, callback) {
|
|
3103
|
+
this._listeners[event] = callback;
|
|
3104
|
+
}
|
|
3105
|
+
off(event) {
|
|
3106
|
+
delete this._listeners[event];
|
|
3107
|
+
}
|
|
3108
|
+
emit(event, ...args) {
|
|
3109
|
+
const callback = this._listeners[event];
|
|
3110
|
+
if (callback) {
|
|
3111
|
+
callback(...args);
|
|
3112
|
+
}
|
|
3113
|
+
}
|
|
3114
|
+
get design() {
|
|
3115
|
+
return this._design;
|
|
3116
|
+
}
|
|
3117
|
+
get width() {
|
|
3118
|
+
return this._design.width;
|
|
3119
|
+
}
|
|
3120
|
+
get height() {
|
|
3121
|
+
return this._design.height;
|
|
3122
|
+
}
|
|
3123
|
+
get activePage() {
|
|
3124
|
+
const page = this._design.pages.find((p) => p.id === this._activePageId) || null;
|
|
3125
|
+
if (!page)
|
|
3126
|
+
return null;
|
|
3127
|
+
return {
|
|
3128
|
+
...page,
|
|
3129
|
+
addElement: (element) => {
|
|
3130
|
+
this.addElement(element);
|
|
3131
|
+
}
|
|
3132
|
+
};
|
|
3133
|
+
}
|
|
3134
|
+
get activePageId() {
|
|
3135
|
+
return this._activePageId;
|
|
3136
|
+
}
|
|
3137
|
+
get activePanelId() {
|
|
3138
|
+
return this._activePanelId;
|
|
3139
|
+
}
|
|
3140
|
+
get selectedId() {
|
|
3141
|
+
return this._selectedId;
|
|
3142
|
+
}
|
|
3143
|
+
get selectedIds() {
|
|
3144
|
+
return this._selectedIds;
|
|
3145
|
+
}
|
|
3146
|
+
get tool() {
|
|
3147
|
+
return this._tool;
|
|
3148
|
+
}
|
|
3149
|
+
get zoom() {
|
|
3150
|
+
return this._zoom;
|
|
3151
|
+
}
|
|
3152
|
+
get selectedShape() {
|
|
3153
|
+
return this._selectedShape;
|
|
3154
|
+
}
|
|
3155
|
+
setDesign(design) {
|
|
3156
|
+
this._design = design;
|
|
3157
|
+
if (design.pages.find((p) => p.id === this._activePageId)) {} else if (design.pages.length > 0) {
|
|
3158
|
+
this._activePageId = design.pages[0].id;
|
|
3159
|
+
}
|
|
3160
|
+
this.emit("designChanged", this._design);
|
|
3161
|
+
this.emit("activePageChanged", this._activePageId);
|
|
3162
|
+
}
|
|
3163
|
+
updateDesign(updates) {
|
|
3164
|
+
this._design = { ...this._design, ...updates };
|
|
3165
|
+
this.emit("designChanged", this._design);
|
|
3166
|
+
}
|
|
3167
|
+
setSize(width, height) {
|
|
3168
|
+
this._design.width = width;
|
|
3169
|
+
this._design.height = height;
|
|
3170
|
+
this.emit("designChanged", this._design);
|
|
3171
|
+
}
|
|
3172
|
+
addPage(page) {
|
|
3173
|
+
console.log(`addPage called - Current pages: ${this._design.pages.length}, New page ID: ${page?.id || `page-${Date.now()}`}`);
|
|
3174
|
+
const newPage = {
|
|
3175
|
+
id: page?.id || `page-${Date.now()}`,
|
|
3176
|
+
name: page?.name || `Page ${this._design.pages.length + 1}`,
|
|
3177
|
+
elements: page?.elements || [],
|
|
3178
|
+
background: page?.background || "#ffffff",
|
|
3179
|
+
backgroundImageObject: page?.backgroundImageObject
|
|
3180
|
+
};
|
|
3181
|
+
this._design.pages.push(newPage);
|
|
3182
|
+
if (!this._activePageId || this._design.pages.length === 1) {
|
|
3183
|
+
this._activePageId = newPage.id;
|
|
3184
|
+
this.emit("activePageChanged", this._activePageId);
|
|
3185
|
+
}
|
|
3186
|
+
this.emit("designChanged", this._design);
|
|
3187
|
+
return newPage.id;
|
|
3188
|
+
}
|
|
3189
|
+
deletePages(pageIds) {
|
|
3190
|
+
const remainingPages = this._design.pages.filter((p) => !pageIds.includes(p.id));
|
|
3191
|
+
if (remainingPages.length === 0) {
|
|
3192
|
+
console.warn("Cannot delete all pages. At least one page must remain.");
|
|
3193
|
+
return;
|
|
3194
|
+
}
|
|
3195
|
+
if (pageIds.includes(this._activePageId)) {
|
|
3196
|
+
this._activePageId = remainingPages[0].id;
|
|
3197
|
+
this.emit("activePageChanged", this._activePageId);
|
|
3198
|
+
}
|
|
3199
|
+
this._design.pages = remainingPages;
|
|
3200
|
+
this.emit("designChanged", this._design);
|
|
3201
|
+
}
|
|
3202
|
+
addElement(element) {
|
|
3203
|
+
const page = this.activePage;
|
|
3204
|
+
if (!page) {
|
|
3205
|
+
console.warn("addElement: No active page!");
|
|
3206
|
+
return;
|
|
3207
|
+
}
|
|
3208
|
+
const newElement = {
|
|
3209
|
+
id: element.id || `element-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
3210
|
+
type: element.type,
|
|
3211
|
+
name: element.name || `${element.type} element`,
|
|
3212
|
+
x: element.x || 0,
|
|
3213
|
+
y: element.y || 0,
|
|
3214
|
+
width: element.width || 100,
|
|
3215
|
+
height: element.height || 100,
|
|
3216
|
+
rotation: element.rotation || 0,
|
|
3217
|
+
visible: element.visible !== false,
|
|
3218
|
+
locked: element.locked || false,
|
|
3219
|
+
opacity: element.opacity || 1,
|
|
3220
|
+
...element
|
|
3221
|
+
};
|
|
3222
|
+
page.elements.push(newElement);
|
|
3223
|
+
this.emit("designChanged", this._design);
|
|
3224
|
+
}
|
|
3225
|
+
openSidePanel(panelId) {
|
|
3226
|
+
this._activePanelId = panelId;
|
|
3227
|
+
this.emit("activePanelChanged", panelId);
|
|
3228
|
+
}
|
|
3229
|
+
setSelectedId(selectedId) {
|
|
3230
|
+
this._selectedId = selectedId;
|
|
3231
|
+
this.emit("selectedIdChanged", selectedId);
|
|
3232
|
+
}
|
|
3233
|
+
setSelectedIds(selectedIds) {
|
|
3234
|
+
this._selectedIds = selectedIds;
|
|
3235
|
+
this.emit("selectedIdsChanged", selectedIds);
|
|
3236
|
+
}
|
|
3237
|
+
setTool(tool) {
|
|
3238
|
+
this._tool = tool;
|
|
3239
|
+
this.emit("toolChanged", tool);
|
|
3240
|
+
}
|
|
3241
|
+
setZoom(zoom) {
|
|
3242
|
+
this._zoom = zoom;
|
|
3243
|
+
this.emit("zoomChanged", zoom);
|
|
3244
|
+
}
|
|
3245
|
+
setSelectedShape(shape) {
|
|
3246
|
+
this._selectedShape = shape;
|
|
3247
|
+
this.emit("selectedShapeChanged", shape);
|
|
3248
|
+
}
|
|
3249
|
+
async toBlob(type = "png") {
|
|
3250
|
+
return new Promise((resolve, reject) => {
|
|
3251
|
+
try {
|
|
3252
|
+
Promise.resolve().then(() => exports_exportImportUtils).then(({ canvasToBlob: canvasToBlob2 }) => {
|
|
3253
|
+
const canvas = document.createElement("canvas");
|
|
3254
|
+
canvas.width = this._design.width;
|
|
3255
|
+
canvas.height = this._design.height;
|
|
3256
|
+
const ctx = canvas.getContext("2d");
|
|
3257
|
+
if (!ctx) {
|
|
3258
|
+
reject(new Error("Failed to get canvas context"));
|
|
3259
|
+
return;
|
|
3260
|
+
}
|
|
3261
|
+
ctx.fillStyle = "#ffffff";
|
|
3262
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
3263
|
+
const mimeType = type === "jpg" ? "image/jpeg" : "image/png";
|
|
3264
|
+
const quality = type === "jpg" ? 0.9 : undefined;
|
|
3265
|
+
canvas.toBlob((blob) => {
|
|
3266
|
+
if (blob) {
|
|
3267
|
+
resolve(blob);
|
|
3268
|
+
} else {
|
|
3269
|
+
reject(new Error("Failed to create blob"));
|
|
3270
|
+
}
|
|
3271
|
+
}, mimeType, quality);
|
|
3272
|
+
});
|
|
3273
|
+
} catch (error) {
|
|
3274
|
+
reject(error);
|
|
3275
|
+
}
|
|
3276
|
+
});
|
|
3277
|
+
}
|
|
3278
|
+
setActivePage(pageId) {
|
|
3279
|
+
const page = this._design.pages.find((p) => p.id === pageId);
|
|
3280
|
+
if (page) {
|
|
3281
|
+
this._activePageId = pageId;
|
|
3282
|
+
this.emit("activePageChanged", pageId);
|
|
3283
|
+
this.emit("designChanged", this._design);
|
|
3284
|
+
}
|
|
3285
|
+
}
|
|
3286
|
+
updateElement(elementId, updates) {
|
|
3287
|
+
for (const page of this._design.pages) {
|
|
3288
|
+
const elementIndex = page.elements.findIndex((e) => e.id === elementId);
|
|
3289
|
+
if (elementIndex !== -1) {
|
|
3290
|
+
page.elements[elementIndex] = { ...page.elements[elementIndex], ...updates };
|
|
3291
|
+
this.emit("designChanged", this._design);
|
|
3292
|
+
return;
|
|
3293
|
+
}
|
|
3294
|
+
}
|
|
3295
|
+
}
|
|
3296
|
+
deleteElement(elementId) {
|
|
3297
|
+
for (const page of this._design.pages) {
|
|
3298
|
+
const elementIndex = page.elements.findIndex((e) => e.id === elementId);
|
|
3299
|
+
if (elementIndex !== -1) {
|
|
3300
|
+
page.elements.splice(elementIndex, 1);
|
|
3301
|
+
this.emit("designChanged", this._design);
|
|
3302
|
+
return;
|
|
3303
|
+
}
|
|
3304
|
+
}
|
|
3305
|
+
}
|
|
3306
|
+
async loadJSON(jsonData) {
|
|
3307
|
+
return new Promise((resolve, reject) => {
|
|
3308
|
+
try {
|
|
3309
|
+
Promise.resolve().then(() => exports_exportImportUtils).then(({ importFromJSONData: importFromJSONData2 }) => {
|
|
3310
|
+
importFromJSONData2(jsonData, (loadedDesign) => {
|
|
3311
|
+
this.setDesign(loadedDesign);
|
|
3312
|
+
resolve();
|
|
3313
|
+
}, (errorMessage) => {
|
|
3314
|
+
reject(new Error(errorMessage));
|
|
3315
|
+
}, () => {
|
|
3316
|
+
reject(new Error("Templates requiring user inputs are not yet supported in standalone store"));
|
|
3317
|
+
});
|
|
3318
|
+
});
|
|
3319
|
+
} catch (error) {
|
|
3320
|
+
reject(error);
|
|
3321
|
+
}
|
|
3322
|
+
});
|
|
3323
|
+
}
|
|
3324
|
+
}
|
|
3325
|
+
var createSimpleStore = (initialDesign) => {
|
|
3326
|
+
return new SimpleCanvasStore(initialDesign);
|
|
3327
|
+
};
|
|
3325
3328
|
// src/context/CanvasStoreContext.tsx
|
|
3326
3329
|
import { createContext, useContext } from "react";
|
|
3327
3330
|
var CanvasStoreContext = createContext(null);
|