polotno 2.36.10 → 2.37.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.
@@ -7,7 +7,9 @@ import { LineElementType } from './line-model.js';
7
7
  import { SVGElementType } from './svg-model.js';
8
8
  import { FigureElementType } from './figure-model.js';
9
9
  import { GifElementType } from './gif-model.js';
10
+ import { TableElementType } from './table-model.js';
10
11
  export declare const forEveryChild: (node: any, cb: any) => void;
12
+ export declare const forEveryNode: (node: any, cb: any) => void;
11
13
  export declare const ElementTypes: any;
12
14
  type ElementUnion = (SVGElementType & {
13
15
  type: 'svg';
@@ -23,6 +25,8 @@ type ElementUnion = (SVGElementType & {
23
25
  type: 'figure';
24
26
  }) | (GifElementType & {
25
27
  type: 'gif';
28
+ }) | (TableElementType & {
29
+ type: 'table';
26
30
  });
27
31
  type UnknownElementType = {
28
32
  type: string;
@@ -1235,6 +1239,354 @@ export declare const TYPES_MAP: {
1235
1239
  alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1236
1240
  showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1237
1241
  }>>;
1242
+ table: import("mobx-state-tree").IModelType<{
1243
+ id: import("mobx-state-tree").ISimpleType<string>;
1244
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
1245
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
1246
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
1247
+ custom: import("mobx-state-tree").IType<any, any, any>;
1248
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1249
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1250
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1251
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1252
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1253
+ } & {
1254
+ x: import("mobx-state-tree").IType<number | undefined, number, number>;
1255
+ y: import("mobx-state-tree").IType<number | undefined, number, number>;
1256
+ width: import("mobx-state-tree").IType<number | undefined, number, number>;
1257
+ height: import("mobx-state-tree").IType<number | undefined, number, number>;
1258
+ rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
1259
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
1260
+ animations: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
1261
+ delay: import("mobx-state-tree").IType<number | undefined, number, number>;
1262
+ duration: import("mobx-state-tree").IType<number | undefined, number, number>;
1263
+ enabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1264
+ type: import("mobx-state-tree").ISimpleType<string>;
1265
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
1266
+ data: import("mobx-state-tree").IType<{} | null | undefined, {}, {}>;
1267
+ }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
1268
+ blurEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1269
+ blurRadius: import("mobx-state-tree").IType<number | undefined, number, number>;
1270
+ brightnessEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1271
+ brightness: import("mobx-state-tree").IType<number | undefined, number, number>;
1272
+ sepiaEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1273
+ grayscaleEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1274
+ filters: import("mobx-state-tree").IMapType<import("mobx-state-tree").IModelType<{
1275
+ intensity: import("mobx-state-tree").IType<number | undefined, number, number>;
1276
+ }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
1277
+ shadowEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1278
+ shadowBlur: import("mobx-state-tree").IType<number | undefined, number, number>;
1279
+ shadowOffsetX: import("mobx-state-tree").IType<number | undefined, number, number>;
1280
+ shadowOffsetY: import("mobx-state-tree").IType<number | undefined, number, number>;
1281
+ shadowColor: import("mobx-state-tree").IType<string | undefined, string, string>;
1282
+ shadowOpacity: import("mobx-state-tree").IType<number | undefined, number, number>;
1283
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1284
+ draggable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1285
+ resizable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1286
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1287
+ contentEditable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1288
+ styleEditable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1289
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1290
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1291
+ } & {
1292
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
1293
+ width: import("mobx-state-tree").IType<number | undefined, number, number>;
1294
+ height: import("mobx-state-tree").IType<number | undefined, number, number>;
1295
+ rows: import("mobx-state-tree").IType<number | undefined, number, number>;
1296
+ cols: import("mobx-state-tree").IType<number | undefined, number, number>;
1297
+ colWidths: import("mobx-state-tree").IArrayType<import("mobx-state-tree").ISimpleType<number>>;
1298
+ rowHeights: import("mobx-state-tree").IArrayType<import("mobx-state-tree").ISimpleType<number>>;
1299
+ cells: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
1300
+ id: import("mobx-state-tree").ISimpleType<string>;
1301
+ type: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<"tablecell">, [undefined]>;
1302
+ text: import("mobx-state-tree").IType<string | undefined, string, string>;
1303
+ _fontSize: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
1304
+ _fontFamily: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1305
+ _fontWeight: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1306
+ _fontStyle: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1307
+ _textDecoration: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1308
+ _textTransform: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1309
+ _fill: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1310
+ _align: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1311
+ _verticalAlign: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1312
+ _lineHeight: import("mobx-state-tree").IMaybe<import("mobx-state-tree/dist/internal").IUnionType<[import("mobx-state-tree").ISimpleType<number>, import("mobx-state-tree").ISimpleType<string>]>>;
1313
+ _letterSpacing: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
1314
+ _strokeWidth: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
1315
+ _stroke: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1316
+ _cellBackground: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1317
+ _cellPadding: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
1318
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
1319
+ rowSpan: import("mobx-state-tree").IType<number | undefined, number, number>;
1320
+ colSpan: import("mobx-state-tree").IType<number | undefined, number, number>;
1321
+ mergedInto: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1322
+ borders: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IModelType<{
1323
+ top: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IModelType<{
1324
+ color: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1325
+ width: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
1326
+ style: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<"none" | "solid" | "dashed" | "dotted">>;
1327
+ }, {}, import("mobx-state-tree")._NotCustomized, any>>;
1328
+ right: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IModelType<{
1329
+ color: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1330
+ width: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
1331
+ style: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<"none" | "solid" | "dashed" | "dotted">>;
1332
+ }, {}, import("mobx-state-tree")._NotCustomized, any>>;
1333
+ bottom: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IModelType<{
1334
+ color: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1335
+ width: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
1336
+ style: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<"none" | "solid" | "dashed" | "dotted">>;
1337
+ }, {}, import("mobx-state-tree")._NotCustomized, any>>;
1338
+ left: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IModelType<{
1339
+ color: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
1340
+ width: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
1341
+ style: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<"none" | "solid" | "dashed" | "dotted">>;
1342
+ }, {}, import("mobx-state-tree")._NotCustomized, any>>;
1343
+ }, {}, import("mobx-state-tree")._NotCustomized, any>>;
1344
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
1345
+ custom: import("mobx-state-tree").IType<any, any, any>;
1346
+ }, {
1347
+ _editModeEnabled: boolean;
1348
+ filters: import("mobx").ObservableMap<string, number>;
1349
+ } & {
1350
+ readonly row: number;
1351
+ readonly col: number;
1352
+ readonly store: any;
1353
+ readonly page: any;
1354
+ readonly fontSize: number;
1355
+ readonly fontFamily: string;
1356
+ readonly fontWeight: string;
1357
+ readonly fontStyle: string;
1358
+ readonly textDecoration: string;
1359
+ readonly textTransform: string;
1360
+ readonly fill: string;
1361
+ readonly align: string;
1362
+ readonly verticalAlign: string;
1363
+ readonly lineHeight: number | string;
1364
+ readonly letterSpacing: number;
1365
+ readonly strokeWidth: number;
1366
+ readonly stroke: string;
1367
+ readonly cellBackground: string;
1368
+ readonly cellPadding: number;
1369
+ readonly width: number;
1370
+ readonly height: number;
1371
+ readonly a: {
1372
+ x: number;
1373
+ y: number;
1374
+ width: number;
1375
+ height: number;
1376
+ rotation: number;
1377
+ opacity: number;
1378
+ fontSize: number;
1379
+ };
1380
+ getEffectiveBorder(side: import("./table-model.js").BorderSideName): {
1381
+ color: string;
1382
+ width: number;
1383
+ style: string;
1384
+ };
1385
+ readonly x: number;
1386
+ readonly y: number;
1387
+ readonly rotation: number;
1388
+ readonly draggable: boolean;
1389
+ readonly resizable: boolean;
1390
+ readonly selectable: boolean;
1391
+ readonly removable: boolean;
1392
+ readonly contentEditable: boolean;
1393
+ readonly visible: boolean;
1394
+ readonly showInExport: boolean;
1395
+ readonly alwaysOnTop: boolean;
1396
+ readonly placeholder: string;
1397
+ readonly backgroundEnabled: boolean;
1398
+ readonly backgroundOpacity: number;
1399
+ readonly backgroundColor: string;
1400
+ readonly backgroundCornerRadius: number;
1401
+ readonly backgroundPadding: number;
1402
+ readonly curveEnabled: boolean;
1403
+ readonly curvePower: number;
1404
+ readonly shadowEnabled: boolean;
1405
+ readonly shadowBlur: number;
1406
+ readonly shadowOffsetX: number;
1407
+ readonly shadowOffsetY: number;
1408
+ readonly shadowColor: string;
1409
+ readonly shadowOpacity: number;
1410
+ readonly blurEnabled: boolean;
1411
+ readonly blurRadius: number;
1412
+ readonly brightnessEnabled: boolean;
1413
+ readonly brightness: number;
1414
+ readonly sepiaEnabled: boolean;
1415
+ readonly grayscaleEnabled: boolean;
1416
+ readonly animations: readonly never[];
1417
+ } & {
1418
+ toJSON(): any;
1419
+ set(attrs: any): void;
1420
+ setBorder(side: import("./table-model.js").BorderSideName, attrs: import("./table-model.js").BorderAttrs): void;
1421
+ toggleEditMode(editing?: boolean): void;
1422
+ }, any, any>>;
1423
+ borderColor: import("mobx-state-tree").IType<string | undefined, string, string>;
1424
+ borderWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
1425
+ borderStyle: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
1426
+ fontSize: import("mobx-state-tree").IType<number | undefined, number, number>;
1427
+ fontFamily: import("mobx-state-tree").IType<string | undefined, string, string>;
1428
+ fontWeight: import("mobx-state-tree").IType<string | undefined, string, string>;
1429
+ fontStyle: import("mobx-state-tree").IType<string | undefined, string, string>;
1430
+ textDecoration: import("mobx-state-tree").IType<string | undefined, string, string>;
1431
+ textTransform: import("mobx-state-tree").IType<string | undefined, string, string>;
1432
+ fill: import("mobx-state-tree").IType<string | undefined, string, string>;
1433
+ align: import("mobx-state-tree").IType<string | undefined, string, string>;
1434
+ verticalAlign: import("mobx-state-tree").IType<string | undefined, string, string>;
1435
+ lineHeight: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree/dist/internal").IUnionType<[import("mobx-state-tree").ISimpleType<number>, import("mobx-state-tree").ISimpleType<string>]>, [undefined]>;
1436
+ letterSpacing: import("mobx-state-tree").IType<number | undefined, number, number>;
1437
+ strokeWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
1438
+ stroke: import("mobx-state-tree").IType<string | undefined, string, string>;
1439
+ cellBackground: import("mobx-state-tree").IType<string | undefined, string, string>;
1440
+ cellPadding: import("mobx-state-tree").IType<number | undefined, number, number>;
1441
+ }, {
1442
+ readonly page: any;
1443
+ readonly store: any;
1444
+ readonly top: import("mobx-state-tree").ModelInstanceTypeProps<{
1445
+ id: import("mobx-state-tree").ISimpleType<string>;
1446
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
1447
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
1448
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
1449
+ custom: import("mobx-state-tree").IType<any, any, any>;
1450
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1451
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1452
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1453
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1454
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1455
+ }> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
1456
+ id: import("mobx-state-tree").ISimpleType<string>;
1457
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
1458
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
1459
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
1460
+ custom: import("mobx-state-tree").IType<any, any, any>;
1461
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1462
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1463
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1464
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1465
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1466
+ }, {}, import("mobx-state-tree").ModelCreationType<{
1467
+ id: string;
1468
+ type: string | undefined;
1469
+ name: string | undefined;
1470
+ opacity: number | undefined;
1471
+ custom: any;
1472
+ visible: boolean | undefined;
1473
+ selectable: boolean | undefined;
1474
+ removable: boolean | undefined;
1475
+ alwaysOnTop: boolean | undefined;
1476
+ showInExport: boolean | undefined;
1477
+ }>, import("mobx-state-tree").ModelSnapshotType<{
1478
+ id: import("mobx-state-tree").ISimpleType<string>;
1479
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
1480
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
1481
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
1482
+ custom: import("mobx-state-tree").IType<any, any, any>;
1483
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1484
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1485
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1486
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1487
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
1488
+ }>>>;
1489
+ readonly parent: any;
1490
+ readonly zIndex: any;
1491
+ } & {
1492
+ toJSON(): {
1493
+ id: string;
1494
+ type: string;
1495
+ name: string;
1496
+ opacity: number;
1497
+ custom: any;
1498
+ visible: boolean;
1499
+ selectable: boolean;
1500
+ removable: boolean;
1501
+ alwaysOnTop: boolean;
1502
+ showInExport: boolean;
1503
+ };
1504
+ } & {
1505
+ clone(attrs?: any, { skipSelect }?: {
1506
+ skipSelect?: boolean | undefined;
1507
+ }): NodeType;
1508
+ set(attrs: any): void;
1509
+ moveUp(): void;
1510
+ moveTop(): void;
1511
+ moveDown(): void;
1512
+ moveBottom(): void;
1513
+ setZIndex(zIndex: number): void;
1514
+ beforeDestroy(): void;
1515
+ } & {
1516
+ readonly locked: boolean;
1517
+ readonly a: import("./shape-model.js").AnimatedAttrs;
1518
+ animated(attr: any): any;
1519
+ } & {
1520
+ setAnimation(type: any, attrs: any): void;
1521
+ setFilter(type: any, value: any): void;
1522
+ } & {
1523
+ _focusedCellIds: string[];
1524
+ _editingCellId: string | undefined;
1525
+ _anchorCellId: string | undefined;
1526
+ _cellContentHeights: import("mobx").ObservableMap<string, number>;
1527
+ _baseRowHeights: number[] | null;
1528
+ _baseHeight: number | null;
1529
+ _isResizingRows: boolean;
1530
+ _isTransforming: boolean;
1531
+ } & {
1532
+ afterCreate(): void;
1533
+ } & {
1534
+ readonly _cellMap: Map<string, import("./table-model.js").TableCellType>;
1535
+ getActualRowHeight(rowIndex: number): number;
1536
+ } & {
1537
+ getCell(row: number, col: number): import("./table-model.js").TableCellType | undefined;
1538
+ readonly minWidth: number;
1539
+ readonly minHeight: number;
1540
+ readonly actualHeight: number;
1541
+ getCellRect(row: number, col: number, rowSpan?: number, colSpan?: number): {
1542
+ x: number;
1543
+ y: number;
1544
+ width: number;
1545
+ height: number;
1546
+ };
1547
+ readonly visibleCells: import("./table-model.js").TableCellType[];
1548
+ readonly focusedCells: import("./table-model.js").TableCellType[];
1549
+ readonly editingCell: import("./table-model.js").TableCellType | undefined;
1550
+ readonly _fitRowsToContent: {
1551
+ rowHeights: number[];
1552
+ height: number;
1553
+ } | null;
1554
+ } & {
1555
+ setCellContentHeight(cellId: string, height: number): void;
1556
+ _applyFitRowsToContent(): void;
1557
+ focusCell(cellId: string, addToSelection?: boolean): void;
1558
+ focusCellRange(targetRow: number, targetCol: number): void;
1559
+ clearCellFocus(): void;
1560
+ enterCellEdit(cellId: string): void;
1561
+ exitCellEdit(): void;
1562
+ _resetBaseRowHeights(): void;
1563
+ _setIsResizingRows(value: boolean): void;
1564
+ _setIsTransforming(value: boolean): void;
1565
+ addRow(index: number): void;
1566
+ removeRow(index: number): void;
1567
+ addColumn(index: number): void;
1568
+ removeColumn(index: number): void;
1569
+ distributeRowsEvenly(): void;
1570
+ distributeColumnsEvenly(): void;
1571
+ resizeColumn(index: number, delta: number): void;
1572
+ resizeRow(index: number, delta: number): void;
1573
+ setCellBorders(cellIds: string[], sides: import("./table-model.js").BorderSideName[], attrs: import("./table-model.js").BorderAttrs): void;
1574
+ } & {
1575
+ clone(attrs?: any, { skipSelect }?: {
1576
+ skipSelect?: boolean | undefined;
1577
+ }): any;
1578
+ }, import("mobx-state-tree").ModelCreationType<{
1579
+ id: string;
1580
+ type: string | undefined;
1581
+ name: string | undefined;
1582
+ opacity: number | undefined;
1583
+ custom: any;
1584
+ visible: boolean | undefined;
1585
+ selectable: boolean | undefined;
1586
+ removable: boolean | undefined;
1587
+ alwaysOnTop: boolean | undefined;
1588
+ showInExport: boolean | undefined;
1589
+ }>, any>;
1238
1590
  };
