@bensitu/image-editor 1.2.0 → 1.2.1

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.
@@ -0,0 +1,181 @@
1
+ // image-editor.d.ts - TypeScript declarations for @bensitu/image-editor
2
+
3
+ declare module '@bensitu/image-editor' {
4
+ import { Canvas, Image as FabricImage, Object as FabricObject } from 'fabric';
5
+
6
+ export interface LabelOptions {
7
+ getText?: (mask: MaskObject, maskIndex: number) => string;
8
+ create?: (mask: MaskObject, fabric: any) => FabricObject;
9
+ textOptions?: Record<string, any>;
10
+ }
11
+
12
+ export interface CropOptions {
13
+ minWidth?: number;
14
+ minHeight?: number;
15
+ padding?: number;
16
+ hideMasksDuringCrop?: boolean;
17
+ preserveMasksAfterCrop?: boolean;
18
+ allowRotationOfCropRect?: boolean;
19
+ }
20
+
21
+ export interface ImageEditorOptions {
22
+ canvasWidth?: number;
23
+ canvasHeight?: number;
24
+ backgroundColor?: string;
25
+ animationDuration?: number;
26
+ minScale?: number;
27
+ maxScale?: number;
28
+ scaleStep?: number;
29
+ rotationStep?: number;
30
+
31
+ expandCanvasToImage?: boolean;
32
+ fitImageToCanvas?: boolean;
33
+ coverImageToCanvas?: boolean;
34
+
35
+ downsampleOnLoad?: boolean;
36
+ downsampleMaxWidth?: number;
37
+ downsampleMaxHeight?: number;
38
+ downsampleQuality?: number;
39
+
40
+ exportMultiplier?: number;
41
+ exportImageAreaByDefault?: boolean;
42
+
43
+ defaultMaskWidth?: number;
44
+ defaultMaskHeight?: number;
45
+ maskRotatable?: boolean;
46
+ maskLabelOnSelect?: boolean;
47
+ maskLabelOffset?: number;
48
+ maskName?: string;
49
+
50
+ groupSelection?: boolean;
51
+
52
+ showPlaceholder?: boolean;
53
+ initialImageBase64?: string | null;
54
+ defaultDownloadFileName?: string;
55
+
56
+ label?: LabelOptions;
57
+ crop?: CropOptions;
58
+
59
+ onImageLoaded?: () => void;
60
+ onError?: (error: unknown, message: string) => void;
61
+ onWarning?: (error: unknown, message: string) => void;
62
+ }
63
+
64
+ export interface ElementIdMap {
65
+ canvas?: string;
66
+ canvasContainer?: string | null;
67
+ imgPlaceholder?: string;
68
+ scaleRate?: string;
69
+ rotationLeftInput?: string;
70
+ rotationRightInput?: string;
71
+ rotateLeftBtn?: string;
72
+ rotateRightBtn?: string;
73
+ addMaskBtn?: string;
74
+ removeMaskBtn?: string;
75
+ removeAllMasksBtn?: string;
76
+ mergeBtn?: string;
77
+ downloadBtn?: string;
78
+ maskList?: string;
79
+ zoomInBtn?: string;
80
+ zoomOutBtn?: string;
81
+ resetBtn?: string;
82
+ undoBtn?: string;
83
+ redoBtn?: string;
84
+ imageInput?: string;
85
+ uploadArea?: string;
86
+ cropBtn?: string;
87
+ applyCropBtn?: string;
88
+ cancelCropBtn?: string;
89
+ }
90
+
91
+ export interface MaskConfig {
92
+ shape?: 'rect' | 'circle' | 'ellipse' | 'polygon' | string;
93
+ width?: number | string | ((canvas: Canvas, options: ImageEditorOptions) => number);
94
+ height?: number | string | ((canvas: Canvas, options: ImageEditorOptions) => number);
95
+ radius?: number | string | ((canvas: Canvas, options: ImageEditorOptions) => number);
96
+ rx?: number | string | ((canvas: Canvas, options: ImageEditorOptions) => number);
97
+ ry?: number | string | ((canvas: Canvas, options: ImageEditorOptions) => number);
98
+ points?: Array<{ x: number; y: number }>;
99
+ color?: string;
100
+ alpha?: number;
101
+ gap?: number;
102
+ left?: number | string | ((canvas: Canvas, options: ImageEditorOptions) => number);
103
+ top?: number | string | ((canvas: Canvas, options: ImageEditorOptions) => number);
104
+ angle?: number;
105
+ selectable?: boolean;
106
+ hasControls?: boolean;
107
+ borderColor?: string;
108
+ cornerColor?: string;
109
+ cornerSize?: number;
110
+ transparentCorners?: boolean;
111
+ strokeUniform?: boolean;
112
+ styles?: Record<string, any>;
113
+ fabricGenerator?: (config: MaskConfig, canvas: Canvas, options: ImageEditorOptions) => FabricObject;
114
+ onCreate?: (mask: MaskObject, canvas: Canvas) => void;
115
+ }
116
+
117
+ export interface MaskObject extends FabricObject {
118
+ maskId: number;
119
+ maskName: string;
120
+ originalAlpha: number;
121
+ __label?: FabricObject;
122
+ }
123
+
124
+ export interface Base64ExportOptions {
125
+ exportImageArea?: boolean;
126
+ multiplier?: number;
127
+ }
128
+
129
+ export interface ImageFileExportOptions {
130
+ mergeMask?: boolean;
131
+ fileType?: 'jpeg' | 'jpg' | 'png' | 'webp' | 'image/jpeg' | 'image/png' | 'image/webp';
132
+ quality?: number;
133
+ multiplier?: number;
134
+ fileName?: string;
135
+ }
136
+
137
+ export class ImageEditor {
138
+ readonly options: ImageEditorOptions;
139
+ readonly canvas: Canvas | null;
140
+ readonly canvasEl: HTMLCanvasElement | null;
141
+ readonly containerEl: HTMLElement | null;
142
+ readonly originalImage: FabricImage | null;
143
+ readonly currentScale: number;
144
+ readonly currentRotation: number;
145
+ readonly maskCounter: number;
146
+ readonly isAnimating: boolean;
147
+ readonly isImageLoadedToCanvas: boolean;
148
+
149
+ constructor(options?: ImageEditorOptions);
150
+
151
+ init(idMap?: ElementIdMap): void;
152
+ loadImage(base64: string): Promise<void>;
153
+ isImageLoaded(): boolean;
154
+
155
+ scaleImage(factor: number): Promise<void>;
156
+ rotateImage(degrees: number): Promise<void>;
157
+ reset(): Promise<void>;
158
+
159
+ addMask(config?: MaskConfig): MaskObject | null;
160
+ removeSelectedMask(): void;
161
+ removeAllMasks(): void;
162
+
163
+ merge(): Promise<void>;
164
+ downloadImage(fileName?: string): void;
165
+ getImageBase64(opts?: Base64ExportOptions): Promise<string>;
166
+ exportImageFile(opts?: ImageFileExportOptions): Promise<File>;
167
+
168
+ enterCropMode(): void;
169
+ cancelCrop(): void;
170
+ applyCrop(): Promise<void>;
171
+
172
+ undo(): void;
173
+ redo(): void;
174
+ saveState(): void;
175
+ loadFromState(jsonString: string | object): void;
176
+
177
+ dispose(): void;
178
+ }
179
+
180
+ export default ImageEditor;
181
+ }
package/package.json CHANGED
@@ -1,71 +1,84 @@
1
- {
2
- "name": "@bensitu/image-editor",
3
- "version": "1.2.0",
4
- "description": "Lightweight canvas-based image editor",
5
- "main": "dist/image-editor.js",
6
- "module": "dist/image-editor.esm.js",
7
- "types": "image-editor.d.ts",
8
- "exports": {
9
- "import": "./dist/image-editor.esm.js",
10
- "require": "./dist/image-editor.iife.js"
11
- },
12
- "scripts": {
13
- "dev": "node esbuild.config.mjs --watch",
14
- "build": "node esbuild.config.mjs",
15
- "build:babel": "babel src --out-dir dist --copy-files",
16
- "lint": "eslint src --ext .js"
17
- },
18
- "repository": {
19
- "type": "git",
20
- "url": "git+https://github.com/bensitu/image-editor.git"
21
- },
22
- "author": "Ben Situ",
23
- "license": "MIT",
24
- "files": [
25
- "dist",
26
- "src"
27
- ],
28
- "peerDependencies": {
29
- "fabric": "^5.5.2"
30
- },
31
- "devDependencies": {
32
- "@babel/cli": "^7.22.9",
33
- "@babel/core": "^7.22.9",
34
- "@babel/preset-env": "^7.22.9",
35
- "esbuild": "^0.19.12",
36
- "esbuild-plugin-babel": "^0.2.3",
37
- "eslint": "^8.49.0"
38
- },
39
- "browserslist": [
40
- "defaults",
41
- "ie 11"
42
- ],
43
- "keywords": [
44
- "fabricjs",
45
- "image-editor",
46
- "javascript",
47
- "mask",
48
- "open-source"
49
- ],
50
- "directories": {
51
- "doc": "docs"
52
- },
53
- "bugs": {
54
- "url": "https://github.com/bensitu/image-editor/issues"
55
- },
56
- "homepage": "https://github.com/bensitu/image-editor#readme",
57
- "babel": {
58
- "presets": [
59
- [
60
- "@babel/preset-env",
61
- {
62
- "targets": {
63
- "ie": "11"
64
- },
65
- "useBuiltIns": false,
66
- "modules": false
67
- }
68
- ]
69
- ]
70
- }
71
- }
1
+ {
2
+ "name": "@bensitu/image-editor",
3
+ "version": "1.2.1",
4
+ "description": "Lightweight canvas-based image editor",
5
+ "main": "./dist/image-editor.js",
6
+ "module": "./dist/image-editor.esm.mjs",
7
+ "types": "./image-editor.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./image-editor.d.ts",
11
+ "import": "./dist/image-editor.esm.mjs",
12
+ "default": "./dist/image-editor.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "dev": "node esbuild.config.mjs --watch",
17
+ "build": "node esbuild.config.mjs",
18
+ "build:babel": "babel src --out-dir dist --copy-files",
19
+ "lint": "eslint src --ext .js",
20
+ "test": "npm run build && node --test tests/image-editor.test.mjs tests/package.test.mjs"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/bensitu/image-editor.git"
25
+ },
26
+ "author": "Ben Situ",
27
+ "license": "MIT",
28
+ "files": [
29
+ "dist",
30
+ "src",
31
+ "image-editor.d.ts"
32
+ ],
33
+ "peerDependencies": {
34
+ "fabric": "^5.5.2"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "devDependencies": {
40
+ "@babel/cli": "^7.22.9",
41
+ "@babel/core": "^7.22.9",
42
+ "@babel/preset-env": "^7.22.9",
43
+ "esbuild": "^0.19.12",
44
+ "esbuild-plugin-babel": "^0.2.3",
45
+ "eslint": "^8.49.0"
46
+ },
47
+ "browserslist": [
48
+ "Chrome >= 100",
49
+ "Firefox >= 100",
50
+ "Safari >= 15",
51
+ "Edge >= 100"
52
+ ],
53
+ "keywords": [
54
+ "fabricjs",
55
+ "image-editor",
56
+ "javascript",
57
+ "mask",
58
+ "open-source"
59
+ ],
60
+ "directories": {
61
+ "doc": "docs"
62
+ },
63
+ "bugs": {
64
+ "url": "https://github.com/bensitu/image-editor/issues"
65
+ },
66
+ "homepage": "https://github.com/bensitu/image-editor#readme",
67
+ "babel": {
68
+ "presets": [
69
+ [
70
+ "@babel/preset-env",
71
+ {
72
+ "targets": {
73
+ "chrome": "100",
74
+ "firefox": "100",
75
+ "safari": "15",
76
+ "edge": "100"
77
+ },
78
+ "useBuiltIns": false,
79
+ "modules": false
80
+ }
81
+ ]
82
+ ]
83
+ }
84
+ }
package/src/browser.js ADDED
@@ -0,0 +1,11 @@
1
+ import ImageEditor, { setFabric } from './image-editor.js';
2
+
3
+ const scope = typeof globalThis !== 'undefined'
4
+ ? globalThis
5
+ : (typeof self !== 'undefined' ? self : (typeof window !== 'undefined' ? window : null));
6
+
7
+ setFabric(scope && scope.fabric);
8
+
9
+ if (scope) {
10
+ scope.ImageEditor = ImageEditor;
11
+ }
package/src/esm.js ADDED
@@ -0,0 +1,9 @@
1
+ import fabricModule from 'fabric';
2
+ import ImageEditor, { setFabric } from './image-editor.js';
3
+
4
+ const fabricInstance = fabricModule && (fabricModule.fabric || fabricModule.default || fabricModule);
5
+
6
+ setFabric(fabricInstance);
7
+
8
+ export { ImageEditor };
9
+ export default ImageEditor;