polotno 4.0.3 → 4.1.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.
- package/blueprint/side-panel/select-video.d.ts +2 -0
- package/canvas/audio.js +1 -1
- package/canvas/context-menu/context-menu.js +1 -1
- package/canvas/page.js +1 -1
- package/canvas/use-mediabunny-video.js +1 -1
- package/canvas/use-transformer-snap.js +1 -1
- package/canvas/video-element.js +1 -1
- package/model/audio-model.d.ts +2 -0
- package/model/audio-model.js +1 -1
- package/model/group-model.d.ts +3 -0
- package/model/page-model.d.ts +3 -0
- package/model/schema.d.ts +20 -253
- package/model/store.d.ts +30 -0
- package/model/store.js +1 -1
- package/model/table-model.d.ts +2 -0
- package/model/table-model.js +1 -1
- package/model/text-model.d.ts +1 -0
- package/model/text-model.js +1 -1
- package/model/video-model.d.ts +1 -0
- package/model/video-model.js +1 -1
- package/package.json +4 -4
- package/pages-timeline/audio-track.js +1 -1
- package/polotno.bundle.js +114 -114
- package/primitives/overflow-list.d.ts +2 -1
- package/primitives/overflow-list.js +1 -1
- package/primitives/speed-control.d.ts +7 -0
- package/primitives/speed-control.js +1 -0
- package/side-panel/select-video.d.ts +2 -0
- package/toolbar/element-container.js +1 -1
- package/toolbar/figure-toolbar.js +1 -1
- package/toolbar/line-toolbar.js +1 -1
- package/toolbar/svg-toolbar.js +1 -1
- package/toolbar/table-toolbar.js +1 -1
- package/toolbar/text-toolbar.js +1 -1
- package/toolbar/video-toolbar.js +1 -1
- package/ui.css +1 -1
- package/utils/fonts.js +1 -1
- package/utils/l10n.d.ts +2 -0
- package/utils/l10n.js +1 -1
- package/utils/timeline.d.ts +11 -0
- package/utils/timeline.js +1 -0
- package/utils/validate-key.js +1 -1
package/model/schema.d.ts
CHANGED
|
@@ -1,253 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
export interface Audio {
|
|
23
|
-
id: string;
|
|
24
|
-
src: string;
|
|
25
|
-
duration: number;
|
|
26
|
-
startTime: number;
|
|
27
|
-
endTime: number;
|
|
28
|
-
volume: number;
|
|
29
|
-
delay: number;
|
|
30
|
-
}
|
|
31
|
-
export interface Page {
|
|
32
|
-
id: string;
|
|
33
|
-
width: number | 'auto';
|
|
34
|
-
height: number | 'auto';
|
|
35
|
-
background: string;
|
|
36
|
-
bleed: number;
|
|
37
|
-
custom?: unknown;
|
|
38
|
-
duration: number;
|
|
39
|
-
children: Element[];
|
|
40
|
-
}
|
|
41
|
-
export type Element = TextElement | ImageElement | SVGElement | LineElement | VideoElement | FigureElement | GifElement | GroupElement | TableElement;
|
|
42
|
-
export interface Animation {
|
|
43
|
-
delay: number;
|
|
44
|
-
duration: number;
|
|
45
|
-
enabled: boolean;
|
|
46
|
-
type: 'enter' | 'exit' | 'loop';
|
|
47
|
-
name: string;
|
|
48
|
-
data: unknown;
|
|
49
|
-
}
|
|
50
|
-
interface ShapeAttributes {
|
|
51
|
-
id: string;
|
|
52
|
-
type: string;
|
|
53
|
-
name?: string;
|
|
54
|
-
custom?: unknown;
|
|
55
|
-
x: number;
|
|
56
|
-
y: number;
|
|
57
|
-
width: number;
|
|
58
|
-
height: number;
|
|
59
|
-
rotation: number;
|
|
60
|
-
opacity: number;
|
|
61
|
-
animations: Animation[];
|
|
62
|
-
blurEnabled: boolean;
|
|
63
|
-
blurRadius: number;
|
|
64
|
-
brightnessEnabled: boolean;
|
|
65
|
-
brightness: number;
|
|
66
|
-
sepiaEnabled: boolean;
|
|
67
|
-
grayscaleEnabled: boolean;
|
|
68
|
-
filters: Record<string, {
|
|
69
|
-
intensity: number;
|
|
70
|
-
}>;
|
|
71
|
-
shadowEnabled: boolean;
|
|
72
|
-
shadowBlur: number;
|
|
73
|
-
shadowOffsetX: number;
|
|
74
|
-
shadowOffsetY: number;
|
|
75
|
-
shadowColor: string;
|
|
76
|
-
shadowOpacity: number;
|
|
77
|
-
visible: boolean;
|
|
78
|
-
draggable: boolean;
|
|
79
|
-
resizable: boolean;
|
|
80
|
-
selectable: boolean;
|
|
81
|
-
contentEditable: boolean;
|
|
82
|
-
styleEditable: boolean;
|
|
83
|
-
alwaysOnTop: boolean;
|
|
84
|
-
showInExport: boolean;
|
|
85
|
-
}
|
|
86
|
-
export interface GroupElement {
|
|
87
|
-
id: string;
|
|
88
|
-
type: 'group';
|
|
89
|
-
name?: string;
|
|
90
|
-
custom?: unknown;
|
|
91
|
-
opacity?: number;
|
|
92
|
-
visible?: boolean;
|
|
93
|
-
selectable?: boolean;
|
|
94
|
-
removable?: boolean;
|
|
95
|
-
alwaysOnTop?: boolean;
|
|
96
|
-
showInExport?: boolean;
|
|
97
|
-
animations?: Animation[];
|
|
98
|
-
children: Element[];
|
|
99
|
-
}
|
|
100
|
-
export interface TextElement extends ShapeAttributes {
|
|
101
|
-
type: 'text';
|
|
102
|
-
text: string;
|
|
103
|
-
placeholder: string;
|
|
104
|
-
fontSize: number;
|
|
105
|
-
fontFamily: string;
|
|
106
|
-
fontStyle: string;
|
|
107
|
-
fontWeight: string;
|
|
108
|
-
textDecoration: string;
|
|
109
|
-
textTransform: string;
|
|
110
|
-
fill: string;
|
|
111
|
-
align: 'left' | 'center' | 'right' | 'justify';
|
|
112
|
-
height: number;
|
|
113
|
-
verticalAlign: string;
|
|
114
|
-
strokeWidth: number;
|
|
115
|
-
stroke: string;
|
|
116
|
-
lineHeight: number | string;
|
|
117
|
-
letterSpacing: number;
|
|
118
|
-
backgroundEnabled: boolean;
|
|
119
|
-
backgroundColor: string;
|
|
120
|
-
backgroundOpacity: number;
|
|
121
|
-
backgroundCornerRadius: number;
|
|
122
|
-
backgroundPadding: number;
|
|
123
|
-
curveEnabled: boolean;
|
|
124
|
-
curvePower: number;
|
|
125
|
-
}
|
|
126
|
-
interface BaseImageProps {
|
|
127
|
-
src: string;
|
|
128
|
-
cropX: number;
|
|
129
|
-
cropY: number;
|
|
130
|
-
cropWidth: number;
|
|
131
|
-
cropHeight: number;
|
|
132
|
-
cornerRadius: number;
|
|
133
|
-
flipX: boolean;
|
|
134
|
-
flipY: boolean;
|
|
135
|
-
clipSrc: string;
|
|
136
|
-
borderColor: string;
|
|
137
|
-
borderSize: number;
|
|
138
|
-
keepRatio: boolean;
|
|
139
|
-
stretchEnabled: boolean;
|
|
140
|
-
}
|
|
141
|
-
export interface ImageElement extends ShapeAttributes, BaseImageProps {
|
|
142
|
-
type: 'image';
|
|
143
|
-
}
|
|
144
|
-
export interface SVGElement extends ShapeAttributes {
|
|
145
|
-
type: 'svg';
|
|
146
|
-
src: string;
|
|
147
|
-
maskSrc: string;
|
|
148
|
-
cropX: number;
|
|
149
|
-
cropY: number;
|
|
150
|
-
cropWidth: number;
|
|
151
|
-
cropHeight: number;
|
|
152
|
-
keepRatio: boolean;
|
|
153
|
-
stretchEnabled: boolean;
|
|
154
|
-
flipX: boolean;
|
|
155
|
-
flipY: boolean;
|
|
156
|
-
borderColor: string;
|
|
157
|
-
borderSize: number;
|
|
158
|
-
cornerRadius: number;
|
|
159
|
-
colorsReplace: Record<string, string>;
|
|
160
|
-
}
|
|
161
|
-
export interface LineElement extends ShapeAttributes {
|
|
162
|
-
type: 'line';
|
|
163
|
-
color: string;
|
|
164
|
-
dash: number[];
|
|
165
|
-
startHead: string;
|
|
166
|
-
endHead: string;
|
|
167
|
-
}
|
|
168
|
-
export interface FigureElement extends ShapeAttributes {
|
|
169
|
-
type: 'figure';
|
|
170
|
-
subType: string;
|
|
171
|
-
fill: string;
|
|
172
|
-
dash: number[];
|
|
173
|
-
strokeWidth: number;
|
|
174
|
-
stroke: string;
|
|
175
|
-
cornerRadius: number;
|
|
176
|
-
}
|
|
177
|
-
export interface GifElement extends ShapeAttributes, BaseImageProps {
|
|
178
|
-
type: 'gif';
|
|
179
|
-
duration: number;
|
|
180
|
-
keepRatio: boolean;
|
|
181
|
-
}
|
|
182
|
-
export interface VideoElement extends ShapeAttributes, BaseImageProps {
|
|
183
|
-
type: 'video';
|
|
184
|
-
duration: number;
|
|
185
|
-
startTime: number;
|
|
186
|
-
endTime: number;
|
|
187
|
-
volume: number;
|
|
188
|
-
}
|
|
189
|
-
export interface BorderSide {
|
|
190
|
-
color?: string;
|
|
191
|
-
width?: number;
|
|
192
|
-
style?: 'solid' | 'dashed' | 'dotted' | 'none';
|
|
193
|
-
}
|
|
194
|
-
export interface CellBorders {
|
|
195
|
-
top?: BorderSide;
|
|
196
|
-
right?: BorderSide;
|
|
197
|
-
bottom?: BorderSide;
|
|
198
|
-
left?: BorderSide;
|
|
199
|
-
}
|
|
200
|
-
export interface TableCell {
|
|
201
|
-
id: string;
|
|
202
|
-
type: 'tablecell';
|
|
203
|
-
text?: string;
|
|
204
|
-
opacity?: number;
|
|
205
|
-
rowSpan?: number;
|
|
206
|
-
colSpan?: number;
|
|
207
|
-
mergedInto?: string;
|
|
208
|
-
name?: string;
|
|
209
|
-
custom?: unknown;
|
|
210
|
-
borders?: CellBorders;
|
|
211
|
-
fontSize?: number;
|
|
212
|
-
fontFamily?: string;
|
|
213
|
-
fontWeight?: string;
|
|
214
|
-
fontStyle?: string;
|
|
215
|
-
textDecoration?: string;
|
|
216
|
-
textTransform?: string;
|
|
217
|
-
fill?: string;
|
|
218
|
-
align?: string;
|
|
219
|
-
verticalAlign?: string;
|
|
220
|
-
lineHeight?: number | string;
|
|
221
|
-
letterSpacing?: number;
|
|
222
|
-
strokeWidth?: number;
|
|
223
|
-
stroke?: string;
|
|
224
|
-
cellBackground?: string;
|
|
225
|
-
cellPadding?: number;
|
|
226
|
-
}
|
|
227
|
-
export interface TableElement extends Omit<ShapeAttributes, 'blurEnabled' | 'blurRadius' | 'brightnessEnabled' | 'brightness' | 'sepiaEnabled' | 'grayscaleEnabled' | 'filters' | 'shadowEnabled' | 'shadowBlur' | 'shadowOffsetX' | 'shadowOffsetY' | 'shadowColor' | 'shadowOpacity'> {
|
|
228
|
-
type: 'table';
|
|
229
|
-
rows: number;
|
|
230
|
-
cols: number;
|
|
231
|
-
colWidths: number[];
|
|
232
|
-
rowHeights: number[];
|
|
233
|
-
cells: TableCell[];
|
|
234
|
-
borderColor: string;
|
|
235
|
-
borderWidth: number;
|
|
236
|
-
borderStyle: 'solid' | 'dashed' | 'dotted' | 'none';
|
|
237
|
-
fontSize: number;
|
|
238
|
-
fontFamily: string;
|
|
239
|
-
fontWeight: string;
|
|
240
|
-
fontStyle: string;
|
|
241
|
-
textDecoration: string;
|
|
242
|
-
textTransform: string;
|
|
243
|
-
fill: string;
|
|
244
|
-
align: string;
|
|
245
|
-
verticalAlign: string;
|
|
246
|
-
lineHeight: number | string;
|
|
247
|
-
letterSpacing: number;
|
|
248
|
-
strokeWidth: number;
|
|
249
|
-
stroke: string;
|
|
250
|
-
cellBackground: string;
|
|
251
|
-
cellPadding: number;
|
|
252
|
-
}
|
|
253
|
-
export {};
|
|
1
|
+
import type * as Schema from '@polotno/schema';
|
|
2
|
+
export type Store = Schema.Design;
|
|
3
|
+
export type FontStyleVariant = Schema.FontStyleVariant;
|
|
4
|
+
export type Font = Schema.Font;
|
|
5
|
+
export type Audio = Schema.Audio;
|
|
6
|
+
export type Page = Schema.Page;
|
|
7
|
+
export type Element = Schema.Element;
|
|
8
|
+
export type Animation = Schema.Animation;
|
|
9
|
+
export type GroupElement = Schema.GroupElement;
|
|
10
|
+
export type TextElement = Schema.TextElement;
|
|
11
|
+
export type ImageElement = Schema.ImageElement;
|
|
12
|
+
export type SVGElement = Schema.SVGElement;
|
|
13
|
+
export type LineElement = Schema.LineElement;
|
|
14
|
+
export type FigureElement = Schema.FigureElement;
|
|
15
|
+
export type GifElement = Schema.GifElement;
|
|
16
|
+
export type VideoElement = Schema.VideoElement;
|
|
17
|
+
export type BorderSide = Schema.BorderSide;
|
|
18
|
+
export type CellBorders = Schema.CellBorders;
|
|
19
|
+
export type TableCell = Schema.TableCell;
|
|
20
|
+
export type TableElement = Schema.TableElement;
|
package/model/store.d.ts
CHANGED
|
@@ -380,6 +380,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
380
380
|
set(attrs: any): void;
|
|
381
381
|
afterCreate(): void;
|
|
382
382
|
toggleEditMode(editing?: boolean): void;
|
|
383
|
+
beforeDestroy(): void;
|
|
383
384
|
}, any, import("mobx-state-tree").ModelSnapshotType<{
|
|
384
385
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
385
386
|
type: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
@@ -801,6 +802,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
801
802
|
startTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
802
803
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
803
804
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
805
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
804
806
|
}, {
|
|
805
807
|
readonly page: any;
|
|
806
808
|
readonly store: any;
|
|
@@ -1439,6 +1441,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
1439
1441
|
set(attrs: any): void;
|
|
1440
1442
|
setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
|
|
1441
1443
|
toggleEditMode(editing?: boolean): void;
|
|
1444
|
+
beforeDestroy(): void;
|
|
1442
1445
|
}, any, any>>;
|
|
1443
1446
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
1444
1447
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
@@ -1969,6 +1972,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
1969
1972
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
1970
1973
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
1971
1974
|
delay: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
1975
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
1972
1976
|
custom: import("mobx-state-tree").IType<any, any, any>;
|
|
1973
1977
|
}, {
|
|
1974
1978
|
readonly visibleDuration: number;
|
|
@@ -1981,6 +1985,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
1981
1985
|
endTime: number;
|
|
1982
1986
|
volume: number;
|
|
1983
1987
|
delay: number;
|
|
1988
|
+
speed: number;
|
|
1984
1989
|
custom: any;
|
|
1985
1990
|
};
|
|
1986
1991
|
} & {
|
|
@@ -2371,6 +2376,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
2371
2376
|
set(attrs: any): void;
|
|
2372
2377
|
afterCreate(): void;
|
|
2373
2378
|
toggleEditMode(editing?: boolean): void;
|
|
2379
|
+
beforeDestroy(): void;
|
|
2374
2380
|
}, any, import("mobx-state-tree").ModelSnapshotType<{
|
|
2375
2381
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
2376
2382
|
type: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
@@ -2792,6 +2798,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
2792
2798
|
startTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
2793
2799
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
2794
2800
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
2801
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
2795
2802
|
}, {
|
|
2796
2803
|
readonly page: any;
|
|
2797
2804
|
readonly store: any;
|
|
@@ -3430,6 +3437,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
3430
3437
|
set(attrs: any): void;
|
|
3431
3438
|
setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
|
|
3432
3439
|
toggleEditMode(editing?: boolean): void;
|
|
3440
|
+
beforeDestroy(): void;
|
|
3433
3441
|
}, any, any>>;
|
|
3434
3442
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
3435
3443
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
@@ -4276,6 +4284,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
4276
4284
|
set(attrs: any): void;
|
|
4277
4285
|
afterCreate(): void;
|
|
4278
4286
|
toggleEditMode(editing?: boolean): void;
|
|
4287
|
+
beforeDestroy(): void;
|
|
4279
4288
|
}, any, import("mobx-state-tree").ModelSnapshotType<{
|
|
4280
4289
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
4281
4290
|
type: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
@@ -4697,6 +4706,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
4697
4706
|
startTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
4698
4707
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
4699
4708
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
4709
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
4700
4710
|
}, {
|
|
4701
4711
|
readonly page: any;
|
|
4702
4712
|
readonly store: any;
|
|
@@ -5335,6 +5345,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
5335
5345
|
set(attrs: any): void;
|
|
5336
5346
|
setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
|
|
5337
5347
|
toggleEditMode(editing?: boolean): void;
|
|
5348
|
+
beforeDestroy(): void;
|
|
5338
5349
|
}, any, any>>;
|
|
5339
5350
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
5340
5351
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
@@ -6469,6 +6480,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
6469
6480
|
set(attrs: any): void;
|
|
6470
6481
|
afterCreate(): void;
|
|
6471
6482
|
toggleEditMode(editing?: boolean): void;
|
|
6483
|
+
beforeDestroy(): void;
|
|
6472
6484
|
}, any, import("mobx-state-tree").ModelSnapshotType<{
|
|
6473
6485
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
6474
6486
|
type: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
@@ -6890,6 +6902,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
6890
6902
|
startTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
6891
6903
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
6892
6904
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
6905
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
6893
6906
|
}, {
|
|
6894
6907
|
readonly page: any;
|
|
6895
6908
|
readonly store: any;
|
|
@@ -7528,6 +7541,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
7528
7541
|
set(attrs: any): void;
|
|
7529
7542
|
setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
|
|
7530
7543
|
toggleEditMode(editing?: boolean): void;
|
|
7544
|
+
beforeDestroy(): void;
|
|
7531
7545
|
}, any, any>>;
|
|
7532
7546
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
7533
7547
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
@@ -8374,6 +8388,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
8374
8388
|
set(attrs: any): void;
|
|
8375
8389
|
afterCreate(): void;
|
|
8376
8390
|
toggleEditMode(editing?: boolean): void;
|
|
8391
|
+
beforeDestroy(): void;
|
|
8377
8392
|
}, any, import("mobx-state-tree").ModelSnapshotType<{
|
|
8378
8393
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
8379
8394
|
type: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
@@ -8795,6 +8810,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
8795
8810
|
startTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
8796
8811
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
8797
8812
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
8813
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
8798
8814
|
}, {
|
|
8799
8815
|
readonly page: any;
|
|
8800
8816
|
readonly store: any;
|
|
@@ -9433,6 +9449,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
9433
9449
|
set(attrs: any): void;
|
|
9434
9450
|
setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
|
|
9435
9451
|
toggleEditMode(editing?: boolean): void;
|
|
9452
|
+
beforeDestroy(): void;
|
|
9436
9453
|
}, any, any>>;
|
|
9437
9454
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
9438
9455
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
@@ -10280,6 +10297,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
10280
10297
|
set(attrs: any): void;
|
|
10281
10298
|
afterCreate(): void;
|
|
10282
10299
|
toggleEditMode(editing?: boolean): void;
|
|
10300
|
+
beforeDestroy(): void;
|
|
10283
10301
|
}, any, import("mobx-state-tree").ModelSnapshotType<{
|
|
10284
10302
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
10285
10303
|
type: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
@@ -10701,6 +10719,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
10701
10719
|
startTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
10702
10720
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
10703
10721
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
10722
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
10704
10723
|
}, {
|
|
10705
10724
|
readonly page: any;
|
|
10706
10725
|
readonly store: any;
|
|
@@ -11339,6 +11358,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
11339
11358
|
set(attrs: any): void;
|
|
11340
11359
|
setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
|
|
11341
11360
|
toggleEditMode(editing?: boolean): void;
|
|
11361
|
+
beforeDestroy(): void;
|
|
11342
11362
|
}, any, any>>;
|
|
11343
11363
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
11344
11364
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
@@ -12185,6 +12205,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
12185
12205
|
set(attrs: any): void;
|
|
12186
12206
|
afterCreate(): void;
|
|
12187
12207
|
toggleEditMode(editing?: boolean): void;
|
|
12208
|
+
beforeDestroy(): void;
|
|
12188
12209
|
}, any, import("mobx-state-tree").ModelSnapshotType<{
|
|
12189
12210
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
12190
12211
|
type: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
@@ -12606,6 +12627,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
12606
12627
|
startTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
12607
12628
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
12608
12629
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
12630
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
12609
12631
|
}, {
|
|
12610
12632
|
readonly page: any;
|
|
12611
12633
|
readonly store: any;
|
|
@@ -13244,6 +13266,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
13244
13266
|
set(attrs: any): void;
|
|
13245
13267
|
setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
|
|
13246
13268
|
toggleEditMode(editing?: boolean): void;
|
|
13269
|
+
beforeDestroy(): void;
|
|
13247
13270
|
}, any, any>>;
|
|
13248
13271
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
13249
13272
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
@@ -14123,6 +14146,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
14123
14146
|
set(attrs: any): void;
|
|
14124
14147
|
afterCreate(): void;
|
|
14125
14148
|
toggleEditMode(editing?: boolean): void;
|
|
14149
|
+
beforeDestroy(): void;
|
|
14126
14150
|
}, any, import("mobx-state-tree").ModelSnapshotType<{
|
|
14127
14151
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
14128
14152
|
type: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
@@ -14544,6 +14568,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
14544
14568
|
startTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
14545
14569
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
14546
14570
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
14571
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
14547
14572
|
}, {
|
|
14548
14573
|
readonly page: any;
|
|
14549
14574
|
readonly store: any;
|
|
@@ -15182,6 +15207,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
15182
15207
|
set(attrs: any): void;
|
|
15183
15208
|
setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
|
|
15184
15209
|
toggleEditMode(editing?: boolean): void;
|
|
15210
|
+
beforeDestroy(): void;
|
|
15185
15211
|
}, any, any>>;
|
|
15186
15212
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
15187
15213
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
@@ -16028,6 +16054,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
16028
16054
|
set(attrs: any): void;
|
|
16029
16055
|
afterCreate(): void;
|
|
16030
16056
|
toggleEditMode(editing?: boolean): void;
|
|
16057
|
+
beforeDestroy(): void;
|
|
16031
16058
|
}, any, import("mobx-state-tree").ModelSnapshotType<{
|
|
16032
16059
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
16033
16060
|
type: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
@@ -16449,6 +16476,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
16449
16476
|
startTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
16450
16477
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
16451
16478
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
16479
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
16452
16480
|
}, {
|
|
16453
16481
|
readonly page: any;
|
|
16454
16482
|
readonly store: any;
|
|
@@ -17087,6 +17115,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
17087
17115
|
set(attrs: any): void;
|
|
17088
17116
|
setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
|
|
17089
17117
|
toggleEditMode(editing?: boolean): void;
|
|
17118
|
+
beforeDestroy(): void;
|
|
17090
17119
|
}, any, any>>;
|
|
17091
17120
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
17092
17121
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
@@ -17675,6 +17704,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
17675
17704
|
endTime: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
17676
17705
|
volume: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
17677
17706
|
delay: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
17707
|
+
speed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
17678
17708
|
custom: import("mobx-state-tree").IType<any, any, any>;
|
|
17679
17709
|
}>[];
|
|
17680
17710
|
unit: UnitType;
|
package/model/store.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=this&&this.__rest||function(e,t){var i={};for(var o in e){Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(i[o]=e[o])}if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++){t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(i[o[n]]=e[o[n]])}}return i};import{applySnapshot as t,cast as i,destroy as o,detach as n,getSnapshot as a,onSnapshot as s,setLivelinessChecking as r,types as l}from"mobx-state-tree";import{UndoManager as d}from"./history.js";import{nanoid as c}from"nanoid";import p from"konva";import{computed as g}from"mobx";import{downloadFile as m}from"../utils/download.js";import{getJsPDF as u}from"../utils/pdf.js";import{createGIF as f}from"../utils/gif-lib.js";import{validateKey as h,setKey as b}from"../utils/validate-key.js";import*as y from"../utils/fonts.js";import{flags as v}from"../utils/flags.js";import{addDpiMetadataToImage as P}from"../utils/image-dpi.js";import{nodeToCanvas as w}from"../utils/canvas.js";import{whenLoaded as E}from"../utils/loader.js";import{pxToUnit as x}from"../utils/unit.js";import{deepEqual as I}from"../utils/deep-equal.js";import{waitTillAvailable as _}from"../utils/wait.js";import{jsonToHTML as k}from"../utils/to-html.js";import{jsonToSVG as S}from"../utils/to-svg.js";import{Page as T}from"./page-model.js";import{forEveryChild as O,forEveryNode as j}from"./group-model.js";import{Audio as R}from"./audio-model.js";r("ignore");export const Font=l.model("Font",{fontFamily:l.string,url:l.optional(l.string,""),styles:l.frozen()}).preProcessSnapshot(e=>Object.assign(Object.assign({},e),{fontFamily:e.fontFamily||e.name}));export const ROLES={ADMIN:"admin",VIEWER:"viewer"};export const Store=l.model("Store",{role:"",pages:l.array(T),fonts:l.array(Font),audios:l.array(R),width:1080,height:1080,currentTime:0,isPlaying:!1,scale:1,scaleToFit:1,unit:l.optional(l.enumeration("UnitType",["pt","mm","cm","in","px"]),"px"),dpi:72,schemaVersion:3,bleedVisible:!1,rulesVisible:!1,distanceGuidesVisible:!1,openedSidePanel:"",previousOpenedSidePanel:"",custom:l.frozen(),tool:l.optional(l.enumeration("Tool",["selection","draw","pan","text","eraser"]),"selection"),toolOptions:l.optional(l.model({brushType:l.optional(l.enumeration("BrushType",["brush","highlighter"]),"brush"),strokeWidth:l.optional(l.number,5),stroke:l.optional(l.string,"#000000"),opacity:l.optional(l.number,1)}),{}),selectedElementsIds:l.array(l.string),animatedElementsIds:l.array(l.string),history:l.optional(d,{targetPath:"../pages"}),_elementsPixelRatio:Math.min(2,"undefined"!=typeof window&&window.devicePixelRatio||1),_activePageId:"",_selectedPagesIds:l.array(l.string),_forceShowCredit:!1,_validated:!1}).views(e=>{const t=g(()=>{const t={};return j({children:e.pages},e=>(t[e.id]=e,!1)),t},{keepAlive:!0});return{get _idsMap(){return t.get()}}}).views(e=>({get _bleedVisible(){return console.warn("store._bleedVisible is deprecated. Please use store.bleedVisible instead."),e.bleedVisible},get selectedElements(){return e.selectedElementsIds.map(t=>e._idsMap[t]).filter(e=>!!e)},get children(){return e.pages},get selectedShapes(){const e=[];return O({children:this.selectedElements},t=>{"group"!==t.type&&e.push(t)}),e},get activePage(){return e.pages.slice().find(t=>t.id===e._activePageId)||(e.pages.length?e.pages[0]:null)},get selectedPages(){return e._selectedPagesIds.map(t=>e.pages.find(e=>e.id===t))},get duration(){let t=0;return e.pages.forEach(e=>{t+=e.duration}),t},get _hasCroppedImages(){return this.find(e=>"image"===e.type&&e._cropModeEnabled)},find(t){let i;return j({children:e.pages},e=>{if(!i&&t(e)){return i=e,!0}}),i},getElementById:t=>e._idsMap[t]})).actions(r=>{let l=0,d=null,g=!1;const b={afterCreate(){r.history.canUndo},setCurrentTime(e){r.currentTime=e},_togglePlaying(e=!r.isPlaying){r.isPlaying=e},play({animatedElementsIds:e=[],startTime:t=0,currentTime:o=0,endTime:n=r.duration,repeat:a=!1}={}){o&&(console.warn("currentTime property of store.play() is deprecated. Please use startTime instead."),t=o),r.animatedElementsIds=i(e),r.currentTime=t,r.isPlaying=!0,l=Date.now(),d=n,g=a,requestAnimationFrame(()=>b.seek())},checkActivePage(){let e=0;for(const t of r.pages){if(r.currentTime>=t.startTime&&r.currentTime<t.startTime+t.duration){b.selectPage(t.id);break}e+=t.duration}},seek(){if(!r.isPlaying){return}const e=Date.now(),t=e-l;l=e,r.currentTime+=t,b.checkActivePage();const i=d||r.duration;r.isPlaying&&r.currentTime<i?requestAnimationFrame(()=>b.seek()):r.isPlaying&&g?(r.currentTime=0,requestAnimationFrame(()=>b.seek())):b.stop()},stop(){r.isPlaying=!1,r.currentTime=0,r.animatedElementsIds=i([]),b.checkActivePage()},__(){r._validated||(h(r._forceShowCredit),r._validated=!0)},set(e){Object.assign(r,e)},setUnit({unit:e,dpi:t}){r.unit=e||r.unit,r.dpi=t||r.dpi},setRole(e){r.role=e},setTool(e){r.tool=e},setToolOptions(e){Object.assign(r.toolOptions,e)},addPage(e){const t=T.create(Object.assign({id:c(10)},e));return r.pages.push(t),r._activePageId=t.id,t},selectPage(e){r._activePageId=e,1===r._selectedPagesIds.length&&(r._selectedPagesIds=i([e]))},selectPages(e){r._selectedPagesIds=i(e),1===r._selectedPagesIds.length&&(r._activePageId=r._selectedPagesIds[0])},selectElements(e){const t=e.map(e=>r.getElementById(e)).filter(e=>!!e);t.sort((e,t)=>{var i,o,n,a;return(null!==(o=null===(i=e.parent)||void 0===i?void 0:i.children.indexOf(e))&&void 0!==o?o:0)-(null!==(a=null===(n=t.parent)||void 0===n?void 0:n.children.indexOf(t))&&void 0!==a?a:0)}),r.selectedElementsIds=i(t.map(e=>e.id))},toggleBleed(e){r.bleedVisible=null!=e?e:!r.bleedVisible},toggleRulers(e){r.rulesVisible=null!=e?e:!r.rulesVisible},toggleDistanceGuides(e){r.distanceGuidesVisible=null!=e?e:!r.distanceGuidesVisible},openSidePanel(e){r.openedSidePanel!==e&&(r.previousOpenedSidePanel=r.openedSidePanel,r.openedSidePanel=e)},restoreSidePanel(){const e=r.previousOpenedSidePanel;e&&e!==r.openedSidePanel?r.openedSidePanel=e:r.openedSidePanel="photos"},setScale(e){r.scale=e},_setScaleToFit(e){r.scaleToFit=e},setElementsPixelRatio(e){r._elementsPixelRatio=e},setSize(e,t,i){r.pages.forEach(o=>{o.setSize({width:e,height:t,useMagic:i,softChange:!0})}),r.width=e,r.height=t},setPageZIndex(e,t){const i=r.pages.find(t=>t.id===e);i&&(n(i),r.pages.remove(i),r.pages.splice(t,0,i))},deletePages(e){const t=r.pages.indexOf(r.activePage);e.forEach(e=>{const t=r.pages.find(t=>t.id===e);o(t)});const n=Math.min(r.pages.length-1,t),a=r.pages[n];a&&(r._activePageId=a.id),r.selectedElementsIds=i(r.selectedElementsIds.filter(e=>r.getElementById(e)))},groupElements(e,t={}){const o=e.map(e=>r.getElementById(e)).filter(e=>!!e);if(!o.length){return}const a=o[0].parent;if(!a){return}if(!o.every(e=>e.parent===a)){return void console.warn("store.groupElements: refusing to group elements that do not share a parent. Pass ids whose elements all live under the same page or the same group.")}o.forEach(e=>n(e));const s=a.children.reduce((e,t)=>{var i;if("group"===t.type){const o=null===(i=t.name)||void 0===i?void 0:i.match(/group-(\d+)/);if(o){const t=parseInt(o[1],10);return Math.max(e,t)}}return e},0),l=Object.assign({id:c(10),name:`group-${s+1}`,children:o,type:"group"},t);return a.children.push(l),r.selectedElementsIds=i([l.id]),a.children.find(e=>e.id===l.id)},ungroupElements(e){const t=e.map(e=>r.getElementById(e)),o=[];t.forEach(e=>{if(e&&"group"===e.type){const t=e.parent;if(!t){return}const i=t.children.indexOf(e);e.children.forEach(e=>{o.push(e.id)}),e.children.slice().forEach(e=>{n(e),t.children.push(e)}),t.children.splice(i,1)}}),r.selectedElementsIds=i(o)},deleteElements(e){const t=[];r.find(i=>(e.includes(i.id)&&t.push(i),!1)),t.forEach(e=>{o(e)}),r.selectedElementsIds=i(r.selectedElementsIds.filter(e=>r.getElementById(e)))},on(e,t){if("change"===e){let e=b.toJSON();return s(r,i=>{const o=b.toJSON();!I(e,o)&&(e=o,t(o))})}},async _toCanvas({pixelRatio:e,ignoreBackground:t,pageId:i,mimeType:o,includeBleed:n,_skipTimeout:a,quickMode:s=!1,_exportCanvases:l}={}){var d;const c=e||1;i=i||(null===(d=r.pages[0])||void 0===d?void 0:d.id);const g=r.pages.find(e=>e.id===i);if(!g){throw new Error(`No page for export with id ${i}`)}const m=r._elementsPixelRatio;c>r._elementsPixelRatio&&b.setElementsPixelRatio(c),s?null==g||g.set({_forceMount:!0}):null==g||g.set({_exporting:!0});const u=await _(()=>{const e=p.stages.filter(e=>e.getAttr("pageId")===i);return 0===e.length?null:e});if(!u){throw null==g||g.set({_forceMount:!1,_exporting:!1}),b.setElementsPixelRatio(m),new Error(`Export is failed. Can not find stage for page ${i}. Looks like <Workspace /> component is not mounted, but it is required in order to process the export.`)}u.length>1&&console.error(`Polotno error: Detected several canvas elements for page "${i}" in the document. This is not supported and will lead to incorrect export. Make sure to use unique ids for all pages and make sure you unmount <Workspace /> when it is not needed.`);const f=u[0];await b.waitLoading({_skipTimeout:a});const h=f.findOne(".page-container");if(!h){throw b.setElementsPixelRatio(m),null==g||g.set({_forceMount:!1,_exporting:!1}),new Error("Export is failed. Canvas was unmounted.")}const y=f.position();f.position({x:0,y:0}),f.find("Transformer").forEach(e=>{e.setAttr("oldVisible",e.visible()),e.visible(!1)}),h.find(".page-background").forEach(e=>e.shadowEnabled(!1)),h.find(".page-background").forEach(e=>e.strokeEnabled(!1)),h.find(".highlighter").forEach(e=>e.visible(!1));const v=h.findOne(".page-background-group"),P=v.clip();v.clip({x:null,y:null,width:null,height:null});const E=h.findOne(".elements-container"),x=E.clip();E.clip({x:null,y:null,width:null,height:null});const I=h.find(e=>!e.visible()&&e.getAttr("editModeEnabled")&&!e.getAttr("hideInExport"));I.forEach(e=>{e.setAttr("oldVisible",e.visible()),e.show()});const k=h.find(e=>e.getAttr("hideInExport"));k.forEach(e=>{e.setAttr("oldVisible",e.visible()),e.hide()}),t&&h.find(".page-background").forEach(e=>e.hide());const S=n?g.bleed:0;let T=S;!r.bleedVisible&&n||(r.bleedVisible||n?r.bleedVisible&&n?T=0:r.bleedVisible&&!n&&(T=-g.bleed):T=0);const O=g.computedWidth+2*S,j=g.computedHeight+2*S,R=h.scale();h.scale({x:1,y:1});const F=w(h,{x:h.x()-T,y:h.y()-T,width:O,height:j,pixelRatio:c,sceneCanvas:null==l?void 0:l.sceneCanvas,bufferCanvas:null==l?void 0:l.bufferCanvas});h.scale(R);const C=F._canvas;if("image/jpeg"===o){const e=C.getContext("2d");e.save(),e.globalCompositeOperation="destination-over",e.fillStyle="white",e.fillRect(0,0,C.width,C.height),e.restore()}return t&&h.find(".page-background").forEach(e=>e.show()),k.forEach(e=>{e.visible(e.getAttr("oldVisible"))}),I.forEach(e=>{e.visible(e.getAttr("oldVisible"))}),h.find(".page-background").forEach(e=>e.shadowEnabled(!0)),h.find(".page-background").forEach(e=>e.strokeEnabled(!0)),f.find("Transformer").forEach(e=>{e.visible(e.getAttr("oldVisible"))}),h.find(".highlighter").forEach(e=>e.visible(!0)),v.clip(P),E.clip(x),f.position(y),null==g||g.set({_exporting:!1,_forceMount:!1}),await Promise.resolve(),b.setElementsPixelRatio(m),C},async toDataURL(t={}){var{mimeType:i,quality:o,dpi:n,dpiMetadata:a="auto"}=t,s=e(t,["mimeType","quality","dpi","dpiMetadata"]);const l=await b._toCanvas(Object.assign({mimeType:i},s)),d=i||"image/png",c=l.toDataURL(d,o);p.Util.releaseCanvas(l);const g=null!=n?n:r.dpi;return"image/png"!==d&&"image/jpeg"!==d||"never"===a||"auto"===a&&72===g?c:P(c,d,g)},async toBlob(t={}){var{mimeType:i,quality:o}=t,n=e(t,["mimeType","quality"]);const a=await b._toCanvas(Object.assign({mimeType:i},n)),s=await new Promise(e=>{a.toBlob(e,i,o)});return p.Util.releaseCanvas(a),s},async saveAsImage(t={}){var{fileName:i}=t,o=e(t,["fileName"]);const n=(o.mimeType||"image/png").split("/")[1];m(await b.toDataURL(o),i||"polotno."+n)},async _toPDF(e){const t=e.dpi||r.dpi,i=e.parallel||1,o=e.unit||("px"===r.unit?"mm":r.unit),n=e.pixelRatio||1,a=e.pageIds||(e.pageId?[e.pageId]:r.pages.map(e=>e.id)),s=r.pages.filter(e=>a.includes(e.id)),l=await u(),d=e=>x({px:e,unit:o,dpi:t}),c=e.cropMarkSize||0,p=d(c),g=s[0]||{},m=e.includeBleed?g.bleed:0,f=d(g.computedWidth+2*m+2*p),h=d(g.computedHeight+2*m+2*p);var y=new l({unit:o,orientation:f>h?"landscape":"portrait",format:[f,h],compress:!0,putOnlyUsedFonts:!0});y.deletePage(1);const v=((e,t)=>{const i=[];for(let o=0;o<e.length;o+=t){i.push(e.slice(o,o+t))}return i})(s,i);let P=0;for(const r of v){const t=r.map(async t=>{const i=e.includeBleed?t.bleed:0,o=t.computedWidth+2*i+2*c,s=t.computedHeight+2*i+2*c,r=d(o),l=d(s);let p=0,g=n;for(;p<10;){p+=1;const i=await b.toDataURL(Object.assign(Object.assign({},e),{pageId:t.id,pixelRatio:g,dpiMetadata:"never"}));if(i.length>20){return g!==n&&console.error(`Polotno can not export PDF with current settings. Quality is automatically reduced. pixelRatio was reduced to ${parseFloat(g.toFixed(3))}.`),e.onProgress&&e.onProgress(++P/a.length*.9),{url:i,width:r,height:l,widthPx:o,heightPx:s}}g*=.8}});(await Promise.all(t)).filter(e=>void 0!==e).forEach(({url:e,width:t,height:i,widthPx:n,heightPx:a})=>{y.addPage([t,i],t>i?"landscape":"portrait");const s=y.getCurrentPageInfo();var r;switch(o){case"pt":r=1;break;case"mm":r=72/25.4;break;case"cm":r=72/2.54;break;case"in":r=72;break;case"px":r=.75;break;default:throw"Invalid unit: "+o}if(s.pageContext.cropBox={bottomLeftX:0,bottomLeftY:0,topRightX:t*r,topRightY:i*r},s.pageContext.artBox={bottomLeftX:d(c+m)*r,bottomLeftY:d(c+m)*r,topRightX:d(n-c-m)*r,topRightY:d(a-c-m)*r},s.pageContext.bleedBox={bottomLeftX:d(c+m)*r,bottomLeftY:d(c+m)*r,topRightX:d(n-c-m)*r,topRightY:d(a-c-m)*r},p){y.setLineWidth(d(1));const e=p+d(m);y.line(e,0,e,p),y.line(0,e,p,e),y.line(t-e,0,t-e,p),y.line(t,e,t-p,e),y.line(0,i-e,p,i-e),y.line(e,i,e,i-p),y.line(t,i-e,t-p,i-e),y.line(t-e,i,t-e,i-p)}y.addImage(e,p,p,t-2*p,i-2*p,void 0,"FAST")})}return y},toPDFDataURL:async e=>(await b._toPDF(Object.assign({mimeType:"image/jpeg"},e))).output("datauristring"),async toGIFDataURL(e={}){const t=e.pixelRatio||1,i=e.pageIds||(e.pageId?[e.pageId]:r.pages.map(e=>e.id)),o=r.pages.filter(e=>i.includes(e.id));if(!o.length){throw new Error("No pages found for GIF export")}const n=o[0],a=await f({width:n.computedWidth*t,height:n.computedHeight*t}),s=1e3/(e.fps||10);for(const l of o){const e=Math.max(1,Math.floor(l.duration/s));for(let i=0;i<e;i++){const e=l.startTime+i*s||1;b.setCurrentTime(e);for(const t of r.pages){t.set({_rendering:t.id===l.id})}const o=await b._toCanvas({pixelRatio:t,pageId:l.id,_skipTimeout:!0});a.addFrame(o.getContext("2d"),{delay:s,copy:!0})}}for(const l of r.pages){l.set({_rendering:!1})}return b.stop(),a.render(),new Promise(e=>{a.on("finished",function(t){!function(e,t){var i=new FileReader;i.onload=function(e){t(e.target.result)},i.readAsDataURL(e)}(t,e)})})},async saveAsGIF(t={}){var{fileName:i}=t,o=e(t,["fileName"]);const n=await b.toGIFDataURL(o);m(n,i||"polotno.gif")},async toHTML({elementHook:e}={}){const t=b.toJSON();return k({json:t,elementHook:e})},async saveAsHTML({fileName:e,elementHook:t}={}){const i=await b.toHTML({elementHook:t}),o="data:text/html;base64,"+window.btoa(unescape(encodeURIComponent(i)));m(o,e||"polotno.html")},async toSVG({elementHook:e,pageId:t,fontEmbedding:i="inline"}={fontEmbedding:"inline"}){var o;const n=b.toJSON();t=t||(null===(o=n.pages[0])||void 0===o?void 0:o.id);const a=n.pages.find(e=>e.id===t);return S({json:Object.assign(Object.assign({},n),{pages:a?[a]:[]}),elementHook:e,fontEmbedding:i})},async saveAsSVG({fileName:e,elementHook:t,pageId:i,fontEmbedding:o="inline"}={}){const n=await b.toSVG({elementHook:t,pageId:i,fontEmbedding:o}),a="data:text/svg;base64,"+window.btoa(unescape(encodeURIComponent(n)));m(a,e||"polotno.svg")},async saveAsPDF(t={}){var{fileName:i}=t,o=e(t,["fileName"]);(await b._toPDF(Object.assign({mimeType:"image/jpeg"},o))).save(i||"polotno.pdf")},async waitLoading({_skipTimeout:e=!1}={}){e||await new Promise(e=>setTimeout(e,50)),await E()},toJSON:()=>({width:r.width,height:r.height,fonts:a(r.fonts),pages:a(r.pages),audios:a(r.audios),unit:r.unit,dpi:r.dpi,custom:r.custom,schemaVersion:r.schemaVersion}),loadJSON(e,i=!1){var o,n,s;const l="boolean"==typeof i?i:null!==(o=null==i?void 0:i.keepHistory)&&void 0!==o&&o,d="boolean"!=typeof i&&null!==(n=null==i?void 0:i.modernizeTextBackground)&&void 0!==n&&n,c=JSON.parse(JSON.stringify(e)),p=c.schemaVersion||0;p<1&&(v.htmlRenderEnabled||v.renderTagTextEnabled)&&j({children:c.pages},e=>{if("text"===e.type){const t=16,i=e.letterSpacing*t;e.letterSpacing=i/e.fontSize}}),p<2&&j({children:c.pages},e=>{e.filters&&Object.keys(e.filters).forEach(t=>{if(["warm","cold","natural"].includes(t)){return}const i=e.filters[t];i&&"number"==typeof i.intensity&&(i.intensity=i.intensity/100)})}),p<3&&(v.htmlRenderEnabled||v.renderTagTextEnabled)&&!d&&j({children:c.pages},e=>{"text"===e.type&&e.backgroundEnabled&&(e.legacyBackground=!0)}),delete c.schemaVersion;const g=r.activePage?r.pages.indexOf(r.activePage):0;let m=null===(s=c.pages[g]||c.pages[0])||void 0===s?void 0:s.id;c._activePageId=m;const u=Object.assign({},a(r));Object.assign(u,c),u.history=l?a(r.history):{history:[],undoIdx:-1,targetPath:""},t(r,u)},clear({keepHistory:e=!1}={}){const t=r.pages.map(e=>e.id);b.deletePages(t),r.custom=null,e||r.history.clear()},addFont(e){b.removeFont(e.fontFamily),r.fonts.push(e)},removeFont(e){r.fonts.filter(t=>t.fontFamily===e).forEach(e=>o(e))},addAudio(e){const t=R.create(Object.assign({id:c(10)},e));r.audios.push(t)},removeAudio(e){const t=r.audios.find(t=>t.id===e);t&&r.audios.remove(t)},async loadFont(e,t,i,o){const n=r.fonts.find(t=>t.fontFamily===e)||y.globalFonts.find(t=>t.fontFamily===e);let a=[{fontStyle:"normal",fontWeight:"normal"},{fontStyle:"normal",fontWeight:"bold"}];return n?(n.styles&&(a=n.styles.map(e=>({fontStyle:e.fontStyle||"normal",fontWeight:e.fontWeight||"normal"}))),y.injectCustomFont(n)):y.injectGoogleFont(e),t&&i&&!a.some(e=>e.fontStyle===t&&e.fontWeight===i)&&a.push({fontStyle:t,fontWeight:i}),Promise.all(a.map(t=>y.loadFont(e,t.fontStyle,t.fontWeight,o)))},validate:e=>Store.validate(e,[{path:"",type:Store}]).map(e=>({path:"store"+e.context.map(e=>e.path).join("."),message:e.message}))};return b});export function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){return b(e),Store.create({_forceShowCredit:t})}export default createStore;
|
|
1
|
+
var e=this&&this.__rest||function(e,t){var i={};for(var o in e){Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(i[o]=e[o])}if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++){t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(i[o[n]]=e[o[n]])}}return i};import{applySnapshot as t,cast as i,destroy as o,detach as n,getSnapshot as a,onSnapshot as s,setLivelinessChecking as r,types as l}from"mobx-state-tree";import{UndoManager as d}from"./history.js";import{nanoid as c}from"nanoid";import p from"konva";import{computed as g}from"mobx";import{downloadFile as m}from"../utils/download.js";import{getJsPDF as u}from"../utils/pdf.js";import{createGIF as f}from"../utils/gif-lib.js";import{validateKey as h,setKey as b}from"../utils/validate-key.js";import*as y from"../utils/fonts.js";import{flags as v}from"../utils/flags.js";import{addDpiMetadataToImage as P}from"../utils/image-dpi.js";import{nodeToCanvas as w}from"../utils/canvas.js";import{whenLoaded as E}from"../utils/loader.js";import{pxToUnit as x}from"../utils/unit.js";import{deepEqual as I}from"../utils/deep-equal.js";import{waitTillAvailable as _}from"../utils/wait.js";import{jsonToHTML as k}from"../utils/to-html.js";import{jsonToSVG as S}from"../utils/to-svg.js";import{Page as T}from"./page-model.js";import{forEveryChild as O,forEveryNode as j}from"./group-model.js";import{Audio as R}from"./audio-model.js";r("ignore");export const Font=l.model("Font",{fontFamily:l.string,url:l.optional(l.string,""),styles:l.frozen()}).preProcessSnapshot(e=>Object.assign(Object.assign({},e),{fontFamily:e.fontFamily||e.name}));export const ROLES={ADMIN:"admin",VIEWER:"viewer"};export const Store=l.model("Store",{role:"",pages:l.array(T),fonts:l.array(Font),audios:l.array(R),width:1080,height:1080,currentTime:0,isPlaying:!1,scale:1,scaleToFit:1,unit:l.optional(l.enumeration("UnitType",["pt","mm","cm","in","px"]),"px"),dpi:72,schemaVersion:4,bleedVisible:!1,rulesVisible:!1,distanceGuidesVisible:!1,openedSidePanel:"",previousOpenedSidePanel:"",custom:l.frozen(),tool:l.optional(l.enumeration("Tool",["selection","draw","pan","text","eraser"]),"selection"),toolOptions:l.optional(l.model({brushType:l.optional(l.enumeration("BrushType",["brush","highlighter"]),"brush"),strokeWidth:l.optional(l.number,5),stroke:l.optional(l.string,"#000000"),opacity:l.optional(l.number,1)}),{}),selectedElementsIds:l.array(l.string),animatedElementsIds:l.array(l.string),history:l.optional(d,{targetPath:"../pages"}),_elementsPixelRatio:Math.min(2,"undefined"!=typeof window&&window.devicePixelRatio||1),_activePageId:"",_selectedPagesIds:l.array(l.string),_forceShowCredit:!1,_validated:!1}).views(e=>{const t=g(()=>{const t={};return j({children:e.pages},e=>(t[e.id]=e,!1)),t},{keepAlive:!0});return{get _idsMap(){return t.get()}}}).views(e=>({get _bleedVisible(){return console.warn("store._bleedVisible is deprecated. Please use store.bleedVisible instead."),e.bleedVisible},get selectedElements(){return e.selectedElementsIds.map(t=>e._idsMap[t]).filter(e=>!!e)},get children(){return e.pages},get selectedShapes(){const e=[];return O({children:this.selectedElements},t=>{"group"!==t.type&&e.push(t)}),e},get activePage(){return e.pages.slice().find(t=>t.id===e._activePageId)||(e.pages.length?e.pages[0]:null)},get selectedPages(){return e._selectedPagesIds.map(t=>e.pages.find(e=>e.id===t))},get duration(){let t=0;return e.pages.forEach(e=>{t+=e.duration}),t},get _hasCroppedImages(){return this.find(e=>"image"===e.type&&e._cropModeEnabled)},find(t){let i;return j({children:e.pages},e=>{if(!i&&t(e)){return i=e,!0}}),i},getElementById:t=>e._idsMap[t]})).actions(r=>{let l=0,d=null,g=!1;const b={afterCreate(){r.history.canUndo},setCurrentTime(e){r.currentTime=e},_togglePlaying(e=!r.isPlaying){r.isPlaying=e},play({animatedElementsIds:e=[],startTime:t=0,currentTime:o=0,endTime:n=r.duration,repeat:a=!1}={}){o&&(console.warn("currentTime property of store.play() is deprecated. Please use startTime instead."),t=o),r.animatedElementsIds=i(e),r.currentTime=t,r.isPlaying=!0,l=Date.now(),d=n,g=a,requestAnimationFrame(()=>b.seek())},checkActivePage(){let e=0;for(const t of r.pages){if(r.currentTime>=t.startTime&&r.currentTime<t.startTime+t.duration){b.selectPage(t.id);break}e+=t.duration}},seek(){if(!r.isPlaying){return}const e=Date.now(),t=e-l;l=e,r.currentTime+=t,b.checkActivePage();const i=d||r.duration;r.isPlaying&&r.currentTime<i?requestAnimationFrame(()=>b.seek()):r.isPlaying&&g?(r.currentTime=0,requestAnimationFrame(()=>b.seek())):b.stop()},stop(){r.isPlaying=!1,r.currentTime=0,r.animatedElementsIds=i([]),b.checkActivePage()},__(){r._validated||(h(r._forceShowCredit),r._validated=!0)},set(e){Object.assign(r,e)},setUnit({unit:e,dpi:t}){r.unit=e||r.unit,r.dpi=t||r.dpi},setRole(e){r.role=e},setTool(e){r.tool=e},setToolOptions(e){Object.assign(r.toolOptions,e)},addPage(e){const t=T.create(Object.assign({id:c(10)},e));return r.pages.push(t),r._activePageId=t.id,t},selectPage(e){r._activePageId=e,1===r._selectedPagesIds.length&&(r._selectedPagesIds=i([e]))},selectPages(e){r._selectedPagesIds=i(e),1===r._selectedPagesIds.length&&(r._activePageId=r._selectedPagesIds[0])},selectElements(e){const t=e.map(e=>r.getElementById(e)).filter(e=>!!e);t.sort((e,t)=>{var i,o,n,a;return(null!==(o=null===(i=e.parent)||void 0===i?void 0:i.children.indexOf(e))&&void 0!==o?o:0)-(null!==(a=null===(n=t.parent)||void 0===n?void 0:n.children.indexOf(t))&&void 0!==a?a:0)}),r.selectedElementsIds=i(t.map(e=>e.id))},toggleBleed(e){r.bleedVisible=null!=e?e:!r.bleedVisible},toggleRulers(e){r.rulesVisible=null!=e?e:!r.rulesVisible},toggleDistanceGuides(e){r.distanceGuidesVisible=null!=e?e:!r.distanceGuidesVisible},openSidePanel(e){r.openedSidePanel!==e&&(r.previousOpenedSidePanel=r.openedSidePanel,r.openedSidePanel=e)},restoreSidePanel(){const e=r.previousOpenedSidePanel;e&&e!==r.openedSidePanel?r.openedSidePanel=e:r.openedSidePanel="photos"},setScale(e){r.scale=e},_setScaleToFit(e){r.scaleToFit=e},setElementsPixelRatio(e){r._elementsPixelRatio=e},setSize(e,t,i){r.pages.forEach(o=>{o.setSize({width:e,height:t,useMagic:i,softChange:!0})}),r.width=e,r.height=t},setPageZIndex(e,t){const i=r.pages.find(t=>t.id===e);i&&(n(i),r.pages.remove(i),r.pages.splice(t,0,i))},deletePages(e){const t=r.pages.indexOf(r.activePage);e.forEach(e=>{const t=r.pages.find(t=>t.id===e);o(t)});const n=Math.min(r.pages.length-1,t),a=r.pages[n];a&&(r._activePageId=a.id),r.selectedElementsIds=i(r.selectedElementsIds.filter(e=>r.getElementById(e)))},groupElements(e,t={}){const o=e.map(e=>r.getElementById(e)).filter(e=>!!e);if(!o.length){return}const a=o[0].parent;if(!a){return}if(!o.every(e=>e.parent===a)){return void console.warn("store.groupElements: refusing to group elements that do not share a parent. Pass ids whose elements all live under the same page or the same group.")}o.forEach(e=>n(e));const s=a.children.reduce((e,t)=>{var i;if("group"===t.type){const o=null===(i=t.name)||void 0===i?void 0:i.match(/group-(\d+)/);if(o){const t=parseInt(o[1],10);return Math.max(e,t)}}return e},0),l=Object.assign({id:c(10),name:`group-${s+1}`,children:o,type:"group"},t);return a.children.push(l),r.selectedElementsIds=i([l.id]),a.children.find(e=>e.id===l.id)},ungroupElements(e){const t=e.map(e=>r.getElementById(e)),o=[];t.forEach(e=>{if(e&&"group"===e.type){const t=e.parent;if(!t){return}const i=t.children.indexOf(e);e.children.forEach(e=>{o.push(e.id)}),e.children.slice().forEach(e=>{n(e),t.children.push(e)}),t.children.splice(i,1)}}),r.selectedElementsIds=i(o)},deleteElements(e){const t=[];r.find(i=>(e.includes(i.id)&&t.push(i),!1)),t.forEach(e=>{o(e)}),r.selectedElementsIds=i(r.selectedElementsIds.filter(e=>r.getElementById(e)))},on(e,t){if("change"===e){let e=b.toJSON();return s(r,i=>{const o=b.toJSON();!I(e,o)&&(e=o,t(o))})}},async _toCanvas({pixelRatio:e,ignoreBackground:t,pageId:i,mimeType:o,includeBleed:n,_skipTimeout:a,quickMode:s=!1,_exportCanvases:l}={}){var d;const c=e||1;i=i||(null===(d=r.pages[0])||void 0===d?void 0:d.id);const g=r.pages.find(e=>e.id===i);if(!g){throw new Error(`No page for export with id ${i}`)}const m=r._elementsPixelRatio;c>r._elementsPixelRatio&&b.setElementsPixelRatio(c),s?null==g||g.set({_forceMount:!0}):null==g||g.set({_exporting:!0});const u=await _(()=>{const e=p.stages.filter(e=>e.getAttr("pageId")===i);return 0===e.length?null:e});if(!u){throw null==g||g.set({_forceMount:!1,_exporting:!1}),b.setElementsPixelRatio(m),new Error(`Export is failed. Can not find stage for page ${i}. Looks like <Workspace /> component is not mounted, but it is required in order to process the export.`)}u.length>1&&console.error(`Polotno error: Detected several canvas elements for page "${i}" in the document. This is not supported and will lead to incorrect export. Make sure to use unique ids for all pages and make sure you unmount <Workspace /> when it is not needed.`);const f=u[0];await b.waitLoading({_skipTimeout:a});const h=f.findOne(".page-container");if(!h){throw b.setElementsPixelRatio(m),null==g||g.set({_forceMount:!1,_exporting:!1}),new Error("Export is failed. Canvas was unmounted.")}const y=f.position();f.position({x:0,y:0}),f.find("Transformer").forEach(e=>{e.setAttr("oldVisible",e.visible()),e.visible(!1)}),h.find(".page-background").forEach(e=>e.shadowEnabled(!1)),h.find(".page-background").forEach(e=>e.strokeEnabled(!1)),h.find(".highlighter").forEach(e=>e.visible(!1));const v=h.findOne(".page-background-group"),P=v.clip();v.clip({x:null,y:null,width:null,height:null});const E=h.findOne(".elements-container"),x=E.clip();E.clip({x:null,y:null,width:null,height:null});const I=h.find(e=>!e.visible()&&e.getAttr("editModeEnabled")&&!e.getAttr("hideInExport"));I.forEach(e=>{e.setAttr("oldVisible",e.visible()),e.show()});const k=h.find(e=>e.getAttr("hideInExport"));k.forEach(e=>{e.setAttr("oldVisible",e.visible()),e.hide()}),t&&h.find(".page-background").forEach(e=>e.hide());const S=n?g.bleed:0;let T=S;!r.bleedVisible&&n||(r.bleedVisible||n?r.bleedVisible&&n?T=0:r.bleedVisible&&!n&&(T=-g.bleed):T=0);const O=g.computedWidth+2*S,j=g.computedHeight+2*S,R=h.scale();h.scale({x:1,y:1});const F=w(h,{x:h.x()-T,y:h.y()-T,width:O,height:j,pixelRatio:c,sceneCanvas:null==l?void 0:l.sceneCanvas,bufferCanvas:null==l?void 0:l.bufferCanvas});h.scale(R);const C=F._canvas;if("image/jpeg"===o){const e=C.getContext("2d");e.save(),e.globalCompositeOperation="destination-over",e.fillStyle="white",e.fillRect(0,0,C.width,C.height),e.restore()}return t&&h.find(".page-background").forEach(e=>e.show()),k.forEach(e=>{e.visible(e.getAttr("oldVisible"))}),I.forEach(e=>{e.visible(e.getAttr("oldVisible"))}),h.find(".page-background").forEach(e=>e.shadowEnabled(!0)),h.find(".page-background").forEach(e=>e.strokeEnabled(!0)),f.find("Transformer").forEach(e=>{e.visible(e.getAttr("oldVisible"))}),h.find(".highlighter").forEach(e=>e.visible(!0)),v.clip(P),E.clip(x),f.position(y),null==g||g.set({_exporting:!1,_forceMount:!1}),await Promise.resolve(),b.setElementsPixelRatio(m),C},async toDataURL(t={}){var{mimeType:i,quality:o,dpi:n,dpiMetadata:a="auto"}=t,s=e(t,["mimeType","quality","dpi","dpiMetadata"]);const l=await b._toCanvas(Object.assign({mimeType:i},s)),d=i||"image/png",c=l.toDataURL(d,o);p.Util.releaseCanvas(l);const g=null!=n?n:r.dpi;return"image/png"!==d&&"image/jpeg"!==d||"never"===a||"auto"===a&&72===g?c:P(c,d,g)},async toBlob(t={}){var{mimeType:i,quality:o}=t,n=e(t,["mimeType","quality"]);const a=await b._toCanvas(Object.assign({mimeType:i},n)),s=await new Promise(e=>{a.toBlob(e,i,o)});return p.Util.releaseCanvas(a),s},async saveAsImage(t={}){var{fileName:i}=t,o=e(t,["fileName"]);const n=(o.mimeType||"image/png").split("/")[1];m(await b.toDataURL(o),i||"polotno."+n)},async _toPDF(e){const t=e.dpi||r.dpi,i=e.parallel||1,o=e.unit||("px"===r.unit?"mm":r.unit),n=e.pixelRatio||1,a=e.pageIds||(e.pageId?[e.pageId]:r.pages.map(e=>e.id)),s=r.pages.filter(e=>a.includes(e.id)),l=await u(),d=e=>x({px:e,unit:o,dpi:t}),c=e.cropMarkSize||0,p=d(c),g=s[0]||{},m=e.includeBleed?g.bleed:0,f=d(g.computedWidth+2*m+2*p),h=d(g.computedHeight+2*m+2*p);var y=new l({unit:o,orientation:f>h?"landscape":"portrait",format:[f,h],compress:!0,putOnlyUsedFonts:!0});y.deletePage(1);const v=((e,t)=>{const i=[];for(let o=0;o<e.length;o+=t){i.push(e.slice(o,o+t))}return i})(s,i);let P=0;for(const r of v){const t=r.map(async t=>{const i=e.includeBleed?t.bleed:0,o=t.computedWidth+2*i+2*c,s=t.computedHeight+2*i+2*c,r=d(o),l=d(s);let p=0,g=n;for(;p<10;){p+=1;const i=await b.toDataURL(Object.assign(Object.assign({},e),{pageId:t.id,pixelRatio:g,dpiMetadata:"never"}));if(i.length>20){return g!==n&&console.error(`Polotno can not export PDF with current settings. Quality is automatically reduced. pixelRatio was reduced to ${parseFloat(g.toFixed(3))}.`),e.onProgress&&e.onProgress(++P/a.length*.9),{url:i,width:r,height:l,widthPx:o,heightPx:s}}g*=.8}});(await Promise.all(t)).filter(e=>void 0!==e).forEach(({url:e,width:t,height:i,widthPx:n,heightPx:a})=>{y.addPage([t,i],t>i?"landscape":"portrait");const s=y.getCurrentPageInfo();var r;switch(o){case"pt":r=1;break;case"mm":r=72/25.4;break;case"cm":r=72/2.54;break;case"in":r=72;break;case"px":r=.75;break;default:throw"Invalid unit: "+o}if(s.pageContext.cropBox={bottomLeftX:0,bottomLeftY:0,topRightX:t*r,topRightY:i*r},s.pageContext.artBox={bottomLeftX:d(c+m)*r,bottomLeftY:d(c+m)*r,topRightX:d(n-c-m)*r,topRightY:d(a-c-m)*r},s.pageContext.bleedBox={bottomLeftX:d(c+m)*r,bottomLeftY:d(c+m)*r,topRightX:d(n-c-m)*r,topRightY:d(a-c-m)*r},p){y.setLineWidth(d(1));const e=p+d(m);y.line(e,0,e,p),y.line(0,e,p,e),y.line(t-e,0,t-e,p),y.line(t,e,t-p,e),y.line(0,i-e,p,i-e),y.line(e,i,e,i-p),y.line(t,i-e,t-p,i-e),y.line(t-e,i,t-e,i-p)}y.addImage(e,p,p,t-2*p,i-2*p,void 0,"FAST")})}return y},toPDFDataURL:async e=>(await b._toPDF(Object.assign({mimeType:"image/jpeg"},e))).output("datauristring"),async toGIFDataURL(e={}){const t=e.pixelRatio||1,i=e.pageIds||(e.pageId?[e.pageId]:r.pages.map(e=>e.id)),o=r.pages.filter(e=>i.includes(e.id));if(!o.length){throw new Error("No pages found for GIF export")}const n=o[0],a=await f({width:n.computedWidth*t,height:n.computedHeight*t}),s=1e3/(e.fps||10);for(const l of o){const e=Math.max(1,Math.floor(l.duration/s));for(let i=0;i<e;i++){const e=l.startTime+i*s||1;b.setCurrentTime(e);for(const t of r.pages){t.set({_rendering:t.id===l.id})}const o=await b._toCanvas({pixelRatio:t,pageId:l.id,_skipTimeout:!0});a.addFrame(o.getContext("2d"),{delay:s,copy:!0})}}for(const l of r.pages){l.set({_rendering:!1})}return b.stop(),a.render(),new Promise(e=>{a.on("finished",function(t){!function(e,t){var i=new FileReader;i.onload=function(e){t(e.target.result)},i.readAsDataURL(e)}(t,e)})})},async saveAsGIF(t={}){var{fileName:i}=t,o=e(t,["fileName"]);const n=await b.toGIFDataURL(o);m(n,i||"polotno.gif")},async toHTML({elementHook:e}={}){const t=b.toJSON();return k({json:t,elementHook:e})},async saveAsHTML({fileName:e,elementHook:t}={}){const i=await b.toHTML({elementHook:t}),o="data:text/html;base64,"+window.btoa(unescape(encodeURIComponent(i)));m(o,e||"polotno.html")},async toSVG({elementHook:e,pageId:t,fontEmbedding:i="inline"}={fontEmbedding:"inline"}){var o;const n=b.toJSON();t=t||(null===(o=n.pages[0])||void 0===o?void 0:o.id);const a=n.pages.find(e=>e.id===t);return S({json:Object.assign(Object.assign({},n),{pages:a?[a]:[]}),elementHook:e,fontEmbedding:i})},async saveAsSVG({fileName:e,elementHook:t,pageId:i,fontEmbedding:o="inline"}={}){const n=await b.toSVG({elementHook:t,pageId:i,fontEmbedding:o}),a="data:text/svg;base64,"+window.btoa(unescape(encodeURIComponent(n)));m(a,e||"polotno.svg")},async saveAsPDF(t={}){var{fileName:i}=t,o=e(t,["fileName"]);(await b._toPDF(Object.assign({mimeType:"image/jpeg"},o))).save(i||"polotno.pdf")},async waitLoading({_skipTimeout:e=!1}={}){e||await new Promise(e=>setTimeout(e,50)),await E()},toJSON:()=>({width:r.width,height:r.height,fonts:a(r.fonts),pages:a(r.pages),audios:a(r.audios),unit:r.unit,dpi:r.dpi,custom:r.custom,schemaVersion:r.schemaVersion}),loadJSON(e,i=!1){var o,n,s;const l="boolean"==typeof i?i:null!==(o=null==i?void 0:i.keepHistory)&&void 0!==o&&o,d="boolean"!=typeof i&&null!==(n=null==i?void 0:i.modernizeTextBackground)&&void 0!==n&&n,c=JSON.parse(JSON.stringify(e)),p=c.schemaVersion||0;p<1&&(v.htmlRenderEnabled||v.renderTagTextEnabled)&&j({children:c.pages},e=>{if("text"===e.type){const t=16,i=e.letterSpacing*t;e.letterSpacing=i/e.fontSize}}),p<2&&j({children:c.pages},e=>{e.filters&&Object.keys(e.filters).forEach(t=>{if(["warm","cold","natural"].includes(t)){return}const i=e.filters[t];i&&"number"==typeof i.intensity&&(i.intensity=i.intensity/100)})}),p<3&&(v.htmlRenderEnabled||v.renderTagTextEnabled)&&!d&&j({children:c.pages},e=>{"text"===e.type&&e.backgroundEnabled&&(e.legacyBackground=!0)}),delete c.schemaVersion;const g=r.activePage?r.pages.indexOf(r.activePage):0;let m=null===(s=c.pages[g]||c.pages[0])||void 0===s?void 0:s.id;c._activePageId=m;const u=Object.assign({},a(r));Object.assign(u,c),u.history=l?a(r.history):{history:[],undoIdx:-1,targetPath:""},t(r,u)},clear({keepHistory:e=!1}={}){const t=r.pages.map(e=>e.id);b.deletePages(t),r.custom=null,e||r.history.clear()},addFont(e){b.removeFont(e.fontFamily),r.fonts.push(e)},removeFont(e){r.fonts.filter(t=>t.fontFamily===e).forEach(e=>o(e))},addAudio(e){const t=R.create(Object.assign({id:c(10)},e));r.audios.push(t)},removeAudio(e){const t=r.audios.find(t=>t.id===e);t&&r.audios.remove(t)},async loadFont(e,t,i,o){const n=r.fonts.find(t=>t.fontFamily===e)||y.globalFonts.find(t=>t.fontFamily===e);let a=[{fontStyle:"normal",fontWeight:"normal"},{fontStyle:"normal",fontWeight:"bold"}];return n?(n.styles&&(a=n.styles.map(e=>({fontStyle:e.fontStyle||"normal",fontWeight:e.fontWeight||"normal"}))),y.injectCustomFont(n)):y.injectGoogleFont(e),t&&i&&!a.some(e=>e.fontStyle===t&&e.fontWeight===i)&&a.push({fontStyle:t,fontWeight:i}),Promise.all(a.map(t=>y.loadFont(e,t.fontStyle,t.fontWeight,o)))},validate:e=>Store.validate(e,[{path:"",type:Store}]).map(e=>({path:"store"+e.context.map(e=>e.path).join("."),message:e.message}))};return b});export function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){return b(e),Store.create({_forceShowCredit:t})}export default createStore;
|
package/model/table-model.d.ts
CHANGED
|
@@ -141,6 +141,7 @@ export declare const TableCell: import("mobx-state-tree").IModelType<{
|
|
|
141
141
|
set(attrs: any): void;
|
|
142
142
|
setBorder(side: BorderSideName, attrs: BorderAttrs): void;
|
|
143
143
|
toggleEditMode(editing?: boolean): void;
|
|
144
|
+
beforeDestroy(): void;
|
|
144
145
|
}, any, any>;
|
|
145
146
|
export type TableCellType = Instance<typeof TableCell>;
|
|
146
147
|
export declare const TableElement: import("mobx-state-tree").IModelType<{
|
|
@@ -329,6 +330,7 @@ export declare const TableElement: import("mobx-state-tree").IModelType<{
|
|
|
329
330
|
set(attrs: any): void;
|
|
330
331
|
setBorder(side: BorderSideName, attrs: BorderAttrs): void;
|
|
331
332
|
toggleEditMode(editing?: boolean): void;
|
|
333
|
+
beforeDestroy(): void;
|
|
332
334
|
}, any, any>>;
|
|
333
335
|
borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
334
336
|
borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
|