customized-fabric 1.5.1 → 1.5.3

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,11 @@
1
+ export declare const CURVED_TEXT_OBJECT_ATTRIBUTES: {
2
+ name: string;
3
+ type: string;
4
+ maxFontSize: number;
5
+ stroke: {
6
+ stroke: string;
7
+ strokeDashArray: number[];
8
+ strokeWidth: number;
9
+ };
10
+ };
11
+ export declare const PARENT_ATTRIBUTES: string[];
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PARENT_ATTRIBUTES = exports.CURVED_TEXT_OBJECT_ATTRIBUTES = void 0;
4
+ exports.CURVED_TEXT_OBJECT_ATTRIBUTES = {
5
+ name: "Curved text",
6
+ type: "CURVED_TEXT",
7
+ maxFontSize: 200,
8
+ stroke: {
9
+ stroke: "#000000",
10
+ strokeDashArray: [5, 5],
11
+ strokeWidth: 2,
12
+ },
13
+ };
14
+ exports.PARENT_ATTRIBUTES = ["top", "left", "width", "height", "angle"];
@@ -0,0 +1,58 @@
1
+ import { fabric } from "fabric";
2
+ import { ICurvedTextOptions } from "./interfaces";
3
+ import { ObjectId } from "../utils/objectId";
4
+ export declare const toCurvedTextObject: (object: CurvedText) => {
5
+ _id: ObjectId | undefined;
6
+ id: ObjectId | undefined;
7
+ personalizeId: number | undefined;
8
+ layerId: number | undefined;
9
+ name: string | undefined;
10
+ locked: boolean | undefined;
11
+ fontId: number | undefined;
12
+ fontCategoryId: string | undefined;
13
+ fontUrl: string | undefined;
14
+ isAdditional: boolean | undefined;
15
+ text: {
16
+ fontWeight: string | number | undefined;
17
+ fontSize: number | undefined;
18
+ textAlign: string | undefined;
19
+ text: string | undefined;
20
+ fill: string | fabric.Gradient | fabric.Pattern | undefined;
21
+ width: number | undefined;
22
+ height: number | undefined;
23
+ fontFamily: string | undefined;
24
+ maxFontSize: any;
25
+ stroke: string | undefined;
26
+ strokeWidth: number | undefined;
27
+ prefix: any;
28
+ infix: any;
29
+ suffix: any;
30
+ curvedWidth: any;
31
+ pathSide: any;
32
+ pathStartOffset: any;
33
+ };
34
+ };
35
+ export default class CurvedText extends fabric.Group {
36
+ _id?: ObjectId;
37
+ layerId?: number;
38
+ locked?: boolean;
39
+ textObject?: fabric.IText;
40
+ fontId?: number;
41
+ fontCategoryId?: string;
42
+ fontUrl?: string;
43
+ isAdditional?: boolean;
44
+ setText?: (text: string) => void;
45
+ setPrefix?: (text: string) => void;
46
+ setInfix?: (text: string) => void;
47
+ setSuffix?: (text: string) => void;
48
+ setMaxFontSize?: (fontSize: string) => void;
49
+ setFontFamily?: (fontName: string, fontUrl?: string) => void;
50
+ setTextAttributes?: (options: fabric.ITextOptions) => void;
51
+ getTextAttribute?: (attribute: string) => any;
52
+ getSettings?: (attribute: string) => any;
53
+ setSizes?: (options: {
54
+ width?: number;
55
+ height?: number;
56
+ }) => void;
57
+ constructor(options?: ICurvedTextOptions);
58
+ }
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toCurvedTextObject = void 0;
4
+ const fabric_1 = require("fabric");
5
+ const constants_1 = require("./constants");
6
+ const utils_1 = require("../utils");
7
+ const objectId_1 = require("../utils/objectId");
8
+ const svg_util_1 = require("../utils/svg.util");
9
+ const CurvedTextClass = fabric_1.fabric.util.createClass(fabric_1.fabric.Group, {
10
+ initialize: function (options) {
11
+ const { text, ...rest } = options ?? {};
12
+ this.rectObject = new fabric_1.fabric.Rect({
13
+ width: options?.width,
14
+ height: options?.height,
15
+ fill: undefined,
16
+ originX: "center",
17
+ originY: "center",
18
+ objectCaching: false,
19
+ ...constants_1.CURVED_TEXT_OBJECT_ATTRIBUTES.stroke,
20
+ });
21
+ this.textObject = new fabric_1.fabric.IText("", {
22
+ originX: "center",
23
+ originY: "center",
24
+ textAlign: "center",
25
+ objectCaching: false,
26
+ ...text,
27
+ });
28
+ const group = new fabric_1.fabric.Group([this.rectObject, this.textObject]);
29
+ this.set(group);
30
+ this.on("scaling", () => {
31
+ let width = this.width * this.scaleX;
32
+ let height = this.height * this.scaleY;
33
+ const attributes = {
34
+ scaleX: 1,
35
+ scaleY: 1,
36
+ width,
37
+ height,
38
+ };
39
+ this.set(attributes);
40
+ this.rectObject.set(attributes);
41
+ this.calculateTextPath(width, height);
42
+ this.canvas?.renderAll?.();
43
+ });
44
+ this.set({
45
+ _id: new objectId_1.ObjectId().toString(),
46
+ name: constants_1.CURVED_TEXT_OBJECT_ATTRIBUTES.name,
47
+ type: constants_1.CURVED_TEXT_OBJECT_ATTRIBUTES.type,
48
+ ...rest,
49
+ layerId: options?.personalizeId ?? options?.layerId,
50
+ objectCaching: false,
51
+ });
52
+ this.autoChangeFontSize(0.1);
53
+ this.calculateTextPath(this.width, this.height);
54
+ if (options?.isOriginal) {
55
+ this.rectObject?.set({ strokeWidth: 0 });
56
+ }
57
+ else {
58
+ if (options?.hideStroke) {
59
+ this.rectObject?.set({ strokeWidth: 0 });
60
+ }
61
+ if (options?.fontUrl) {
62
+ (0, utils_1.loadFontFromUrl)(options?.fontUrl, text?.fontFamily ?? "").then(() => {
63
+ this.canvas?.renderAll?.();
64
+ });
65
+ }
66
+ }
67
+ },
68
+ autoChangeFontSize: function (changeSpeed) {
69
+ if (this.textObject.curvedWidth <= this.textObject.__lineWidths) {
70
+ while (this.textObject.curvedWidth <= this.textObject.__lineWidths) {
71
+ this.textObject.set({
72
+ fontSize: this.textObject.fontSize - changeSpeed,
73
+ });
74
+ this.canvas?.renderAll?.();
75
+ }
76
+ }
77
+ else {
78
+ while (this.textObject.maxFontSize > this.textObject.fontSize &&
79
+ this.textObject.curvedWidth > this.textObject.__lineWidths) {
80
+ this.textObject.set({
81
+ fontSize: this.textObject.fontSize + changeSpeed,
82
+ });
83
+ this.canvas?.renderAll?.();
84
+ }
85
+ }
86
+ },
87
+ setText: function (text) {
88
+ this.textObject.set({
89
+ text,
90
+ });
91
+ this.canvas?.renderAll?.();
92
+ this.autoChangeFontSize(0.1);
93
+ },
94
+ setPrefix: function (text) {
95
+ this.textObject.set({
96
+ prefix: text,
97
+ });
98
+ this.getText();
99
+ },
100
+ setInfix: function (text) {
101
+ this.textObject.set({
102
+ infix: text,
103
+ });
104
+ this.getText();
105
+ },
106
+ setSuffix: function (text) {
107
+ this.textObject.set({
108
+ suffix: text,
109
+ });
110
+ this.getText();
111
+ },
112
+ getText: function () {
113
+ const { prefix = "", infix = "", suffix = "" } = this.textObject;
114
+ this.setText(infix?.length > 0 ? prefix + infix + suffix : "");
115
+ },
116
+ setMaxFontSize: function (fontSize) {
117
+ this.textObject.set({
118
+ fontSize,
119
+ });
120
+ this.canvas?.renderAll?.();
121
+ if (this.textObject.__lineWidths < this.textObject.curvedWidth) {
122
+ }
123
+ else {
124
+ this.autoChangeFontSize(1);
125
+ }
126
+ this.textObject.set({
127
+ maxFontSize: fontSize,
128
+ });
129
+ this.canvas?.renderAll?.();
130
+ },
131
+ setFontFamily: async function (fontName, fontUrl) {
132
+ if (!(0, utils_1.isFontLoaded)(fontName)) {
133
+ await (0, utils_1.loadFontFromUrl)(fontUrl ?? "", fontName);
134
+ }
135
+ this.textObject.set({ fontFamily: fontName });
136
+ this.canvas?.renderAll?.();
137
+ this.autoChangeFontSize(0.1);
138
+ this.canvas?.renderAll?.();
139
+ },
140
+ setSizes: function (options) {
141
+ const { width, height } = options;
142
+ if (width && width > this.textObject.__lineWidths) {
143
+ this.set({ width });
144
+ this.textObject.set({ width });
145
+ }
146
+ if (height && height > this.textObject.height) {
147
+ this.set({ height });
148
+ }
149
+ this.canvas?.renderAll?.();
150
+ },
151
+ setTextAttributes: function (options) {
152
+ this.textObject.set(options);
153
+ this.canvas?.renderAll?.();
154
+ },
155
+ getTextAttribute: function (attribute) {
156
+ return this.textObject.get(attribute);
157
+ },
158
+ getSettings: function (attribute) {
159
+ if (constants_1.PARENT_ATTRIBUTES.includes(attribute)) {
160
+ return this.get(attribute);
161
+ }
162
+ return this.textObject.get(attribute);
163
+ },
164
+ calculateTextPath: function (width, height) {
165
+ const pathSide = this.textObject.pathSide;
166
+ const textHeight = 0;
167
+ const rx = (width - textHeight) / 2;
168
+ const ry = (height - textHeight) / 2;
169
+ const path = new fabric_1.fabric.Path((0, svg_util_1.getEllipsePath)(rx, ry), {
170
+ fill: undefined,
171
+ stroke: "black",
172
+ objectCaching: false,
173
+ originX: "center",
174
+ originY: "center",
175
+ });
176
+ this.pathObject = path;
177
+ const pathInfo = fabric_1.fabric.util?.getPathSegmentsInfo?.(path.path);
178
+ this.textObject.set({
179
+ path,
180
+ pathLength: pathInfo?.[(pathInfo?.length ?? 0) - 1]?.length,
181
+ });
182
+ },
183
+ });
184
+ const toCurvedTextObject = (object) => {
185
+ const textObject = object.textObject;
186
+ return {
187
+ _id: object?._id,
188
+ id: object?._id,
189
+ personalizeId: object?.layerId,
190
+ layerId: object?.layerId,
191
+ name: object?.name,
192
+ locked: object?.locked,
193
+ fontId: object?.fontId,
194
+ fontCategoryId: object?.fontCategoryId,
195
+ fontUrl: object?.fontUrl,
196
+ isAdditional: object?.isAdditional,
197
+ text: {
198
+ fontWeight: textObject?.fontWeight,
199
+ fontSize: textObject?.fontSize,
200
+ textAlign: textObject?.textAlign,
201
+ text: textObject?.text,
202
+ fill: textObject?.fill,
203
+ width: textObject?.width,
204
+ height: textObject?.height,
205
+ fontFamily: textObject?.fontFamily,
206
+ maxFontSize: textObject?.maxFontSize,
207
+ stroke: textObject?.stroke,
208
+ strokeWidth: textObject?.strokeWidth,
209
+ prefix: textObject?.prefix,
210
+ infix: textObject?.infix,
211
+ suffix: textObject?.suffix,
212
+ curvedWidth: textObject?.curvedWidth,
213
+ pathSide: textObject?.pathSide,
214
+ pathStartOffset: textObject?.pathStartOffset,
215
+ },
216
+ };
217
+ };
218
+ exports.toCurvedTextObject = toCurvedTextObject;
219
+ class CurvedText extends fabric_1.fabric.Group {
220
+ constructor(options) {
221
+ super();
222
+ return new CurvedTextClass(options);
223
+ }
224
+ }
225
+ exports.default = CurvedText;
@@ -0,0 +1,27 @@
1
+ import { ObjectId } from "../utils/objectId";
2
+ export interface ICurvedTextOptions extends fabric.IGroupOptions {
3
+ _id?: ObjectId;
4
+ personalizeId?: string;
5
+ layerId: number;
6
+ text: {
7
+ fontSize?: number;
8
+ fill?: string;
9
+ width?: number;
10
+ height?: number;
11
+ textAlign?: string;
12
+ fontWeight?: string;
13
+ text: string;
14
+ fontFamily?: string;
15
+ maxFontSize: number;
16
+ stroke?: string;
17
+ strokeWidth?: number;
18
+ prefix?: string;
19
+ infix?: string;
20
+ suffix?: string;
21
+ curvedWidth?: number;
22
+ };
23
+ fontUrl?: string;
24
+ isOriginal?: boolean;
25
+ isAdditional?: boolean;
26
+ hideStroke?: boolean;
27
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -230,9 +230,9 @@ const ImagePlaceholderClass = fabric_1.fabric.util.createClass(fabric_1.fabric.G
230
230
  },
231
231
  loadCustomizedImage: async function (image) {
232
232
  if (image) {
233
- const { url, data, clipPath } = image;
233
+ const { url, filteredUrl, data, clipPath } = image;
234
234
  if (url && data && clipPath) {
235
- const loadedImage = await (0, utils_1.loadImageFromUrl)(url);
235
+ const loadedImage = await (0, utils_1.loadImageFromUrl)(filteredUrl ?? url);
236
236
  if (loadedImage) {
237
237
  const mask = await this.getMask();
238
238
  const { top, left, scaleX, width, angle, flipX, flipY, settings = {}, } = data;
@@ -18,6 +18,7 @@ export interface IClipPathOptions {
18
18
  }
19
19
  export interface IImageOptions {
20
20
  url: string;
21
+ filteredUrl?: string;
21
22
  data: {
22
23
  originX: string;
23
24
  originY: string;
@@ -1,5 +1,6 @@
1
1
  export declare const OBJECT_TYPES: {
2
2
  textInput: string;
3
+ curvedText: string;
3
4
  clipart: string;
4
5
  imagePlaceHolder: string;
5
6
  activeSelection: string;
package/lib/constants.js CHANGED
@@ -2,13 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OBJECT_TYPES = void 0;
4
4
  const constants_1 = require("./ClipartObject/constants");
5
- const constants_2 = require("./ImagePlaceholderObject/constants");
6
- const constants_3 = require("./LayoutGroupObject/constants");
7
- const constants_4 = require("./TextInputObject/constants");
5
+ const constants_2 = require("./CurvedTextObject/constants");
6
+ const constants_3 = require("./ImagePlaceholderObject/constants");
7
+ const constants_4 = require("./LayoutGroupObject/constants");
8
+ const constants_5 = require("./TextInputObject/constants");
8
9
  exports.OBJECT_TYPES = {
9
- textInput: constants_4.TEXT_INPUT_OBJECT_ATTRIBUTES.type,
10
+ textInput: constants_5.TEXT_INPUT_OBJECT_ATTRIBUTES.type,
11
+ curvedText: constants_2.CURVED_TEXT_OBJECT_ATTRIBUTES.type,
10
12
  clipart: constants_1.CLIPART_OBJECT_ATTRIBUTES.type,
11
- imagePlaceHolder: constants_2.IMAGE_PLACEHOLDER_OBJECT_ATTRIBUTES.type,
13
+ imagePlaceHolder: constants_3.IMAGE_PLACEHOLDER_OBJECT_ATTRIBUTES.type,
12
14
  activeSelection: "activeSelection",
13
- layoutGroup: constants_3.LAYOUT_GROUP_OBJECT_ATTRIBUTES.type,
15
+ layoutGroup: constants_4.LAYOUT_GROUP_OBJECT_ATTRIBUTES.type,
14
16
  };
package/lib/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import TextInput from "./TextInputObject";
2
+ import CurvedText from "./CurvedTextObject";
2
3
  import Clipart from "./ClipartObject";
3
4
  import ImagePlaceholder from "./ImagePlaceholderObject";
4
5
  import fabric, { lockObject, lockAllObjects, loadImageFromFile, loadImageFromUrl, getObject, asyncGetObject } from "./utils";
5
6
  import { OBJECT_TYPES } from "./constants";
6
7
  import { IMAGE_FILTER_TYPES } from "./ImagePlaceholderObject/constants";
7
8
  import LayoutGroup from "./LayoutGroupObject";
8
- export { fabric, TextInput, Clipart, ImagePlaceholder, LayoutGroup, lockObject, lockAllObjects, loadImageFromFile, loadImageFromUrl, getObject, asyncGetObject, OBJECT_TYPES, IMAGE_FILTER_TYPES, };
9
+ export { fabric, TextInput, Clipart, ImagePlaceholder, LayoutGroup, CurvedText, lockObject, lockAllObjects, loadImageFromFile, loadImageFromUrl, getObject, asyncGetObject, OBJECT_TYPES, IMAGE_FILTER_TYPES, };
package/lib/index.js CHANGED
@@ -26,9 +26,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.IMAGE_FILTER_TYPES = exports.OBJECT_TYPES = exports.asyncGetObject = exports.getObject = exports.loadImageFromUrl = exports.loadImageFromFile = exports.lockAllObjects = exports.lockObject = exports.LayoutGroup = exports.ImagePlaceholder = exports.Clipart = exports.TextInput = exports.fabric = void 0;
29
+ exports.IMAGE_FILTER_TYPES = exports.OBJECT_TYPES = exports.asyncGetObject = exports.getObject = exports.loadImageFromUrl = exports.loadImageFromFile = exports.lockAllObjects = exports.lockObject = exports.CurvedText = exports.LayoutGroup = exports.ImagePlaceholder = exports.Clipart = exports.TextInput = exports.fabric = void 0;
30
30
  const TextInputObject_1 = __importDefault(require("./TextInputObject"));
31
31
  exports.TextInput = TextInputObject_1.default;
32
+ const CurvedTextObject_1 = __importDefault(require("./CurvedTextObject"));
33
+ exports.CurvedText = CurvedTextObject_1.default;
32
34
  const ClipartObject_1 = __importDefault(require("./ClipartObject"));
33
35
  exports.Clipart = ClipartObject_1.default;
34
36
  const ImagePlaceholderObject_1 = __importDefault(require("./ImagePlaceholderObject"));
@@ -3,6 +3,7 @@ import Clipart from "../ClipartObject";
3
3
  import ImagePlaceholder from "../ImagePlaceholderObject";
4
4
  import TextInput from "../TextInputObject";
5
5
  import { ImageFilterType } from "../ImagePlaceholderObject/interfaces";
6
+ import CurvedText from "../CurvedTextObject";
6
7
  export declare const loadFontFromUrl: (url: string, name: string) => Promise<void>;
7
8
  export declare const isFontLoaded: (name: string) => boolean;
8
9
  export declare const loadImageFromFile: (image: File) => Promise<fabric.Image>;
@@ -16,7 +17,7 @@ export declare const lockAllObjects: (canvas: fabric.Canvas, locked: boolean, se
16
17
  export declare const getObject: (object: any, options?: {
17
18
  isOriginal?: boolean;
18
19
  hideStroke?: boolean;
19
- }) => Clipart | ImagePlaceholder | TextInput | undefined;
20
+ }) => Clipart | ImagePlaceholder | CurvedText | TextInput | undefined;
20
21
  export declare const asyncGetObject: (object: any, options?: {
21
22
  isOriginal?: boolean;
22
23
  }) => Promise<fabric.Image | Clipart | ImagePlaceholder | TextInput | undefined>;
@@ -29,6 +29,7 @@ const constants_1 = require("../constants");
29
29
  const ClipartObject_1 = __importStar(require("../ClipartObject"));
30
30
  const ImagePlaceholderObject_1 = __importStar(require("../ImagePlaceholderObject"));
31
31
  const TextInputObject_1 = __importStar(require("../TextInputObject"));
32
+ const CurvedTextObject_1 = __importStar(require("../CurvedTextObject"));
32
33
  const loadFontFromUrl = async (url, name) => {
33
34
  if (!name || !url)
34
35
  return;
@@ -148,6 +149,13 @@ const getObject = (object, options) => {
148
149
  });
149
150
  return imagePlaceHolderObject;
150
151
  }
152
+ case constants_1.OBJECT_TYPES.curvedText: {
153
+ const curvedTextObject = new CurvedTextObject_1.default({
154
+ ...object,
155
+ ...options,
156
+ });
157
+ return curvedTextObject;
158
+ }
151
159
  default:
152
160
  return;
153
161
  }
@@ -217,6 +225,9 @@ fabric_1.fabric.Object.prototype.toObject = (function (toObject) {
217
225
  case constants_1.OBJECT_TYPES.imagePlaceHolder: {
218
226
  return fabric_1.fabric.util.object.extend(toObject.call(this), (0, ImagePlaceholderObject_1.toImagePlaceholderObject)(this));
219
227
  }
228
+ case constants_1.OBJECT_TYPES.curvedText: {
229
+ return fabric_1.fabric.util.object.extend(toObject.call(this), (0, CurvedTextObject_1.toCurvedTextObject)(this));
230
+ }
220
231
  default: {
221
232
  return {};
222
233
  }
@@ -0,0 +1 @@
1
+ export declare const getEllipsePath: (rx: number, ry: number) => string;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEllipsePath = void 0;
4
+ const getEllipsePath = (rx, ry) => {
5
+ let output = `M 0,0`;
6
+ output += `a ${rx},${ry} 0 0,1 0,${ry * -2}`;
7
+ output += " ";
8
+ output += `a ${rx},${ry} 0 0,1 0,${ry * 2}`;
9
+ return output;
10
+ };
11
+ exports.getEllipsePath = getEllipsePath;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "customized-fabric",
3
- "version": "1.5.1",
3
+ "version": "1.5.3",
4
4
  "description": "Customized fabric",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",