@idraw/core 0.4.0-beta.9 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/esm/board/index.d.ts +44 -0
  2. package/dist/esm/board/index.js +366 -0
  3. package/dist/esm/board/sharer.d.ts +21 -0
  4. package/dist/esm/board/sharer.js +101 -0
  5. package/dist/esm/board/viewer.d.ts +32 -0
  6. package/dist/esm/board/viewer.js +165 -0
  7. package/dist/esm/board/watcher.d.ts +15 -0
  8. package/dist/esm/board/watcher.js +218 -0
  9. package/dist/esm/config.d.ts +28 -0
  10. package/dist/esm/config.js +34 -0
  11. package/dist/esm/{lib → cursor}/cursor-image.d.ts +1 -0
  12. package/dist/esm/{lib → cursor}/cursor-image.js +1 -0
  13. package/dist/esm/cursor/cursor.d.ts +7 -0
  14. package/dist/esm/cursor/cursor.js +154 -0
  15. package/dist/esm/index.d.ts +39 -10
  16. package/dist/esm/index.js +296 -17
  17. package/dist/esm/middlewares/dragger/index.d.ts +7 -0
  18. package/dist/esm/{middleware → middlewares}/dragger/index.js +4 -3
  19. package/dist/esm/middlewares/info/config.d.ts +5 -0
  20. package/dist/esm/middlewares/info/config.js +9 -0
  21. package/dist/esm/middlewares/info/draw-info.d.ts +29 -0
  22. package/dist/esm/middlewares/info/draw-info.js +113 -0
  23. package/dist/esm/middlewares/info/index.d.ts +9 -0
  24. package/dist/esm/middlewares/info/index.js +131 -0
  25. package/dist/esm/middlewares/info/types.d.ts +3 -0
  26. package/dist/esm/middlewares/info/types.js +1 -0
  27. package/dist/esm/middlewares/layout-selector/config.d.ts +11 -0
  28. package/dist/esm/middlewares/layout-selector/config.js +12 -0
  29. package/dist/esm/middlewares/layout-selector/index.d.ts +5 -0
  30. package/dist/esm/middlewares/layout-selector/index.js +371 -0
  31. package/dist/esm/middlewares/layout-selector/types.d.ts +17 -0
  32. package/dist/esm/middlewares/layout-selector/types.js +2 -0
  33. package/dist/esm/middlewares/layout-selector/util.d.ts +9 -0
  34. package/dist/esm/middlewares/layout-selector/util.js +78 -0
  35. package/dist/esm/middlewares/pointer/index.d.ts +3 -0
  36. package/dist/esm/middlewares/pointer/index.js +42 -0
  37. package/dist/esm/middlewares/pointer/types.d.ts +3 -0
  38. package/dist/esm/middlewares/pointer/types.js +1 -0
  39. package/dist/esm/middlewares/ruler/config.d.ts +7 -0
  40. package/dist/esm/middlewares/ruler/config.js +21 -0
  41. package/dist/esm/middlewares/ruler/index.d.ts +3 -0
  42. package/dist/esm/middlewares/ruler/index.js +66 -0
  43. package/dist/esm/middlewares/ruler/types.d.ts +3 -0
  44. package/dist/esm/middlewares/ruler/types.js +1 -0
  45. package/dist/esm/{middleware → middlewares}/ruler/util.d.ts +20 -4
  46. package/dist/esm/{middleware → middlewares}/ruler/util.js +99 -26
  47. package/dist/esm/middlewares/scaler/index.d.ts +2 -0
  48. package/dist/esm/{middleware → middlewares}/scaler/index.js +2 -2
  49. package/dist/esm/{middleware → middlewares}/scroller/config.d.ts +4 -0
  50. package/dist/esm/middlewares/scroller/config.js +16 -0
  51. package/dist/esm/middlewares/scroller/index.d.ts +3 -0
  52. package/dist/esm/{middleware → middlewares}/scroller/index.js +47 -6
  53. package/dist/esm/middlewares/scroller/types.d.ts +11 -0
  54. package/dist/esm/middlewares/scroller/types.js +1 -0
  55. package/dist/esm/{middleware → middlewares}/scroller/util.d.ts +3 -2
  56. package/dist/esm/{middleware → middlewares}/scroller/util.js +33 -44
  57. package/dist/esm/{middleware → middlewares}/selector/config.d.ts +9 -1
  58. package/dist/esm/{middleware → middlewares}/selector/config.js +17 -1
  59. package/dist/esm/middlewares/selector/draw-auxiliary.d.ts +1 -0
  60. package/dist/esm/middlewares/selector/draw-auxiliary.js +12 -0
  61. package/dist/esm/middlewares/selector/draw-base.d.ts +30 -0
  62. package/dist/esm/middlewares/selector/draw-base.js +100 -0
  63. package/dist/esm/middlewares/selector/draw-debug.d.ts +5 -0
  64. package/dist/esm/middlewares/selector/draw-debug.js +30 -0
  65. package/dist/esm/middlewares/selector/draw-reference.d.ts +7 -0
  66. package/dist/esm/middlewares/selector/draw-reference.js +31 -0
  67. package/dist/esm/{middleware → middlewares}/selector/draw-wrapper.d.ts +16 -1
  68. package/dist/esm/middlewares/selector/draw-wrapper.js +139 -0
  69. package/dist/esm/middlewares/selector/index.d.ts +11 -0
  70. package/dist/esm/middlewares/selector/index.js +879 -0
  71. package/dist/esm/middlewares/selector/pattern/icon-rotate.d.ts +4 -0
  72. package/dist/esm/middlewares/selector/pattern/icon-rotate.js +88 -0
  73. package/dist/esm/middlewares/selector/pattern/index.d.ts +8 -0
  74. package/dist/esm/middlewares/selector/pattern/index.js +38 -0
  75. package/dist/esm/middlewares/selector/reference.d.ts +13 -0
  76. package/dist/esm/middlewares/selector/reference.js +267 -0
  77. package/dist/esm/{middleware → middlewares}/selector/types.d.ts +11 -5
  78. package/dist/esm/middlewares/selector/types.js +2 -0
  79. package/dist/esm/{middleware → middlewares}/selector/util.d.ts +14 -7
  80. package/dist/esm/{middleware → middlewares}/selector/util.js +46 -43
  81. package/dist/esm/middlewares/text-editor/index.d.ts +20 -0
  82. package/dist/esm/middlewares/text-editor/index.js +286 -0
  83. package/dist/esm/record.d.ts +5 -0
  84. package/dist/esm/record.js +38 -0
  85. package/dist/index.global.js +5740 -1632
  86. package/dist/index.global.min.js +1 -1
  87. package/package.json +5 -6
  88. package/dist/esm/lib/cursor.d.ts +0 -16
  89. package/dist/esm/lib/cursor.js +0 -129
  90. package/dist/esm/middleware/dragger/index.d.ts +0 -7
  91. package/dist/esm/middleware/ruler/index.d.ts +0 -3
  92. package/dist/esm/middleware/ruler/index.js +0 -48
  93. package/dist/esm/middleware/scaler/index.d.ts +0 -3
  94. package/dist/esm/middleware/scroller/config.js +0 -6
  95. package/dist/esm/middleware/scroller/index.d.ts +0 -2
  96. package/dist/esm/middleware/selector/draw-wrapper.js +0 -107
  97. package/dist/esm/middleware/selector/index.d.ts +0 -5
  98. package/dist/esm/middleware/selector/index.js +0 -510
  99. package/dist/esm/middleware/selector/types.js +0 -1
  100. package/dist/esm/middleware/text-editor/index.d.ts +0 -3
  101. package/dist/esm/middleware/text-editor/index.js +0 -147
