@leapfrog/interactive-canvas 1.7.0 → 1.8.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/abstract-interactive-canvas.d.ts +6 -0
- package/dist/interactive-canvas.es.js +97 -1
- package/dist/interactive-canvas.interface.d.ts +7 -0
- package/dist/interactive-canvas.js +97 -1
- package/dist/object/impl/rich-text.d.ts +39 -0
- package/dist/types/object-type.enum.d.ts +2 -1
- package/package.json +1 -1
|
@@ -21,6 +21,7 @@ import { ISelectionData } from "./types/selection-data.interface";
|
|
|
21
21
|
import { ICanvasState } from "./types/canvas-state.interface";
|
|
22
22
|
import { ITextSelection } from "./mutator/mutable-text-style.interface";
|
|
23
23
|
import { fabric } from "fabric";
|
|
24
|
+
import { IRichText } from "./object/impl/rich-text";
|
|
24
25
|
export declare abstract class AbstractInteractiveCanvas implements IInteractiveCanvas {
|
|
25
26
|
fabric: any;
|
|
26
27
|
protected readonly fabricCanvas: fabric.Canvas;
|
|
@@ -188,6 +189,11 @@ export declare abstract class AbstractInteractiveCanvas implements IInteractiveC
|
|
|
188
189
|
* @inheritDoc
|
|
189
190
|
*/
|
|
190
191
|
addTextObject(): Promise<IText>;
|
|
192
|
+
/**
|
|
193
|
+
* @override
|
|
194
|
+
* @inheritDoc
|
|
195
|
+
*/
|
|
196
|
+
addRichTextObject(imageUrl: string, htmlContent: string): Promise<IRichText>;
|
|
191
197
|
/**
|
|
192
198
|
* @override
|
|
193
199
|
* @inheritDoc
|
|
@@ -391,7 +391,7 @@ var StackObjectsLayoutFunction = /** @class */ (function () {
|
|
|
391
391
|
StackObjectsLayoutFunction.prototype.execute = function (canvas) {
|
|
392
392
|
var canvasMargin = canvas.getMargin();
|
|
393
393
|
var canvasDimensions = canvas.getDimensions();
|
|
394
|
-
var allObjects = canvas.getObjectsByTypesInternal(ObjectType.TEXT, ObjectType.IMAGE, ObjectType.RECTANGLE, ObjectType.VERTICAL_RULE, ObjectType.HORIZONTAL_RULE);
|
|
394
|
+
var allObjects = canvas.getObjectsByTypesInternal(ObjectType.TEXT, ObjectType.RICH_TEXT, ObjectType.IMAGE, ObjectType.RECTANGLE, ObjectType.VERTICAL_RULE, ObjectType.HORIZONTAL_RULE);
|
|
395
395
|
var objects = _(allObjects)
|
|
396
396
|
.partition(function (object) { return object.isPinToBottom(); })
|
|
397
397
|
.value();
|
|
@@ -2415,8 +2415,60 @@ var ObjectType;
|
|
|
2415
2415
|
ObjectType["CUTOFF"] = "CUTOFF";
|
|
2416
2416
|
ObjectType["VERTICAL_RULE"] = "VERTICAL_RULE";
|
|
2417
2417
|
ObjectType["HORIZONTAL_RULE"] = "HORIZONTAL_RULE";
|
|
2418
|
+
ObjectType["RICH_TEXT"] = "RICH_TEXT";
|
|
2418
2419
|
})(ObjectType || (ObjectType = {}));
|
|
2419
2420
|
|
|
2421
|
+
var RichText = /** @class */ (function (_super) {
|
|
2422
|
+
__extends(RichText, _super);
|
|
2423
|
+
function RichText(canvas, fabricObject, persistedField) {
|
|
2424
|
+
var _this = _super.call(this, canvas, fabricObject, persistedField) || this;
|
|
2425
|
+
_this.data.type = ObjectType.RICH_TEXT;
|
|
2426
|
+
return _this;
|
|
2427
|
+
}
|
|
2428
|
+
Object.defineProperty(RichText.prototype, "htmlContent", {
|
|
2429
|
+
/**
|
|
2430
|
+
* @override
|
|
2431
|
+
* @inheritDoc
|
|
2432
|
+
*/
|
|
2433
|
+
get: function () {
|
|
2434
|
+
return this.data.userText;
|
|
2435
|
+
},
|
|
2436
|
+
/**
|
|
2437
|
+
* @override
|
|
2438
|
+
* @inheritDoc
|
|
2439
|
+
*/
|
|
2440
|
+
set: function (text) {
|
|
2441
|
+
this.data.userText = text;
|
|
2442
|
+
},
|
|
2443
|
+
enumerable: false,
|
|
2444
|
+
configurable: true
|
|
2445
|
+
});
|
|
2446
|
+
/**
|
|
2447
|
+
* @override
|
|
2448
|
+
* @inheritDoc
|
|
2449
|
+
*/
|
|
2450
|
+
RichText.prototype.setRichTextContent = function (renderedContentUrl, htmlContent) {
|
|
2451
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2452
|
+
var canvasWidthPx;
|
|
2453
|
+
return __generator(this, function (_a) {
|
|
2454
|
+
switch (_a.label) {
|
|
2455
|
+
case 0:
|
|
2456
|
+
canvasWidthPx = this.canvas.getDimensions().widthPx;
|
|
2457
|
+
if (!renderedContentUrl)
|
|
2458
|
+
return [2 /*return*/];
|
|
2459
|
+
this.htmlContent = htmlContent;
|
|
2460
|
+
return [4 /*yield*/, this.setImageUrl(renderedContentUrl)];
|
|
2461
|
+
case 1:
|
|
2462
|
+
_a.sent();
|
|
2463
|
+
this.setImageWidth(canvasWidthPx);
|
|
2464
|
+
return [2 /*return*/];
|
|
2465
|
+
}
|
|
2466
|
+
});
|
|
2467
|
+
});
|
|
2468
|
+
};
|
|
2469
|
+
return RichText;
|
|
2470
|
+
}(Image));
|
|
2471
|
+
|
|
2420
2472
|
var AbstractInteractiveCanvas = /** @class */ (function () {
|
|
2421
2473
|
function AbstractInteractiveCanvas(fabric, fabricCanvas, devicePixelRatio) {
|
|
2422
2474
|
this.fabric = fabric;
|
|
@@ -2784,6 +2836,48 @@ var AbstractInteractiveCanvas = /** @class */ (function () {
|
|
|
2784
2836
|
});
|
|
2785
2837
|
});
|
|
2786
2838
|
};
|
|
2839
|
+
/**
|
|
2840
|
+
* @override
|
|
2841
|
+
* @inheritDoc
|
|
2842
|
+
*/
|
|
2843
|
+
AbstractInteractiveCanvas.prototype.addRichTextObject = function (imageUrl, htmlContent) {
|
|
2844
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2845
|
+
var maxSizeScale, maxWidth, options;
|
|
2846
|
+
var _this = this;
|
|
2847
|
+
return __generator(this, function (_a) {
|
|
2848
|
+
switch (_a.label) {
|
|
2849
|
+
case 0:
|
|
2850
|
+
maxSizeScale = 2;
|
|
2851
|
+
maxWidth = this.dimensions$.value.widthPx / maxSizeScale;
|
|
2852
|
+
options = { crossOrigin: "anonymous" };
|
|
2853
|
+
return [4 /*yield*/, new Promise(function (resolve) {
|
|
2854
|
+
_this.fabric.Image.fromURL(imageUrl, function (fabricImage) {
|
|
2855
|
+
var id = _this.randomId();
|
|
2856
|
+
var newScale = 1;
|
|
2857
|
+
var curWidth = newScale * fabricImage.width;
|
|
2858
|
+
if (curWidth > maxWidth) {
|
|
2859
|
+
newScale = maxWidth / curWidth;
|
|
2860
|
+
}
|
|
2861
|
+
fabricImage.set({
|
|
2862
|
+
id: id,
|
|
2863
|
+
scaleX: newScale,
|
|
2864
|
+
scaleY: newScale
|
|
2865
|
+
});
|
|
2866
|
+
_this.fabricCanvas.add(fabricImage);
|
|
2867
|
+
var object = new RichText(_this, fabricImage);
|
|
2868
|
+
object.htmlContent = htmlContent;
|
|
2869
|
+
_this.trackNewObject(object);
|
|
2870
|
+
object.setImageWidth(_this.dimensions$.value.widthPx);
|
|
2871
|
+
_this.selectFabricObject(fabricImage);
|
|
2872
|
+
_this.syncObjectList();
|
|
2873
|
+
resolve(object);
|
|
2874
|
+
}, options);
|
|
2875
|
+
})];
|
|
2876
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
2877
|
+
}
|
|
2878
|
+
});
|
|
2879
|
+
});
|
|
2880
|
+
};
|
|
2787
2881
|
/**
|
|
2788
2882
|
* @override
|
|
2789
2883
|
* @inheritDoc
|
|
@@ -3201,6 +3295,8 @@ var AbstractInteractiveCanvas = /** @class */ (function () {
|
|
|
3201
3295
|
return new HorizontalRule(this, fabricObject, persistedField);
|
|
3202
3296
|
case ObjectType.VERTICAL_RULE:
|
|
3203
3297
|
return new VerticalRule(this, fabricObject, persistedField);
|
|
3298
|
+
case ObjectType.RICH_TEXT:
|
|
3299
|
+
return new RichText(this, fabricObject, persistedField);
|
|
3204
3300
|
default:
|
|
3205
3301
|
throw new Error("Unknown field type: [" + persistedField.type + "]");
|
|
3206
3302
|
}
|
|
@@ -19,6 +19,7 @@ import { ICanvasState } from "./types/canvas-state.interface";
|
|
|
19
19
|
import { AbstractCanvasObject } from "./object/abstract-canvas-object";
|
|
20
20
|
import { ObjectType } from "./types/object-type.enum";
|
|
21
21
|
import { fabric } from "fabric";
|
|
22
|
+
import { IRichText } from "./object/impl/rich-text";
|
|
22
23
|
/**
|
|
23
24
|
* New leapfrog canvas implementation c. 2019.
|
|
24
25
|
*/
|
|
@@ -146,6 +147,12 @@ export interface IInteractiveCanvas {
|
|
|
146
147
|
* Add a text object to the canvas.
|
|
147
148
|
*/
|
|
148
149
|
addTextObject(): Promise<IText>;
|
|
150
|
+
/**
|
|
151
|
+
* Add a rich text element to the canvas.
|
|
152
|
+
* @param imageUrl Url for text-rendered-as-image content.
|
|
153
|
+
* @param htmlContent Rich-text content as HTML.
|
|
154
|
+
*/
|
|
155
|
+
addRichTextObject(imageUrl: string, htmlContent: string): Promise<IRichText>;
|
|
149
156
|
/**
|
|
150
157
|
* Add a rectangle object to the canvas.
|
|
151
158
|
*/
|
|
@@ -393,7 +393,7 @@ var StackObjectsLayoutFunction = /** @class */ (function () {
|
|
|
393
393
|
StackObjectsLayoutFunction.prototype.execute = function (canvas) {
|
|
394
394
|
var canvasMargin = canvas.getMargin();
|
|
395
395
|
var canvasDimensions = canvas.getDimensions();
|
|
396
|
-
var allObjects = canvas.getObjectsByTypesInternal(exports.ObjectType.TEXT, exports.ObjectType.IMAGE, exports.ObjectType.RECTANGLE, exports.ObjectType.VERTICAL_RULE, exports.ObjectType.HORIZONTAL_RULE);
|
|
396
|
+
var allObjects = canvas.getObjectsByTypesInternal(exports.ObjectType.TEXT, exports.ObjectType.RICH_TEXT, exports.ObjectType.IMAGE, exports.ObjectType.RECTANGLE, exports.ObjectType.VERTICAL_RULE, exports.ObjectType.HORIZONTAL_RULE);
|
|
397
397
|
var objects = _(allObjects)
|
|
398
398
|
.partition(function (object) { return object.isPinToBottom(); })
|
|
399
399
|
.value();
|
|
@@ -2415,8 +2415,60 @@ var DefaultCanvasProfile = /** @class */ (function () {
|
|
|
2415
2415
|
ObjectType["CUTOFF"] = "CUTOFF";
|
|
2416
2416
|
ObjectType["VERTICAL_RULE"] = "VERTICAL_RULE";
|
|
2417
2417
|
ObjectType["HORIZONTAL_RULE"] = "HORIZONTAL_RULE";
|
|
2418
|
+
ObjectType["RICH_TEXT"] = "RICH_TEXT";
|
|
2418
2419
|
})(exports.ObjectType || (exports.ObjectType = {}));
|
|
2419
2420
|
|
|
2421
|
+
var RichText = /** @class */ (function (_super) {
|
|
2422
|
+
__extends(RichText, _super);
|
|
2423
|
+
function RichText(canvas, fabricObject, persistedField) {
|
|
2424
|
+
var _this = _super.call(this, canvas, fabricObject, persistedField) || this;
|
|
2425
|
+
_this.data.type = exports.ObjectType.RICH_TEXT;
|
|
2426
|
+
return _this;
|
|
2427
|
+
}
|
|
2428
|
+
Object.defineProperty(RichText.prototype, "htmlContent", {
|
|
2429
|
+
/**
|
|
2430
|
+
* @override
|
|
2431
|
+
* @inheritDoc
|
|
2432
|
+
*/
|
|
2433
|
+
get: function () {
|
|
2434
|
+
return this.data.userText;
|
|
2435
|
+
},
|
|
2436
|
+
/**
|
|
2437
|
+
* @override
|
|
2438
|
+
* @inheritDoc
|
|
2439
|
+
*/
|
|
2440
|
+
set: function (text) {
|
|
2441
|
+
this.data.userText = text;
|
|
2442
|
+
},
|
|
2443
|
+
enumerable: false,
|
|
2444
|
+
configurable: true
|
|
2445
|
+
});
|
|
2446
|
+
/**
|
|
2447
|
+
* @override
|
|
2448
|
+
* @inheritDoc
|
|
2449
|
+
*/
|
|
2450
|
+
RichText.prototype.setRichTextContent = function (renderedContentUrl, htmlContent) {
|
|
2451
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2452
|
+
var canvasWidthPx;
|
|
2453
|
+
return __generator(this, function (_a) {
|
|
2454
|
+
switch (_a.label) {
|
|
2455
|
+
case 0:
|
|
2456
|
+
canvasWidthPx = this.canvas.getDimensions().widthPx;
|
|
2457
|
+
if (!renderedContentUrl)
|
|
2458
|
+
return [2 /*return*/];
|
|
2459
|
+
this.htmlContent = htmlContent;
|
|
2460
|
+
return [4 /*yield*/, this.setImageUrl(renderedContentUrl)];
|
|
2461
|
+
case 1:
|
|
2462
|
+
_a.sent();
|
|
2463
|
+
this.setImageWidth(canvasWidthPx);
|
|
2464
|
+
return [2 /*return*/];
|
|
2465
|
+
}
|
|
2466
|
+
});
|
|
2467
|
+
});
|
|
2468
|
+
};
|
|
2469
|
+
return RichText;
|
|
2470
|
+
}(Image));
|
|
2471
|
+
|
|
2420
2472
|
var AbstractInteractiveCanvas = /** @class */ (function () {
|
|
2421
2473
|
function AbstractInteractiveCanvas(fabric, fabricCanvas, devicePixelRatio) {
|
|
2422
2474
|
this.fabric = fabric;
|
|
@@ -2784,6 +2836,48 @@ var AbstractInteractiveCanvas = /** @class */ (function () {
|
|
|
2784
2836
|
});
|
|
2785
2837
|
});
|
|
2786
2838
|
};
|
|
2839
|
+
/**
|
|
2840
|
+
* @override
|
|
2841
|
+
* @inheritDoc
|
|
2842
|
+
*/
|
|
2843
|
+
AbstractInteractiveCanvas.prototype.addRichTextObject = function (imageUrl, htmlContent) {
|
|
2844
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2845
|
+
var maxSizeScale, maxWidth, options;
|
|
2846
|
+
var _this = this;
|
|
2847
|
+
return __generator(this, function (_a) {
|
|
2848
|
+
switch (_a.label) {
|
|
2849
|
+
case 0:
|
|
2850
|
+
maxSizeScale = 2;
|
|
2851
|
+
maxWidth = this.dimensions$.value.widthPx / maxSizeScale;
|
|
2852
|
+
options = { crossOrigin: "anonymous" };
|
|
2853
|
+
return [4 /*yield*/, new Promise(function (resolve) {
|
|
2854
|
+
_this.fabric.Image.fromURL(imageUrl, function (fabricImage) {
|
|
2855
|
+
var id = _this.randomId();
|
|
2856
|
+
var newScale = 1;
|
|
2857
|
+
var curWidth = newScale * fabricImage.width;
|
|
2858
|
+
if (curWidth > maxWidth) {
|
|
2859
|
+
newScale = maxWidth / curWidth;
|
|
2860
|
+
}
|
|
2861
|
+
fabricImage.set({
|
|
2862
|
+
id: id,
|
|
2863
|
+
scaleX: newScale,
|
|
2864
|
+
scaleY: newScale
|
|
2865
|
+
});
|
|
2866
|
+
_this.fabricCanvas.add(fabricImage);
|
|
2867
|
+
var object = new RichText(_this, fabricImage);
|
|
2868
|
+
object.htmlContent = htmlContent;
|
|
2869
|
+
_this.trackNewObject(object);
|
|
2870
|
+
object.setImageWidth(_this.dimensions$.value.widthPx);
|
|
2871
|
+
_this.selectFabricObject(fabricImage);
|
|
2872
|
+
_this.syncObjectList();
|
|
2873
|
+
resolve(object);
|
|
2874
|
+
}, options);
|
|
2875
|
+
})];
|
|
2876
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
2877
|
+
}
|
|
2878
|
+
});
|
|
2879
|
+
});
|
|
2880
|
+
};
|
|
2787
2881
|
/**
|
|
2788
2882
|
* @override
|
|
2789
2883
|
* @inheritDoc
|
|
@@ -3201,6 +3295,8 @@ var AbstractInteractiveCanvas = /** @class */ (function () {
|
|
|
3201
3295
|
return new HorizontalRule(this, fabricObject, persistedField);
|
|
3202
3296
|
case exports.ObjectType.VERTICAL_RULE:
|
|
3203
3297
|
return new VerticalRule(this, fabricObject, persistedField);
|
|
3298
|
+
case exports.ObjectType.RICH_TEXT:
|
|
3299
|
+
return new RichText(this, fabricObject, persistedField);
|
|
3204
3300
|
default:
|
|
3205
3301
|
throw new Error("Unknown field type: [" + persistedField.type + "]");
|
|
3206
3302
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { CanvasObjectData, IInteractiveCanvas, Image, IMutableImage, IMutablePosition } from "../..";
|
|
2
|
+
import { ICanvasObject } from "../canvas-object.interface";
|
|
3
|
+
import { fabric } from "fabric";
|
|
4
|
+
/**
|
|
5
|
+
* Rich text field.
|
|
6
|
+
* Displays complex text by taking a rendered image of a html block of rich text and displays it on the canvas.
|
|
7
|
+
* The rendering of the text content to an image must be handled by the caller.
|
|
8
|
+
* This is an attempt to work around the poor rich-text support of fabric, which supports virtually no rich-text features on the canvas itself.
|
|
9
|
+
*/
|
|
10
|
+
export interface IRichText extends ICanvasObject, IMutableImage, IMutablePosition {
|
|
11
|
+
/**
|
|
12
|
+
* HTML rich text content.
|
|
13
|
+
*/
|
|
14
|
+
htmlContent: string;
|
|
15
|
+
/**
|
|
16
|
+
* Set the rich text content by providing the rendered image version of the content and the html content.
|
|
17
|
+
* @param renderedContentUrl Rendered version of the rich-text content.
|
|
18
|
+
* @param htmlContent Html version of the rich text content.
|
|
19
|
+
*/
|
|
20
|
+
setRichTextContent(renderedContentUrl: string, htmlContent: string): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export declare class RichText extends Image implements IRichText {
|
|
23
|
+
constructor(canvas: IInteractiveCanvas, fabricObject: fabric.Image, persistedField?: CanvasObjectData);
|
|
24
|
+
/**
|
|
25
|
+
* @override
|
|
26
|
+
* @inheritDoc
|
|
27
|
+
*/
|
|
28
|
+
get htmlContent(): string;
|
|
29
|
+
/**
|
|
30
|
+
* @override
|
|
31
|
+
* @inheritDoc
|
|
32
|
+
*/
|
|
33
|
+
set htmlContent(text: string);
|
|
34
|
+
/**
|
|
35
|
+
* @override
|
|
36
|
+
* @inheritDoc
|
|
37
|
+
*/
|
|
38
|
+
setRichTextContent(renderedContentUrl: string, htmlContent: string): Promise<void>;
|
|
39
|
+
}
|