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.
Files changed (42) hide show
  1. package/blueprint/side-panel/select-video.d.ts +2 -0
  2. package/canvas/audio.js +1 -1
  3. package/canvas/context-menu/context-menu.js +1 -1
  4. package/canvas/page.js +1 -1
  5. package/canvas/use-mediabunny-video.js +1 -1
  6. package/canvas/use-transformer-snap.js +1 -1
  7. package/canvas/video-element.js +1 -1
  8. package/model/audio-model.d.ts +2 -0
  9. package/model/audio-model.js +1 -1
  10. package/model/group-model.d.ts +3 -0
  11. package/model/page-model.d.ts +3 -0
  12. package/model/schema.d.ts +20 -253
  13. package/model/store.d.ts +30 -0
  14. package/model/store.js +1 -1
  15. package/model/table-model.d.ts +2 -0
  16. package/model/table-model.js +1 -1
  17. package/model/text-model.d.ts +1 -0
  18. package/model/text-model.js +1 -1
  19. package/model/video-model.d.ts +1 -0
  20. package/model/video-model.js +1 -1
  21. package/package.json +4 -4
  22. package/pages-timeline/audio-track.js +1 -1
  23. package/polotno.bundle.js +114 -114
  24. package/primitives/overflow-list.d.ts +2 -1
  25. package/primitives/overflow-list.js +1 -1
  26. package/primitives/speed-control.d.ts +7 -0
  27. package/primitives/speed-control.js +1 -0
  28. package/side-panel/select-video.d.ts +2 -0
  29. package/toolbar/element-container.js +1 -1
  30. package/toolbar/figure-toolbar.js +1 -1
  31. package/toolbar/line-toolbar.js +1 -1
  32. package/toolbar/svg-toolbar.js +1 -1
  33. package/toolbar/table-toolbar.js +1 -1
  34. package/toolbar/text-toolbar.js +1 -1
  35. package/toolbar/video-toolbar.js +1 -1
  36. package/ui.css +1 -1
  37. package/utils/fonts.js +1 -1
  38. package/utils/l10n.d.ts +2 -0
  39. package/utils/l10n.js +1 -1
  40. package/utils/timeline.d.ts +11 -0
  41. package/utils/timeline.js +1 -0
  42. package/utils/validate-key.js +1 -1
package/model/schema.d.ts CHANGED
@@ -1,253 +1,20 @@
1
- export interface Store {
2
- schemaVersion: number;
3
- width: number;
4
- height: number;
5
- unit: 'px' | 'pt' | 'mm' | 'cm' | 'in';
6
- dpi: number;
7
- custom?: unknown;
8
- fonts: Font[];
9
- pages: Page[];
10
- audios: Audio[];
11
- }
12
- export interface FontStyleVariant {
13
- src: string;
14
- fontStyle?: string;
15
- fontWeight?: string;
16
- }
17
- export interface Font {
18
- fontFamily: string;
19
- url?: string;
20
- styles?: FontStyleVariant[];
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;
@@ -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>;