@idraw/core 0.4.0-alpha.4 → 0.4.0-alpha.6

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.
@@ -1,13 +1,11 @@
1
- import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEvent } from '@idraw/types';
1
+ import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEvent, ViewScaleInfo } from '@idraw/types';
2
2
  export { MiddlewareSelector, middlewareEventSelect } from './middleware/selector';
3
3
  export { MiddlewareScroller } from './middleware/scroller';
4
4
  export { MiddlewareScaler, middlewareEventScale } from './middleware/scaler';
5
5
  export { MiddlewareRuler, middlewareEventRuler } from './middleware/ruler';
6
+ export { MiddlewareTextEditor, middlewareEventTextEdit } from './middleware/text-editor';
6
7
  export declare class Core {
7
- private _board;
8
- private _opts;
9
- private _container;
10
- private _canvas;
8
+ #private;
11
9
  constructor(container: HTMLDivElement, opts: CoreOptions);
12
10
  use(middleware: BoardMiddleware<any, any>): void;
13
11
  setData(data: Data): void;
@@ -21,4 +19,14 @@ export declare class Core {
21
19
  on<T extends keyof CoreEvent>(name: T, callback: (e: CoreEvent[T]) => void): void;
22
20
  off<T extends keyof CoreEvent>(name: T, callback: (e: CoreEvent[T]) => void): void;
23
21
  trigger<T extends keyof CoreEvent>(name: T, e: CoreEvent[T]): void;
22
+ getViewInfo(): {
23
+ viewSizeInfo: ViewSizeInfo;
24
+ viewScaleInfo: ViewScaleInfo;
25
+ };
26
+ refresh(): void;
27
+ updateViewScale(opts: {
28
+ scale: number;
29
+ offsetX: number;
30
+ offsetY: number;
31
+ }): void;
24
32
  }
package/dist/esm/index.js CHANGED
@@ -1,3 +1,15 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _Core_instances, _Core_board, _Core_container, _Core_initContainer;
1
13
  import { Board } from '@idraw/board';
2
14
  import { createBoardContexts, validateElements } from '@idraw/util';
3
15
  import { Cursor } from './lib/cursor';
@@ -5,17 +17,20 @@ export { MiddlewareSelector, middlewareEventSelect } from './middleware/selector
5
17
  export { MiddlewareScroller } from './middleware/scroller';
6
18
  export { MiddlewareScaler, middlewareEventScale } from './middleware/scaler';
7
19
  export { MiddlewareRuler, middlewareEventRuler } from './middleware/ruler';
20
+ export { MiddlewareTextEditor, middlewareEventTextEdit } from './middleware/text-editor';
8
21
  export class Core {
9
22
  constructor(container, opts) {
23
+ _Core_instances.add(this);
24
+ _Core_board.set(this, void 0);
25
+ _Core_container.set(this, void 0);
10
26
  const { devicePixelRatio = 1, width, height } = opts;
11
- this._opts = opts;
12
- this._container = container;
27
+ __classPrivateFieldSet(this, _Core_container, container, "f");
13
28
  const canvas = document.createElement('canvas');
14
- this._canvas = canvas;
29
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_initContainer).call(this);
15
30
  container.appendChild(canvas);
16
31
  const ctx = canvas.getContext('2d');
17
32
  const viewContent = createBoardContexts(ctx, { devicePixelRatio });
18
- const board = new Board({ viewContent });
33
+ const board = new Board({ viewContent, container });
19
34
  const sharer = board.getSharer();
20
35
  sharer.setActiveViewSizeInfo({
21
36
  width,
@@ -24,7 +39,7 @@ export class Core {
24
39
  contextWidth: width,
25
40
  contextHeight: height
26
41
  });
27
- this._board = board;
42
+ __classPrivateFieldSet(this, _Core_board, board, "f");
28
43
  this.resize(sharer.getActiveViewSizeInfo());
29
44
  const eventHub = board.getEventHub();
30
45
  new Cursor(container, {
@@ -32,39 +47,59 @@ export class Core {
32
47
  });
33
48
  }
34
49
  use(middleware) {
35
- this._board.use(middleware);
50
+ __classPrivateFieldGet(this, _Core_board, "f").use(middleware);
36
51
  }
37
52
  setData(data) {
38
53
  validateElements((data === null || data === void 0 ? void 0 : data.elements) || []);
39
- this._board.setData(data);
54
+ __classPrivateFieldGet(this, _Core_board, "f").setData(data);
40
55
  }
41
56
  getData() {
42
- return this._board.getData();
57
+ return __classPrivateFieldGet(this, _Core_board, "f").getData();
43
58
  }
44
59
  scale(opts) {
45
- this._board.scale(opts);
46
- const viewer = this._board.getViewer();
60
+ __classPrivateFieldGet(this, _Core_board, "f").scale(opts);
61
+ const viewer = __classPrivateFieldGet(this, _Core_board, "f").getViewer();
47
62
  viewer.drawFrame();
48
63
  }
49
64
  resize(newViewSize) {
50
- const { _board: board } = this;
65
+ const board = __classPrivateFieldGet(this, _Core_board, "f");
51
66
  const sharer = board.getSharer();
52
67
  const viewSizeInfo = sharer.getActiveViewSizeInfo();
53
68
  board.resize(Object.assign(Object.assign({}, viewSizeInfo), newViewSize));
54
69
  }
55
70
  clear() {
56
- this._board.clear();
71
+ __classPrivateFieldGet(this, _Core_board, "f").clear();
57
72
  }
58
73
  on(name, callback) {
59
- const eventHub = this._board.getEventHub();
74
+ const eventHub = __classPrivateFieldGet(this, _Core_board, "f").getEventHub();
60
75
  eventHub.on(name, callback);
61
76
  }
62
77
  off(name, callback) {
63
- const eventHub = this._board.getEventHub();
78
+ const eventHub = __classPrivateFieldGet(this, _Core_board, "f").getEventHub();
64
79
  eventHub.off(name, callback);
65
80
  }
66
81
  trigger(name, e) {
67
- const eventHub = this._board.getEventHub();
82
+ const eventHub = __classPrivateFieldGet(this, _Core_board, "f").getEventHub();
68
83
  eventHub.trigger(name, e);
69
84
  }
85
+ getViewInfo() {
86
+ const board = __classPrivateFieldGet(this, _Core_board, "f");
87
+ const sharer = board.getSharer();
88
+ const viewSizeInfo = sharer.getActiveViewSizeInfo();
89
+ const viewScaleInfo = sharer.getActiveViewScaleInfo();
90
+ return {
91
+ viewSizeInfo,
92
+ viewScaleInfo
93
+ };
94
+ }
95
+ refresh() {
96
+ __classPrivateFieldGet(this, _Core_board, "f").getViewer().drawFrame();
97
+ }
98
+ updateViewScale(opts) {
99
+ __classPrivateFieldGet(this, _Core_board, "f").updateViewScaleInfo(opts);
100
+ }
70
101
  }
102
+ _Core_board = new WeakMap(), _Core_container = new WeakMap(), _Core_instances = new WeakSet(), _Core_initContainer = function _Core_initContainer() {
103
+ const container = __classPrivateFieldGet(this, _Core_container, "f");
104
+ container.style.position = 'relative';
105
+ };
@@ -5,10 +5,16 @@ export const MiddlewareRuler = (opts) => {
5
5
  const key = 'RULE';
6
6
  const { viewContent, viewer, eventHub } = opts;
7
7
  const { helperContext, underContext } = viewContent;
8
- let showRuler = true;
8
+ let show = true;
9
+ let showGrid = true;
9
10
  eventHub.on(middlewareEventRuler, (e) => {
10
11
  if (typeof (e === null || e === void 0 ? void 0 : e.show) === 'boolean') {
11
- showRuler = e.show;
12
+ show = e.show;
13
+ }
14
+ if (typeof (e === null || e === void 0 ? void 0 : e.showGrid) === 'boolean') {
15
+ showGrid = e.showGrid;
16
+ }
17
+ if (typeof (e === null || e === void 0 ? void 0 : e.show) === 'boolean' || typeof (e === null || e === void 0 ? void 0 : e.showGrid) === 'boolean') {
12
18
  viewer.drawFrame();
13
19
  }
14
20
  });
@@ -16,7 +22,7 @@ export const MiddlewareRuler = (opts) => {
16
22
  mode: key,
17
23
  isDefault: true,
18
24
  beforeDrawFrame: ({ snapshot }) => {
19
- if (showRuler === true) {
25
+ if (show === true) {
20
26
  const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
21
27
  const viewSizeInfo = getViewSizeInfoFromSnapshot(snapshot);
22
28
  drawRulerBackground(helperContext, { viewScaleInfo, viewSizeInfo });
@@ -24,12 +30,14 @@ export const MiddlewareRuler = (opts) => {
24
30
  drawXRuler(helperContext, { scaleList: xList });
25
31
  const yList = calcYRulerScaleList({ viewScaleInfo, viewSizeInfo });
26
32
  drawYRuler(helperContext, { scaleList: yList });
27
- drawUnderGrid(underContext, {
28
- xList,
29
- yList,
30
- viewScaleInfo,
31
- viewSizeInfo
32
- });
33
+ if (showGrid === true) {
34
+ drawUnderGrid(underContext, {
35
+ xList,
36
+ yList,
37
+ viewScaleInfo,
38
+ viewSizeInfo
39
+ });
40
+ }
33
41
  }
34
42
  }
35
43
  };
@@ -7,14 +7,15 @@ const textColor = '#00000080';
7
7
  const fontFamily = 'monospace';
8
8
  const fontSize = 10;
9
9
  const fontWeight = 100;
10
- const gridColor = '#AAAAAA30';
11
- const gridKeyColor = '#AAAAAA70';
10
+ const gridColor = '#AAAAAA20';
11
+ const gridKeyColor = '#AAAAAA40';
12
+ const lineSize = 1;
12
13
  function calcRulerScaleList(opts) {
13
14
  const { scale, viewLength, viewOffset } = opts;
14
15
  const list = [];
15
16
  let rulerUnit = 10;
16
17
  rulerUnit = formatNumber(rulerUnit / scale, { decimalPlaces: 0 });
17
- rulerUnit = Math.max(1, Math.min(rulerUnit, 1000));
18
+ rulerUnit = Math.max(10, Math.min(rulerUnit, 1000));
18
19
  const rulerKeyUnit = rulerUnit * 10;
19
20
  const rulerSubKeyUnit = rulerUnit * 5;
20
21
  let index = 0;
@@ -77,6 +78,8 @@ export function drawXRuler(ctx, opts) {
77
78
  ctx.moveTo(item.position, scaleDrawStart);
78
79
  ctx.lineTo(item.position, item.isKeyNum ? keyScaleDrawEnd : item.isSubKeyNum ? subKeyScaleDrawEnd : scaleDrawEnd);
79
80
  ctx.closePath();
81
+ ctx.lineWidth = lineSize;
82
+ ctx.setLineDash([]);
80
83
  ctx.fillStyle = scaleColor;
81
84
  ctx.stroke();
82
85
  if (item.isKeyNum) {
@@ -108,6 +111,8 @@ export function drawYRuler(ctx, opts) {
108
111
  ctx.lineTo(item.isKeyNum ? keyScaleDrawEnd : item.isSubKeyNum ? subKeyScaleDrawEnd : scaleDrawEnd, item.position);
109
112
  ctx.closePath();
110
113
  ctx.fillStyle = scaleColor;
114
+ ctx.lineWidth = lineSize;
115
+ ctx.setLineDash([]);
111
116
  ctx.stroke();
112
117
  if (item.showNum === true) {
113
118
  const textX = fontStart;
@@ -140,6 +145,8 @@ export function drawRulerBackground(ctx, opts) {
140
145
  ctx.closePath();
141
146
  ctx.fillStyle = background;
142
147
  ctx.fill();
148
+ ctx.lineWidth = lineSize;
149
+ ctx.setLineDash([]);
143
150
  ctx.strokeStyle = borderColor;
144
151
  ctx.stroke();
145
152
  }
@@ -157,8 +164,9 @@ export function drawUnderGrid(ctx, opts) {
157
164
  else {
158
165
  ctx.strokeStyle = gridColor;
159
166
  }
160
- ctx.lineWidth = 1;
161
167
  ctx.closePath();
168
+ ctx.lineWidth = lineSize;
169
+ ctx.setLineDash([]);
162
170
  ctx.stroke();
163
171
  }
164
172
  for (let i = 0; i < yList.length; i++) {
@@ -3,6 +3,8 @@ export const middlewareEventScale = '@middleware/scale';
3
3
  export const MiddlewareScaler = (opts) => {
4
4
  const key = 'SCALE';
5
5
  const { viewer, sharer, eventHub } = opts;
6
+ const maxScale = 50;
7
+ const minScale = 0.05;
6
8
  return {
7
9
  mode: key,
8
10
  isDefault: true,
@@ -16,6 +18,9 @@ export const MiddlewareScaler = (opts) => {
16
18
  else if (deltaY > 0) {
17
19
  newScaleNum = scale * 0.9;
18
20
  }
21
+ if (newScaleNum < minScale || newScaleNum > maxScale) {
22
+ return;
23
+ }
19
24
  const { moveX, moveY } = viewer.scale({ scale: newScaleNum, point });
20
25
  viewer.scroll({ moveX, moveY });
21
26
  viewer.drawFrame();
@@ -49,11 +49,11 @@ function calcScrollerInfo(viewScaleInfo, viewSizeInfo) {
49
49
  const lineSize = scrollerLineWidth;
50
50
  let xSize = 0;
51
51
  let ySize = 0;
52
- xSize = Math.max(sliderMinSize, width - (Math.abs(offsetLeft) + Math.abs(offsetRight)));
52
+ xSize = Math.max(sliderMinSize, width - lineSize * 2 - (Math.abs(offsetLeft) + Math.abs(offsetRight)));
53
53
  if (xSize >= width) {
54
54
  xSize = width;
55
55
  }
56
- ySize = Math.max(sliderMinSize, height - (Math.abs(offsetTop) + Math.abs(offsetBottom)));
56
+ ySize = Math.max(sliderMinSize, height - lineSize * 2 - (Math.abs(offsetTop) + Math.abs(offsetBottom)));
57
57
  if (ySize >= height) {
58
58
  ySize = height;
59
59
  }
@@ -1,17 +1,24 @@
1
- import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, rotatePointInGroup, getGroupQueueFromList, findElementsFromList } from '@idraw/util';
1
+ import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions } from '@idraw/util';
2
2
  import { drawHoverVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
3
  import { getPointTarget, resizeElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup, calcMoveInGroup } from './util';
4
4
  import { key, keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController } from './config';
5
+ import { middlewareEventTextEdit } from '../text-editor';
5
6
  export const middlewareEventSelect = '@middleware/select';
6
7
  export const MiddlewareSelector = (opts) => {
7
8
  const { viewer, sharer, viewContent, calculator, eventHub } = opts;
8
9
  const { helperContext } = viewContent;
9
10
  let prevPoint = null;
10
11
  let inBusyMode = null;
11
- eventHub.on(middlewareEventSelect, ({ uuids }) => {
12
+ eventHub.on(middlewareEventSelect, ({ uuids, positions }) => {
13
+ let elements = [];
12
14
  const actionType = sharer.getSharedStorage(keyActionType);
13
15
  const data = sharer.getActiveStorage('data');
14
- const elements = findElementsFromList(uuids, (data === null || data === void 0 ? void 0 : data.elements) || []);
16
+ if (positions && Array.isArray(positions)) {
17
+ elements = findElementsFromListByPositions(positions, (data === null || data === void 0 ? void 0 : data.elements) || []);
18
+ }
19
+ else {
20
+ elements = findElementsFromList(uuids, (data === null || data === void 0 ? void 0 : data.elements) || []);
21
+ }
15
22
  let needRefresh = false;
16
23
  if (!actionType && elements.length === 1) {
17
24
  sharer.setSharedStorage(keyActionType, 'select');
@@ -385,7 +392,7 @@ export const MiddlewareSelector = (opts) => {
385
392
  viewer.drawFrame();
386
393
  },
387
394
  doubleClick(e) {
388
- var _a;
395
+ var _a, _b;
389
396
  const target = getPointTarget(e.point, pointTargetBaseOptions());
390
397
  if (target.elements.length === 1 && ((_a = target.elements[0]) === null || _a === void 0 ? void 0 : _a.type) === 'group') {
391
398
  const pushResult = pushGroupQueue(target.elements[0]);
@@ -395,6 +402,13 @@ export const MiddlewareSelector = (opts) => {
395
402
  return;
396
403
  }
397
404
  }
405
+ else if (target.elements.length === 1 && ((_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.type) === 'text') {
406
+ eventHub.trigger(middlewareEventTextEdit, {
407
+ element: target.elements[0],
408
+ groupQueue: sharer.getSharedStorage(keyGroupQueue) || [],
409
+ viewScaleInfo: sharer.getActiveViewScaleInfo()
410
+ });
411
+ }
398
412
  sharer.setSharedStorage(keyActionType, null);
399
413
  },
400
414
  beforeDrawFrame({ snapshot }) {
@@ -0,0 +1,3 @@
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>;
@@ -0,0 +1,132 @@
1
+ import { limitAngle, getDefaultElementDetailConfig } from '@idraw/util';
2
+ export const middlewareEventTextEdit = '@middleware/text-edit';
3
+ const defaultElementDetail = getDefaultElementDetailConfig();
4
+ export const MiddlewareTextEditor = (opts) => {
5
+ const key = 'SELECT';
6
+ const { eventHub, viewContent, viewer } = opts;
7
+ const canvas = viewContent.boardContext.canvas;
8
+ const textarea = document.createElement('textarea');
9
+ const canvasWrapper = document.createElement('div');
10
+ const container = opts.container || document.body;
11
+ const mask = document.createElement('div');
12
+ let activeElem = null;
13
+ canvasWrapper.appendChild(textarea);
14
+ canvasWrapper.style.position = 'absolute';
15
+ mask.appendChild(canvasWrapper);
16
+ mask.style.position = 'fixed';
17
+ mask.style.top = '0';
18
+ mask.style.bottom = '0';
19
+ mask.style.left = '0';
20
+ mask.style.right = '0';
21
+ mask.style.display = 'none';
22
+ container.appendChild(mask);
23
+ const showTextArea = (e) => {
24
+ resetCanvasWrapper();
25
+ resetTextArea(e);
26
+ mask.style.display = 'block';
27
+ };
28
+ const hideTextArea = () => {
29
+ mask.style.display = 'none';
30
+ activeElem = null;
31
+ };
32
+ const getCanvasRect = () => {
33
+ const clientRect = canvas.getBoundingClientRect();
34
+ const { left, top, width, height } = clientRect;
35
+ return { left, top, width, height };
36
+ };
37
+ const createBox = (opts) => {
38
+ const { size, parent } = opts;
39
+ const div = document.createElement('div');
40
+ const { x, y, w, h } = size;
41
+ const angle = limitAngle(size.angle || 0);
42
+ div.style.position = 'absolute';
43
+ div.style.left = `${x}px`;
44
+ div.style.top = `${y}px`;
45
+ div.style.width = `${w}px`;
46
+ div.style.height = `${h}px`;
47
+ div.style.transform = `rotate(${angle}deg)`;
48
+ parent.appendChild(div);
49
+ return div;
50
+ };
51
+ const resetTextArea = (e) => {
52
+ const { viewScaleInfo, element, groupQueue } = e;
53
+ const { scale, offsetTop, offsetLeft } = viewScaleInfo;
54
+ if (canvasWrapper.children) {
55
+ Array.from(canvasWrapper.children).forEach((child) => {
56
+ child.remove();
57
+ });
58
+ }
59
+ let parent = canvasWrapper;
60
+ for (let i = 0; i < groupQueue.length; i++) {
61
+ const group = groupQueue[i];
62
+ const { x, y, w, h } = group;
63
+ const angle = limitAngle(group.angle || 0);
64
+ const size = {
65
+ x: x * scale,
66
+ y: y * scale,
67
+ w: w * scale,
68
+ h: h * scale,
69
+ angle
70
+ };
71
+ if (i === 0) {
72
+ size.x += offsetLeft;
73
+ size.y += offsetTop;
74
+ }
75
+ parent = createBox({ size, parent });
76
+ }
77
+ const detail = Object.assign(Object.assign({}, defaultElementDetail), element.detail);
78
+ textarea.style.position = 'absolute';
79
+ textarea.style.left = `${element.x * scale}px`;
80
+ textarea.style.top = `${element.y * scale}px`;
81
+ textarea.style.width = `${element.w * scale}px`;
82
+ textarea.style.height = `${element.h * scale}px`;
83
+ textarea.style.transform = `rotate(${limitAngle(element.angle || 0)}deg)`;
84
+ textarea.style.border = 'none';
85
+ textarea.style.resize = 'none';
86
+ textarea.style.overflow = 'hidden';
87
+ textarea.style.wordBreak = 'break-all';
88
+ textarea.style.background = '#FFFFFF';
89
+ textarea.style.color = '#333333';
90
+ textarea.style.fontSize = `${detail.fontSize * scale}px`;
91
+ textarea.style.lineHeight = `${detail.lineHeight * scale}px`;
92
+ textarea.style.fontFamily = detail.fontFamily;
93
+ textarea.style.fontWeight = `${detail.fontWeight}`;
94
+ textarea.value = detail.text || '';
95
+ parent.appendChild(textarea);
96
+ };
97
+ const resetCanvasWrapper = () => {
98
+ const { left, top, width, height } = getCanvasRect();
99
+ canvasWrapper.style.position = 'absolute';
100
+ canvasWrapper.style.overflow = 'hidden';
101
+ canvasWrapper.style.top = `${top}px`;
102
+ canvasWrapper.style.left = `${left}px`;
103
+ canvasWrapper.style.width = `${width}px`;
104
+ canvasWrapper.style.height = `${height}px`;
105
+ };
106
+ mask.addEventListener('click', () => {
107
+ hideTextArea();
108
+ });
109
+ textarea.addEventListener('click', (e) => {
110
+ e.stopPropagation();
111
+ });
112
+ textarea.addEventListener('input', (e) => {
113
+ if (activeElem) {
114
+ activeElem.detail.text = e.target.value || '';
115
+ viewer.drawFrame();
116
+ }
117
+ });
118
+ textarea.addEventListener('blur', () => {
119
+ hideTextArea();
120
+ });
121
+ eventHub.on(middlewareEventTextEdit, (e) => {
122
+ var _a;
123
+ 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') {
124
+ activeElem = e.element;
125
+ }
126
+ showTextArea(e);
127
+ });
128
+ return {
129
+ mode: key,
130
+ isDefault: true
131
+ };
132
+ };