polotno 2.40.1 → 2.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/canvas/context-menu/context-menu.js +1 -1
- package/canvas/element.js +1 -1
- package/canvas/figure-element.js +1 -1
- package/canvas/gif-element.js +1 -1
- package/canvas/hotkeys.js +1 -1
- package/canvas/html-element.js +2 -2
- package/canvas/image-element.js +1 -1
- package/canvas/line-element.js +1 -1
- package/canvas/page-controls.js +1 -1
- package/canvas/page.d.ts +3 -1
- package/canvas/page.js +1 -1
- package/canvas/table-element.js +1 -1
- package/canvas/text-element.js +1 -1
- package/canvas/tooltip.js +1 -1
- package/canvas/video-element.js +1 -1
- package/canvas/workspace-canvas.d.ts +3 -1
- package/canvas/workspace-canvas.js +1 -1
- package/model/group-model.d.ts +28 -12
- package/model/group-model.js +1 -1
- package/model/node-model.js +1 -1
- package/model/page-model.d.ts +15 -17
- package/model/page-model.js +1 -1
- package/model/store.d.ts +140 -153
- package/model/store.js +1 -1
- package/model/table-model.d.ts +27 -0
- package/model/table-model.js +1 -1
- package/model/text-model.d.ts +1 -12
- package/package.json +3 -3
- package/pages-timeline/elements.js +1 -1
- package/pages-timeline/page-preview.d.ts +4 -0
- package/pages-timeline/page-preview.js +2 -2
- package/polotno.bundle.js +245 -245
- package/side-panel/layers-panel.js +1 -1
- package/toolbar/position-picker.js +1 -1
- package/toolbar/table-toolbar.js +1 -1
- package/toolbar/toolbar.js +5 -5
- package/utils/html-to-svg/xhtml.js +1 -1
- package/utils/l10n.d.ts +11 -6
- package/utils/l10n.js +1 -1
- package/utils/text-html.js +1 -1
- package/utils/to-html.js +1 -1
- package/utils/to-svg.js +1 -1
- package/utils/validate-key.js +1 -1
- package/utils/xml.d.ts +1 -0
- package/utils/xml.js +7 -0
package/model/store.d.ts
CHANGED
|
@@ -30,6 +30,7 @@ export interface ImageExportOptions extends ExportOptions {
|
|
|
30
30
|
}
|
|
31
31
|
export interface GifExportOptions extends ExportOptions {
|
|
32
32
|
fps?: number;
|
|
33
|
+
pageIds?: Array<string>;
|
|
33
34
|
}
|
|
34
35
|
export interface PDFExportOptions extends ExportOptions {
|
|
35
36
|
dpi?: number;
|
|
@@ -43,6 +44,10 @@ export interface LoadJSONOptions {
|
|
|
43
44
|
keepHistory?: boolean;
|
|
44
45
|
modernizeTextBackground?: boolean;
|
|
45
46
|
}
|
|
47
|
+
export declare const ROLES: {
|
|
48
|
+
readonly ADMIN: "admin";
|
|
49
|
+
readonly VIEWER: "viewer";
|
|
50
|
+
};
|
|
46
51
|
export declare const Store: import("mobx-state-tree").IModelType<{
|
|
47
52
|
role: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
48
53
|
pages: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
|
|
@@ -67,9 +72,22 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
67
72
|
readonly computedHeight: any;
|
|
68
73
|
} & {
|
|
69
74
|
toJSON(): any;
|
|
70
|
-
_forEachElementUp(ids: Array<string>, callback: Function): void;
|
|
71
|
-
_forEachElementDown(ids: Array<string>, callback: Function): false;
|
|
72
75
|
} & {
|
|
76
|
+
setSize({ width, height, useMagic, softChange, }: {
|
|
77
|
+
width: number;
|
|
78
|
+
height: number;
|
|
79
|
+
useMagic?: boolean;
|
|
80
|
+
softChange?: boolean;
|
|
81
|
+
}): void;
|
|
82
|
+
canMoveElementsUp(ids: Array<string>): boolean;
|
|
83
|
+
canMoveElementsTop(ids: Array<string>): boolean;
|
|
84
|
+
canMoveElementsDown(ids: Array<string>): boolean;
|
|
85
|
+
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
86
|
+
moveElementsUp(ids: Array<string>): void;
|
|
87
|
+
moveElementsDown(ids: Array<string>): void;
|
|
88
|
+
moveElementsTop(ids: Array<string>): void;
|
|
89
|
+
moveElementsBottom(ids: Array<string>): void;
|
|
90
|
+
setElementZIndex(id: string, zIndex: number): void;
|
|
73
91
|
clone(attrs?: {}): any;
|
|
74
92
|
setZIndex(zIndex: any): void;
|
|
75
93
|
set(attrs: any): void;
|
|
@@ -83,21 +101,6 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
83
101
|
}): T extends ElementType["type"] ? Extract<ElementType, {
|
|
84
102
|
type: T;
|
|
85
103
|
}> : NodeType;
|
|
86
|
-
canMoveElementsUp(ids: Array<string>): boolean;
|
|
87
|
-
moveElementsUp(ids: Array<string>): void;
|
|
88
|
-
canMoveElementsTop(ids: Array<string>): boolean;
|
|
89
|
-
moveElementsTop(ids: Array<string>): void;
|
|
90
|
-
canMoveElementsDown(ids: Array<string>): boolean;
|
|
91
|
-
moveElementsDown(ids: Array<string>): void;
|
|
92
|
-
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
93
|
-
moveElementsBottom(ids: Array<string>): void;
|
|
94
|
-
setElementZIndex(id: any, zIndex: any): void;
|
|
95
|
-
setSize({ width, height, useMagic, softChange, }: {
|
|
96
|
-
width: number;
|
|
97
|
-
height: number;
|
|
98
|
-
useMagic?: boolean;
|
|
99
|
-
softChange?: boolean;
|
|
100
|
-
}): void;
|
|
101
104
|
} & {
|
|
102
105
|
moveElementUp(id: any): void;
|
|
103
106
|
moveElementDown(id: any): void;
|
|
@@ -211,9 +214,22 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
211
214
|
readonly computedHeight: any;
|
|
212
215
|
} & {
|
|
213
216
|
toJSON(): any;
|
|
214
|
-
_forEachElementUp(ids: Array<string>, callback: Function): void;
|
|
215
|
-
_forEachElementDown(ids: Array<string>, callback: Function): false;
|
|
216
217
|
} & {
|
|
218
|
+
setSize({ width, height, useMagic, softChange, }: {
|
|
219
|
+
width: number;
|
|
220
|
+
height: number;
|
|
221
|
+
useMagic?: boolean;
|
|
222
|
+
softChange?: boolean;
|
|
223
|
+
}): void;
|
|
224
|
+
canMoveElementsUp(ids: Array<string>): boolean;
|
|
225
|
+
canMoveElementsTop(ids: Array<string>): boolean;
|
|
226
|
+
canMoveElementsDown(ids: Array<string>): boolean;
|
|
227
|
+
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
228
|
+
moveElementsUp(ids: Array<string>): void;
|
|
229
|
+
moveElementsDown(ids: Array<string>): void;
|
|
230
|
+
moveElementsTop(ids: Array<string>): void;
|
|
231
|
+
moveElementsBottom(ids: Array<string>): void;
|
|
232
|
+
setElementZIndex(id: string, zIndex: number): void;
|
|
217
233
|
clone(attrs?: {}): any;
|
|
218
234
|
setZIndex(zIndex: any): void;
|
|
219
235
|
set(attrs: any): void;
|
|
@@ -227,21 +243,6 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
227
243
|
}): T extends ElementType["type"] ? Extract<ElementType, {
|
|
228
244
|
type: T;
|
|
229
245
|
}> : NodeType;
|
|
230
|
-
canMoveElementsUp(ids: Array<string>): boolean;
|
|
231
|
-
moveElementsUp(ids: Array<string>): void;
|
|
232
|
-
canMoveElementsTop(ids: Array<string>): boolean;
|
|
233
|
-
moveElementsTop(ids: Array<string>): void;
|
|
234
|
-
canMoveElementsDown(ids: Array<string>): boolean;
|
|
235
|
-
moveElementsDown(ids: Array<string>): void;
|
|
236
|
-
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
237
|
-
moveElementsBottom(ids: Array<string>): void;
|
|
238
|
-
setElementZIndex(id: any, zIndex: any): void;
|
|
239
|
-
setSize({ width, height, useMagic, softChange, }: {
|
|
240
|
-
width: number;
|
|
241
|
-
height: number;
|
|
242
|
-
useMagic?: boolean;
|
|
243
|
-
softChange?: boolean;
|
|
244
|
-
}): void;
|
|
245
246
|
} & {
|
|
246
247
|
moveElementUp(id: any): void;
|
|
247
248
|
moveElementDown(id: any): void;
|
|
@@ -270,9 +271,22 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
270
271
|
readonly computedHeight: any;
|
|
271
272
|
} & {
|
|
272
273
|
toJSON(): any;
|
|
273
|
-
_forEachElementUp(ids: Array<string>, callback: Function): void;
|
|
274
|
-
_forEachElementDown(ids: Array<string>, callback: Function): false;
|
|
275
274
|
} & {
|
|
275
|
+
setSize({ width, height, useMagic, softChange, }: {
|
|
276
|
+
width: number;
|
|
277
|
+
height: number;
|
|
278
|
+
useMagic?: boolean;
|
|
279
|
+
softChange?: boolean;
|
|
280
|
+
}): void;
|
|
281
|
+
canMoveElementsUp(ids: Array<string>): boolean;
|
|
282
|
+
canMoveElementsTop(ids: Array<string>): boolean;
|
|
283
|
+
canMoveElementsDown(ids: Array<string>): boolean;
|
|
284
|
+
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
285
|
+
moveElementsUp(ids: Array<string>): void;
|
|
286
|
+
moveElementsDown(ids: Array<string>): void;
|
|
287
|
+
moveElementsTop(ids: Array<string>): void;
|
|
288
|
+
moveElementsBottom(ids: Array<string>): void;
|
|
289
|
+
setElementZIndex(id: string, zIndex: number): void;
|
|
276
290
|
clone(attrs?: {}): any;
|
|
277
291
|
setZIndex(zIndex: any): void;
|
|
278
292
|
set(attrs: any): void;
|
|
@@ -286,21 +300,6 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
286
300
|
}): T extends ElementType["type"] ? Extract<ElementType, {
|
|
287
301
|
type: T;
|
|
288
302
|
}> : NodeType;
|
|
289
|
-
canMoveElementsUp(ids: Array<string>): boolean;
|
|
290
|
-
moveElementsUp(ids: Array<string>): void;
|
|
291
|
-
canMoveElementsTop(ids: Array<string>): boolean;
|
|
292
|
-
moveElementsTop(ids: Array<string>): void;
|
|
293
|
-
canMoveElementsDown(ids: Array<string>): boolean;
|
|
294
|
-
moveElementsDown(ids: Array<string>): void;
|
|
295
|
-
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
296
|
-
moveElementsBottom(ids: Array<string>): void;
|
|
297
|
-
setElementZIndex(id: any, zIndex: any): void;
|
|
298
|
-
setSize({ width, height, useMagic, softChange, }: {
|
|
299
|
-
width: number;
|
|
300
|
-
height: number;
|
|
301
|
-
useMagic?: boolean;
|
|
302
|
-
softChange?: boolean;
|
|
303
|
-
}): void;
|
|
304
303
|
} & {
|
|
305
304
|
moveElementUp(id: any): void;
|
|
306
305
|
moveElementDown(id: any): void;
|
|
@@ -617,9 +616,22 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
617
616
|
readonly computedHeight: any;
|
|
618
617
|
} & {
|
|
619
618
|
toJSON(): any;
|
|
620
|
-
_forEachElementUp(ids: Array<string>, callback: Function): void;
|
|
621
|
-
_forEachElementDown(ids: Array<string>, callback: Function): false;
|
|
622
619
|
} & {
|
|
620
|
+
setSize({ width, height, useMagic, softChange, }: {
|
|
621
|
+
width: number;
|
|
622
|
+
height: number;
|
|
623
|
+
useMagic?: boolean;
|
|
624
|
+
softChange?: boolean;
|
|
625
|
+
}): void;
|
|
626
|
+
canMoveElementsUp(ids: Array<string>): boolean;
|
|
627
|
+
canMoveElementsTop(ids: Array<string>): boolean;
|
|
628
|
+
canMoveElementsDown(ids: Array<string>): boolean;
|
|
629
|
+
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
630
|
+
moveElementsUp(ids: Array<string>): void;
|
|
631
|
+
moveElementsDown(ids: Array<string>): void;
|
|
632
|
+
moveElementsTop(ids: Array<string>): void;
|
|
633
|
+
moveElementsBottom(ids: Array<string>): void;
|
|
634
|
+
setElementZIndex(id: string, zIndex: number): void;
|
|
623
635
|
clone(attrs?: {}): any;
|
|
624
636
|
setZIndex(zIndex: any): void;
|
|
625
637
|
set(attrs: any): void;
|
|
@@ -633,21 +645,6 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
633
645
|
}): T extends ElementType["type"] ? Extract<ElementType, {
|
|
634
646
|
type: T;
|
|
635
647
|
}> : NodeType;
|
|
636
|
-
canMoveElementsUp(ids: Array<string>): boolean;
|
|
637
|
-
moveElementsUp(ids: Array<string>): void;
|
|
638
|
-
canMoveElementsTop(ids: Array<string>): boolean;
|
|
639
|
-
moveElementsTop(ids: Array<string>): void;
|
|
640
|
-
canMoveElementsDown(ids: Array<string>): boolean;
|
|
641
|
-
moveElementsDown(ids: Array<string>): void;
|
|
642
|
-
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
643
|
-
moveElementsBottom(ids: Array<string>): void;
|
|
644
|
-
setElementZIndex(id: any, zIndex: any): void;
|
|
645
|
-
setSize({ width, height, useMagic, softChange, }: {
|
|
646
|
-
width: number;
|
|
647
|
-
height: number;
|
|
648
|
-
useMagic?: boolean;
|
|
649
|
-
softChange?: boolean;
|
|
650
|
-
}): void;
|
|
651
648
|
} & {
|
|
652
649
|
moveElementUp(id: any): void;
|
|
653
650
|
moveElementDown(id: any): void;
|
|
@@ -676,9 +673,22 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
676
673
|
readonly computedHeight: any;
|
|
677
674
|
} & {
|
|
678
675
|
toJSON(): any;
|
|
679
|
-
_forEachElementUp(ids: Array<string>, callback: Function): void;
|
|
680
|
-
_forEachElementDown(ids: Array<string>, callback: Function): false;
|
|
681
676
|
} & {
|
|
677
|
+
setSize({ width, height, useMagic, softChange, }: {
|
|
678
|
+
width: number;
|
|
679
|
+
height: number;
|
|
680
|
+
useMagic?: boolean;
|
|
681
|
+
softChange?: boolean;
|
|
682
|
+
}): void;
|
|
683
|
+
canMoveElementsUp(ids: Array<string>): boolean;
|
|
684
|
+
canMoveElementsTop(ids: Array<string>): boolean;
|
|
685
|
+
canMoveElementsDown(ids: Array<string>): boolean;
|
|
686
|
+
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
687
|
+
moveElementsUp(ids: Array<string>): void;
|
|
688
|
+
moveElementsDown(ids: Array<string>): void;
|
|
689
|
+
moveElementsTop(ids: Array<string>): void;
|
|
690
|
+
moveElementsBottom(ids: Array<string>): void;
|
|
691
|
+
setElementZIndex(id: string, zIndex: number): void;
|
|
682
692
|
clone(attrs?: {}): any;
|
|
683
693
|
setZIndex(zIndex: any): void;
|
|
684
694
|
set(attrs: any): void;
|
|
@@ -692,21 +702,6 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
692
702
|
}): T extends ElementType["type"] ? Extract<ElementType, {
|
|
693
703
|
type: T;
|
|
694
704
|
}> : NodeType;
|
|
695
|
-
canMoveElementsUp(ids: Array<string>): boolean;
|
|
696
|
-
moveElementsUp(ids: Array<string>): void;
|
|
697
|
-
canMoveElementsTop(ids: Array<string>): boolean;
|
|
698
|
-
moveElementsTop(ids: Array<string>): void;
|
|
699
|
-
canMoveElementsDown(ids: Array<string>): boolean;
|
|
700
|
-
moveElementsDown(ids: Array<string>): void;
|
|
701
|
-
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
702
|
-
moveElementsBottom(ids: Array<string>): void;
|
|
703
|
-
setElementZIndex(id: any, zIndex: any): void;
|
|
704
|
-
setSize({ width, height, useMagic, softChange, }: {
|
|
705
|
-
width: number;
|
|
706
|
-
height: number;
|
|
707
|
-
useMagic?: boolean;
|
|
708
|
-
softChange?: boolean;
|
|
709
|
-
}): void;
|
|
710
705
|
} & {
|
|
711
706
|
moveElementUp(id: any): void;
|
|
712
707
|
moveElementDown(id: any): void;
|
|
@@ -736,9 +731,22 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
736
731
|
readonly computedHeight: any;
|
|
737
732
|
} & {
|
|
738
733
|
toJSON(): any;
|
|
739
|
-
_forEachElementUp(ids: Array<string>, callback: Function): void;
|
|
740
|
-
_forEachElementDown(ids: Array<string>, callback: Function): false;
|
|
741
734
|
} & {
|
|
735
|
+
setSize({ width, height, useMagic, softChange, }: {
|
|
736
|
+
width: number;
|
|
737
|
+
height: number;
|
|
738
|
+
useMagic?: boolean;
|
|
739
|
+
softChange?: boolean;
|
|
740
|
+
}): void;
|
|
741
|
+
canMoveElementsUp(ids: Array<string>): boolean;
|
|
742
|
+
canMoveElementsTop(ids: Array<string>): boolean;
|
|
743
|
+
canMoveElementsDown(ids: Array<string>): boolean;
|
|
744
|
+
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
745
|
+
moveElementsUp(ids: Array<string>): void;
|
|
746
|
+
moveElementsDown(ids: Array<string>): void;
|
|
747
|
+
moveElementsTop(ids: Array<string>): void;
|
|
748
|
+
moveElementsBottom(ids: Array<string>): void;
|
|
749
|
+
setElementZIndex(id: string, zIndex: number): void;
|
|
742
750
|
clone(attrs?: {}): any;
|
|
743
751
|
setZIndex(zIndex: any): void;
|
|
744
752
|
set(attrs: any): void;
|
|
@@ -752,21 +760,6 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
752
760
|
}): T extends ElementType["type"] ? Extract<ElementType, {
|
|
753
761
|
type: T;
|
|
754
762
|
}> : NodeType;
|
|
755
|
-
canMoveElementsUp(ids: Array<string>): boolean;
|
|
756
|
-
moveElementsUp(ids: Array<string>): void;
|
|
757
|
-
canMoveElementsTop(ids: Array<string>): boolean;
|
|
758
|
-
moveElementsTop(ids: Array<string>): void;
|
|
759
|
-
canMoveElementsDown(ids: Array<string>): boolean;
|
|
760
|
-
moveElementsDown(ids: Array<string>): void;
|
|
761
|
-
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
762
|
-
moveElementsBottom(ids: Array<string>): void;
|
|
763
|
-
setElementZIndex(id: any, zIndex: any): void;
|
|
764
|
-
setSize({ width, height, useMagic, softChange, }: {
|
|
765
|
-
width: number;
|
|
766
|
-
height: number;
|
|
767
|
-
useMagic?: boolean;
|
|
768
|
-
softChange?: boolean;
|
|
769
|
-
}): void;
|
|
770
763
|
} & {
|
|
771
764
|
moveElementUp(id: any): void;
|
|
772
765
|
moveElementDown(id: any): void;
|
|
@@ -795,9 +788,22 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
795
788
|
readonly computedHeight: any;
|
|
796
789
|
} & {
|
|
797
790
|
toJSON(): any;
|
|
798
|
-
_forEachElementUp(ids: Array<string>, callback: Function): void;
|
|
799
|
-
_forEachElementDown(ids: Array<string>, callback: Function): false;
|
|
800
791
|
} & {
|
|
792
|
+
setSize({ width, height, useMagic, softChange, }: {
|
|
793
|
+
width: number;
|
|
794
|
+
height: number;
|
|
795
|
+
useMagic?: boolean;
|
|
796
|
+
softChange?: boolean;
|
|
797
|
+
}): void;
|
|
798
|
+
canMoveElementsUp(ids: Array<string>): boolean;
|
|
799
|
+
canMoveElementsTop(ids: Array<string>): boolean;
|
|
800
|
+
canMoveElementsDown(ids: Array<string>): boolean;
|
|
801
|
+
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
802
|
+
moveElementsUp(ids: Array<string>): void;
|
|
803
|
+
moveElementsDown(ids: Array<string>): void;
|
|
804
|
+
moveElementsTop(ids: Array<string>): void;
|
|
805
|
+
moveElementsBottom(ids: Array<string>): void;
|
|
806
|
+
setElementZIndex(id: string, zIndex: number): void;
|
|
801
807
|
clone(attrs?: {}): any;
|
|
802
808
|
setZIndex(zIndex: any): void;
|
|
803
809
|
set(attrs: any): void;
|
|
@@ -811,21 +817,6 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
811
817
|
}): T extends ElementType["type"] ? Extract<ElementType, {
|
|
812
818
|
type: T;
|
|
813
819
|
}> : NodeType;
|
|
814
|
-
canMoveElementsUp(ids: Array<string>): boolean;
|
|
815
|
-
moveElementsUp(ids: Array<string>): void;
|
|
816
|
-
canMoveElementsTop(ids: Array<string>): boolean;
|
|
817
|
-
moveElementsTop(ids: Array<string>): void;
|
|
818
|
-
canMoveElementsDown(ids: Array<string>): boolean;
|
|
819
|
-
moveElementsDown(ids: Array<string>): void;
|
|
820
|
-
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
821
|
-
moveElementsBottom(ids: Array<string>): void;
|
|
822
|
-
setElementZIndex(id: any, zIndex: any): void;
|
|
823
|
-
setSize({ width, height, useMagic, softChange, }: {
|
|
824
|
-
width: number;
|
|
825
|
-
height: number;
|
|
826
|
-
useMagic?: boolean;
|
|
827
|
-
softChange?: boolean;
|
|
828
|
-
}): void;
|
|
829
820
|
} & {
|
|
830
821
|
moveElementUp(id: any): void;
|
|
831
822
|
moveElementDown(id: any): void;
|
|
@@ -887,9 +878,22 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
887
878
|
readonly computedHeight: any;
|
|
888
879
|
} & {
|
|
889
880
|
toJSON(): any;
|
|
890
|
-
_forEachElementUp(ids: Array<string>, callback: Function): void;
|
|
891
|
-
_forEachElementDown(ids: Array<string>, callback: Function): false;
|
|
892
881
|
} & {
|
|
882
|
+
setSize({ width, height, useMagic, softChange, }: {
|
|
883
|
+
width: number;
|
|
884
|
+
height: number;
|
|
885
|
+
useMagic?: boolean;
|
|
886
|
+
softChange?: boolean;
|
|
887
|
+
}): void;
|
|
888
|
+
canMoveElementsUp(ids: Array<string>): boolean;
|
|
889
|
+
canMoveElementsTop(ids: Array<string>): boolean;
|
|
890
|
+
canMoveElementsDown(ids: Array<string>): boolean;
|
|
891
|
+
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
892
|
+
moveElementsUp(ids: Array<string>): void;
|
|
893
|
+
moveElementsDown(ids: Array<string>): void;
|
|
894
|
+
moveElementsTop(ids: Array<string>): void;
|
|
895
|
+
moveElementsBottom(ids: Array<string>): void;
|
|
896
|
+
setElementZIndex(id: string, zIndex: number): void;
|
|
893
897
|
clone(attrs?: {}): any;
|
|
894
898
|
setZIndex(zIndex: any): void;
|
|
895
899
|
set(attrs: any): void;
|
|
@@ -903,21 +907,6 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
903
907
|
}): T extends ElementType["type"] ? Extract<ElementType, {
|
|
904
908
|
type: T;
|
|
905
909
|
}> : NodeType;
|
|
906
|
-
canMoveElementsUp(ids: Array<string>): boolean;
|
|
907
|
-
moveElementsUp(ids: Array<string>): void;
|
|
908
|
-
canMoveElementsTop(ids: Array<string>): boolean;
|
|
909
|
-
moveElementsTop(ids: Array<string>): void;
|
|
910
|
-
canMoveElementsDown(ids: Array<string>): boolean;
|
|
911
|
-
moveElementsDown(ids: Array<string>): void;
|
|
912
|
-
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
913
|
-
moveElementsBottom(ids: Array<string>): void;
|
|
914
|
-
setElementZIndex(id: any, zIndex: any): void;
|
|
915
|
-
setSize({ width, height, useMagic, softChange, }: {
|
|
916
|
-
width: number;
|
|
917
|
-
height: number;
|
|
918
|
-
useMagic?: boolean;
|
|
919
|
-
softChange?: boolean;
|
|
920
|
-
}): void;
|
|
921
910
|
} & {
|
|
922
911
|
moveElementUp(id: any): void;
|
|
923
912
|
moveElementDown(id: any): void;
|
|
@@ -946,9 +935,22 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
946
935
|
readonly computedHeight: any;
|
|
947
936
|
} & {
|
|
948
937
|
toJSON(): any;
|
|
949
|
-
_forEachElementUp(ids: Array<string>, callback: Function): void;
|
|
950
|
-
_forEachElementDown(ids: Array<string>, callback: Function): false;
|
|
951
938
|
} & {
|
|
939
|
+
setSize({ width, height, useMagic, softChange, }: {
|
|
940
|
+
width: number;
|
|
941
|
+
height: number;
|
|
942
|
+
useMagic?: boolean;
|
|
943
|
+
softChange?: boolean;
|
|
944
|
+
}): void;
|
|
945
|
+
canMoveElementsUp(ids: Array<string>): boolean;
|
|
946
|
+
canMoveElementsTop(ids: Array<string>): boolean;
|
|
947
|
+
canMoveElementsDown(ids: Array<string>): boolean;
|
|
948
|
+
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
949
|
+
moveElementsUp(ids: Array<string>): void;
|
|
950
|
+
moveElementsDown(ids: Array<string>): void;
|
|
951
|
+
moveElementsTop(ids: Array<string>): void;
|
|
952
|
+
moveElementsBottom(ids: Array<string>): void;
|
|
953
|
+
setElementZIndex(id: string, zIndex: number): void;
|
|
952
954
|
clone(attrs?: {}): any;
|
|
953
955
|
setZIndex(zIndex: any): void;
|
|
954
956
|
set(attrs: any): void;
|
|
@@ -962,21 +964,6 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
962
964
|
}): T extends ElementType["type"] ? Extract<ElementType, {
|
|
963
965
|
type: T;
|
|
964
966
|
}> : NodeType;
|
|
965
|
-
canMoveElementsUp(ids: Array<string>): boolean;
|
|
966
|
-
moveElementsUp(ids: Array<string>): void;
|
|
967
|
-
canMoveElementsTop(ids: Array<string>): boolean;
|
|
968
|
-
moveElementsTop(ids: Array<string>): void;
|
|
969
|
-
canMoveElementsDown(ids: Array<string>): boolean;
|
|
970
|
-
moveElementsDown(ids: Array<string>): void;
|
|
971
|
-
canMoveElementsBottom(ids: Array<string>): boolean;
|
|
972
|
-
moveElementsBottom(ids: Array<string>): void;
|
|
973
|
-
setElementZIndex(id: any, zIndex: any): void;
|
|
974
|
-
setSize({ width, height, useMagic, softChange, }: {
|
|
975
|
-
width: number;
|
|
976
|
-
height: number;
|
|
977
|
-
useMagic?: boolean;
|
|
978
|
-
softChange?: boolean;
|
|
979
|
-
}): void;
|
|
980
967
|
} & {
|
|
981
968
|
moveElementUp(id: any): void;
|
|
982
969
|
moveElementDown(id: any): void;
|
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}from"../utils/validate-key.js";import*as b from"../utils/fonts.js";import{flags as y}from"../utils/flags.js";import{addDpiMetadataToImage as v}from"../utils/image-dpi.js";import{nodeToCanvas as P}from"../utils/canvas.js";import{whenLoaded as w}from"../utils/loader.js";import{pxToUnit as x}from"../utils/unit.js";import{deepEqual as E}from"../utils/deep-equal.js";import{waitTillAvailable as _}from"../utils/wait.js";import{jsonToHTML as k}from"../utils/to-html.js";import{jsonToSVG as I}from"../utils/to-svg.js";import{Page as S}from"./page-model.js";import{forEveryChild as O,forEveryNode as T}from"./group-model.js";import{Audio as j}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 Store=l.model("Store",{role:"",pages:l.array(S),fonts:l.array(Font),audios:l.array(j),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,_key:"",_validated:!1}).views(e=>{const t=g(()=>{const t={};return T({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=>{for(const i of e.pages){for(const e of i.children){if(e.id===t){return e}}}}).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 T({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 O={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(()=>O.seek())},checkActivePage(){let e=0;for(const t of r.pages){if(r.currentTime>=t.startTime&&r.currentTime<t.startTime+t.duration){O.selectPage(t.id);break}e+=t.duration}},seek(){if(!r.isPlaying){return}const e=Date.now(),t=e-l;l=e,r.currentTime+=t,O.checkActivePage();const i=d||r.duration;r.isPlaying&&r.currentTime<i?requestAnimationFrame(()=>O.seek()):r.isPlaying&&g?(r.currentTime=0,requestAnimationFrame(()=>O.seek())):O.stop()},stop(){r.isPlaying=!1,r.currentTime=0,r.animatedElementsIds=i([]),O.checkActivePage()},__(){r._validated||(h(r._key,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=S.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)).sort((e,t)=>e.page.children.indexOf(e)-e.page.children.indexOf(t)).filter(e=>!!e).map(e=>e.id);r.selectedElementsIds=i(t)},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)),a=o[0].page;if(o.forEach(e=>{e&&n(e)}),!o.length){return}const s=a.children.reduce((e,t)=>{if("group"===t.type){const i=t.name.match(/group-(\d+)/);if(i){const t=parseInt(i[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.page,i=t.children.indexOf(e);e.children.forEach(e=>{o.push(e.id)}),e.children.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=O.toJSON();return s(r,i=>{const o=O.toJSON();!E(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&&O.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}),O.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 O.waitLoading({_skipTimeout:a});const h=f.findOne(".page-container");if(!h){throw O.setElementsPixelRatio(m),null==g||g.set({_forceMount:!1,_exporting:!1}),new Error("Export is failed. Canvas was unmounted.")}const b=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 y=h.findOne(".page-background-group"),v=y.clip();y.clip({x:null,y:null,width:null,height:null});const w=h.findOne(".elements-container"),x=w.clip();w.clip({x:null,y:null,width:null,height:null});const E=h.find(e=>!e.visible()&&e.getAttr("editModeEnabled")&&!e.getAttr("hideInExport"));E.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 I=n?g.bleed:0;let S=I;!r.bleedVisible&&n||(r.bleedVisible||n?r.bleedVisible&&n?S=0:r.bleedVisible&&!n&&(S=-g.bleed):S=0);const T=g.computedWidth+2*I,j=g.computedHeight+2*I,F=h.scale();h.scale({x:1,y:1});const R=P(h,{x:h.x()-S,y:h.y()-S,width:T,height:j,pixelRatio:c,sceneCanvas:null==l?void 0:l.sceneCanvas,bufferCanvas:null==l?void 0:l.bufferCanvas});h.scale(F);const C=R._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"))}),E.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)),y.clip(v),w.clip(x),f.position(b),null==g||g.set({_exporting:!1,_forceMount:!1}),await Promise.resolve(),O.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 O._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:v(c,d,g)},async toBlob(t={}){var{mimeType:i,quality:o}=t,n=e(t,["mimeType","quality"]);const a=await O._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 O.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||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 b=new l({unit:o,orientation:f>h?"landscape":"portrait",format:[f,h],compress:!0,putOnlyUsedFonts:!0});b.deletePage(1);const y=((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 v=0;for(const r of y){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 O.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(++v/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})=>{b.addPage([t,i],t>i?"landscape":"portrait");const s=b.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){b.setLineWidth(d(1));const e=p+d(m);b.line(e,0,e,p),b.line(0,e,p,e),b.line(t-e,0,t-e,p),b.line(t,e,t-p,e),b.line(0,i-e,p,i-e),b.line(e,i,e,i-p),b.line(t,i-e,t-p,i-e),b.line(t-e,i,t-e,i-p)}b.addImage(e,p,p,t-2*p,i-2*p,void 0,"FAST")})}return b},toPDFDataURL:async e=>(await O._toPDF(Object.assign({mimeType:"image/jpeg"},e))).output("datauristring"),async toGIFDataURL(e={}){const t=e.pixelRatio||1,i=await f({width:r.width*t,height:r.height*t}),o=1e3/(e.fps||10),n=r.duration/o;for(let a=0;a<n-1;a++){const e=a*o||1;O.setCurrentTime(e);let n=0,s="";for(const t of r.pages){if(n+=t.duration,t.set({_rendering:n>e}),n>e){s=t.id;break}}const l=await O._toCanvas({pixelRatio:t,pageId:s,_skipTimeout:!0});i.addFrame(l.getContext("2d"),{delay:o,copy:!0})}for(const a of r.pages){a.set({_rendering:!1})}return O.stop(),i.render(),new Promise(e=>{i.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 O.toGIFDataURL(o);m(n,i||"polotno.gif")},async toHTML({elementHook:e}={}){const t=O.toJSON();return k({json:t,elementHook:e})},async saveAsHTML({fileName:e,elementHook:t}={}){const i=await O.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=O.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 I({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 O.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 O._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 w()},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&&y.htmlRenderEnabled&&T({children:c.pages},e=>{if("text"===e.type){const t=16,i=e.letterSpacing*t;e.letterSpacing=i/e.fontSize}}),p<2&&T({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&&y.htmlRenderEnabled&&!d&&T({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);O.deletePages(t),r.custom=null,e||r.history.clear()},addFont(e){O.removeFont(e.fontFamily),r.fonts.push(e)},removeFont(e){r.fonts.filter(t=>t.fontFamily===e).forEach(e=>o(e))},addAudio(e){const t=j.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)||b.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"}))),b.injectCustomFont(n)):b.injectGoogleFont(e),t&&i&&!a.some(e=>e.fontStyle===t&&e.fontWeight===i)&&a.push({fontStyle:t,fontWeight:i}),Promise.all(a.map(t=>b.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 O});export function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){return Store.create({_forceShowCredit:t,_key:e})}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}from"../utils/validate-key.js";import*as b from"../utils/fonts.js";import{flags as y}from"../utils/flags.js";import{addDpiMetadataToImage as v}from"../utils/image-dpi.js";import{nodeToCanvas as P}from"../utils/canvas.js";import{whenLoaded as w}from"../utils/loader.js";import{pxToUnit as E}from"../utils/unit.js";import{deepEqual as x}from"../utils/deep-equal.js";import{waitTillAvailable as I}from"../utils/wait.js";import{jsonToHTML as _}from"../utils/to-html.js";import{jsonToSVG as k}from"../utils/to-svg.js";import{Page as S}from"./page-model.js";import{forEveryChild as O,forEveryNode as T}from"./group-model.js";import{Audio as j}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(S),fonts:l.array(Font),audios:l.array(j),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,_key:"",_validated:!1}).views(e=>{const t=g(()=>{const t={};return T({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 T({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 O={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(()=>O.seek())},checkActivePage(){let e=0;for(const t of r.pages){if(r.currentTime>=t.startTime&&r.currentTime<t.startTime+t.duration){O.selectPage(t.id);break}e+=t.duration}},seek(){if(!r.isPlaying){return}const e=Date.now(),t=e-l;l=e,r.currentTime+=t,O.checkActivePage();const i=d||r.duration;r.isPlaying&&r.currentTime<i?requestAnimationFrame(()=>O.seek()):r.isPlaying&&g?(r.currentTime=0,requestAnimationFrame(()=>O.seek())):O.stop()},stop(){r.isPlaying=!1,r.currentTime=0,r.animatedElementsIds=i([]),O.checkActivePage()},__(){r._validated||(h(r._key,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=S.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=O.toJSON();return s(r,i=>{const o=O.toJSON();!x(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&&O.setElementsPixelRatio(c),s?null==g||g.set({_forceMount:!0}):null==g||g.set({_exporting:!0});const u=await I(()=>{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}),O.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 O.waitLoading({_skipTimeout:a});const h=f.findOne(".page-container");if(!h){throw O.setElementsPixelRatio(m),null==g||g.set({_forceMount:!1,_exporting:!1}),new Error("Export is failed. Canvas was unmounted.")}const b=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 y=h.findOne(".page-background-group"),v=y.clip();y.clip({x:null,y:null,width:null,height:null});const w=h.findOne(".elements-container"),E=w.clip();w.clip({x:null,y:null,width:null,height:null});const x=h.find(e=>!e.visible()&&e.getAttr("editModeEnabled")&&!e.getAttr("hideInExport"));x.forEach(e=>{e.setAttr("oldVisible",e.visible()),e.show()});const _=h.find(e=>e.getAttr("hideInExport"));_.forEach(e=>{e.setAttr("oldVisible",e.visible()),e.hide()}),t&&h.find(".page-background").forEach(e=>e.hide());const k=n?g.bleed:0;let S=k;!r.bleedVisible&&n||(r.bleedVisible||n?r.bleedVisible&&n?S=0:r.bleedVisible&&!n&&(S=-g.bleed):S=0);const T=g.computedWidth+2*k,j=g.computedHeight+2*k,R=h.scale();h.scale({x:1,y:1});const F=P(h,{x:h.x()-S,y:h.y()-S,width:T,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()),_.forEach(e=>{e.visible(e.getAttr("oldVisible"))}),x.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)),y.clip(v),w.clip(E),f.position(b),null==g||g.set({_exporting:!1,_forceMount:!1}),await Promise.resolve(),O.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 O._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:v(c,d,g)},async toBlob(t={}){var{mimeType:i,quality:o}=t,n=e(t,["mimeType","quality"]);const a=await O._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 O.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=>E({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 b=new l({unit:o,orientation:f>h?"landscape":"portrait",format:[f,h],compress:!0,putOnlyUsedFonts:!0});b.deletePage(1);const y=((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 v=0;for(const r of y){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 O.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(++v/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})=>{b.addPage([t,i],t>i?"landscape":"portrait");const s=b.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){b.setLineWidth(d(1));const e=p+d(m);b.line(e,0,e,p),b.line(0,e,p,e),b.line(t-e,0,t-e,p),b.line(t,e,t-p,e),b.line(0,i-e,p,i-e),b.line(e,i,e,i-p),b.line(t,i-e,t-p,i-e),b.line(t-e,i,t-e,i-p)}b.addImage(e,p,p,t-2*p,i-2*p,void 0,"FAST")})}return b},toPDFDataURL:async e=>(await O._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;O.setCurrentTime(e);for(const t of r.pages){t.set({_rendering:t.id===l.id})}const o=await O._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 O.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 O.toGIFDataURL(o);m(n,i||"polotno.gif")},async toHTML({elementHook:e}={}){const t=O.toJSON();return _({json:t,elementHook:e})},async saveAsHTML({fileName:e,elementHook:t}={}){const i=await O.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=O.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 k({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 O.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 O._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 w()},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&&y.htmlRenderEnabled&&T({children:c.pages},e=>{if("text"===e.type){const t=16,i=e.letterSpacing*t;e.letterSpacing=i/e.fontSize}}),p<2&&T({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&&y.htmlRenderEnabled&&!d&&T({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);O.deletePages(t),r.custom=null,e||r.history.clear()},addFont(e){O.removeFont(e.fontFamily),r.fonts.push(e)},removeFont(e){r.fonts.filter(t=>t.fontFamily===e).forEach(e=>o(e))},addAudio(e){const t=j.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)||b.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"}))),b.injectCustomFont(n)):b.injectGoogleFont(e),t&&i&&!a.some(e=>e.fontStyle===t&&e.fontWeight===i)&&a.push({fontStyle:t,fontWeight:i}),Promise.all(a.map(t=>b.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 O});export function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){return Store.create({_forceShowCredit:t,_key:e})}export default createStore;
|
package/model/table-model.d.ts
CHANGED
|
@@ -5,6 +5,13 @@ export type BorderAttrs = {
|
|
|
5
5
|
width?: number;
|
|
6
6
|
style?: string;
|
|
7
7
|
};
|
|
8
|
+
export type BorderMode = 'all' | 'outer' | 'inner' | 'topBottom' | 'topOnly' | 'bottomOnly' | 'leftOnly' | 'rightOnly' | 'innerHorizontal' | 'innerVertical';
|
|
9
|
+
export type CellRange = {
|
|
10
|
+
minRow: number;
|
|
11
|
+
maxRow: number;
|
|
12
|
+
minCol: number;
|
|
13
|
+
maxCol: number;
|
|
14
|
+
};
|
|
8
15
|
export declare const TableCell: import("mobx-state-tree").IModelType<{
|
|
9
16
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
10
17
|
type: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<"tablecell">, [undefined]>;
|
|
@@ -77,6 +84,12 @@ export declare const TableCell: import("mobx-state-tree").IModelType<{
|
|
|
77
84
|
readonly cellPadding: number;
|
|
78
85
|
readonly width: number;
|
|
79
86
|
readonly height: number;
|
|
87
|
+
readonly borderInsets: {
|
|
88
|
+
top: number;
|
|
89
|
+
right: number;
|
|
90
|
+
bottom: number;
|
|
91
|
+
left: number;
|
|
92
|
+
};
|
|
80
93
|
readonly a: {
|
|
81
94
|
x: number;
|
|
82
95
|
y: number;
|
|
@@ -259,6 +272,12 @@ export declare const TableElement: import("mobx-state-tree").IModelType<{
|
|
|
259
272
|
readonly cellPadding: number;
|
|
260
273
|
readonly width: number;
|
|
261
274
|
readonly height: number;
|
|
275
|
+
readonly borderInsets: {
|
|
276
|
+
top: number;
|
|
277
|
+
right: number;
|
|
278
|
+
bottom: number;
|
|
279
|
+
left: number;
|
|
280
|
+
};
|
|
262
281
|
readonly a: {
|
|
263
282
|
x: number;
|
|
264
283
|
y: number;
|
|
@@ -439,6 +458,7 @@ export declare const TableElement: import("mobx-state-tree").IModelType<{
|
|
|
439
458
|
readonly visibleCells: TableCellType[];
|
|
440
459
|
readonly focusedCells: TableCellType[];
|
|
441
460
|
readonly editingCell: TableCellType | undefined;
|
|
461
|
+
getFocusedCellRange(): CellRange | null;
|
|
442
462
|
readonly _fitRowsToContent: {
|
|
443
463
|
rowHeights: number[];
|
|
444
464
|
height: number;
|
|
@@ -447,6 +467,10 @@ export declare const TableElement: import("mobx-state-tree").IModelType<{
|
|
|
447
467
|
setCellContentHeight(cellId: string, height: number): void;
|
|
448
468
|
_applyFitRowsToContent(): void;
|
|
449
469
|
focusCell(cellId: string, addToSelection?: boolean): void;
|
|
470
|
+
selectRowRange(startRow: number, endRow: number): void;
|
|
471
|
+
selectColumnRange(startCol: number, endCol: number): void;
|
|
472
|
+
selectRow(rowIndex: number): void;
|
|
473
|
+
selectColumn(colIndex: number): void;
|
|
450
474
|
focusCellRange(targetRow: number, targetCol: number): void;
|
|
451
475
|
clearCellFocus(): void;
|
|
452
476
|
enterCellEdit(cellId: string): void;
|
|
@@ -457,11 +481,14 @@ export declare const TableElement: import("mobx-state-tree").IModelType<{
|
|
|
457
481
|
removeRow(index: number): void;
|
|
458
482
|
addColumn(index: number): void;
|
|
459
483
|
removeColumn(index: number): void;
|
|
484
|
+
removeRowRange(minRow: number, maxRow: number): void;
|
|
485
|
+
removeColumnRange(minCol: number, maxCol: number): void;
|
|
460
486
|
distributeRowsEvenly(): void;
|
|
461
487
|
distributeColumnsEvenly(): void;
|
|
462
488
|
resizeColumn(index: number, delta: number): void;
|
|
463
489
|
resizeRow(index: number, delta: number): void;
|
|
464
490
|
setCellBorders(cellIds: string[], sides: BorderSideName[], attrs: BorderAttrs): void;
|
|
491
|
+
applyBorderMode(mode: BorderMode, attrs: BorderAttrs): void;
|
|
465
492
|
} & {
|
|
466
493
|
clone(attrs?: any, { skipSelect }?: {
|
|
467
494
|
skipSelect?: boolean | undefined;
|