@@ -1,4 +1,4 @@
1
- import { calcElementCenter, rotateElementVertexes, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcViewPointSize, rotatePointInGroup, rotatePoint, parseAngleToRadian, limitAngle } from '@idraw/util';
1
+ import { calcElementCenter, rotateElementVertexes, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcViewPointSize, calcViewElementSize, rotatePoint, parseAngleToRadian, parseRadianToAngle, limitAngle, calcRadian } from '@idraw/util';
2
2
  function parseRadian(angle) {
3
3
  return (angle * Math.PI) / 180;
4
4
  }
@@ -9,11 +9,11 @@ function changeMoveDistDirect(moveDist, moveDirect) {
9
9
  return moveDirect > 0 ? Math.abs(moveDist) : 0 - Math.abs(moveDist);
10
10
  }
11
11
  export function isPointInViewActiveVertexes(p, opts) {
12
- const { ctx, viewScaleInfo, viewSizeInfo, vertexes } = opts;
13
- const v0 = calcViewPointSize(vertexes[0], { viewScaleInfo, viewSizeInfo });
14
- const v1 = calcViewPointSize(vertexes[1], { viewScaleInfo, viewSizeInfo });
15
- const v2 = calcViewPointSize(vertexes[2], { viewScaleInfo, viewSizeInfo });
16
- const v3 = calcViewPointSize(vertexes[3], { viewScaleInfo, viewSizeInfo });
12
+ const { ctx, viewScaleInfo, vertexes } = opts;
13
+ const v0 = calcViewPointSize(vertexes[0], { viewScaleInfo });
14
+ const v1 = calcViewPointSize(vertexes[1], { viewScaleInfo });
15
+ const v2 = calcViewPointSize(vertexes[2], { viewScaleInfo });
16
+ const v3 = calcViewPointSize(vertexes[3], { viewScaleInfo });
17
17
  ctx.beginPath();
18
18
  ctx.moveTo(v0.x, v0.y);
19
19
  ctx.lineTo(v1.x, v1.y);
@@ -39,7 +39,7 @@ export function isPointInViewActiveGroup(p, opts) {
39
39
  return isPointInViewActiveVertexes(p, { ctx, vertexes, viewScaleInfo, viewSizeInfo });
40
40
  }
41
41
  export function getPointTarget(p, opts) {
42
- var _a, _b, _c;
42
+ var _a, _b, _c, _d, _e;
43
43
  const target = {
44
44
  type: null,
45
45
  elements: [],
@@ -49,8 +49,11 @@ export function getPointTarget(p, opts) {
49
49
  };
50
50
  const { ctx, data, calculator, selectedElements, viewScaleInfo, viewSizeInfo, areaSize, groupQueue, selectedElementController } = opts;
51
51
  if (selectedElementController) {
52
- const { left, right, top, bottom, topLeft, topRight, bottomLeft, bottomRight } = selectedElementController;
52
+ const { left, right, top, bottom, topLeft, topRight, bottomLeft, bottomRight, rotate } = selectedElementController;
53
53
  const ctrls = [left, right, top, bottom, topLeft, topRight, bottomLeft, bottomRight];
54
+ if ((selectedElements === null || selectedElements === void 0 ? void 0 : selectedElements.length) === 1 && ((_b = (_a = selectedElements === null || selectedElements === void 0 ? void 0 : selectedElements[0]) === null || _a === void 0 ? void 0 : _a.operations) === null || _b === void 0 ? void 0 : _b.rotatable) !== false) {
55
+ ctrls.push(rotate);
56
+ }
54
57
  for (let i = 0; i < ctrls.length; i++) {
55
58
  const ctrl = ctrls[i];
56
59
  if (isPointInViewActiveVertexes(p, { ctx, vertexes: ctrl.vertexes, viewSizeInfo, viewScaleInfo })) {
@@ -58,6 +61,7 @@ export function getPointTarget(p, opts) {
58
61
  if (selectedElements && (selectedElements === null || selectedElements === void 0 ? void 0 : selectedElements.length) > 0) {
59
62
  target.groupQueue = groupQueue || [];
60
63
  target.elements = [selectedElements[0]];
64
+ return target;
61
65
  }
62
66
  break;
63
67
  }
@@ -65,7 +69,7 @@ export function getPointTarget(p, opts) {
65
69
  }
66
70
  if (groupQueue && Array.isArray(groupQueue) && groupQueue.length > 0) {
67
71
  const lastGroup = groupQueue[groupQueue.length - 1];
68
- if (((_a = lastGroup === null || lastGroup === void 0 ? void 0 : lastGroup.detail) === null || _a === void 0 ? void 0 : _a.children) && Array.isArray((_b = lastGroup === null || lastGroup === void 0 ? void 0 : lastGroup.detail) === null || _b === void 0 ? void 0 : _b.children)) {
72
+ if (((_c = lastGroup === null || lastGroup === void 0 ? void 0 : lastGroup.detail) === null || _c === void 0 ? void 0 : _c.children) && Array.isArray((_d = lastGroup === null || lastGroup === void 0 ? void 0 : lastGroup.detail) === null || _d === void 0 ? void 0 : _d.children)) {
69
73
  for (let i = lastGroup.detail.children.length - 1; i >= 0; i--) {
70
74
  const child = lastGroup.detail.children[i];
71
75
  const vertexes = calcElementVertexesInGroup(child, { groupQueue });
@@ -94,7 +98,7 @@ export function getPointTarget(p, opts) {
94
98
  }
95
99
  if (data) {
96
100
  const { index, element } = calculator.getPointElement(p, { data, viewScaleInfo, viewSizeInfo });
97
- if (index >= 0 && element && ((_c = element === null || element === void 0 ? void 0 : element.operations) === null || _c === void 0 ? void 0 : _c.invisible) !== true) {
101
+ if (index >= 0 && element && ((_e = element === null || element === void 0 ? void 0 : element.operations) === null || _e === void 0 ? void 0 : _e.invisible) !== true) {
98
102
  target.elements = [element];
99
103
  target.type = 'over-element';
100
104
  return target;
@@ -410,7 +414,8 @@ export function resizeElement(elem, opts) {
410
414
  let centerY = elemCenter.y;
411
415
  if (angle < 90) {
412
416
  moveVerticalDist = 0 - changeMoveDistDirect(moveVerticalDist, moveVerticalY);
413
- moveHorizontalDist = 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
417
+ moveHorizontalDist =
418
+ 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
414
419
  const centerMoveVerticalDist = moveVerticalDist / 2;
415
420
  centerX = centerX + centerMoveVerticalDist * Math.sin(radian);
416
421
  centerY = centerY - centerMoveVerticalDist * Math.cos(radian);
@@ -545,7 +550,8 @@ export function resizeElement(elem, opts) {
545
550
  let centerY = elemCenter.y;
546
551
  if (angle < 90) {
547
552
  moveVerticalDist = changeMoveDistDirect(moveVerticalDist, moveVerticalY);
548
- moveHorizontalDist = 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
553
+ moveHorizontalDist =
554
+ 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
549
555
  const radian = parseRadian(angle);
550
556
  const centerMoveVerticalDist = moveVerticalDist / 2;
551
557
  centerX = centerX - centerMoveVerticalDist * Math.sin(radian);
@@ -671,11 +677,29 @@ export function resizeElement(elem, opts) {
671
677
  }
672
678
  return { x, y, w, h, angle: elem.angle };
673
679
  }
680
+ export function rotateElement(elem, opts) {
681
+ const { x, y, w, h, angle = 0 } = elem;
682
+ const { center, start, end, viewScaleInfo } = opts;
683
+ const elemCenter = calcViewPointSize(center, {
684
+ viewScaleInfo
685
+ });
686
+ const startAngle = limitAngle(angle);
687
+ const changedRadian = calcRadian(elemCenter, start, end);
688
+ const endAngle = limitAngle(startAngle + parseRadianToAngle(changedRadian));
689
+ return {
690
+ x,
691
+ y,
692
+ w,
693
+ h,
694
+ angle: endAngle
695
+ };
696
+ }
674
697
  export function getSelectedListArea(data, opts) {
698
+ var _a;
675
699
  const indexes = [];
676
700
  const uuids = [];
677
701
  const elements = [];
678
- const { calculator, viewScaleInfo, viewSizeInfo, start, end } = opts;
702
+ const { viewScaleInfo, start, end } = opts;
679
703
  if (!(Array.isArray(data.elements) && start && end)) {
680
704
  return { indexes, uuids, elements };
681
705
  }
@@ -683,8 +707,12 @@ export function getSelectedListArea(data, opts) {
683
707
  const endX = Math.max(start.x, end.x);
684
708
  const startY = Math.min(start.y, end.y);
685
709
  const endY = Math.max(start.y, end.y);
686
- data.elements.forEach((elem, idx) => {
687
- const elemSize = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
710
+ for (let idx = 0; idx < data.elements.length; idx++) {
711
+ const elem = data.elements[idx];
712
+ if (((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.locked) === true) {
713
+ continue;
714
+ }
715
+ const elemSize = calcViewElementSize(elem, { viewScaleInfo });
688
716
  const center = calcElementCenter(elemSize);
689
717
  if (center.x >= startX && center.x <= endX && center.y >= startY && center.y <= endY) {
690
718
  indexes.push(idx);
@@ -702,7 +730,7 @@ export function getSelectedListArea(data, opts) {
702
730
  }
703
731
  }
704
732
  }
705
- });
733
+ }
706
734
  return { indexes, uuids, elements };
707
735
  }
708
736
  export function calcSelectedElementsArea(elements, opts) {
@@ -711,14 +739,14 @@ export function calcSelectedElementsArea(elements, opts) {
711
739
  return null;
712
740
  }
713
741
  const area = { x: 0, y: 0, w: 0, h: 0 };
714
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
742
+ const { viewScaleInfo } = opts;
715
743
  let prevElemSize = null;
716
744
  for (let i = 0; i < elements.length; i++) {
717
745
  const elem = elements[i];
718
746
  if ((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.invisible) {
719
747
  continue;
720
748
  }
721
- const elemSize = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
749
+ const elemSize = calcViewElementSize(elem, { viewScaleInfo });
722
750
  if (elemSize.angle && (elemSize.angle > 0 || elemSize.angle < 0)) {
723
751
  const ves = rotateElementVertexes(elemSize);
724
752
  if (ves.length === 4) {
@@ -762,28 +790,3 @@ export function isElementInGroup(elem, group) {
762
790
  }
763
791
  return false;
764
792
  }
765
- export function calcMoveInGroup(start, end, groupQueue) {
766
- let moveX = end.x - start.x;
767
- let moveY = end.y - start.y;
768
- const pointGroupQueue = [];
769
- groupQueue.forEach((group) => {
770
- const { x, y, w, h, angle = 0 } = group;
771
- pointGroupQueue.push({
772
- x,
773
- y,
774
- w,
775
- h,
776
- angle: 0 - angle
777
- });
778
- });
779
- if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
780
- const startInGroup = rotatePointInGroup(start, pointGroupQueue);
781
- const endInGroup = rotatePointInGroup(end, pointGroupQueue);
782
- moveX = endInGroup.x - startInGroup.x;
783
- moveY = endInGroup.y - startInGroup.y;
784
- }
785
- return {
786
- moveX,
787
- moveY
788
- };
789
- }
@@ -0,0 +1,20 @@
1
+ import type { Middleware, CoreEventMap, Element, ViewScaleInfo, ElementPosition } from '@idraw/types';
2
+ import { coreEventKeys } from '../../config';
3
+ type TextEditEvent = {
4
+ element: Element<'text'>;
5
+ position: ElementPosition;
6
+ groupQueue: Element<'group'>[];
7
+ viewScaleInfo: ViewScaleInfo;
8
+ };
9
+ type TextChangeEvent = {
10
+ element: {
11
+ uuid: string;
12
+ detail: {
13
+ text: string;
14
+ };
15
+ };
16
+ position: ElementPosition;
17
+ };
18
+ type ExtendEventMap = Record<typeof coreEventKeys.TEXT_EDIT, TextEditEvent> & Record<typeof coreEventKeys.TEXT_CHANGE, TextChangeEvent>;
19
+ export declare const MiddlewareTextEditor: Middleware<ExtendEventMap, CoreEventMap & ExtendEventMap>;
20
+ export {};
@@ -0,0 +1,286 @@
1
+ import { limitAngle, getDefaultElementDetailConfig, enhanceFontFamliy, updateElementInList } from '@idraw/util';
2
+ import { coreEventKeys } from '../../config';
3
+ const defaultElementDetail = getDefaultElementDetailConfig();
4
+ export const MiddlewareTextEditor = (opts) => {
5
+ const { eventHub, boardContent, viewer, sharer, calculator } = opts;
6
+ const canvas = boardContent.boardContext.canvas;
7
+ const container = opts.container || document.body;
8
+ let textarea = document.createElement('div');
9
+ textarea.setAttribute('contenteditable', 'true');
10
+ let canvasWrapper = document.createElement('div');
11
+ let mask = document.createElement('div');
12
+ let activeElem = null;
13
+ let activePosition = [];
14
+ let originText = '';
15
+ const id = `idraw-middleware-text-editor-${Math.random().toString(26).substring(2)}`;
16
+ mask.setAttribute('id', id);
17
+ canvasWrapper.appendChild(textarea);
18
+ canvasWrapper.style.position = 'absolute';
19
+ mask.appendChild(canvasWrapper);
20
+ mask.style.position = 'fixed';
21
+ mask.style.top = '0';
22
+ mask.style.bottom = '0';
23
+ mask.style.left = '0';
24
+ mask.style.right = '0';
25
+ mask.style.display = 'none';
26
+ container.appendChild(mask);
27
+ const showTextArea = (e) => {
28
+ resetCanvasWrapper();
29
+ resetTextArea(e);
30
+ mask.style.display = 'block';
31
+ originText = '';
32
+ if (activeElem === null || activeElem === void 0 ? void 0 : activeElem.uuid) {
33
+ sharer.setActiveOverrideElemenentMap({
34
+ [activeElem.uuid]: {
35
+ operations: { invisible: true }
36
+ }
37
+ });
38
+ originText = activeElem.detail.text || '';
39
+ viewer.drawFrame();
40
+ }
41
+ };
42
+ const hideTextArea = () => {
43
+ if (activeElem === null || activeElem === void 0 ? void 0 : activeElem.uuid) {
44
+ const map = sharer.getActiveOverrideElemenentMap();
45
+ if (map) {
46
+ delete map[activeElem.uuid];
47
+ }
48
+ sharer.setActiveOverrideElemenentMap(map);
49
+ viewer.drawFrame();
50
+ }
51
+ mask.style.display = 'none';
52
+ activeElem = null;
53
+ activePosition = [];
54
+ };
55
+ const getCanvasRect = () => {
56
+ const clientRect = canvas.getBoundingClientRect();
57
+ const { left, top, width, height } = clientRect;
58
+ return { left, top, width, height };
59
+ };
60
+ const createBox = (opts) => {
61
+ const { size, parent } = opts;
62
+ const div = document.createElement('div');
63
+ const { x, y, w, h } = size;
64
+ const angle = limitAngle(size.angle || 0);
65
+ div.style.position = 'absolute';
66
+ div.style.left = `${x}px`;
67
+ div.style.top = `${y}px`;
68
+ div.style.width = `${w}px`;
69
+ div.style.height = `${h}px`;
70
+ div.style.transform = `rotate(${angle}deg)`;
71
+ parent.appendChild(div);
72
+ return div;
73
+ };
74
+ const resetTextArea = (e) => {
75
+ const { viewScaleInfo, element, groupQueue } = e;
76
+ const { scale, offsetTop, offsetLeft } = viewScaleInfo;
77
+ if (canvasWrapper.children) {
78
+ Array.from(canvasWrapper.children).forEach((child) => {
79
+ child.remove();
80
+ });
81
+ }
82
+ let parent = canvasWrapper;
83
+ for (let i = 0; i < groupQueue.length; i++) {
84
+ const group = groupQueue[i];
85
+ const { x, y, w, h } = group;
86
+ const angle = limitAngle(group.angle || 0);
87
+ const size = {
88
+ x: x * scale,
89
+ y: y * scale,
90
+ w: w * scale,
91
+ h: h * scale,
92
+ angle
93
+ };
94
+ if (i === 0) {
95
+ size.x += offsetLeft;
96
+ size.y += offsetTop;
97
+ }
98
+ parent = createBox({ size, parent });
99
+ }
100
+ const detail = Object.assign(Object.assign({}, defaultElementDetail), element.detail);
101
+ let elemX = element.x * scale + offsetLeft;
102
+ let elemY = element.y * scale + offsetTop;
103
+ let elemW = element.w * scale;
104
+ let elemH = element.h * scale;
105
+ if (groupQueue.length > 0) {
106
+ elemX = element.x * scale;
107
+ elemY = element.y * scale;
108
+ elemW = element.w * scale;
109
+ elemH = element.h * scale;
110
+ }
111
+ let justifyContent = 'center';
112
+ let alignItems = 'center';
113
+ if (detail.textAlign === 'left') {
114
+ justifyContent = 'start';
115
+ }
116
+ else if (detail.textAlign === 'right') {
117
+ justifyContent = 'end';
118
+ }
119
+ if (detail.verticalAlign === 'top') {
120
+ alignItems = 'start';
121
+ }
122
+ else if (detail.verticalAlign === 'bottom') {
123
+ alignItems = 'end';
124
+ }
125
+ textarea.style.display = 'inline-flex';
126
+ textarea.style.justifyContent = justifyContent;
127
+ textarea.style.alignItems = alignItems;
128
+ textarea.style.position = 'absolute';
129
+ textarea.style.left = `${elemX - 1}px`;
130
+ textarea.style.top = `${elemY - 1}px`;
131
+ textarea.style.width = `${elemW + 2}px`;
132
+ textarea.style.height = `${elemH + 2}px`;
133
+ textarea.style.transform = `rotate(${limitAngle(element.angle || 0)}deg)`;
134
+ textarea.style.boxSizing = 'border-box';
135
+ textarea.style.border = '1px solid #1973ba';
136
+ textarea.style.resize = 'none';
137
+ textarea.style.overflow = 'hidden';
138
+ textarea.style.wordBreak = 'break-all';
139
+ textarea.style.borderRadius = `${(typeof detail.borderRadius === 'number' ? detail.borderRadius : 0) * scale}px`;
140
+ textarea.style.background = `${detail.background || 'transparent'}`;
141
+ textarea.style.color = `${detail.color || '#333333'}`;
142
+ textarea.style.fontSize = `${detail.fontSize * scale}px`;
143
+ textarea.style.lineHeight = `${(detail.lineHeight || detail.fontSize) * scale}px`;
144
+ textarea.style.fontFamily = enhanceFontFamliy(detail.fontFamily);
145
+ textarea.style.fontWeight = `${detail.fontWeight}`;
146
+ textarea.style.padding = '0';
147
+ textarea.style.margin = '0';
148
+ textarea.style.outline = 'none';
149
+ textarea.innerText = detail.text || '';
150
+ parent.appendChild(textarea);
151
+ };
152
+ const resetCanvasWrapper = () => {
153
+ const { left, top, width, height } = getCanvasRect();
154
+ canvasWrapper.style.position = 'absolute';
155
+ canvasWrapper.style.overflow = 'hidden';
156
+ canvasWrapper.style.top = `${top}px`;
157
+ canvasWrapper.style.left = `${left}px`;
158
+ canvasWrapper.style.width = `${width}px`;
159
+ canvasWrapper.style.height = `${height}px`;
160
+ };
161
+ const maskClickEvent = () => {
162
+ hideTextArea();
163
+ };
164
+ const textareaClickEvent = (e) => {
165
+ e.stopPropagation();
166
+ };
167
+ const textareaInputEvent = () => {
168
+ if (activeElem && activePosition) {
169
+ activeElem.detail.text = textarea.innerText || '';
170
+ eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
171
+ element: {
172
+ uuid: activeElem.uuid,
173
+ detail: {
174
+ text: activeElem.detail.text
175
+ }
176
+ },
177
+ position: [...(activePosition || [])]
178
+ });
179
+ calculator.modifyText(activeElem);
180
+ viewer.drawFrame();
181
+ }
182
+ };
183
+ const textareaBlurEvent = () => {
184
+ if (activeElem && activePosition) {
185
+ activeElem.detail.text = textarea.innerText || '';
186
+ eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
187
+ element: {
188
+ uuid: activeElem.uuid,
189
+ detail: {
190
+ text: activeElem.detail.text
191
+ }
192
+ },
193
+ position: [...activePosition]
194
+ });
195
+ const data = sharer.getActiveStorage('data') || { elements: [] };
196
+ const updateContent = {
197
+ detail: {
198
+ text: activeElem.detail.text
199
+ }
200
+ };
201
+ updateElementInList(activeElem.uuid, updateContent, data.elements);
202
+ eventHub.trigger(coreEventKeys.CHANGE, {
203
+ selectedElements: [
204
+ Object.assign(Object.assign({}, activeElem), { detail: Object.assign(Object.assign({}, activeElem.detail), updateContent.detail) })
205
+ ],
206
+ data,
207
+ type: 'modifyElement',
208
+ modifyRecord: {
209
+ type: 'modifyElement',
210
+ time: Date.now(),
211
+ content: {
212
+ method: 'modifyElement',
213
+ uuid: activeElem.uuid,
214
+ before: {
215
+ 'detail.text': originText
216
+ },
217
+ after: {
218
+ 'detail.text': activeElem.detail.text
219
+ }
220
+ }
221
+ }
222
+ });
223
+ calculator.modifyText(activeElem);
224
+ viewer.drawFrame();
225
+ }
226
+ hideTextArea();
227
+ };
228
+ const textareaKeyDownEvent = (e) => {
229
+ e.stopPropagation();
230
+ };
231
+ const textareaKeyPressEvent = (e) => {
232
+ e.stopPropagation();
233
+ };
234
+ const textareaKeyUpEvent = (e) => {
235
+ e.stopPropagation();
236
+ };
237
+ const textareaWheelEvent = (e) => {
238
+ e.stopPropagation();
239
+ e.preventDefault();
240
+ };
241
+ mask.addEventListener('click', maskClickEvent);
242
+ textarea.addEventListener('click', textareaClickEvent);
243
+ textarea.addEventListener('input', textareaInputEvent);
244
+ textarea.addEventListener('blur', textareaBlurEvent);
245
+ textarea.addEventListener('keydown', textareaKeyDownEvent);
246
+ textarea.addEventListener('keypress', textareaKeyPressEvent);
247
+ textarea.addEventListener('keyup', textareaKeyUpEvent);
248
+ textarea.addEventListener('wheel', textareaWheelEvent);
249
+ const textEditCallback = (e) => {
250
+ var _a;
251
+ if ((e === null || e === void 0 ? void 0 : e.position) && (e === null || e === void 0 ? void 0 : e.element) && ((_a = e === null || e === void 0 ? void 0 : e.element) === null || _a === void 0 ? void 0 : _a.type) === 'text') {
252
+ activeElem = e.element;
253
+ activePosition = e.position;
254
+ }
255
+ showTextArea(e);
256
+ };
257
+ return {
258
+ name: '@middleware/text-editor',
259
+ use() {
260
+ eventHub.on(coreEventKeys.TEXT_EDIT, textEditCallback);
261
+ },
262
+ disuse() {
263
+ eventHub.off(coreEventKeys.TEXT_EDIT, textEditCallback);
264
+ mask.removeEventListener('click', maskClickEvent);
265
+ textarea.removeEventListener('click', textareaClickEvent);
266
+ textarea.removeEventListener('input', textareaInputEvent);
267
+ textarea.removeEventListener('blur', textareaBlurEvent);
268
+ textarea.removeEventListener('keydown', textareaKeyDownEvent);
269
+ textarea.removeEventListener('keypress', textareaKeyPressEvent);
270
+ textarea.removeEventListener('keyup', textareaKeyUpEvent);
271
+ textarea.removeEventListener('wheel', textareaWheelEvent);
272
+ canvasWrapper.removeChild(textarea);
273
+ mask.removeChild(canvasWrapper);
274
+ container.removeChild(mask);
275
+ textarea.remove();
276
+ canvasWrapper.remove();
277
+ mask = null;
278
+ textarea = null;
279
+ canvasWrapper = null;
280
+ mask = null;
281
+ activeElem = null;
282
+ activePosition = null;
283
+ originText = null;
284
+ }
285
+ };
286
+ };
@@ -0,0 +1,5 @@
1
+ import type { RecursivePartial, Element, ModifyRecord } from '@idraw/types';
2
+ export declare function getModifyElementRecord(opts: {
3
+ modifiedElement: RecursivePartial<Omit<Element, 'uuid'>> & Pick<Element, 'uuid'>;
4
+ beforeElement: Element;
5
+ }): ModifyRecord<'modifyElement'>;
@@ -0,0 +1,38 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { toFlattenElement, get } from '@idraw/util';
13
+ export function getModifyElementRecord(opts) {
14
+ const { modifiedElement, beforeElement } = opts;
15
+ const { uuid } = modifiedElement, restElement = __rest(modifiedElement, ["uuid"]);
16
+ const after = toFlattenElement(restElement);
17
+ let before = {};
18
+ Object.keys(after).forEach((key) => {
19
+ let val = get(beforeElement, key);
20
+ if (val === undefined && /(borderRadius|borderWidth)\[[0-9]{1,}\]$/.test(key)) {
21
+ key = key.replace(/\[[0-9]{1,}\]$/, '');
22
+ val = get(beforeElement, key);
23
+ }
24
+ before[key] = val;
25
+ });
26
+ before = toFlattenElement(before);
27
+ const record = {
28
+ type: 'modifyElement',
29
+ time: Date.now(),
30
+ content: {
31
+ method: 'modifyElement',
32
+ uuid,
33
+ before,
34
+ after
35
+ }
36
+ };
37
+ return record;
38
+ }