1239
1591
  export declare function registerShapeModel(defaultAttributes: any, extendFunc?: any): void;
1240
1592
  export type GroupElementType = Instance<typeof GroupElement>;
@@ -1 +1 @@
1
- var e=this&&this.__rest||function(e,t){var r={};for(var o in e){Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o])}if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(o=Object.getOwnPropertySymbols(e);i<o.length;i++){t.indexOf(o[i])<0&&Object.prototype.propertyIsEnumerable.call(e,o[i])&&(r[o[i]]=e[o[i]])}}return r};import{detach as t,types as r}from"mobx-state-tree";import{nanoid as o}from"nanoid";import{Node as i}from"./node-model.js";import{Shape as l}from"./shape-model.js";import{TextElement as n}from"./text-model.js";import{ImageElement as s}from"./image-model.js";import{VideoElement as d}from"./video-model.js";import{LineElement as a}from"./line-model.js";import{SVGElement as m}from"./svg-model.js";import{FigureElement as p}from"./figure-model.js";import{GifElement as c}from"./gif-model.js";export const forEveryChild=(e,t)=>{if(e.children){for(const r of e.children){if(!0===t(r)){break}forEveryChild(r,t)}}};const f=[...new Array(20)].map((e,t)=>r.late(()=>y[t]));export const ElementTypes=r.union({dispatcher:e=>{const t=TYPES_MAP[e.type];if(!t){throw new Error(`Unknown element type: "${e.type}"`)}return t}},m,n,s,a,d,p,c,r.late(()=>GroupElement),...f);export const GroupElement=i.named("Group").props({type:"group",children:r.array(ElementTypes)}).views(e=>({get draggable(){let t=!0;return forEveryChild(e,e=>{e.draggable||(t=!1)}),t},get resizable(){let t=!0;return forEveryChild(e,e=>{e.resizable||(t=!1)}),t},get contentEditable(){let t=!0;return forEveryChild(e,e=>{e.contentEditable||(t=!1)}),t},get styleEditable(){let t=!0;return forEveryChild(e,e=>{e.styleEditable||(t=!1)}),t},get locked(){let t=!0;return forEveryChild(e,e=>{e.locked||(t=!1)}),t}})).actions(r=>({set(t){var{draggable:o,contentEditable:i,styleEditable:l,resizable:n}=t,s=e(t,["draggable","contentEditable","styleEditable","resizable"]);void 0!==o&&forEveryChild(r,e=>{e.set({draggable:o})}),void 0!==i&&forEveryChild(r,e=>{e.set({contentEditable:i})}),void 0!==l&&forEveryChild(r,e=>{e.set({styleEditable:l})}),void 0!==n&&forEveryChild(r,e=>{e.set({resizable:n})}),Object.assign(r,s)},addElement(e,{skipSelect:t=!1}={}){const i=TYPES_MAP[e.type];if(!i){return void console.error("Can not find model with type "+e.type)}e.children&&e.children.forEach(e=>{e.id=e.id||o(10)});const l=i.create(Object.assign({id:o(10)},e));return r.children.push(l),l.selectable&&!t&&r.store.selectElements([l.id]),l},setElementZIndex(e,o){const i=r.children.find(t=>t.id===e);i&&(t(i),r.children.remove(i),r.children.splice(o,0,i))},setAnimation(e,t){forEveryChild(r,r=>{r.setAnimation(e,t)})}}));const y=[];export const TYPES_MAP={svg:m,text:n,image:s,group:GroupElement,line:a,video:d,figure:p,gif:c};export function registerShapeModel(e,t){const r=e.type;if(!r){throw new Error('You must pass "type" attribute to custom model.')}let o=l.named(r).props(e);t&&(o=t(o)),TYPES_MAP[r]=o,y.push(o)}
1
+ var e=this&&this.__rest||function(e,t){var r={};for(var o in e){Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o])}if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(o=Object.getOwnPropertySymbols(e);i<o.length;i++){t.indexOf(o[i])<0&&Object.prototype.propertyIsEnumerable.call(e,o[i])&&(r[o[i]]=e[o[i]])}}return r};import{detach as t,types as r}from"mobx-state-tree";import{nanoid as o}from"nanoid";import{Node as i}from"./node-model.js";import{Shape as l}from"./shape-model.js";import{TextElement as n}from"./text-model.js";import{ImageElement as s}from"./image-model.js";import{VideoElement as d}from"./video-model.js";import{LineElement as a}from"./line-model.js";import{SVGElement as m}from"./svg-model.js";import{FigureElement as p}from"./figure-model.js";import{GifElement as f}from"./gif-model.js";import{TableElement as c}from"./table-model.js";export const forEveryChild=(e,t)=>{if(e.children){for(const r of e.children){if(!0===t(r)){break}forEveryChild(r,t)}}};export const forEveryNode=(e,t)=>{if(e.children){for(const r of e.children){if(!0===t(r)){break}forEveryNode(r,t)}}if(e.cells){for(const r of e.cells){if(!0===t(r)){break}}}};const y=[...new Array(20)].map((e,t)=>r.late(()=>E[t]));export const ElementTypes=r.union({dispatcher:e=>{const t=TYPES_MAP[e.type];if(!t){throw new Error(`Unknown element type: "${e.type}"`)}return t}},m,n,s,a,d,p,f,c,r.late(()=>GroupElement),...y);export const GroupElement=i.named("Group").props({type:"group",children:r.array(ElementTypes)}).views(e=>({get draggable(){let t=!0;return forEveryChild(e,e=>{e.draggable||(t=!1)}),t},get resizable(){let t=!0;return forEveryChild(e,e=>{e.resizable||(t=!1)}),t},get contentEditable(){let t=!0;return forEveryChild(e,e=>{e.contentEditable||(t=!1)}),t},get styleEditable(){let t=!0;return forEveryChild(e,e=>{e.styleEditable||(t=!1)}),t},get locked(){let t=!0;return forEveryChild(e,e=>{e.locked||(t=!1)}),t}})).actions(r=>({set(t){var{draggable:o,contentEditable:i,styleEditable:l,resizable:n}=t,s=e(t,["draggable","contentEditable","styleEditable","resizable"]);void 0!==o&&forEveryChild(r,e=>{e.set({draggable:o})}),void 0!==i&&forEveryChild(r,e=>{e.set({contentEditable:i})}),void 0!==l&&forEveryChild(r,e=>{e.set({styleEditable:l})}),void 0!==n&&forEveryChild(r,e=>{e.set({resizable:n})}),Object.assign(r,s)},addElement(e,{skipSelect:t=!1}={}){const i=TYPES_MAP[e.type];if(!i){return void console.error("Can not find model with type "+e.type)}e.children&&e.children.forEach(e=>{e.id=e.id||o(10)});const l=i.create(Object.assign({id:o(10)},e));return r.children.push(l),l.selectable&&!t&&r.store.selectElements([l.id]),l},setElementZIndex(e,o){const i=r.children.find(t=>t.id===e);i&&(t(i),r.children.remove(i),r.children.splice(o,0,i))},setAnimation(e,t){forEveryChild(r,r=>{r.setAnimation(e,t)})}}));const E=[];export const TYPES_MAP={svg:m,text:n,image:s,group:GroupElement,line:a,video:d,figure:p,gif:f,table:c};export function registerShapeModel(e,t){const r=e.type;if(!r){throw new Error('You must pass "type" attribute to custom model.')}let o=l.named(r).props(e);t&&(o=t(o)),TYPES_MAP[r]=o,E.push(o)}
@@ -1 +1 @@
1
- import{types as e,getParentOfType as t,getSnapshot as o,hasParentOfType as n}from"mobx-state-tree";import{nanoid as r}from"nanoid";import{Store as s}from"./store.js";import{Page as i}from"./page-model.js";import{GroupElement as p,forEveryChild as m}from"./group-model.js";export const Node=e.model("Node",{id:e.identifier,type:"none",name:"",opacity:1,custom:e.frozen(),visible:!0,selectable:!0,removable:!0,alwaysOnTop:!1,showInExport:!0}).preProcessSnapshot(e=>{for(var t in e){null===e[t]&&(e[t]=void 0)}return e}).postProcessSnapshot(e=>{const t=Object.assign({},e),o={};for(var n in t){"_"!==n[0]&&(o[n]=e[n])}return o}).views(e=>({get page(){return t(e,i)},get store(){return t(e,s)},get top(){let o=e;for(;;){if(!n(o,p)){return o}o=t(o,p)}},get parent(){if(n(e,p)){const o=t(e,p);return o&&o.children&&o.children.length,o}if(n(e,i)){const o=t(e,i);return o&&o.children&&o.children.length,o}if(n(e,s)){const o=t(e,s);return o&&o.pages&&o.pages.length,o}return null},get zIndex(){return e.parent.children.indexOf(e)}})).actions(e=>({toJSON:()=>Object.assign({},o(e))})).actions(e=>({clone(t={},{skipSelect:o=!1}={}){const n=JSON.parse(JSON.stringify(e.toJSON()));return t.id=t.id||r(10),m(n,e=>{e.id=r(10)}),Object.assign(n,t),e.page.addElement(n,{skipSelect:o})},set(t){Object.assign(e,t)},moveUp(){e.page.moveElementsUp([e.id])},moveTop(){e.page.moveElementsTop([e.id])},moveDown(){e.page.moveElementsDown([e.id])},moveBottom(){e.page.moveElementsBottom([e.id])},setZIndex(t){e.parent.setElementZIndex(e.id,t)},beforeDestroy(){}}));
1
+ import{types as e,getParentOfType as t,getSnapshot as o,hasParentOfType as n}from"mobx-state-tree";import{nanoid as r}from"nanoid";import{Store as s}from"./store.js";import{Page as i}from"./page-model.js";import{GroupElement as m,forEveryNode as p}from"./group-model.js";export const Node=e.model("Node",{id:e.identifier,type:"none",name:"",opacity:1,custom:e.frozen(),visible:!0,selectable:!0,removable:!0,alwaysOnTop:!1,showInExport:!0}).preProcessSnapshot(e=>{for(var t in e){null===e[t]&&(e[t]=void 0)}return e}).postProcessSnapshot(e=>{const t=Object.assign({},e),o={};for(var n in t){"_"!==n[0]&&(o[n]=e[n])}return o}).views(e=>({get page(){return t(e,i)},get store(){return t(e,s)},get top(){let o=e;for(;;){if(!n(o,m)){return o}o=t(o,m)}},get parent(){if(n(e,m)){const o=t(e,m);return o&&o.children&&o.children.length,o}if(n(e,i)){const o=t(e,i);return o&&o.children&&o.children.length,o}if(n(e,s)){const o=t(e,s);return o&&o.pages&&o.pages.length,o}return null},get zIndex(){return e.parent.children.indexOf(e)}})).actions(e=>({toJSON:()=>Object.assign({},o(e))})).actions(e=>({clone(t={},{skipSelect:o=!1}={}){const n=JSON.parse(JSON.stringify(e.toJSON()));t.id=t.id||r(10);const s=new Map;return p(n,e=>{const t=e.id,o=r(10);s.set(t,o),e.id=o}),p(n,e=>{e.mergedInto&&s.has(e.mergedInto)&&(e.mergedInto=s.get(e.mergedInto))}),Object.assign(n,t),e.page.addElement(n,{skipSelect:o})},set(t){Object.assign(e,t)},moveUp(){e.page.moveElementsUp([e.id])},moveTop(){e.page.moveElementsTop([e.id])},moveDown(){e.page.moveElementsDown([e.id])},moveBottom(){e.page.moveElementsBottom([e.id])},setZIndex(t){e.parent.setElementZIndex(e.id,t)},beforeDestroy(){}}));
@@ -1 +1 @@
1
- import{detach as e,getParentOfType as t,getSnapshot as n,types as o}from"mobx-state-tree";import{nanoid as i}from"nanoid";import{ElementTypes as r,forEveryChild as d,TYPES_MAP as s}from"./group-model.js";import{Store as c}from"./store.js";import{getTotalClientRect as a}from"../utils/math.js";export const Page=o.model("Page",{id:o.identifier,children:o.array(o.late(()=>r)),width:o.optional(o.union(o.number,o.literal("auto")),"auto"),height:o.optional(o.union(o.number,o.literal("auto")),"auto"),background:"white",bleed:0,custom:o.frozen(),duration:5e3,_exporting:!1,_rendering:!1,_forceMount:!1}).postProcessSnapshot(e=>{const t=Object.assign({},e),n={};for(var o in t){"_"!==o[0]&&(n[o]=e[o])}return n}).views(e=>({get store(){return t(e,c)}})).views(e=>({get startTime(){let t=0;for(const n of e.store.pages){if(n.id===e.id){return t}t+=n.duration}return t},get _exportingOrRendering(){return e._exporting||e._rendering}})).views(e=>({get computedWidth(){return"auto"===e.width?e.store.width:e.width},get computedHeight(){return"auto"===e.height?e.store.height:e.height}})).actions(e=>({toJSON:()=>JSON.parse(JSON.stringify(n(e))),_forEachElementUp(t,n){const o=t.map(t=>({id:t,index:e.children.findIndex(e=>e.id===t)}));o.sort((e,t)=>t.index-e.index);for(const{index:i}of o){if(-1==i){continue}const o=i<e.children.length-1&&e.children[i+1],r=t.indexOf(null==o?void 0:o.id)>=0;i===e.children.length-1||r||n(i)}},_forEachElementDown(t,n){const o=t.map(t=>({id:t,index:e.children.findIndex(e=>e.id===t)}));o.sort((e,t)=>e.index-t.index);for(const{index:i}of o){if(-1==i){continue}const o=i>0&&e.children[i-1],r=t.indexOf(null==o?void 0:o.id)>=0;0===i||r||n(i)}return!1}})).actions(t=>{const n={clone(e={}){const n=t.toJSON();n.children.forEach(e=>{e.id=i(10),d(e,e=>{e.id=i(10)})});const o=Object.assign(Object.assign(Object.assign({},n),{id:i(10)}),e),r=t.store.addPage(o),s=t.store.pages.indexOf(t);return r.setZIndex(s+1),r.select(),r},setZIndex(e){t.store.setPageZIndex(t.id,e)},set(e){Object.assign(t,e)},select(){t.store.selectPage(t.id)},addElement(e,{skipSelect:n=!1}={}){const o=s[e.type];if(!o){return void console.error("Can not find model with type "+e.type)}"children"in e&&Array.isArray(e.children)&&d(e,e=>{e.id=e.id||i(10)});const r=t.children.reduce((t,n)=>{if("group"===n.type){const o=n.children.reduce((t,n)=>{var o;const i=null===(o=n.name)||void 0===o?void 0:o.match(new RegExp(`${e.type}-(\\d+)`));if(i){const e=parseInt(i[1],10);return Math.max(t,e||0)}},0);return Math.max(t,o||0)}{const o=n.name.match(new RegExp(`${e.type}-(\\d+)`));if(o){const e=parseInt(o[1],10);return Math.max(t,e||0)}}return t},0),c=o.create(Object.assign({id:i(10),name:`${e.type}-${r+1}`},e));return t.children.push(c),c.selectable&&!n&&t.store.selectElements([c.id]),c},canMoveElementsUp(e){let n=!1;return t._forEachElementUp(e,()=>{n=n||!0}),n},moveElementsUp(n){t._forEachElementUp(n,n=>{const o=t.children[n];e(o),t.children.splice(n+1,0,o)})},canMoveElementsTop:e=>n.canMoveElementsUp(e),moveElementsTop(e){const n=[],o=[];t.children.forEach(t=>{e.indexOf(t.id)>=0?n.push(t):o.push(t)}),t.children.replace(o.concat(n))},canMoveElementsDown(e){let n=!1;return t._forEachElementDown(e,()=>{n=n||!0}),n},moveElementsDown(n){t._forEachElementDown(n,n=>{const o=t.children[n];e(o),t.children.splice(n-1,0,o)})},canMoveElementsBottom:e=>n.canMoveElementsDown(e),moveElementsBottom(e){const n=[],o=[];t.children.forEach(t=>{e.indexOf(t.id)>=0?n.push(t):o.push(t)}),t.children.replace(n.concat(o))},setElementZIndex(n,o){const i=t.children.find(e=>e.id===n);i&&(e(i),t.children.remove(i),t.children.splice(o,0,i))},setSize({width:e,height:n,useMagic:o,softChange:i}){if(o){const o=[],i=e=>"image"===e.type&&e.x<1&&e.y<1&&e.width>=t.computedWidth-2&&e.height>=t.computedHeight-2;d(t,e=>{"group"!==e.type&&(i(e)||o.push(e))});const r=o.length?a(o):{x:0,y:0,width:t.computedWidth,height:t.computedHeight},s=1/4,c=Math.max(0,Math.min(r.x,t.computedWidth-r.x-r.width)),m=t.computedWidth*s,h=Math.max(0,c-m),l=Math.max(0,Math.min(r.y,t.computedHeight-r.y-r.height)),p=t.computedHeight*s,u=Math.max(0,l-p),g=t.computedWidth-2*h,f=t.computedHeight-2*u,E=e/g,x=n/f,v=Math.min(E,x),w=(e-g*v)/2-h*v,y=(n-f*v)/2-u*v;d(t,e=>{"group"!==e.type&&(i(e)?e.set({x:e.x*v,y:e.y*v,width:e.width*E,height:e.height*x,cropX:0,cropY:0,cropWidth:1,cropHeight:1}):(e.set({x:w+e.x*v,y:y+e.y*v,width:e.width*v,height:e.height*v}),"text"===e.type?e.set({fontSize:e.fontSize*v}):"figure"===e.type&&e.set({strokeWidth:e.strokeWidth*v})))})}i||(t.width=e),i||(t.height=n)}};return n}).actions(e=>({moveElementUp(t){console.warn("page.moveElementUp(id) is deprecated. Please use page.moveElementsUp([id1, id2]) instead."),e.moveElementsUp([t])},moveElementDown(t){console.warn("page.moveElementDown(id) is deprecated. Please use page.moveElementsDown([id1, id2]) instead."),e.moveElementsDown([t])},moveElementTop(t){console.warn("page.moveElementTop(id) is deprecated. Please use page.moveElementsTop([id1, id2]) instead."),e.moveElementsTop([t])},moveElementBottom(t){console.warn("page.moveElementBottom(id) is deprecated. Please use page.moveElementsBottom([id1, id2]) instead."),e.moveElementsBottom([t])},play(){e.store.play({startTime:e.startTime,endTime:e.startTime+e.duration})}}));
1
+ import{detach as e,getParentOfType as t,getSnapshot as n,types as o}from"mobx-state-tree";import{nanoid as i}from"nanoid";import{ElementTypes as r,forEveryChild as d,forEveryNode as s,TYPES_MAP as c}from"./group-model.js";import{Store as a}from"./store.js";import{getTotalClientRect as l}from"../utils/math.js";export const Page=o.model("Page",{id:o.identifier,children:o.array(o.late(()=>r)),width:o.optional(o.union(o.number,o.literal("auto")),"auto"),height:o.optional(o.union(o.number,o.literal("auto")),"auto"),background:"white",bleed:0,custom:o.frozen(),duration:5e3,_exporting:!1,_rendering:!1,_forceMount:!1}).postProcessSnapshot(e=>{const t=Object.assign({},e),n={};for(var o in t){"_"!==o[0]&&(n[o]=e[o])}return n}).views(e=>({get store(){return t(e,a)}})).views(e=>({get startTime(){let t=0;for(const n of e.store.pages){if(n.id===e.id){return t}t+=n.duration}return t},get _exportingOrRendering(){return e._exporting||e._rendering}})).views(e=>({get computedWidth(){return"auto"===e.width?e.store.width:e.width},get computedHeight(){return"auto"===e.height?e.store.height:e.height}})).actions(e=>({toJSON:()=>JSON.parse(JSON.stringify(n(e))),_forEachElementUp(t,n){const o=t.map(t=>({id:t,index:e.children.findIndex(e=>e.id===t)}));o.sort((e,t)=>t.index-e.index);for(const{index:i}of o){if(-1==i){continue}const o=i<e.children.length-1&&e.children[i+1],r=t.indexOf(null==o?void 0:o.id)>=0;i===e.children.length-1||r||n(i)}},_forEachElementDown(t,n){const o=t.map(t=>({id:t,index:e.children.findIndex(e=>e.id===t)}));o.sort((e,t)=>e.index-t.index);for(const{index:i}of o){if(-1==i){continue}const o=i>0&&e.children[i-1],r=t.indexOf(null==o?void 0:o.id)>=0;0===i||r||n(i)}return!1}})).actions(t=>{const n={clone(e={}){const n=t.toJSON(),o=new Map;n.children.forEach(e=>{const t=e.id,n=i(10);o.set(t,n),e.id=n,s(e,e=>{const t=e.id,n=i(10);o.set(t,n),e.id=n})}),n.children.forEach(e=>{e.cells&&e.cells.forEach(e=>{e.mergedInto&&o.has(e.mergedInto)&&(e.mergedInto=o.get(e.mergedInto))})});const r=Object.assign(Object.assign(Object.assign({},n),{id:i(10)}),e),d=t.store.addPage(r),c=t.store.pages.indexOf(t);return d.setZIndex(c+1),d.select(),d},setZIndex(e){t.store.setPageZIndex(t.id,e)},set(e){Object.assign(t,e)},select(){t.store.selectPage(t.id)},addElement(e,{skipSelect:n=!1}={}){const o=c[e.type];if(!o){return void console.error("Can not find model with type "+e.type)}"children"in e&&Array.isArray(e.children)&&s(e,e=>{e.id=e.id||i(10)});const r=t.children.reduce((t,n)=>{if("group"===n.type){const o=n.children.reduce((t,n)=>{var o;const i=null===(o=n.name)||void 0===o?void 0:o.match(new RegExp(`${e.type}-(\\d+)`));if(i){const e=parseInt(i[1],10);return Math.max(t,e||0)}},0);return Math.max(t,o||0)}{const o=n.name.match(new RegExp(`${e.type}-(\\d+)`));if(o){const e=parseInt(o[1],10);return Math.max(t,e||0)}}return t},0),d=o.create(Object.assign({id:i(10),name:`${e.type}-${r+1}`},e));return t.children.push(d),d.selectable&&!n&&t.store.selectElements([d.id]),d},canMoveElementsUp(e){let n=!1;return t._forEachElementUp(e,()=>{n=n||!0}),n},moveElementsUp(n){t._forEachElementUp(n,n=>{const o=t.children[n];e(o),t.children.splice(n+1,0,o)})},canMoveElementsTop:e=>n.canMoveElementsUp(e),moveElementsTop(e){const n=[],o=[];t.children.forEach(t=>{e.indexOf(t.id)>=0?n.push(t):o.push(t)}),t.children.replace(o.concat(n))},canMoveElementsDown(e){let n=!1;return t._forEachElementDown(e,()=>{n=n||!0}),n},moveElementsDown(n){t._forEachElementDown(n,n=>{const o=t.children[n];e(o),t.children.splice(n-1,0,o)})},canMoveElementsBottom:e=>n.canMoveElementsDown(e),moveElementsBottom(e){const n=[],o=[];t.children.forEach(t=>{e.indexOf(t.id)>=0?n.push(t):o.push(t)}),t.children.replace(n.concat(o))},setElementZIndex(n,o){const i=t.children.find(e=>e.id===n);i&&(e(i),t.children.remove(i),t.children.splice(o,0,i))},setSize({width:e,height:n,useMagic:o,softChange:i}){if(o){const o=[],i=e=>"image"===e.type&&e.x<1&&e.y<1&&e.width>=t.computedWidth-2&&e.height>=t.computedHeight-2;d(t,e=>{"group"!==e.type&&(i(e)||o.push(e))});const r=o.length?l(o):{x:0,y:0,width:t.computedWidth,height:t.computedHeight},s=1/4,c=Math.max(0,Math.min(r.x,t.computedWidth-r.x-r.width)),a=t.computedWidth*s,h=Math.max(0,c-a),m=Math.max(0,Math.min(r.y,t.computedHeight-r.y-r.height)),p=t.computedHeight*s,g=Math.max(0,m-p),u=t.computedWidth-2*h,f=t.computedHeight-2*g,E=e/u,x=n/f,v=Math.min(E,x),w=(e-u*v)/2-h*v,y=(n-f*v)/2-g*v;d(t,e=>{var t;if("group"!==e.type){if(i(e)){e.set({x:e.x*v,y:e.y*v,width:e.width*E,height:e.height*x,cropX:0,cropY:0,cropWidth:1,cropHeight:1})}else if(e.set({x:w+e.x*v,y:y+e.y*v,width:e.width*v,height:e.height*v}),"text"===e.type){e.set({fontSize:e.fontSize*v})}else if("figure"===e.type){e.set({strokeWidth:e.strokeWidth*v})}else if("table"===e.type){e.set({borderWidth:e.borderWidth*v});for(const n of e.cells){const e={fontSize:n.fontSize*v,cellPadding:n.cellPadding*v};if(n.borders){const o=JSON.parse(JSON.stringify(n.borders));for(const e of["top","right","bottom","left"]){null!=(null===(t=o[e])||void 0===t?void 0:t.width)&&(o[e]=Object.assign(Object.assign({},o[e]),{width:o[e].width*v}))}e.borders=o}n.set(e)}}}})}i||(t.width=e),i||(t.height=n)}};return n}).actions(e=>({moveElementUp(t){console.warn("page.moveElementUp(id) is deprecated. Please use page.moveElementsUp([id1, id2]) instead."),e.moveElementsUp([t])},moveElementDown(t){console.warn("page.moveElementDown(id) is deprecated. Please use page.moveElementsDown([id1, id2]) instead."),e.moveElementsDown([t])},moveElementTop(t){console.warn("page.moveElementTop(id) is deprecated. Please use page.moveElementsTop([id1, id2]) instead."),e.moveElementsTop([t])},moveElementBottom(t){console.warn("page.moveElementBottom(id) is deprecated. Please use page.moveElementsBottom([id1, id2]) instead."),e.moveElementsBottom([t])},play(){e.store.play({startTime:e.startTime,endTime:e.startTime+e.duration})}}));
package/model/schema.d.ts CHANGED
@@ -2,17 +2,22 @@ export interface Store {
2
2
  schemaVersion: number;
3
3
  width: number;
4
4
  height: number;
5
- unit: 'px' | 'pt' | 'mm' | 'in';
5
+ unit: 'px' | 'pt' | 'mm' | 'cm' | 'in';
6
6
  dpi: number;
7
7
  custom?: unknown;
8
8
  fonts: Font[];
9
9
  pages: Page[];
10
10
  audios: Audio[];
11
11
  }
