@idraw/util 0.4.0-beta.3 → 0.4.0-beta.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/esm/index.d.ts +14 -8
  2. package/dist/esm/index.js +14 -8
  3. package/dist/esm/lib/canvas.d.ts +6 -1
  4. package/dist/esm/lib/canvas.js +42 -19
  5. package/dist/esm/lib/config.d.ts +5 -10
  6. package/dist/esm/lib/config.js +9 -9
  7. package/dist/esm/lib/context2d.d.ts +2 -0
  8. package/dist/esm/lib/context2d.js +14 -0
  9. package/dist/esm/lib/controller.d.ts +5 -1
  10. package/dist/esm/lib/controller.js +142 -0
  11. package/dist/esm/lib/data.d.ts +6 -2
  12. package/dist/esm/lib/data.js +95 -2
  13. package/dist/esm/lib/element.d.ts +1 -0
  14. package/dist/esm/lib/element.js +19 -0
  15. package/dist/esm/lib/event.d.ts +4 -2
  16. package/dist/esm/lib/event.js +31 -11
  17. package/dist/esm/lib/file.d.ts +7 -2
  18. package/dist/esm/lib/file.js +26 -7
  19. package/dist/esm/lib/flat.d.ts +2 -0
  20. package/dist/esm/lib/flat.js +132 -0
  21. package/dist/esm/lib/handle-element.d.ts +6 -1
  22. package/dist/esm/lib/handle-element.js +108 -43
  23. package/dist/esm/lib/html.d.ts +1 -1
  24. package/dist/esm/lib/istype.d.ts +1 -0
  25. package/dist/esm/lib/istype.js +3 -0
  26. package/dist/esm/lib/modify-recorder.d.ts +15 -0
  27. package/dist/esm/lib/modify-recorder.js +177 -0
  28. package/dist/esm/lib/modify.d.ts +6 -0
  29. package/dist/esm/lib/modify.js +99 -0
  30. package/dist/esm/lib/rect.js +9 -9
  31. package/dist/esm/lib/resize-element.d.ts +2 -0
  32. package/dist/esm/lib/resize-element.js +101 -0
  33. package/dist/esm/lib/store.d.ts +6 -5
  34. package/dist/esm/lib/store.js +30 -9
  35. package/dist/esm/lib/text.d.ts +1 -0
  36. package/dist/esm/lib/text.js +4 -0
  37. package/dist/esm/lib/time.d.ts +1 -0
  38. package/dist/esm/lib/time.js +13 -1
  39. package/dist/esm/lib/view-box.js +4 -3
  40. package/dist/esm/lib/view-calc.d.ts +20 -3
  41. package/dist/esm/lib/view-calc.js +171 -3
  42. package/dist/esm/lib/view-content.d.ts +14 -0
  43. package/dist/esm/lib/view-content.js +88 -0
  44. package/dist/esm/lib/view-visible.d.ts +21 -0
  45. package/dist/esm/lib/view-visible.js +93 -0
  46. package/dist/index.global.js +1272 -176
  47. package/dist/index.global.min.js +1 -1
  48. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
- export { delay, compose, throttle } from './lib/time';
2
- export { downloadImageFromCanvas, parseFileToBase64, pickFile, parseFileToText } from './lib/file';
1
+ export { delay, compose, throttle, debounce } from './lib/time';
2
+ export { downloadImageFromCanvas, parseFileToBase64, pickFile, parseFileToText, downloadFileFromText } from './lib/file';
3
3
  export { toColorHexStr, toColorHexNum, isColorStr, colorNameToHex, colorToCSS, colorToLinearGradientCSS, mergeHexColorAlpha } from './lib/color';
4
4
  export { createUUID, isAssetId, createAssetId } from './lib/uuid';
5
- export { deepClone, sortDataAsserts } from './lib/data';
5
+ export { deepClone, sortDataAsserts, deepCloneElement, filterCompactData } from './lib/data';
6
6
  export { istype } from './lib/istype';
7
7
  export { loadImage, loadSVG, loadHTML } from './lib/load';
8
8
  export { is } from './lib/is';
