@idraw/core 0.4.0-beta.4 → 0.4.0-beta.40

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 (85) hide show
  1. package/dist/esm/board/index.d.ts +46 -0
  2. package/dist/esm/board/index.js +371 -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/index.d.ts +23 -9
  12. package/dist/esm/index.js +36 -12
  13. package/dist/esm/lib/cursor-image.d.ts +1 -0
  14. package/dist/esm/lib/cursor-image.js +1 -0
  15. package/dist/esm/lib/cursor.d.ts +3 -12
  16. package/dist/esm/lib/cursor.js +137 -112
  17. package/dist/esm/middleware/dragger/index.d.ts +2 -2
  18. package/dist/esm/middleware/dragger/index.js +5 -3
  19. package/dist/esm/middleware/info/config.d.ts +5 -0
  20. package/dist/esm/middleware/info/config.js +9 -0
  21. package/dist/esm/middleware/info/draw-info.d.ts +29 -0
  22. package/dist/esm/middleware/info/draw-info.js +113 -0
  23. package/dist/esm/middleware/info/index.d.ts +9 -0
  24. package/dist/esm/middleware/info/index.js +131 -0
  25. package/dist/esm/middleware/info/types.d.ts +3 -0
  26. package/dist/esm/middleware/info/types.js +1 -0
  27. package/dist/esm/middleware/layout-selector/config.d.ts +11 -0
  28. package/dist/esm/middleware/layout-selector/config.js +12 -0
  29. package/dist/esm/middleware/layout-selector/index.d.ts +5 -0
  30. package/dist/esm/middleware/layout-selector/index.js +349 -0
  31. package/dist/esm/middleware/layout-selector/types.d.ts +17 -0
  32. package/dist/esm/middleware/layout-selector/types.js +2 -0
  33. package/dist/esm/middleware/layout-selector/util.d.ts +9 -0
  34. package/dist/esm/middleware/layout-selector/util.js +63 -0
  35. package/dist/esm/middleware/pointer/index.d.ts +3 -0
  36. package/dist/esm/middleware/pointer/index.js +43 -0
  37. package/dist/esm/middleware/pointer/types.d.ts +3 -0
  38. package/dist/esm/middleware/pointer/types.js +1 -0
  39. package/dist/esm/middleware/ruler/config.d.ts +7 -0
  40. package/dist/esm/middleware/ruler/config.js +21 -0
  41. package/dist/esm/middleware/ruler/index.d.ts +3 -3
  42. package/dist/esm/middleware/ruler/index.js +33 -14
  43. package/dist/esm/middleware/ruler/types.d.ts +3 -0
  44. package/dist/esm/middleware/ruler/types.js +1 -0
  45. package/dist/esm/middleware/ruler/util.d.ts +20 -4
  46. package/dist/esm/middleware/ruler/util.js +97 -25
  47. package/dist/esm/middleware/scaler/index.d.ts +2 -3
  48. package/dist/esm/middleware/scaler/index.js +3 -2
  49. package/dist/esm/middleware/scroller/config.d.ts +4 -0
  50. package/dist/esm/middleware/scroller/config.js +10 -0
  51. package/dist/esm/middleware/scroller/index.d.ts +3 -2
  52. package/dist/esm/middleware/scroller/index.js +48 -6
  53. package/dist/esm/middleware/scroller/types.d.ts +11 -0
  54. package/dist/esm/middleware/scroller/types.js +1 -0
  55. package/dist/esm/middleware/scroller/util.d.ts +3 -2
  56. package/dist/esm/middleware/scroller/util.js +32 -43
  57. package/dist/esm/middleware/selector/config.d.ts +9 -1
  58. package/dist/esm/middleware/selector/config.js +17 -1
  59. package/dist/esm/middleware/selector/draw-auxiliary.d.ts +1 -0
  60. package/dist/esm/middleware/selector/draw-auxiliary.js +12 -0
  61. package/dist/esm/middleware/selector/draw-base.d.ts +30 -0
  62. package/dist/esm/middleware/selector/draw-base.js +100 -0
  63. package/dist/esm/middleware/selector/draw-debug.d.ts +5 -0
  64. package/dist/esm/middleware/selector/draw-debug.js +30 -0
  65. package/dist/esm/middleware/selector/draw-reference.d.ts +7 -0
  66. package/dist/esm/middleware/selector/draw-reference.js +31 -0
  67. package/dist/esm/middleware/selector/draw-wrapper.d.ts +16 -1
  68. package/dist/esm/middleware/selector/draw-wrapper.js +57 -35
  69. package/dist/esm/middleware/selector/index.d.ts +11 -4
  70. package/dist/esm/middleware/selector/index.js +420 -70
  71. package/dist/esm/middleware/selector/pattern/icon-rotate.d.ts +4 -0
  72. package/dist/esm/middleware/selector/pattern/icon-rotate.js +88 -0
  73. package/dist/esm/middleware/selector/pattern/index.d.ts +8 -0
  74. package/dist/esm/middleware/selector/pattern/index.js +38 -0
  75. package/dist/esm/middleware/selector/reference.d.ts +13 -0
  76. package/dist/esm/middleware/selector/reference.js +267 -0
  77. package/dist/esm/middleware/selector/types.d.ts +10 -4
  78. package/dist/esm/middleware/selector/types.js +2 -1
  79. package/dist/esm/middleware/selector/util.d.ts +14 -7
  80. package/dist/esm/middleware/selector/util.js +45 -43
  81. package/dist/esm/middleware/text-editor/index.d.ts +20 -3
  82. package/dist/esm/middleware/text-editor/index.js +96 -19
  83. package/dist/index.global.js +4765 -1466
  84. package/dist/index.global.min.js +1 -1
  85. package/package.json +5 -6