12
+ export interface FontStyleVariant {
13
+ src: string;
14
+ fontStyle?: string;
15
+ fontWeight?: string;
16
+ }
12
17
  export interface Font {
13
18
  fontFamily: string;
14
19
  url?: string;
15
- styles?: unknown;
20
+ styles?: FontStyleVariant[];
16
21
  }
17
22
  export interface Audio {
18
23
  id: string;
@@ -33,7 +38,7 @@ export interface Page {
33
38
  duration: number;
34
39
  children: Element[];
35
40
  }
36
- export type Element = TextElement | ImageElement | SVGElement | LineElement | VideoElement | FigureElement | GifElement | GroupElement;
41
+ export type Element = TextElement | ImageElement | SVGElement | LineElement | VideoElement | FigureElement | GifElement | GroupElement | TableElement;
37
42
  export interface Animation {
38
43
  delay: number;
39
44
  duration: number;
@@ -180,4 +185,68 @@ export interface VideoElement extends ShapeAttributes, BaseImageProps {
180
185
  endTime: number;
181
186
  volume: number;
182
187
  }
188
+ export interface BorderSide {
189
+ color?: string;
190
+ width?: number;
191
+ style?: 'solid' | 'dashed' | 'dotted' | 'none';
192
+ }
193
+ export interface CellBorders {
194
+ top?: BorderSide;
195
+ right?: BorderSide;
196
+ bottom?: BorderSide;
197
+ left?: BorderSide;
198
+ }
199
+ export interface TableCell {
200
+ id: string;
201
+ type: 'tablecell';
202
+ text?: string;
203
+ opacity?: number;
204
+ rowSpan?: number;
205
+ colSpan?: number;
206
+ mergedInto?: string;
207
+ name?: string;
208
+ custom?: unknown;
209
+ borders?: CellBorders;
210
+ fontSize?: number;
211
+ fontFamily?: string;
212
+ fontWeight?: string;
213
+ fontStyle?: string;
214
+ textDecoration?: string;
215
+ textTransform?: string;
216
+ fill?: string;
217
+ align?: string;
218
+ verticalAlign?: string;
219
+ lineHeight?: number | string;
220
+ letterSpacing?: number;
221
+ strokeWidth?: number;
222
+ stroke?: string;
223
+ cellBackground?: string;
224
+ cellPadding?: number;
225
+ }
226
+ export interface TableElement extends Omit<ShapeAttributes, 'blurEnabled' | 'blurRadius' | 'brightnessEnabled' | 'brightness' | 'sepiaEnabled' | 'grayscaleEnabled' | 'filters' | 'shadowEnabled' | 'shadowBlur' | 'shadowOffsetX' | 'shadowOffsetY' | 'shadowColor' | 'shadowOpacity'> {
227
+ type: 'table';
228
+ rows: number;
229
+ cols: number;
230
+ colWidths: number[];
231
+ rowHeights: number[];
232
+ cells: TableCell[];
233
+ borderColor: string;
234
+ borderWidth: number;
235
+ borderStyle: 'solid' | 'dashed' | 'dotted' | 'none';
236
+ fontSize: number;
237
+ fontFamily: string;
238
+ fontWeight: string;
239
+ fontStyle: string;
240
+ textDecoration: string;
241
+ textTransform: string;
242
+ fill: string;
243
+ align: string;
244
+ verticalAlign: string;
245
+ lineHeight: number | string;
246
+ letterSpacing: number;
247
+ strokeWidth: number;
248
+ stroke: string;
249
+ cellBackground: string;
250
+ cellPadding: number;
251
+ }
183
252
  export {};
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 s,onSnapshot as a,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 w}from"../utils/canvas.js";import{whenLoaded as P}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 I}from"../utils/to-html.js";import{jsonToSVG as k}from"../utils/to-svg.js";import{Page as O}from"./page-model.js";import{forEveryChild as j}from"./group-model.js";import{Audio as S}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(O),fonts:l.array(Font),audios:l.array(S),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:2,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 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=>{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 j({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 T={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:s=!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=s,requestAnimationFrame(()=>T.seek())},checkActivePage(){let e=0;for(const t of r.pages){if(r.currentTime>=t.startTime&&r.currentTime<t.startTime+t.duration){T.selectPage(t.id);break}e+=t.duration}},seek(){if(!r.isPlaying){return}const e=Date.now(),t=e-l;l=e,r.currentTime+=t,T.checkActivePage();const i=d||r.duration;r.isPlaying&&r.currentTime<i?requestAnimationFrame(()=>T.seek()):r.isPlaying&&g?(r.currentTime=0,requestAnimationFrame(()=>T.seek())):T.stop()},stop(){r.isPlaying=!1,r.currentTime=0,r.animatedElementsIds=i([]),T.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=O.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)},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),s=r.pages[n];s&&(r._activePageId=s.id),r.selectedElementsIds=i(r.selectedElementsIds.filter(e=>r.getElementById(e)))},groupElements(e,t={}){const o=e.map(e=>r.getElementById(e)),s=o[0].page;if(o.forEach(e=>{e&&n(e)}),!o.length){return}const a=s.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-${a+1}`,children:o,type:"group"},t);return s.children.push(l),r.selectedElementsIds=i([l.id]),s.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=T.toJSON();return a(r,i=>{const o=T.toJSON();!E(e,o)&&(e=o,t(o))})}},async _toCanvas({pixelRatio:e,ignoreBackground:t,pageId:i,mimeType:o,includeBleed:n,_skipTimeout:s,quickMode:a=!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&&T.setElementsPixelRatio(c),a?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}),T.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 T.waitLoading({_skipTimeout:s});const h=f.findOne(".page-container");if(!h){throw T.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 P=h.findOne(".elements-container"),x=P.clip();P.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 I=h.find(e=>e.getAttr("hideInExport"));I.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 O=k;!r.bleedVisible&&n||(r.bleedVisible||n?r.bleedVisible&&n?O=0:r.bleedVisible&&!n&&(O=-g.bleed):O=0);const j=g.computedWidth+2*k,S=g.computedHeight+2*k,F=h.scale();h.scale({x:1,y:1});const R=w(h,{x:h.x()-O,y:h.y()-O,width:j,height:S,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()),I.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),P.clip(x),f.position(b),null==g||g.set({_exporting:!1,_forceMount:!1}),await Promise.resolve(),T.setElementsPixelRatio(m),C},async toDataURL(t={}){var{mimeType:i,quality:o,dpi:n,dpiMetadata:s="auto"}=t,a=e(t,["mimeType","quality","dpi","dpiMetadata"]);const l=await T._toCanvas(Object.assign({mimeType:i},a)),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"===s||"auto"===s&&72===g?c:v(c,d,g)},async toBlob(t={}){var{mimeType:i,quality:o}=t,n=e(t,["mimeType","quality"]);const s=await T._toCanvas(Object.assign({mimeType:i},n)),a=await new Promise(e=>{s.toBlob(e,i,o)});return p.Util.releaseCanvas(s),a},async saveAsImage(t={}){var{fileName:i}=t,o=e(t,["fileName"]);const n=(o.mimeType||"image/png").split("/")[1];m(await T.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,s=e.pageIds||r.pages.map(e=>e.id),a=r.pages.filter(e=>s.includes(e.id)),l=await u(),d=e=>x({px:e,unit:o,dpi:t}),c=e.cropMarkSize||0,p=d(c),g=a[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})(a,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,a=t.computedHeight+2*i+2*c,r=d(o),l=d(a);let p=0,g=n;for(;p<10;){p+=1;const i=await T.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/s.length*.9),{url:i,width:r,height:l,widthPx:o,heightPx:a}}g*=.8}});(await Promise.all(t)).filter(e=>void 0!==e).forEach(({url:e,width:t,height:i,widthPx:n,heightPx:s})=>{b.addPage([t,i],t>i?"landscape":"portrait");const a=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(a.pageContext.cropBox={bottomLeftX:0,bottomLeftY:0,topRightX:t*r,topRightY:i*r},a.pageContext.artBox={bottomLeftX:d(c+m)*r,bottomLeftY:d(c+m)*r,topRightX:d(n-c-m)*r,topRightY:d(s-c-m)*r},a.pageContext.bleedBox={bottomLeftX:d(c+m)*r,bottomLeftY:d(c+m)*r,topRightX:d(n-c-m)*r,topRightY:d(s-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 T._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 s=0;s<n-1;s++){const e=s*o||1;T.setCurrentTime(e);let n=0,a="";for(const t of r.pages){if(n+=t.duration,t.set({_rendering:n>e}),n>e){a=t.id;break}}const l=await T._toCanvas({pixelRatio:t,pageId:a,_skipTimeout:!0});i.addFrame(l.getContext("2d"),{delay:o,copy:!0})}for(const s of r.pages){s.set({_rendering:!1})}return T.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 T.toGIFDataURL(o);m(n,i||"polotno.gif")},async toHTML({elementHook:e}={}){const t=T.toJSON();return I({json:t,elementHook:e})},async saveAsHTML({fileName:e,elementHook:t}={}){const i=await T.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=T.toJSON();t=t||(null===(o=n.pages[0])||void 0===o?void 0:o.id);const s=n.pages.find(e=>e.id===t);return k({json:Object.assign(Object.assign({},n),{pages:s?[s]:[]}),elementHook:e,fontEmbedding:i})},async saveAsSVG({fileName:e,elementHook:t,pageId:i,fontEmbedding:o="inline"}={}){const n=await T.toSVG({elementHook:t,pageId:i,fontEmbedding:o}),s="data:text/svg;base64,"+window.btoa(unescape(encodeURIComponent(n)));m(s,e||"polotno.svg")},async saveAsPDF(t={}){var{fileName:i}=t,o=e(t,["fileName"]);(await T._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 P()},toJSON:()=>({width:r.width,height:r.height,fonts:s(r.fonts),pages:s(r.pages),audios:s(r.audios),unit:r.unit,dpi:r.dpi,custom:r.custom,schemaVersion:r.schemaVersion}),loadJSON(e,i=!1){var o;const n=JSON.parse(JSON.stringify(e)),a=n.schemaVersion||0;a<1&&y.htmlRenderEnabled&&j({children:n.pages},e=>{if("text"===e.type){const t=16,i=e.letterSpacing*t;e.letterSpacing=i/e.fontSize}}),a<2&&j({children:n.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)})}),delete n.schemaVersion;const l=r.activePage?r.pages.indexOf(r.activePage):0;let d=null===(o=n.pages[l]||n.pages[0])||void 0===o?void 0:o.id;n._activePageId=d;const c=Object.assign({},s(r));Object.assign(c,n),c.history=i?s(r.history):{history:[],undoIdx:-1,targetPath:""},t(r,c)},clear({keepHistory:e=!1}={}){const t=r.pages.map(e=>e.id);T.deletePages(t),r.custom=null,e||r.history.clear()},addFont(e){T.removeFont(e.fontFamily),r.fonts.push(e)},removeFont(e){r.fonts.filter(t=>t.fontFamily===e).forEach(e=>o(e))},addAudio(e){const t=S.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){const o=r.fonts.find(t=>t.fontFamily===e)||b.globalFonts.find(t=>t.fontFamily===e);let n=[{fontStyle:"normal",fontWeight:"normal"},{fontStyle:"normal",fontWeight:"bold"}];return o?(o.styles&&(n=o.styles.map(e=>({fontStyle:e.fontStyle||"normal",fontWeight:e.fontWeight||"normal"}))),b.injectCustomFont(o)):b.injectGoogleFont(e),t&&i&&!n.some(e=>e.fontStyle===t&&e.fontWeight===i)&&n.push({fontStyle:t,fontWeight:i}),Promise.all(n.map(t=>b.loadFont(e,t.fontStyle,t.fontWeight)))},validate:e=>Store.validate(e,[{path:"",type:Store}]).map(e=>({path:"store"+e.context.map(e=>e.path).join("."),message:e.message}))};return T});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 s,onSnapshot as a,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 w}from"../utils/canvas.js";import{whenLoaded as P}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 I}from"../utils/to-html.js";import{jsonToSVG as k}from"../utils/to-svg.js";import{Page as O}from"./page-model.js";import{forEveryChild as j,forEveryNode as S}from"./group-model.js";import{Audio as T}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(O),fonts:l.array(Font),audios:l.array(T),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:2,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 S({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 j({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 S({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 j={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:s=!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=s,requestAnimationFrame(()=>j.seek())},checkActivePage(){let e=0;for(const t of r.pages){if(r.currentTime>=t.startTime&&r.currentTime<t.startTime+t.duration){j.selectPage(t.id);break}e+=t.duration}},seek(){if(!r.isPlaying){return}const e=Date.now(),t=e-l;l=e,r.currentTime+=t,j.checkActivePage();const i=d||r.duration;r.isPlaying&&r.currentTime<i?requestAnimationFrame(()=>j.seek()):r.isPlaying&&g?(r.currentTime=0,requestAnimationFrame(()=>j.seek())):j.stop()},stop(){r.isPlaying=!1,r.currentTime=0,r.animatedElementsIds=i([]),j.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=O.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)},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),s=r.pages[n];s&&(r._activePageId=s.id),r.selectedElementsIds=i(r.selectedElementsIds.filter(e=>r.getElementById(e)))},groupElements(e,t={}){const o=e.map(e=>r.getElementById(e)),s=o[0].page;if(o.forEach(e=>{e&&n(e)}),!o.length){return}const a=s.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-${a+1}`,children:o,type:"group"},t);return s.children.push(l),r.selectedElementsIds=i([l.id]),s.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=j.toJSON();return a(r,i=>{const o=j.toJSON();!E(e,o)&&(e=o,t(o))})}},async _toCanvas({pixelRatio:e,ignoreBackground:t,pageId:i,mimeType:o,includeBleed:n,_skipTimeout:s,quickMode:a=!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&&j.setElementsPixelRatio(c),a?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}),j.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 j.waitLoading({_skipTimeout:s});const h=f.findOne(".page-container");if(!h){throw j.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 P=h.findOne(".elements-container"),x=P.clip();P.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 I=h.find(e=>e.getAttr("hideInExport"));I.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 O=k;!r.bleedVisible&&n||(r.bleedVisible||n?r.bleedVisible&&n?O=0:r.bleedVisible&&!n&&(O=-g.bleed):O=0);const S=g.computedWidth+2*k,T=g.computedHeight+2*k,F=h.scale();h.scale({x:1,y:1});const R=w(h,{x:h.x()-O,y:h.y()-O,width:S,height:T,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()),I.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),P.clip(x),f.position(b),null==g||g.set({_exporting:!1,_forceMount:!1}),await Promise.resolve(),j.setElementsPixelRatio(m),C},async toDataURL(t={}){var{mimeType:i,quality:o,dpi:n,dpiMetadata:s="auto"}=t,a=e(t,["mimeType","quality","dpi","dpiMetadata"]);const l=await j._toCanvas(Object.assign({mimeType:i},a)),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"===s||"auto"===s&&72===g?c:v(c,d,g)},async toBlob(t={}){var{mimeType:i,quality:o}=t,n=e(t,["mimeType","quality"]);const s=await j._toCanvas(Object.assign({mimeType:i},n)),a=await new Promise(e=>{s.toBlob(e,i,o)});return p.Util.releaseCanvas(s),a},async saveAsImage(t={}){var{fileName:i}=t,o=e(t,["fileName"]);const n=(o.mimeType||"image/png").split("/")[1];m(await j.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,s=e.pageIds||r.pages.map(e=>e.id),a=r.pages.filter(e=>s.includes(e.id)),l=await u(),d=e=>x({px:e,unit:o,dpi:t}),c=e.cropMarkSize||0,p=d(c),g=a[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})(a,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,a=t.computedHeight+2*i+2*c,r=d(o),l=d(a);let p=0,g=n;for(;p<10;){p+=1;const i=await j.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/s.length*.9),{url:i,width:r,height:l,widthPx:o,heightPx:a}}g*=.8}});(await Promise.all(t)).filter(e=>void 0!==e).forEach(({url:e,width:t,height:i,widthPx:n,heightPx:s})=>{b.addPage([t,i],t>i?"landscape":"portrait");const a=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(a.pageContext.cropBox={bottomLeftX:0,bottomLeftY:0,topRightX:t*r,topRightY:i*r},a.pageContext.artBox={bottomLeftX:d(c+m)*r,bottomLeftY:d(c+m)*r,topRightX:d(n-c-m)*r,topRightY:d(s-c-m)*r},a.pageContext.bleedBox={bottomLeftX:d(c+m)*r,bottomLeftY:d(c+m)*r,topRightX:d(n-c-m)*r,topRightY:d(s-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 j._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 s=0;s<n-1;s++){const e=s*o||1;j.setCurrentTime(e);let n=0,a="";for(const t of r.pages){if(n+=t.duration,t.set({_rendering:n>e}),n>e){a=t.id;break}}const l=await j._toCanvas({pixelRatio:t,pageId:a,_skipTimeout:!0});i.addFrame(l.getContext("2d"),{delay:o,copy:!0})}for(const s of r.pages){s.set({_rendering:!1})}return j.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 j.toGIFDataURL(o);m(n,i||"polotno.gif")},async toHTML({elementHook:e}={}){const t=j.toJSON();return I({json:t,elementHook:e})},async saveAsHTML({fileName:e,elementHook:t}={}){const i=await j.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=j.toJSON();t=t||(null===(o=n.pages[0])||void 0===o?void 0:o.id);const s=n.pages.find(e=>e.id===t);return k({json:Object.assign(Object.assign({},n),{pages:s?[s]:[]}),elementHook:e,fontEmbedding:i})},async saveAsSVG({fileName:e,elementHook:t,pageId:i,fontEmbedding:o="inline"}={}){const n=await j.toSVG({elementHook:t,pageId:i,fontEmbedding:o}),s="data:text/svg;base64,"+window.btoa(unescape(encodeURIComponent(n)));m(s,e||"polotno.svg")},async saveAsPDF(t={}){var{fileName:i}=t,o=e(t,["fileName"]);(await j._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 P()},toJSON:()=>({width:r.width,height:r.height,fonts:s(r.fonts),pages:s(r.pages),audios:s(r.audios),unit:r.unit,dpi:r.dpi,custom:r.custom,schemaVersion:r.schemaVersion}),loadJSON(e,i=!1){var o;const n=JSON.parse(JSON.stringify(e)),a=n.schemaVersion||0;a<1&&y.htmlRenderEnabled&&S({children:n.pages},e=>{if("text"===e.type){const t=16,i=e.letterSpacing*t;e.letterSpacing=i/e.fontSize}}),a<2&&S({children:n.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)})}),delete n.schemaVersion;const l=r.activePage?r.pages.indexOf(r.activePage):0;let d=null===(o=n.pages[l]||n.pages[0])||void 0===o?void 0:o.id;n._activePageId=d;const c=Object.assign({},s(r));Object.assign(c,n),c.history=i?s(r.history):{history:[],undoIdx:-1,targetPath:""},t(r,c)},clear({keepHistory:e=!1}={}){const t=r.pages.map(e=>e.id);j.deletePages(t),r.custom=null,e||r.history.clear()},addFont(e){j.removeFont(e.fontFamily),r.fonts.push(e)},removeFont(e){r.fonts.filter(t=>t.fontFamily===e).forEach(e=>o(e))},addAudio(e){const t=T.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){const o=r.fonts.find(t=>t.fontFamily===e)||b.globalFonts.find(t=>t.fontFamily===e);let n=[{fontStyle:"normal",fontWeight:"normal"},{fontStyle:"normal",fontWeight:"bold"}];return o?(o.styles&&(n=o.styles.map(e=>({fontStyle:e.fontStyle||"normal",fontWeight:e.fontWeight||"normal"}))),b.injectCustomFont(o)):b.injectGoogleFont(e),t&&i&&!n.some(e=>e.fontStyle===t&&e.fontWeight===i)&&n.push({fontStyle:t,fontWeight:i}),Promise.all(n.map(t=>b.loadFont(e,t.fontStyle,t.fontWeight)))},validate:e=>Store.validate(e,[{path:"",type:Store}]).map(e=>({path:"store"+e.context.map(e=>e.path).join("."),message:e.message}))};return j});export function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){return Store.create({_forceShowCredit:t,_key:e})}export default createStore;