@@ -13,13 +13,14 @@ export { calcDistance, calcSpeed, equalPoint, equalTouchPoint, vaildPoint, vaild
13
13
  export { Store } from './lib/store';
14
14
  export { getViewScaleInfoFromSnapshot, getViewSizeInfoFromSnapshot } from './lib/middleware';
15
15
  export { Context2D } from './lib/context2d';
16
- export { rotateElement, parseRadianToAngle, parseAngleToRadian, rotateElementVertexes, getElementRotateVertexes, calcElementCenter, calcElementCenterFromVertexes, rotatePointInGroup, limitAngle } from './lib/rotate';
17
- export { getSelectedElementUUIDs, validateElements, calcElementsContextSize, calcElementsViewInfo, getElemenetsAssetIds, findElementFromList, findElementsFromList, findElementFromListByPosition, findElementQueueFromListByPosition, findElementsFromListByPositions, getGroupQueueFromList, getElementSize, mergeElementAsset, filterElementAsset, isResourceElement, getElementPositionFromList, calcElementListSize } from './lib/element';
16
+ export { rotateElement, parseRadianToAngle, parseAngleToRadian, rotateElementVertexes, getElementRotateVertexes, calcElementCenter, calcElementCenterFromVertexes, rotatePointInGroup, limitAngle, calcRadian } from './lib/rotate';
17
+ export { getSelectedElementUUIDs, validateElements, calcElementsContextSize, calcElementsViewInfo, getElemenetsAssetIds, findElementFromList, findElementsFromList, findElementFromListByPosition, findElementQueueFromListByPosition, findElementsFromListByPositions, getGroupQueueFromList, getGroupQueueByElementPosition, getElementSize, mergeElementAsset, filterElementAsset, isResourceElement, getElementPositionFromList, calcElementListSize } from './lib/element';
18
18
  export { checkRectIntersect } from './lib/rect';
19
- export { viewScale, viewScroll, calcViewElementSize, calcViewPointSize, calcViewVertexes, isViewPointInElement, getViewPointAtElement, isElementInView, calcViewScaleInfo } from './lib/view-calc';
19
+ export { viewScale, viewScroll, calcViewElementSize, calcViewPointSize, calcViewVertexes, isViewPointInElement, getViewPointAtElement, isElementInView, calcViewScaleInfo, calcElementViewRectInfo, calcElementOriginRectInfo, calcElementViewRectInfoMap, originRectInfoToRangeRectInfo, isViewPointInElementSize, isViewPointInVertexes } from './lib/view-calc';
20
+ export { sortElementsViewVisiableInfoMap, calcVisibleOriginCanvasRectInfo, updateViewVisibleInfoMapStatus } from './lib/view-visible';
20
21
  export { rotatePoint, rotateVertexes, rotateByCenter } from './lib/rotate';
21
22
  export { getElementVertexes, calcElementVertexesInGroup, calcElementVertexesQueueInGroup, calcElementQueueVertexesQueueInGroup } from './lib/vertex';
22
- export { calcElementSizeController } from './lib/controller';
23
+ export { calcElementSizeController, calcLayoutSizeController } from './lib/controller';
23
24
  export { generateSVGPath, parseSVGPath } from './lib/svg-path';
24
25
  export { generateHTML, parseHTML } from './lib/html';
25
26
  export { compressImage } from './lib/image';
@@ -27,4 +28,9 @@ export { formatNumber } from './lib/number';
27
28
  export { matrixToAngle, matrixToRadian } from './lib/matrix';
28
29
  export { getDefaultElementDetailConfig, getDefaultElementRectDetail } from './lib/config';
29
30
  export { calcViewBoxSize } from './lib/view-box';
30
- export { createElement, insertElementToListByPosition, deleteElementInListByPosition, deleteElementInList, moveElementPosition, updateElementInList } from './lib/handle-element';
31
+ export { createElement, insertElementToListByPosition, deleteElementInListByPosition, deleteElementInList, moveElementPosition, updateElementInList, updateElementInListByPosition } from './lib/handle-element';
32
+ export { deepResizeGroupElement } from './lib/resize-element';
33
+ export { calcViewCenterContent, calcViewCenter } from './lib/view-content';
34
+ export { modifyElement, getModifiedElement } from './lib/modify';
35
+ export { enhanceFontFamliy } from './lib/text';
36
+ export { flatElementList } from './lib/flat';
package/dist/esm/index.js CHANGED
@@ -1,8 +1,8 @@
1
- export { delay, compose, throttle } from './lib/time';
2
- export { downloadImageFromCanvas, parseFileToBase64, pickFile, parseFileToText } from './lib/file';
1
+ export { delay, compose, throttle, debounce } from './lib/time';
2
+ export { downloadImageFromCanvas, parseFileToBase64, pickFile, parseFileToText, downloadFileFromText } from './lib/file';
3
3
  export { toColorHexStr, toColorHexNum, isColorStr, colorNameToHex, colorToCSS, colorToLinearGradientCSS, mergeHexColorAlpha } from './lib/color';
4
4
  export { createUUID, isAssetId, createAssetId } from './lib/uuid';
5
- export { deepClone, sortDataAsserts } from './lib/data';
5
+ export { deepClone, sortDataAsserts, deepCloneElement, filterCompactData } from './lib/data';
6
6
  export { istype } from './lib/istype';
7
7
  export { loadImage, loadSVG, loadHTML } from './lib/load';
8
8
  export { is } from './lib/is';
@@ -13,13 +13,14 @@ export { calcDistance, calcSpeed, equalPoint, equalTouchPoint, vaildPoint, vaild
13
13
  export { Store } from './lib/store';
14
14
  export { getViewScaleInfoFromSnapshot, getViewSizeInfoFromSnapshot } from './lib/middleware';
15
15
  export { Context2D } from './lib/context2d';
16
- export { rotateElement, parseRadianToAngle, parseAngleToRadian, rotateElementVertexes, getElementRotateVertexes, calcElementCenter, calcElementCenterFromVertexes, rotatePointInGroup, limitAngle } from './lib/rotate';
17
- export { getSelectedElementUUIDs, validateElements, calcElementsContextSize, calcElementsViewInfo, getElemenetsAssetIds, findElementFromList, findElementsFromList, findElementFromListByPosition, findElementQueueFromListByPosition, findElementsFromListByPositions, getGroupQueueFromList, getElementSize, mergeElementAsset, filterElementAsset, isResourceElement, getElementPositionFromList, calcElementListSize } from './lib/element';
16
+ export { rotateElement, parseRadianToAngle, parseAngleToRadian, rotateElementVertexes, getElementRotateVertexes, calcElementCenter, calcElementCenterFromVertexes, rotatePointInGroup, limitAngle, calcRadian } from './lib/rotate';
17
+ export { getSelectedElementUUIDs, validateElements, calcElementsContextSize, calcElementsViewInfo, getElemenetsAssetIds, findElementFromList, findElementsFromList, findElementFromListByPosition, findElementQueueFromListByPosition, findElementsFromListByPositions, getGroupQueueFromList, getGroupQueueByElementPosition, getElementSize, mergeElementAsset, filterElementAsset, isResourceElement, getElementPositionFromList, calcElementListSize } from './lib/element';
18
18
  export { checkRectIntersect } from './lib/rect';
19
- export { viewScale, viewScroll, calcViewElementSize, calcViewPointSize, calcViewVertexes, isViewPointInElement, getViewPointAtElement, isElementInView, calcViewScaleInfo } from './lib/view-calc';
19
+ export { viewScale, viewScroll, calcViewElementSize, calcViewPointSize, calcViewVertexes, isViewPointInElement, getViewPointAtElement, isElementInView, calcViewScaleInfo, calcElementViewRectInfo, calcElementOriginRectInfo, calcElementViewRectInfoMap, originRectInfoToRangeRectInfo, isViewPointInElementSize, isViewPointInVertexes } from './lib/view-calc';
20
+ export { sortElementsViewVisiableInfoMap, calcVisibleOriginCanvasRectInfo, updateViewVisibleInfoMapStatus } from './lib/view-visible';
20
21
  export { rotatePoint, rotateVertexes, rotateByCenter } from './lib/rotate';
21
22
  export { getElementVertexes, calcElementVertexesInGroup, calcElementVertexesQueueInGroup, calcElementQueueVertexesQueueInGroup } from './lib/vertex';
22
- export { calcElementSizeController } from './lib/controller';
23
+ export { calcElementSizeController, calcLayoutSizeController } from './lib/controller';
23
24
  export { generateSVGPath, parseSVGPath } from './lib/svg-path';
24
25
  export { generateHTML, parseHTML } from './lib/html';
25
26
  export { compressImage } from './lib/image';
@@ -27,4 +28,9 @@ export { formatNumber } from './lib/number';
27
28
  export { matrixToAngle, matrixToRadian } from './lib/matrix';
28
29
  export { getDefaultElementDetailConfig, getDefaultElementRectDetail } from './lib/config';
29
30
  export { calcViewBoxSize } from './lib/view-box';
30
- export { createElement, insertElementToListByPosition, deleteElementInListByPosition, deleteElementInList, moveElementPosition, updateElementInList } from './lib/handle-element';
31
+ export { createElement, insertElementToListByPosition, deleteElementInListByPosition, deleteElementInList, moveElementPosition, updateElementInList, updateElementInListByPosition } from './lib/handle-element';
32
+ export { deepResizeGroupElement } from './lib/resize-element';
33
+ export { calcViewCenterContent, calcViewCenter } from './lib/view-content';
34
+ export { modifyElement, getModifiedElement } from './lib/modify';
35
+ export { enhanceFontFamliy } from './lib/text';
36
+ export { flatElementList } from './lib/flat';
@@ -1,4 +1,4 @@
1
- import type { BoardContent } from '@idraw/types';
1
+ import type { BoardContent, ViewContext2D } from '@idraw/types';
2
2
  import { Context2D } from './context2d';
3
3
  export declare function createContext2D(opts: {
4
4
  ctx?: CanvasRenderingContext2D;
@@ -16,4 +16,9 @@ export declare function createBoardContent(canvas: HTMLCanvasElement, opts: {
16
16
  height: number;
17
17
  devicePixelRatio: number;
18
18
  offscreen?: boolean;
19
+ createCustomContext2D?: (opts: {
20
+ width: number;
21
+ height: number;
22
+ devicePixelRatio: number;
23
+ }) => ViewContext2D;
19
24
  }): BoardContent;
@@ -23,56 +23,79 @@ export function createOffscreenContext2D(opts) {
23
23
  return context2d;
24
24
  }
25
25
  export function createBoardContent(canvas, opts) {
26
- const { width, height, devicePixelRatio, offscreen } = opts;
26
+ const { width, height, devicePixelRatio, offscreen, createCustomContext2D } = opts;
27
27
  const ctxOpts = {
28
28
  width,
29
29
  height,
30
30
  devicePixelRatio
31
31
  };
32
+ const ctx = canvas.getContext('2d');
33
+ if (createCustomContext2D) {
34
+ const viewContext = createCustomContext2D(ctxOpts);
35
+ const overlayContext = createCustomContext2D(ctxOpts);
36
+ const underlayContext = createCustomContext2D(ctxOpts);
37
+ const boardContext = createContext2D(Object.assign({ ctx }, ctxOpts));
38
+ const drawView = () => {
39
+ const { width: w, height: h } = viewContext.$getSize();
40
+ boardContext.clearRect(0, 0, w, h);
41
+ boardContext.drawImage(underlayContext.canvas, 0, 0, w, h);
42
+ boardContext.drawImage(viewContext.canvas, 0, 0, w, h);
43
+ boardContext.drawImage(overlayContext.canvas, 0, 0, w, h);
44
+ underlayContext.clearRect(0, 0, w, h);
45
+ viewContext.clearRect(0, 0, w, h);
46
+ overlayContext.clearRect(0, 0, w, h);
47
+ };
48
+ const content = {
49
+ underlayContext,
50
+ viewContext,
51
+ overlayContext,
52
+ boardContext,
53
+ drawView
54
+ };
55
+ return content;
56
+ }
32
57
  if (offscreen === true) {
33
- const ctx = canvas.getContext('2d');
34
58
  const viewContext = createOffscreenContext2D(ctxOpts);
35
- const helperContext = createOffscreenContext2D(ctxOpts);
36
- const underContext = createOffscreenContext2D(ctxOpts);
59
+ const overlayContext = createOffscreenContext2D(ctxOpts);
60
+ const underlayContext = createOffscreenContext2D(ctxOpts);
37
61
  const boardContext = createContext2D(Object.assign({ ctx }, ctxOpts));
38
62
  const drawView = () => {
39
63
  const { width: w, height: h } = viewContext.$getSize();
40
64
  boardContext.clearRect(0, 0, w, h);
41
- boardContext.drawImage(underContext.canvas, 0, 0, w, h);
65
+ boardContext.drawImage(underlayContext.canvas, 0, 0, w, h);
42
66
  boardContext.drawImage(viewContext.canvas, 0, 0, w, h);
43
- boardContext.drawImage(helperContext.canvas, 0, 0, w, h);
44
- underContext.clearRect(0, 0, w, h);
67
+ boardContext.drawImage(overlayContext.canvas, 0, 0, w, h);
68
+ underlayContext.clearRect(0, 0, w, h);
45
69
  viewContext.clearRect(0, 0, w, h);
46
- helperContext.clearRect(0, 0, w, h);
70
+ overlayContext.clearRect(0, 0, w, h);
47
71
  };
48
72
  const content = {
49
- underContext,
73
+ underlayContext,
50
74
  viewContext,
51
- helperContext,
75
+ overlayContext,
52
76
  boardContext,
53
77
  drawView
54
78
  };
55
79
  return content;
56
80
  }
57
81
  else {
58
- const ctx = canvas.getContext('2d');
59
82
  const viewContext = createContext2D(ctxOpts);
60
- const helperContext = createContext2D(ctxOpts);
61
- const underContext = createContext2D(ctxOpts);
83
+ const overlayContext = createContext2D(ctxOpts);
84
+ const underlayContext = createContext2D(ctxOpts);
62
85
  const boardContext = createContext2D(Object.assign({ ctx }, ctxOpts));
63
86
  const drawView = () => {
64
87
  boardContext.clearRect(0, 0, width, height);
65
- boardContext.drawImage(underContext.canvas, 0, 0, width, height);
88
+ boardContext.drawImage(underlayContext.canvas, 0, 0, width, height);
66
89
  boardContext.drawImage(viewContext.canvas, 0, 0, width, height);
67
- boardContext.drawImage(helperContext.canvas, 0, 0, width, height);
68
- underContext.clearRect(0, 0, width, height);
90
+ boardContext.drawImage(overlayContext.canvas, 0, 0, width, height);
91
+ underlayContext.clearRect(0, 0, width, height);
69
92
  viewContext.clearRect(0, 0, width, height);
70
- helperContext.clearRect(0, 0, width, height);
93
+ overlayContext.clearRect(0, 0, width, height);
71
94
  };
72
95
  const content = {
73
- underContext,
96
+ underlayContext,
74
97
  viewContext,
75
- helperContext,
98
+ overlayContext,
76
99
  boardContext,
77
100
  drawView
78
101
  };
@@ -1,14 +1,9 @@
1
- import type { ViewScaleInfo, DefaultElementDetailConfig, ElementRectDetail, ElementCircleDetail, ElementTextDetail, ElementSVGDetail, ElementImageDetail, ElementGroupDetail } from '@idraw/types';
1
+ import type { DefaultElementDetailConfig, ElementSize, ElementRectDetail, ElementCircleDetail, ElementTextDetail, ElementSVGDetail, ElementImageDetail, ElementGroupDetail } from '@idraw/types';
2
+ export declare const defaultText = "Text Element";
2
3
  export declare function getDefaultElementDetailConfig(): DefaultElementDetailConfig;
3
4
  export declare function getDefaultElementRectDetail(): ElementRectDetail;
4
- export declare function getDefaultElementCircleDetail(opts: {
5
- radius: number;
6
- }): ElementCircleDetail;
7
- export declare function getDefaultElementTextDetail(opts?: {
8
- viewScaleInfo: ViewScaleInfo;
9
- }): ElementTextDetail;
5
+ export declare function getDefaultElementCircleDetail(): ElementCircleDetail;
6
+ export declare function getDefaultElementTextDetail(elementSize: ElementSize): ElementTextDetail;
10
7
  export declare function getDefaultElementSVGDetail(): ElementSVGDetail;
11
8
  export declare function getDefaultElementImageDetail(): ElementImageDetail;
12
- export declare function getDefaultElementGroupDetail(opts?: {
13
- viewScaleInfo: ViewScaleInfo;
14
- }): ElementGroupDetail;
9
+ export declare function getDefaultElementGroupDetail(): ElementGroupDetail;
@@ -1,3 +1,4 @@
1
+ export const defaultText = 'Text Element';
1
2
  export function getDefaultElementDetailConfig() {
2
3
  const config = {
3
4
  boxSizing: 'border-box',
@@ -14,9 +15,10 @@ export function getDefaultElementDetailConfig() {
14
15
  textAlign: 'left',
15
16
  verticalAlign: 'top',
16
17
  fontSize: 16,
17
- lineHeight: 20,
18
18
  fontFamily: 'sans-serif',
19
19
  fontWeight: 400,
20
+ minInlineSize: 'auto',
21
+ wordBreak: 'break-all',
20
22
  overflow: 'hidden'
21
23
  };
22
24
  return config;
@@ -27,24 +29,22 @@ export function getDefaultElementRectDetail() {
27
29
  };
28
30
  return detail;
29
31
  }
30
- export function getDefaultElementCircleDetail(opts) {
32
+ export function getDefaultElementCircleDetail() {
31
33
  const detail = {
32
34
  background: '#D9D9D9',
33
35
  radius: 0
34
36
  };
35
37
  return detail;
36
38
  }
37
- export function getDefaultElementTextDetail(opts) {
38
- var _a;
39
+ export function getDefaultElementTextDetail(elementSize) {
39
40
  const detailConfig = getDefaultElementDetailConfig();
40
- const scale = ((_a = opts === null || opts === void 0 ? void 0 : opts.viewScaleInfo) === null || _a === void 0 ? void 0 : _a.scale) || 1;
41
41
  const detail = {
42
- text: 'Text Element',
42
+ text: defaultText,
43
43
  color: detailConfig.color,
44
44
  fontFamily: detailConfig.fontFamily,
45
45
  fontWeight: detailConfig.fontWeight,
46
- lineHeight: detailConfig.fontSize * scale,
47
- fontSize: detailConfig.fontSize * scale,
46
+ lineHeight: elementSize.w / defaultText.length,
47
+ fontSize: elementSize.w / defaultText.length,
48
48
  textAlign: 'center',
49
49
  verticalAlign: 'middle'
50
50
  };
@@ -62,7 +62,7 @@ export function getDefaultElementImageDetail() {
62
62
  };
63
63
  return detail;
64
64
  }
65
- export function getDefaultElementGroupDetail(opts) {
65
+ export function getDefaultElementGroupDetail() {
66
66
  const detail = {
67
67
  children: [],
68
68
  background: '#D9D9D9',
@@ -5,11 +5,13 @@ export declare class Context2D implements ViewContext2D {
5
5
  $undoPixelRatio(num: number): number;
6
6
  $doPixelRatio(num: number): number;
7
7
  $getContext(): CanvasRenderingContext2D;
8
+ $setContext(ctx: CanvasRenderingContext2D): void;
8
9
  $setFont(opts: {
9
10
  fontSize: number;
10
11
  fontFamily?: string;
11
12
  fontWeight?: 'bold' | number | string;
12
13
  }): void;
14
+ $resetFont(): void;
13
15
  $getOffscreenCanvas(): OffscreenCanvas | null;
14
16
  $resize(opts: {
15
17
  width: number;
@@ -10,12 +10,16 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
12
  var _Context2D_ctx, _Context2D_opts;
13
+ const defaultFontSize = 12;
14
+ const defaultFontWeight = '400';
15
+ const defaultFontFamily = `-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'`;
13
16
  export class Context2D {
14
17
  constructor(ctx, opts) {
15
18
  _Context2D_ctx.set(this, void 0);
16
19
  _Context2D_opts.set(this, void 0);
17
20
  __classPrivateFieldSet(this, _Context2D_ctx, ctx, "f");
18
21
  __classPrivateFieldSet(this, _Context2D_opts, Object.assign({ devicePixelRatio: 1, offscreenCanvas: null }, opts), "f");
22
+ this.$resetFont();
19
23
  }
20
24
  $undoPixelRatio(num) {
21
25
  return num / __classPrivateFieldGet(this, _Context2D_opts, "f").devicePixelRatio;
@@ -26,6 +30,9 @@ export class Context2D {
26
30
  $getContext() {
27
31
  return __classPrivateFieldGet(this, _Context2D_ctx, "f");
28
32
  }
33
+ $setContext(ctx) {
34
+ __classPrivateFieldSet(this, _Context2D_ctx, ctx, "f");
35
+ }
29
36
  $setFont(opts) {
30
37
  const strList = [];
31
38
  if (opts.fontWeight) {
@@ -35,6 +42,13 @@ export class Context2D {
35
42
  strList.push(`${opts.fontFamily || 'sans-serif'}`);
36
43
  __classPrivateFieldGet(this, _Context2D_ctx, "f").font = `${strList.join(' ')}`;
37
44
  }
45
+ $resetFont() {
46
+ this.$setFont({
47
+ fontSize: defaultFontSize,
48
+ fontFamily: defaultFontFamily,
49
+ fontWeight: defaultFontWeight
50
+ });
51
+ }
38
52
  $getOffscreenCanvas() {
39
53
  return __classPrivateFieldGet(this, _Context2D_opts, "f").offscreenCanvas;
40
54
  }
@@ -1,6 +1,10 @@
1
- import type { Element, ElementSize, ElementSizeController, ViewScaleInfo } from '@idraw/types';
1
+ import type { Element, ElementSize, ElementSizeController, ViewScaleInfo, LayoutSizeController } from '@idraw/types';
2
2
  export declare function calcElementSizeController(elemSize: ElementSize, opts: {
3
3
  groupQueue: Element<'group'>[];
4
4
  controllerSize?: number;
5
5
  viewScaleInfo: ViewScaleInfo;
6
6
  }): ElementSizeController;
7
+ export declare function calcLayoutSizeController(layoutSize: Pick<ElementSize, 'x' | 'y' | 'w' | 'h'>, opts: {
8
+ controllerSize?: number;
9
+ viewScaleInfo: ViewScaleInfo;
10
+ }): LayoutSizeController;
@@ -1,6 +1,8 @@
1
1
  import { createUUID } from './uuid';
2
2
  import { getCenterFromTwoPoints } from './point';
3
3
  import { calcElementVertexesInGroup, calcElementVertexes } from './vertex';
4
+ import { calcViewElementSize } from './view-calc';
5
+ import { calcElementCenter } from './rotate';
4
6
  function createControllerElementSizeFromCenter(center, opts) {
5
7
  const { x, y } = center;
6
8
  const { size, angle } = opts;
@@ -36,6 +38,13 @@ export function calcElementSizeController(elemSize, opts) {
36
38
  totalAngle += angle;
37
39
  });
38
40
  const vertexes = calcElementVertexesInGroup(elemSize, { groupQueue });
41
+ const rotateElemVertexes = calcElementVertexesInGroup({
42
+ x: x - ctrlSize * 2,
43
+ y: y - ctrlSize * 2,
44
+ h: h + ctrlSize * 4,
45
+ w: w + ctrlSize * 4,
46
+ angle
47
+ }, { groupQueue: [...groupQueue] });
39
48
  const topCenter = getCenterFromTwoPoints(vertexes[0], vertexes[1]);
40
49
  const rightCenter = getCenterFromTwoPoints(vertexes[1], vertexes[2]);
41
50
  const bottomCenter = getCenterFromTwoPoints(vertexes[2], vertexes[3]);
@@ -44,6 +53,10 @@ export function calcElementSizeController(elemSize, opts) {
44
53
  const topRightCenter = vertexes[1];
45
54
  const bottomRightCenter = vertexes[2];
46
55
  const bottomLeftCenter = vertexes[3];
56
+ const topMiddleSize = createControllerElementSizeFromCenter(topCenter, { size: ctrlSize, angle: totalAngle });
57
+ const rightMiddleSize = createControllerElementSizeFromCenter(rightCenter, { size: ctrlSize, angle: totalAngle });
58
+ const bottomMiddleSize = createControllerElementSizeFromCenter(bottomCenter, { size: ctrlSize, angle: totalAngle });
59
+ const leftMiddleSize = createControllerElementSizeFromCenter(leftCenter, { size: ctrlSize, angle: totalAngle });
47
60
  const topLeftSize = createControllerElementSizeFromCenter(topLeftCenter, { size: ctrlSize, angle: totalAngle });
48
61
  const topRightSize = createControllerElementSizeFromCenter(topRightCenter, { size: ctrlSize, angle: totalAngle });
49
62
  const bottomLeftSize = createControllerElementSizeFromCenter(bottomLeftCenter, { size: ctrlSize, angle: totalAngle });
@@ -56,6 +69,13 @@ export function calcElementSizeController(elemSize, opts) {
56
69
  const rightVertexes = [topRightVertexes[3], topRightVertexes[2], bottomRightVertexes[1], bottomRightVertexes[0]];
57
70
  const bottomVertexes = [bottomLeftVertexes[1], bottomRightVertexes[0], bottomRightVertexes[3], bottomLeftVertexes[2]];
58
71
  const leftVertexes = [topLeftVertexes[3], topLeftVertexes[2], bottomLeftVertexes[1], bottomLeftVertexes[0]];
72
+ const topMiddleVertexes = calcElementVertexes(topMiddleSize);
73
+ const rightMiddleVertexes = calcElementVertexes(rightMiddleSize);
74
+ const bottomMiddleVertexes = calcElementVertexes(bottomMiddleSize);
75
+ const leftMiddleVertexes = calcElementVertexes(leftMiddleSize);
76
+ const rotateCenter = getCenterFromTwoPoints(rotateElemVertexes[0], rotateElemVertexes[1]);
77
+ const rotateSize = createControllerElementSizeFromCenter(rotateCenter, { size: ctrlSize, angle: totalAngle });
78
+ const rotateVertexes = calcElementVertexes(rotateSize);
59
79
  const sizeController = {
60
80
  elementWrapper: vertexes,
61
81
  left: {
@@ -97,6 +117,128 @@ export function calcElementSizeController(elemSize, opts) {
97
117
  type: 'bottom-right',
98
118
  vertexes: bottomRightVertexes,
99
119
  center: bottomRightCenter
120
+ },
121
+ leftMiddle: {
122
+ type: 'left-middle',
123
+ vertexes: leftMiddleVertexes,
124
+ center: leftCenter
125
+ },
126
+ rightMiddle: {
127
+ type: 'right-middle',
128
+ vertexes: rightMiddleVertexes,
129
+ center: rightCenter
130
+ },
131
+ topMiddle: {
132
+ type: 'top-middle',
133
+ vertexes: topMiddleVertexes,
134
+ center: topCenter
135
+ },
136
+ bottomMiddle: {
137
+ type: 'bottom-middle',
138
+ vertexes: bottomMiddleVertexes,
139
+ center: bottomCenter
140
+ },
141
+ rotate: {
142
+ type: 'rotate',
143
+ vertexes: rotateVertexes,
144
+ center: rotateCenter
145
+ }
146
+ };
147
+ return sizeController;
148
+ }
149
+ export function calcLayoutSizeController(layoutSize, opts) {
150
+ const { controllerSize, viewScaleInfo } = opts;
151
+ const ctrlSize = controllerSize && controllerSize > 0 ? controllerSize : 8;
152
+ const { x, y, w, h } = calcViewElementSize(layoutSize, { viewScaleInfo });
153
+ const center = calcElementCenter({ x, y, w, h });
154
+ const topCenter = { x: center.x, y };
155
+ const rightCenter = { x: x + w, y: center.y };
156
+ const bottomCenter = { x: center.x, y: y + h };
157
+ const leftCenter = { x, y: center.y };
158
+ const topLeftCenter = { x, y };
159
+ const topRightCenter = { x: x + w, y };
160
+ const bottomRightCenter = { x: x + w, y: y + h };
161
+ const bottomLeftCenter = { x, y: y + h };
162
+ const topMiddleSize = createControllerElementSizeFromCenter(topCenter, { size: ctrlSize, angle: 0 });
163
+ const rightMiddleSize = createControllerElementSizeFromCenter(rightCenter, { size: ctrlSize, angle: 0 });
164
+ const bottomMiddleSize = createControllerElementSizeFromCenter(bottomCenter, { size: ctrlSize, angle: 0 });
165
+ const leftMiddleSize = createControllerElementSizeFromCenter(leftCenter, { size: ctrlSize, angle: 0 });
166
+ const topLeftSize = createControllerElementSizeFromCenter(topLeftCenter, { size: ctrlSize, angle: 0 });
167
+ const topRightSize = createControllerElementSizeFromCenter(topRightCenter, { size: ctrlSize, angle: 0 });
168
+ const bottomLeftSize = createControllerElementSizeFromCenter(bottomLeftCenter, { size: ctrlSize, angle: 0 });
169
+ const bottomRightSize = createControllerElementSizeFromCenter(bottomRightCenter, { size: ctrlSize, angle: 0 });
170
+ const topLeftVertexes = calcElementVertexes(topLeftSize);
171
+ const topRightVertexes = calcElementVertexes(topRightSize);
172
+ const bottomLeftVertexes = calcElementVertexes(bottomLeftSize);
173
+ const bottomRightVertexes = calcElementVertexes(bottomRightSize);
174
+ const topVertexes = [topLeftVertexes[1], topRightVertexes[0], topRightVertexes[3], topLeftVertexes[2]];
175
+ const rightVertexes = [topRightVertexes[3], topRightVertexes[2], bottomRightVertexes[1], bottomRightVertexes[0]];
176
+ const bottomVertexes = [bottomLeftVertexes[1], bottomRightVertexes[0], bottomRightVertexes[3], bottomLeftVertexes[2]];
177
+ const leftVertexes = [topLeftVertexes[3], topLeftVertexes[2], bottomLeftVertexes[1], bottomLeftVertexes[0]];
178
+ const topMiddleVertexes = calcElementVertexes(topMiddleSize);
179
+ const rightMiddleVertexes = calcElementVertexes(rightMiddleSize);
180
+ const bottomMiddleVertexes = calcElementVertexes(bottomMiddleSize);
181
+ const leftMiddleVertexes = calcElementVertexes(leftMiddleSize);
182
+ const sizeController = {
183
+ left: {
184
+ type: 'left',
185
+ vertexes: leftVertexes,
186
+ center: leftCenter
187
+ },
188
+ right: {
189
+ type: 'right',
190
+ vertexes: rightVertexes,
191
+ center: rightCenter
192
+ },
193
+ top: {
194
+ type: 'top',
195
+ vertexes: topVertexes,
196
+ center: topCenter
197
+ },
198
+ bottom: {
199
+ type: 'bottom',
200
+ vertexes: bottomVertexes,
201
+ center: bottomCenter
202
+ },
203
+ topLeft: {
204
+ type: 'top-left',
205
+ vertexes: topLeftVertexes,
206
+ center: topLeftCenter
207
+ },
208
+ topRight: {
209
+ type: 'top-right',
210
+ vertexes: topRightVertexes,
211
+ center: topRightCenter
212
+ },
213
+ bottomLeft: {
214
+ type: 'bottom-left',
215
+ vertexes: bottomLeftVertexes,
216
+ center: bottomLeftCenter
217
+ },
218
+ bottomRight: {
219
+ type: 'bottom-right',
220
+ vertexes: bottomRightVertexes,
221
+ center: bottomRightCenter
222
+ },
223
+ leftMiddle: {
224
+ type: 'left-middle',
225
+ vertexes: leftMiddleVertexes,
226
+ center: leftCenter
227
+ },
228
+ rightMiddle: {
229
+ type: 'right-middle',
230
+ vertexes: rightMiddleVertexes,
231
+ center: rightCenter
232
+ },
233
+ topMiddle: {
234
+ type: 'top-middle',
235
+ vertexes: topMiddleVertexes,
236
+ center: topCenter
237
+ },
238
+ bottomMiddle: {
239
+ type: 'bottom-middle',
240
+ vertexes: bottomMiddleVertexes,
241
+ center: bottomCenter
100
242
  }
101
243
  };
102
244
  return sizeController;
@@ -1,5 +1,9 @@
1
- import type { Data } from '@idraw/types';
2
- export declare function deepClone<T extends any = any>(target: T): T;
1
+ import type { Data, Element, LoadItemMap } from '@idraw/types';
2
+ export declare function deepClone<T = any>(target: T): T;
3
+ export declare function deepCloneElement<T extends Element = Element>(element: T): T;
3
4
  export declare function sortDataAsserts(data: Data, opts?: {
4
5
  clone?: boolean;
5
6
  }): Data;
7
+ export declare function filterCompactData(data: Data, opts?: {
8
+ loadItemMap?: LoadItemMap;
9
+ }): Data<Record<string, any>>;
@@ -1,4 +1,4 @@
1
- import { createAssetId } from './uuid';
1
+ import { createAssetId, createUUID, isAssetId } from './uuid';
2
2
  export function deepClone(target) {
3
3
  function _clone(t) {
4
4
  const type = is(t);
@@ -27,6 +27,19 @@ export function deepClone(target) {
27
27
  }
28
28
  return _clone(target);
29
29
  }
30
+ export function deepCloneElement(element) {
31
+ const elem = deepClone(element);
32
+ const _resetUUID = (e) => {
33
+ e.uuid = createUUID();
34
+ if (e.type === 'group' && e.detail.children) {
35
+ e.detail.children.forEach((child) => {
36
+ _resetUUID(child);
37
+ });
38
+ }
39
+ };
40
+ _resetUUID(elem);
41
+ return elem;
42
+ }
30
43
  function is(target) {
31
44
  return Object.prototype.toString
32
45
  .call(target)
@@ -68,7 +81,7 @@ export function sortDataAsserts(data, opts) {
68
81
  const assetUUID = createAssetId(html);
69
82
  if (!assets[assetUUID]) {
70
83
  assets[assetUUID] = {
71
- type: 'svg',
84
+ type: 'html',
72
85
  value: html
73
86
  };
74
87
  }
@@ -90,3 +103,83 @@ export function sortDataAsserts(data, opts) {
90
103
  sortedData.assets = assets;
91
104
  return sortedData;
92
105
  }
106
+ export function filterCompactData(data, opts) {
107
+ const assets = data.assets || {};
108
+ const sortedData = deepClone(data);
109
+ const loadItemMap = (opts === null || opts === void 0 ? void 0 : opts.loadItemMap) || {};
110
+ const _scanElements = (elems) => {
111
+ elems.forEach((elem) => {
112
+ var _a, _b, _c;
113
+ if (elem.type === 'image' && elem.detail.src) {
114
+ const src = elem.detail.src;
115
+ if (isAssetId(src) && !assets[src] && loadItemMap[src] && typeof ((_a = loadItemMap[src]) === null || _a === void 0 ? void 0 : _a.source) === 'string') {
116
+ assets[src] = {
117
+ type: 'image',
118
+ value: loadItemMap[src].source
119
+ };
120
+ }
121
+ else if (!assets[src]) {
122
+ const assetUUID = createAssetId(src);
123
+ if (!assets[assetUUID]) {
124
+ assets[assetUUID] = {
125
+ type: 'image',
126
+ value: src
127
+ };
128
+ }
129
+ elem.detail.src = assetUUID;
130
+ }
131
+ }
132
+ else if (elem.type === 'svg') {
133
+ const svg = elem.detail.svg;
134
+ if (isAssetId(svg) && !assets[svg] && loadItemMap[svg] && typeof ((_b = loadItemMap[svg]) === null || _b === void 0 ? void 0 : _b.source) === 'string') {
135
+ assets[svg] = {
136
+ type: 'svg',
137
+ value: loadItemMap[svg].source
138
+ };
139
+ }
140
+ else if (!assets[svg]) {
141
+ const assetUUID = createAssetId(svg);
142
+ if (!assets[assetUUID]) {
143
+ assets[assetUUID] = {
144
+ type: 'svg',
145
+ value: svg
146
+ };
147
+ }
148
+ elem.detail.svg = assetUUID;
149
+ }
150
+ }
151
+ else if (elem.type === 'html') {
152
+ const html = elem.detail.html;
153
+ if (isAssetId(html) && !assets[html] && loadItemMap[html] && typeof ((_c = loadItemMap[html]) === null || _c === void 0 ? void 0 : _c.source) === 'string') {
154
+ assets[html] = {
155
+ type: 'html',
156
+ value: loadItemMap[html].source
157
+ };
158
+ }
159
+ else if (!assets[html]) {
160
+ const assetUUID = createAssetId(html);
161
+ if (!assets[assetUUID]) {
162
+ assets[assetUUID] = {
163
+ type: 'html',
164
+ value: html
165
+ };
166
+ }
167
+ elem.detail.html = assetUUID;
168
+ }
169
+ }
170
+ else if (elem.type === 'group' && Array.isArray(elem.detail.children)) {
171
+ const groupAssets = elem.detail.assets || {};
172
+ Object.keys(groupAssets).forEach((assetId) => {
173
+ if (!assets[assetId]) {
174
+ assets[assetId] = groupAssets[assetId];
175
+ }
176
+ });
177
+ delete elem.detail.assets;
178
+ _scanElements(elem.detail.children);
179
+ }
180
+ });
181
+ };
182
+ _scanElements(sortedData.elements);
183
+ sortedData.assets = assets;
184
+ return sortedData;
185
+ }