@@ -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 })) {
@@ -65,7 +68,7 @@ export function getPointTarget(p, opts) {
65
68
  }
66
69
  if (groupQueue && Array.isArray(groupQueue) && groupQueue.length > 0) {
67
70
  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)) {
71
+ 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
72
  for (let i = lastGroup.detail.children.length - 1; i >= 0; i--) {
70
73
  const child = lastGroup.detail.children[i];
71
74
  const vertexes = calcElementVertexesInGroup(child, { groupQueue });
@@ -94,7 +97,7 @@ export function getPointTarget(p, opts) {
94
97
  }
95
98
  if (data) {
96
99
  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) {
100
+ if (index >= 0 && element && ((_e = element === null || element === void 0 ? void 0 : element.operations) === null || _e === void 0 ? void 0 : _e.invisible) !== true) {
98
101
  target.elements = [element];
99
102
  target.type = 'over-element';
100
103
  return target;
@@ -410,7 +413,8 @@ export function resizeElement(elem, opts) {
410
413
  let centerY = elemCenter.y;
411
414
  if (angle < 90) {
412
415
  moveVerticalDist = 0 - changeMoveDistDirect(moveVerticalDist, moveVerticalY);
413
- moveHorizontalDist = 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
416
+ moveHorizontalDist =
417
+ 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
414
418
  const centerMoveVerticalDist = moveVerticalDist / 2;
415
419
  centerX = centerX + centerMoveVerticalDist * Math.sin(radian);
416
420
  centerY = centerY - centerMoveVerticalDist * Math.cos(radian);
@@ -545,7 +549,8 @@ export function resizeElement(elem, opts) {
545
549
  let centerY = elemCenter.y;
546
550
  if (angle < 90) {
547
551
  moveVerticalDist = changeMoveDistDirect(moveVerticalDist, moveVerticalY);
548
- moveHorizontalDist = 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
552
+ moveHorizontalDist =
553
+ 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
549
554
  const radian = parseRadian(angle);
550
555
  const centerMoveVerticalDist = moveVerticalDist / 2;
551
556
  centerX = centerX - centerMoveVerticalDist * Math.sin(radian);
@@ -671,11 +676,29 @@ export function resizeElement(elem, opts) {
671
676
  }
672
677
  return { x, y, w, h, angle: elem.angle };
673
678
  }
679
+ export function rotateElement(elem, opts) {
680
+ const { x, y, w, h, angle = 0 } = elem;
681
+ const { center, start, end, viewScaleInfo } = opts;
682
+ const elemCenter = calcViewPointSize(center, {
683
+ viewScaleInfo
684
+ });
685
+ const startAngle = limitAngle(angle);
686
+ const changedRadian = calcRadian(elemCenter, start, end);
687
+ const endAngle = limitAngle(startAngle + parseRadianToAngle(changedRadian));
688
+ return {
689
+ x,
690
+ y,
691
+ w,
692
+ h,
693
+ angle: endAngle
694
+ };
695
+ }
674
696
  export function getSelectedListArea(data, opts) {
697
+ var _a;
675
698
  const indexes = [];
676
699
  const uuids = [];
677
700
  const elements = [];
678
- const { calculator, viewScaleInfo, viewSizeInfo, start, end } = opts;
701
+ const { viewScaleInfo, start, end } = opts;
679
702
  if (!(Array.isArray(data.elements) && start && end)) {
680
703
  return { indexes, uuids, elements };
681
704
  }
@@ -683,8 +706,12 @@ export function getSelectedListArea(data, opts) {
683
706
  const endX = Math.max(start.x, end.x);
684
707
  const startY = Math.min(start.y, end.y);
685
708
  const endY = Math.max(start.y, end.y);
686
- data.elements.forEach((elem, idx) => {
687
- const elemSize = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
709
+ for (let idx = 0; idx < data.elements.length; idx++) {
710
+ const elem = data.elements[idx];
711
+ if (((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.locked) === true) {
712
+ continue;
713
+ }
714
+ const elemSize = calcViewElementSize(elem, { viewScaleInfo });
688
715
  const center = calcElementCenter(elemSize);
689
716
  if (center.x >= startX && center.x <= endX && center.y >= startY && center.y <= endY) {
690
717
  indexes.push(idx);
@@ -702,7 +729,7 @@ export function getSelectedListArea(data, opts) {
702
729
  }
703
730
  }
704
731
  }
705
- });
732
+ }
706
733
  return { indexes, uuids, elements };
707
734
  }
708
735
  export function calcSelectedElementsArea(elements, opts) {
@@ -711,14 +738,14 @@ export function calcSelectedElementsArea(elements, opts) {
711
738
  return null;
712
739
  }
713
740
  const area = { x: 0, y: 0, w: 0, h: 0 };
714
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
741
+ const { viewScaleInfo } = opts;
715
742
  let prevElemSize = null;
716
743
  for (let i = 0; i < elements.length; i++) {
717
744
  const elem = elements[i];
718
745
  if ((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.invisible) {
719
746
  continue;
720
747
  }
721
- const elemSize = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
748
+ const elemSize = calcViewElementSize(elem, { viewScaleInfo });
722
749
  if (elemSize.angle && (elemSize.angle > 0 || elemSize.angle < 0)) {
723
750
  const ves = rotateElementVertexes(elemSize);
724
751
  if (ves.length === 4) {
@@ -762,28 +789,3 @@ export function isElementInGroup(elem, group) {
762
789
  }
763
790
  return false;
764
791
  }
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
- }
@@ -1,3 +1,20 @@
1
- import type { BoardMiddleware, CoreEvent } from '@idraw/types';
2
- export declare const middlewareEventTextEdit = "@middleware/text-edit";
3
- export declare const MiddlewareTextEditor: BoardMiddleware<Record<string, any>, CoreEvent>;
1
+ import type { BoardMiddleware, 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: BoardMiddleware<ExtendEventMap, CoreEventMap & ExtendEventMap>;
20
+ export {};
@@ -1,14 +1,18 @@
1
- import { limitAngle, getDefaultElementDetailConfig } from '@idraw/util';
2
- export const middlewareEventTextEdit = '@middleware/text-edit';
1
+ import { limitAngle, getDefaultElementDetailConfig, enhanceFontFamliy } from '@idraw/util';
2
+ import { coreEventKeys } from '../../config';
3
3
  const defaultElementDetail = getDefaultElementDetailConfig();
4
4
  export const MiddlewareTextEditor = (opts) => {
5
- const { eventHub, boardContent, viewer } = opts;
5
+ const { eventHub, boardContent, viewer, sharer } = opts;
6
6
  const canvas = boardContent.boardContext.canvas;
7
- const textarea = document.createElement('textarea');
7
+ const textarea = document.createElement('div');
8
+ textarea.setAttribute('contenteditable', 'true');
8
9
  const canvasWrapper = document.createElement('div');
9
10
  const container = opts.container || document.body;
10
11
  const mask = document.createElement('div');
11
12
  let activeElem = null;
13
+ let activePosition = [];
14
+ const id = `idraw-middleware-text-editor-${Math.random().toString(26).substring(2)}`;
15
+ mask.setAttribute('id', id);
12
16
  canvasWrapper.appendChild(textarea);
13
17
  canvasWrapper.style.position = 'absolute';
14
18
  mask.appendChild(canvasWrapper);
@@ -23,10 +27,27 @@ export const MiddlewareTextEditor = (opts) => {
23
27
  resetCanvasWrapper();
24
28
  resetTextArea(e);
25
29
  mask.style.display = 'block';
30
+ if (activeElem === null || activeElem === void 0 ? void 0 : activeElem.uuid) {
31
+ sharer.setActiveOverrideElemenentMap({
32
+ [activeElem.uuid]: {
33
+ operations: { invisible: true }
34
+ }
35
+ });
36
+ viewer.drawFrame();
37
+ }
26
38
  };
27
39
  const hideTextArea = () => {
40
+ if (activeElem === null || activeElem === void 0 ? void 0 : activeElem.uuid) {
41
+ const map = sharer.getActiveOverrideElemenentMap();
42
+ if (map) {
43
+ delete map[activeElem.uuid];
44
+ }
45
+ sharer.setActiveOverrideElemenentMap(map);
46
+ viewer.drawFrame();
47
+ }
28
48
  mask.style.display = 'none';
29
49
  activeElem = null;
50
+ activePosition = [];
30
51
  };
31
52
  const getCanvasRect = () => {
32
53
  const clientRect = canvas.getBoundingClientRect();
@@ -84,24 +105,45 @@ export const MiddlewareTextEditor = (opts) => {
84
105
  elemW = element.w * scale;
85
106
  elemH = element.h * scale;
86
107
  }
108
+ let justifyContent = 'center';
109
+ let alignItems = 'center';
110
+ if (detail.textAlign === 'left') {
111
+ justifyContent = 'start';
112
+ }
113
+ else if (detail.textAlign === 'right') {
114
+ justifyContent = 'end';
115
+ }
116
+ if (detail.verticalAlign === 'top') {
117
+ alignItems = 'start';
118
+ }
119
+ else if (detail.verticalAlign === 'bottom') {
120
+ alignItems = 'end';
121
+ }
122
+ textarea.style.display = 'inline-flex';
123
+ textarea.style.justifyContent = justifyContent;
124
+ textarea.style.alignItems = alignItems;
87
125
  textarea.style.position = 'absolute';
88
- textarea.style.left = `${elemX}px`;
89
- textarea.style.top = `${elemY}px`;
90
- textarea.style.width = `${elemW}px`;
91
- textarea.style.height = `${elemH}px`;
126
+ textarea.style.left = `${elemX - 1}px`;
127
+ textarea.style.top = `${elemY - 1}px`;
128
+ textarea.style.width = `${elemW + 2}px`;
129
+ textarea.style.height = `${elemH + 2}px`;
92
130
  textarea.style.transform = `rotate(${limitAngle(element.angle || 0)}deg)`;
93
131
  textarea.style.boxSizing = 'border-box';
94
132
  textarea.style.border = '1px solid #1973ba';
95
133
  textarea.style.resize = 'none';
96
134
  textarea.style.overflow = 'hidden';
97
135
  textarea.style.wordBreak = 'break-all';
98
- textarea.style.background = '#FFFFFF';
99
- textarea.style.color = '#333333';
136
+ textarea.style.borderRadius = `${(typeof detail.borderRadius === 'number' ? detail.borderRadius : 0) * scale}px`;
137
+ textarea.style.background = `${detail.background || 'transparent'}`;
138
+ textarea.style.color = `${detail.color || '#333333'}`;
100
139
  textarea.style.fontSize = `${detail.fontSize * scale}px`;
101
- textarea.style.lineHeight = `${detail.lineHeight * scale}px`;
102
- textarea.style.fontFamily = detail.fontFamily;
140
+ textarea.style.lineHeight = `${(detail.lineHeight || detail.fontSize) * scale}px`;
141
+ textarea.style.fontFamily = enhanceFontFamliy(detail.fontFamily);
103
142
  textarea.style.fontWeight = `${detail.fontWeight}`;
104
- textarea.value = detail.text || '';
143
+ textarea.style.padding = '0';
144
+ textarea.style.margin = '0';
145
+ textarea.style.outline = 'none';
146
+ textarea.innerText = detail.text || '';
105
147
  parent.appendChild(textarea);
106
148
  };
107
149
  const resetCanvasWrapper = () => {
@@ -119,28 +161,63 @@ export const MiddlewareTextEditor = (opts) => {
119
161
  textarea.addEventListener('click', (e) => {
120
162
  e.stopPropagation();
121
163
  });
122
- textarea.addEventListener('input', (e) => {
123
- if (activeElem) {
124
- activeElem.detail.text = e.target.value || '';
164
+ textarea.addEventListener('input', () => {
165
+ if (activeElem && activePosition) {
166
+ activeElem.detail.text = textarea.innerText || '';
167
+ eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
168
+ element: {
169
+ uuid: activeElem.uuid,
170
+ detail: {
171
+ text: activeElem.detail.text
172
+ }
173
+ },
174
+ position: [...(activePosition || [])]
175
+ });
125
176
  viewer.drawFrame();
126
177
  }
127
178
  });
128
179
  textarea.addEventListener('blur', () => {
180
+ if (activeElem && activePosition) {
181
+ eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
182
+ element: {
183
+ uuid: activeElem.uuid,
184
+ detail: {
185
+ text: activeElem.detail.text
186
+ }
187
+ },
188
+ position: [...activePosition]
189
+ });
190
+ }
129
191
  hideTextArea();
130
192
  });
193
+ textarea.addEventListener('keydown', (e) => {
194
+ e.stopPropagation();
195
+ });
196
+ textarea.addEventListener('keypress', (e) => {
197
+ e.stopPropagation();
198
+ });
199
+ textarea.addEventListener('keyup', (e) => {
200
+ e.stopPropagation();
201
+ });
202
+ textarea.addEventListener('wheel', (e) => {
203
+ e.stopPropagation();
204
+ e.preventDefault();
205
+ });
131
206
  const textEditCallback = (e) => {
132
207
  var _a;
133
- if ((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') {
208
+ 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') {
134
209
  activeElem = e.element;
210
+ activePosition = e.position;
135
211
  }
136
212
  showTextArea(e);
137
213
  };
138
214
  return {
215
+ name: '@middleware/text-editor',
139
216
  use() {
140
- eventHub.on(middlewareEventTextEdit, textEditCallback);
217
+ eventHub.on(coreEventKeys.TEXT_EDIT, textEditCallback);
141
218
  },
142
219
  disuse() {
143
- eventHub.off(middlewareEventTextEdit, textEditCallback);
220
+ eventHub.off(coreEventKeys.TEXT_EDIT, textEditCallback);
144
221
  }
145
222
  };
146
223
  };