@idraw/core 0.4.0-beta.13 → 0.4.0-beta.15

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,11 +1,11 @@
1
- import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEvent, ViewScaleInfo, LoadItemMap } from '@idraw/types';
1
+ import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEventMap, ViewScaleInfo, LoadItemMap } from '@idraw/types';
2
2
  export { MiddlewareSelector, middlewareEventSelect, middlewareEventSelectClear } 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
+ export { MiddlewareTextEditor, middlewareEventTextEdit, middlewareEventTextChange } from './middleware/text-editor';
7
7
  export { MiddlewareDragger } from './middleware/dragger';
8
- export declare class Core<E extends CoreEvent = CoreEvent> {
8
+ export declare class Core<E extends CoreEventMap = CoreEventMap> {
9
9
  #private;
10
10
  constructor(container: HTMLDivElement, opts: CoreOptions);
11
11
  isDestroyed(): boolean;
package/dist/esm/index.js CHANGED
@@ -17,7 +17,7 @@ export { MiddlewareSelector, middlewareEventSelect, middlewareEventSelectClear }
17
17
  export { MiddlewareScroller } from './middleware/scroller';
18
18
  export { MiddlewareScaler, middlewareEventScale } from './middleware/scaler';
19
19
  export { MiddlewareRuler, middlewareEventRuler } from './middleware/ruler';
20
- export { MiddlewareTextEditor, middlewareEventTextEdit } from './middleware/text-editor';
20
+ export { MiddlewareTextEditor, middlewareEventTextEdit, middlewareEventTextChange } from './middleware/text-editor';
21
21
  export { MiddlewareDragger } from './middleware/dragger';
22
22
  export class Core {
23
23
  constructor(container, opts) {
@@ -1,7 +1,7 @@
1
- import type { UtilEventEmitter, CoreEvent } from '@idraw/types';
1
+ import type { UtilEventEmitter, CoreEventMap } from '@idraw/types';
2
2
  export declare class Cursor {
3
3
  #private;
4
4
  constructor(container: HTMLDivElement, opts: {
5
- eventHub: UtilEventEmitter<CoreEvent>;
5
+ eventHub: UtilEventEmitter<CoreEventMap>;
6
6
  });
7
7
  }
@@ -1,7 +1,7 @@
1
- import type { BoardMiddleware, CoreEvent, Point } from '@idraw/types';
1
+ import type { BoardMiddleware, CoreEventMap, Point } from '@idraw/types';
2
2
  declare const keyPrevPoint: unique symbol;
3
3
  type DraggerSharedStorage = {
4
4
  [keyPrevPoint]: Point | null;
5
5
  };
6
- export declare const MiddlewareDragger: BoardMiddleware<DraggerSharedStorage, CoreEvent>;
6
+ export declare const MiddlewareDragger: BoardMiddleware<DraggerSharedStorage, CoreEventMap>;
7
7
  export {};
@@ -1,3 +1,3 @@
1
- import type { BoardMiddleware, CoreEvent } from '@idraw/types';
1
+ import type { BoardMiddleware, CoreEventMap } from '@idraw/types';
2
2
  export declare const middlewareEventRuler = "@middleware/show-ruler";
3
- export declare const MiddlewareRuler: BoardMiddleware<Record<string, any>, CoreEvent>;
3
+ export declare const MiddlewareRuler: BoardMiddleware<Record<string, any>, CoreEventMap>;
@@ -1,3 +1,3 @@
1
- import type { BoardMiddleware, CoreEvent } from '@idraw/types';
1
+ import type { BoardMiddleware, CoreEventMap } from '@idraw/types';
2
2
  export declare const middlewareEventScale = "@middleware/scale";
3
- export declare const MiddlewareScaler: BoardMiddleware<Record<string, any>, CoreEvent>;
3
+ export declare const MiddlewareScaler: BoardMiddleware<Record<string, any>, CoreEventMap>;
@@ -10,6 +10,7 @@ export declare const keySelectedElementListVertexes: unique symbol;
10
10
  export declare const keySelectedElementController: unique symbol;
11
11
  export declare const keyGroupQueue: unique symbol;
12
12
  export declare const keyGroupQueueVertexesList: unique symbol;
13
+ export declare const keyIsMoving: unique symbol;
13
14
  export declare const keyDebugElemCenter: unique symbol;
14
15
  export declare const keyDebugStartVertical: unique symbol;
15
16
  export declare const keyDebugEndVertical: unique symbol;
@@ -10,6 +10,7 @@ export const keySelectedElementListVertexes = Symbol(`${key}_selectedElementList
10
10
  export const keySelectedElementController = Symbol(`${key}_selectedElementController`);
11
11
  export const keyGroupQueue = Symbol(`${key}_groupQueue`);
12
12
  export const keyGroupQueueVertexesList = Symbol(`${key}_groupQueueVertexesList`);
13
+ export const keyIsMoving = Symbol(`${key}_isMoving`);
13
14
  export const keyDebugElemCenter = Symbol(`${key}_debug_elemCenter`);
14
15
  export const keyDebugStartVertical = Symbol(`${key}_debug_startVertical`);
15
16
  export const keyDebugEndVertical = Symbol(`${key}_debug_endVertical`);
@@ -0,0 +1,6 @@
1
+ import type { ViewContext2D, ViewRectVertexes, Element } from '@idraw/types';
2
+ export declare function drawSizeAuxiliaryLines(ctx: ViewContext2D, opts: {
3
+ vertexes: ViewRectVertexes;
4
+ element: Element | null;
5
+ groupQueue: Element<'group'>[];
6
+ }): void;
@@ -0,0 +1,19 @@
1
+ import { drawLine } from './draw-base';
2
+ const auxiliaryColor = '#f7276e';
3
+ export function drawSizeAuxiliaryLines(ctx, opts) {
4
+ const { vertexes, element, groupQueue } = opts;
5
+ const point = vertexes[0];
6
+ const lineOpts = {
7
+ borderColor: auxiliaryColor,
8
+ borderWidth: 1,
9
+ lineDash: []
10
+ };
11
+ if (groupQueue.length > 0) {
12
+ }
13
+ else {
14
+ if (!(element === null || element === void 0 ? void 0 : element.angle)) {
15
+ drawLine(ctx, { x: point.x, y: 0 }, point, lineOpts);
16
+ drawLine(ctx, { x: 0, y: point.y }, point, lineOpts);
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,25 @@
1
+ import type { PointSize, ViewContext2D, ViewRectVertexes } from '@idraw/types';
2
+ export declare function drawVertexes(ctx: ViewContext2D, vertexes: ViewRectVertexes, opts: {
3
+ borderColor: string;
4
+ borderWidth: number;
5
+ background: string;
6
+ lineDash: number[];
7
+ }): void;
8
+ export declare function drawLine(ctx: ViewContext2D, start: PointSize, end: PointSize, opts: {
9
+ borderColor: string;
10
+ borderWidth: number;
11
+ lineDash: number[];
12
+ }): void;
13
+ export declare function drawCircleController(ctx: ViewContext2D, circleCenter: PointSize, opts: {
14
+ borderColor: string;
15
+ borderWidth: number;
16
+ background: string;
17
+ lineDash: number[];
18
+ size: number;
19
+ }): void;
20
+ export declare function drawCrossVertexes(ctx: ViewContext2D, vertexes: ViewRectVertexes, opts: {
21
+ borderColor: string;
22
+ borderWidth: number;
23
+ background: string;
24
+ lineDash: number[];
25
+ }): void;
@@ -0,0 +1,71 @@
1
+ export function drawVertexes(ctx, vertexes, opts) {
2
+ const { borderColor, borderWidth, background, lineDash } = opts;
3
+ ctx.setLineDash([]);
4
+ ctx.lineWidth = borderWidth;
5
+ ctx.strokeStyle = borderColor;
6
+ ctx.fillStyle = background;
7
+ ctx.setLineDash(lineDash);
8
+ ctx.beginPath();
9
+ ctx.moveTo(vertexes[0].x, vertexes[0].y);
10
+ ctx.lineTo(vertexes[1].x, vertexes[1].y);
11
+ ctx.lineTo(vertexes[2].x, vertexes[2].y);
12
+ ctx.lineTo(vertexes[3].x, vertexes[3].y);
13
+ ctx.lineTo(vertexes[0].x, vertexes[0].y);
14
+ ctx.closePath();
15
+ ctx.stroke();
16
+ ctx.fill();
17
+ }
18
+ export function drawLine(ctx, start, end, opts) {
19
+ const { borderColor, borderWidth, lineDash } = opts;
20
+ ctx.setLineDash([]);
21
+ ctx.lineWidth = borderWidth;
22
+ ctx.strokeStyle = borderColor;
23
+ ctx.setLineDash(lineDash);
24
+ ctx.beginPath();
25
+ ctx.moveTo(start.x, start.y);
26
+ ctx.lineTo(end.x, end.y);
27
+ ctx.closePath();
28
+ ctx.stroke();
29
+ }
30
+ export function drawCircleController(ctx, circleCenter, opts) {
31
+ const { size, borderColor, borderWidth, background } = opts;
32
+ const center = circleCenter;
33
+ const r = size / 2;
34
+ const a = r;
35
+ const b = r;
36
+ if (a >= 0 && b >= 0) {
37
+ if (typeof borderWidth === 'number' && borderWidth > 0) {
38
+ const ba = borderWidth / 2 + a;
39
+ const bb = borderWidth / 2 + b;
40
+ ctx.beginPath();
41
+ ctx.strokeStyle = borderColor;
42
+ ctx.lineWidth = borderWidth;
43
+ ctx.circle(center.x, center.y, ba, bb, 0, 0, 2 * Math.PI);
44
+ ctx.closePath();
45
+ ctx.stroke();
46
+ }
47
+ ctx.beginPath();
48
+ ctx.fillStyle = background;
49
+ ctx.circle(center.x, center.y, a, b, 0, 0, 2 * Math.PI);
50
+ ctx.closePath();
51
+ ctx.fill();
52
+ }
53
+ }
54
+ export function drawCrossVertexes(ctx, vertexes, opts) {
55
+ const { borderColor, borderWidth, background, lineDash } = opts;
56
+ ctx.setLineDash([]);
57
+ ctx.lineWidth = borderWidth;
58
+ ctx.strokeStyle = borderColor;
59
+ ctx.fillStyle = background;
60
+ ctx.setLineDash(lineDash);
61
+ ctx.beginPath();
62
+ ctx.moveTo(vertexes[0].x, vertexes[0].y);
63
+ ctx.lineTo(vertexes[2].x, vertexes[2].y);
64
+ ctx.closePath();
65
+ ctx.stroke();
66
+ ctx.beginPath();
67
+ ctx.moveTo(vertexes[1].x, vertexes[1].y);
68
+ ctx.lineTo(vertexes[3].x, vertexes[3].y);
69
+ ctx.closePath();
70
+ ctx.stroke();
71
+ }
@@ -10,8 +10,11 @@ export declare function drawLockVertexesWrapper(ctx: ViewContext2D, vertexes: Vi
10
10
  controller?: ElementSizeController | null;
11
11
  }): void;
12
12
  export declare function drawSelectedElementControllersVertexes(ctx: ViewContext2D, controller: ElementSizeController | null, opts: {
13
+ hideControllers: boolean;
13
14
  viewScaleInfo: ViewScaleInfo;
14
15
  viewSizeInfo: ViewSizeInfo;
16
+ element: Element | null;
17
+ groupQueue: Element<'group'>[];
15
18
  }): void;
16
19
  export declare function drawElementListShadows(ctx: ViewContext2D, elements: Element<ElementType>[], opts?: Omit<RendererDrawElementOptions, 'loader'>): void;
17
20
  export declare function drawArea(ctx: ViewContext2D, opts: {
@@ -1,58 +1,6 @@
1
1
  import { rotateElementVertexes, calcViewPointSize, calcViewVertexes } from '@idraw/util';
2
2
  import { resizeControllerBorderWidth, areaBorderWidth, wrapperColor, selectWrapperBorderWidth, lockColor, controllerSize } from './config';
3
- function drawVertexes(ctx, vertexes, opts) {
4
- const { borderColor, borderWidth, background, lineDash } = opts;
5
- ctx.setLineDash([]);
6
- ctx.lineWidth = borderWidth;
7
- ctx.strokeStyle = borderColor;
8
- ctx.fillStyle = background;
9
- ctx.setLineDash(lineDash);
10
- ctx.beginPath();
11
- ctx.moveTo(vertexes[0].x, vertexes[0].y);
12
- ctx.lineTo(vertexes[1].x, vertexes[1].y);
13
- ctx.lineTo(vertexes[2].x, vertexes[2].y);
14
- ctx.lineTo(vertexes[3].x, vertexes[3].y);
15
- ctx.lineTo(vertexes[0].x, vertexes[0].y);
16
- ctx.closePath();
17
- ctx.stroke();
18
- ctx.fill();
19
- }
20
- function drawLine(ctx, start, end, opts) {
21
- const { borderColor, borderWidth, lineDash } = opts;
22
- ctx.setLineDash([]);
23
- ctx.lineWidth = borderWidth;
24
- ctx.strokeStyle = borderColor;
25
- ctx.setLineDash(lineDash);
26
- ctx.beginPath();
27
- ctx.moveTo(start.x, start.y);
28
- ctx.lineTo(end.x, end.y);
29
- ctx.closePath();
30
- ctx.stroke();
31
- }
32
- function drawCircleController(ctx, circleCenter, opts) {
33
- const { size, borderColor, borderWidth, background } = opts;
34
- const center = circleCenter;
35
- const r = size / 2;
36
- const a = r;
37
- const b = r;
38
- if (a >= 0 && b >= 0) {
39
- if (typeof borderWidth === 'number' && borderWidth > 0) {
40
- const ba = borderWidth / 2 + a;
41
- const bb = borderWidth / 2 + b;
42
- ctx.beginPath();
43
- ctx.strokeStyle = borderColor;
44
- ctx.lineWidth = borderWidth;
45
- ctx.circle(center.x, center.y, ba, bb, 0, 0, 2 * Math.PI);
46
- ctx.closePath();
47
- ctx.stroke();
48
- }
49
- ctx.beginPath();
50
- ctx.fillStyle = background;
51
- ctx.circle(center.x, center.y, a, b, 0, 0, 2 * Math.PI);
52
- ctx.closePath();
53
- ctx.fill();
54
- }
55
- }
3
+ import { drawVertexes, drawLine, drawCircleController, drawCrossVertexes } from './draw-base';
56
4
  export function drawHoverVertexesWrapper(ctx, vertexes, opts) {
57
5
  if (!vertexes) {
58
6
  return;
@@ -60,24 +8,6 @@ export function drawHoverVertexesWrapper(ctx, vertexes, opts) {
60
8
  const wrapperOpts = { borderColor: wrapperColor, borderWidth: 1, background: 'transparent', lineDash: [] };
61
9
  drawVertexes(ctx, calcViewVertexes(vertexes, opts), wrapperOpts);
62
10
  }
63
- function drawCrossVertexes(ctx, vertexes, opts) {
64
- const { borderColor, borderWidth, background, lineDash } = opts;
65
- ctx.setLineDash([]);
66
- ctx.lineWidth = borderWidth;
67
- ctx.strokeStyle = borderColor;
68
- ctx.fillStyle = background;
69
- ctx.setLineDash(lineDash);
70
- ctx.beginPath();
71
- ctx.moveTo(vertexes[0].x, vertexes[0].y);
72
- ctx.lineTo(vertexes[2].x, vertexes[2].y);
73
- ctx.closePath();
74
- ctx.stroke();
75
- ctx.beginPath();
76
- ctx.moveTo(vertexes[1].x, vertexes[1].y);
77
- ctx.lineTo(vertexes[3].x, vertexes[3].y);
78
- ctx.closePath();
79
- ctx.stroke();
80
- }
81
11
  export function drawLockVertexesWrapper(ctx, vertexes, opts) {
82
12
  if (!vertexes) {
83
13
  return;
@@ -102,16 +32,19 @@ export function drawSelectedElementControllersVertexes(ctx, controller, opts) {
102
32
  if (!controller) {
103
33
  return;
104
34
  }
35
+ const { hideControllers } = opts;
105
36
  const { elementWrapper, topLeft, topRight, bottomLeft, bottomRight, top, rotate } = controller;
106
37
  const wrapperOpts = { borderColor: wrapperColor, borderWidth: selectWrapperBorderWidth, background: 'transparent', lineDash: [] };
107
38
  const ctrlOpts = Object.assign(Object.assign({}, wrapperOpts), { borderWidth: resizeControllerBorderWidth, background: '#FFFFFF' });
108
- drawLine(ctx, calcViewPointSize(top.center, opts), calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { borderWidth: 2 }));
109
39
  drawVertexes(ctx, calcViewVertexes(elementWrapper, opts), wrapperOpts);
110
- drawVertexes(ctx, calcViewVertexes(topLeft.vertexes, opts), ctrlOpts);
111
- drawVertexes(ctx, calcViewVertexes(topRight.vertexes, opts), ctrlOpts);
112
- drawVertexes(ctx, calcViewVertexes(bottomLeft.vertexes, opts), ctrlOpts);
113
- drawVertexes(ctx, calcViewVertexes(bottomRight.vertexes, opts), ctrlOpts);
114
- drawCircleController(ctx, calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { size: controllerSize, borderWidth: 2 }));
40
+ if (!hideControllers) {
41
+ drawLine(ctx, calcViewPointSize(top.center, opts), calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { borderWidth: 2 }));
42
+ drawVertexes(ctx, calcViewVertexes(topLeft.vertexes, opts), ctrlOpts);
43
+ drawVertexes(ctx, calcViewVertexes(topRight.vertexes, opts), ctrlOpts);
44
+ drawVertexes(ctx, calcViewVertexes(bottomLeft.vertexes, opts), ctrlOpts);
45
+ drawVertexes(ctx, calcViewVertexes(bottomRight.vertexes, opts), ctrlOpts);
46
+ drawCircleController(ctx, calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { size: controllerSize, borderWidth: 2 }));
47
+ }
115
48
  }
116
49
  export function drawElementListShadows(ctx, elements, opts) {
117
50
  elements.forEach((elem) => {
@@ -1,5 +1,5 @@
1
- import type { CoreEvent } from '@idraw/types';
1
+ import type { CoreEventMap } from '@idraw/types';
2
2
  import type { BoardMiddleware, DeepSelectorSharedStorage } from './types';
3
3
  export declare const middlewareEventSelect: string;
4
4
  export declare const middlewareEventSelectClear: string;
5
- export declare const MiddlewareSelector: BoardMiddleware<DeepSelectorSharedStorage, CoreEvent>;
5
+ export declare const MiddlewareSelector: BoardMiddleware<DeepSelectorSharedStorage, CoreEventMap>;
@@ -1,7 +1,7 @@
1
- import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, deepResizeGroupElement } from '@idraw/util';
1
+ import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, getElementPositionFromList, deepResizeGroupElement } from '@idraw/util';
2
2
  import { drawHoverVertexesWrapper, drawLockVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
3
  import { getPointTarget, resizeElement, rotateElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup, calcMoveInGroup } from './util';
4
- import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, controllerSize } from './config';
4
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyIsMoving, controllerSize } from './config';
5
5
  import { middlewareEventTextEdit } from '../text-editor';
6
6
  export const middlewareEventSelect = '@middleware/select';
7
7
  export const middlewareEventSelectClear = '@middleware/select-clear';
@@ -87,6 +87,7 @@ export const MiddlewareSelector = (opts) => {
87
87
  sharer.setSharedStorage(keySelectedElementList, []);
88
88
  sharer.setSharedStorage(keySelectedElementListVertexes, null);
89
89
  sharer.setSharedStorage(keySelectedElementController, null);
90
+ sharer.setSharedStorage(keyIsMoving, null);
90
91
  };
91
92
  clear();
92
93
  const selectCallback = ({ uuids, positions }) => {
@@ -284,6 +285,7 @@ export const MiddlewareSelector = (opts) => {
284
285
  },
285
286
  pointMove: (e) => {
286
287
  var _a, _b, _c;
288
+ sharer.setSharedStorage(keyIsMoving, true);
287
289
  const data = sharer.getActiveStorage('data');
288
290
  const elems = getActiveElements();
289
291
  const scale = sharer.getActiveStorage('scale') || 1;
@@ -388,6 +390,7 @@ export const MiddlewareSelector = (opts) => {
388
390
  },
389
391
  pointEnd(e) {
390
392
  inBusyMode = null;
393
+ sharer.setSharedStorage(keyIsMoving, false);
391
394
  const data = sharer.getActiveStorage('data');
392
395
  const resizeType = sharer.getSharedStorage(keyResizeType);
393
396
  const actionType = sharer.getSharedStorage(keyActionType);
@@ -467,7 +470,7 @@ export const MiddlewareSelector = (opts) => {
467
470
  viewer.drawFrame();
468
471
  },
469
472
  doubleClick(e) {
470
- var _a, _b, _c, _d;
473
+ var _a, _b, _c, _d, _e, _f;
471
474
  const target = getPointTarget(e.point, pointTargetBaseOptions());
472
475
  sharer.setSharedStorage(keySelectedElementController, null);
473
476
  sharer.setSharedStorage(keySelectedElementList, []);
@@ -486,6 +489,7 @@ export const MiddlewareSelector = (opts) => {
486
489
  eventHub.trigger(middlewareEventTextEdit, {
487
490
  element: target.elements[0],
488
491
  groupQueue: sharer.getSharedStorage(keyGroupQueue) || [],
492
+ position: getElementPositionFromList((_e = target.elements[0]) === null || _e === void 0 ? void 0 : _e.uuid, ((_f = sharer.getActiveStorage('data')) === null || _f === void 0 ? void 0 : _f.elements) || []),
489
493
  viewScaleInfo: sharer.getActiveViewScaleInfo()
490
494
  });
491
495
  }
@@ -507,6 +511,7 @@ export const MiddlewareSelector = (opts) => {
507
511
  const areaEnd = sharedStore[keyAreaEnd];
508
512
  const groupQueue = sharedStore[keyGroupQueue];
509
513
  const groupQueueVertexesList = sharedStore[keyGroupQueueVertexesList];
514
+ const isMoving = sharedStore[keyIsMoving];
510
515
  const drawBaseOpts = { calculator, viewScaleInfo, viewSizeInfo };
511
516
  const selectedElementController = elem
512
517
  ? calcElementSizeController(elem, {
@@ -531,7 +536,7 @@ export const MiddlewareSelector = (opts) => {
531
536
  }
532
537
  }
533
538
  if (!isLock && elem && ['select', 'drag', 'resize'].includes(actionType)) {
534
- drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
539
+ drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, groupQueue, hideControllers: !!isMoving && actionType === 'drag' }));
535
540
  }
536
541
  }
537
542
  else {
@@ -548,7 +553,7 @@ export const MiddlewareSelector = (opts) => {
548
553
  }
549
554
  }
550
555
  if (!isLock && elem && ['select', 'drag', 'resize'].includes(actionType)) {
551
- drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
556
+ drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, groupQueue, hideControllers: !!isMoving && actionType === 'drag' }));
552
557
  }
553
558
  else if (actionType === 'area' && areaStart && areaEnd) {
554
559
  drawArea(helperContext, { start: areaStart, end: areaEnd });
@@ -1,5 +1,5 @@
1
1
  import type { ElementSizeController } from '@idraw/types';
2
- import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyDebugElemCenter, keyDebugEnd0, keyDebugEndHorizontal, keyDebugEndVertical, keyDebugStartHorizontal, keyDebugStartVertical } from './config';
2
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyIsMoving, keyDebugElemCenter, keyDebugEnd0, keyDebugEndHorizontal, keyDebugEndVertical, keyDebugStartHorizontal, keyDebugStartVertical } from './config';
3
3
  import { Data, ElementSize, ElementType, Element, ViewContext2D, Point, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator, PointWatcherEvent, BoardMiddleware, ViewRectVertexes } from '@idraw/types';
4
4
  export { Data, ElementType, Element, ElementSize, ViewContext2D, Point, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator, PointWatcherEvent, BoardMiddleware };
5
5
  export type ControllerStyle = ElementSize & {
@@ -31,6 +31,7 @@ export type DeepSelectorSharedStorage = {
31
31
  [keySelectedElementList]: Array<Element<ElementType>>;
32
32
  [keySelectedElementListVertexes]: ViewRectVertexes | null;
33
33
  [keySelectedElementController]: ElementSizeController | null;
34
+ [keyIsMoving]: boolean | null;
34
35
  [keyDebugElemCenter]: PointSize | null;
35
36
  [keyDebugEnd0]: PointSize | null;
36
37
  [keyDebugEndHorizontal]: PointSize | null;
@@ -1 +1 @@
1
- import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyDebugElemCenter, keyDebugEnd0, keyDebugEndHorizontal, keyDebugEndVertical, keyDebugStartHorizontal, keyDebugStartVertical } from './config';
1
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyIsMoving, keyDebugElemCenter, keyDebugEnd0, keyDebugEndHorizontal, keyDebugEndVertical, keyDebugStartHorizontal, keyDebugStartVertical } from './config';
@@ -1,3 +1,21 @@
1
- import type { BoardMiddleware, CoreEvent } from '@idraw/types';
1
+ import type { BoardMiddleware, CoreEventMap, Element, ViewScaleInfo, ElementPosition } from '@idraw/types';
2
2
  export declare const middlewareEventTextEdit = "@middleware/text-edit";
3
- export declare const MiddlewareTextEditor: BoardMiddleware<Record<string, any>, CoreEvent>;
3
+ export declare const middlewareEventTextChange = "@middleware/text-change";
4
+ type TextEditEvent = {
5
+ element: Element<'text'>;
6
+ position: ElementPosition;
7
+ groupQueue: Element<'group'>[];
8
+ viewScaleInfo: ViewScaleInfo;
9
+ };
10
+ type TextChangeEvent = {
11
+ element: {
12
+ uuid: string;
13
+ detail: {
14
+ text: string;
15
+ };
16
+ };
17
+ position: ElementPosition;
18
+ };
19
+ type ExtendEventMap = Record<typeof middlewareEventTextEdit, TextEditEvent> & Record<typeof middlewareEventTextChange, TextChangeEvent>;
20
+ export declare const MiddlewareTextEditor: BoardMiddleware<ExtendEventMap, CoreEventMap & ExtendEventMap>;
21
+ export {};
@@ -1,14 +1,17 @@
1
1
  import { limitAngle, getDefaultElementDetailConfig } from '@idraw/util';
2
2
  export const middlewareEventTextEdit = '@middleware/text-edit';
3
+ export const middlewareEventTextChange = '@middleware/text-change';
3
4
  const defaultElementDetail = getDefaultElementDetailConfig();
4
5
  export const MiddlewareTextEditor = (opts) => {
5
6
  const { eventHub, boardContent, viewer } = opts;
6
7
  const canvas = boardContent.boardContext.canvas;
7
- const textarea = document.createElement('textarea');
8
+ const textarea = document.createElement('div');
9
+ textarea.setAttribute('contenteditable', 'true');
8
10
  const canvasWrapper = document.createElement('div');
9
11
  const container = opts.container || document.body;
10
12
  const mask = document.createElement('div');
11
13
  let activeElem = null;
14
+ let activePosition = [];
12
15
  canvasWrapper.appendChild(textarea);
13
16
  canvasWrapper.style.position = 'absolute';
14
17
  mask.appendChild(canvasWrapper);
@@ -27,6 +30,7 @@ export const MiddlewareTextEditor = (opts) => {
27
30
  const hideTextArea = () => {
28
31
  mask.style.display = 'none';
29
32
  activeElem = null;
33
+ activePosition = [];
30
34
  };
31
35
  const getCanvasRect = () => {
32
36
  const clientRect = canvas.getBoundingClientRect();
@@ -84,6 +88,23 @@ export const MiddlewareTextEditor = (opts) => {
84
88
  elemW = element.w * scale;
85
89
  elemH = element.h * scale;
86
90
  }
91
+ let justifyContent = 'center';
92
+ let alignItems = 'center';
93
+ if (detail.textAlign === 'left') {
94
+ justifyContent = 'start';
95
+ }
96
+ else if (detail.textAlign === 'right') {
97
+ justifyContent = 'end';
98
+ }
99
+ if (detail.verticalAlign === 'top') {
100
+ alignItems = 'start';
101
+ }
102
+ else if (detail.verticalAlign === 'bottom') {
103
+ alignItems = 'end';
104
+ }
105
+ textarea.style.display = 'inline-flex';
106
+ textarea.style.justifyContent = justifyContent;
107
+ textarea.style.alignItems = alignItems;
87
108
  textarea.style.position = 'absolute';
88
109
  textarea.style.left = `${elemX - 1}px`;
89
110
  textarea.style.top = `${elemY - 1}px`;
@@ -104,7 +125,7 @@ export const MiddlewareTextEditor = (opts) => {
104
125
  textarea.style.padding = '0';
105
126
  textarea.style.margin = '0';
106
127
  textarea.style.outline = 'none';
107
- textarea.value = detail.text || '';
128
+ textarea.innerText = detail.text || '';
108
129
  parent.appendChild(textarea);
109
130
  };
110
131
  const resetCanvasWrapper = () => {
@@ -122,19 +143,40 @@ export const MiddlewareTextEditor = (opts) => {
122
143
  textarea.addEventListener('click', (e) => {
123
144
  e.stopPropagation();
124
145
  });
125
- textarea.addEventListener('input', (e) => {
126
- if (activeElem) {
127
- activeElem.detail.text = e.target.value || '';
146
+ textarea.addEventListener('input', () => {
147
+ if (activeElem && activePosition) {
148
+ activeElem.detail.text = textarea.innerText || '';
149
+ eventHub.trigger(middlewareEventTextChange, {
150
+ element: {
151
+ uuid: activeElem.uuid,
152
+ detail: {
153
+ text: activeElem.detail.text
154
+ }
155
+ },
156
+ position: [...(activePosition || [])]
157
+ });
128
158
  viewer.drawFrame();
129
159
  }
130
160
  });
131
161
  textarea.addEventListener('blur', () => {
162
+ if (activeElem && activePosition) {
163
+ eventHub.trigger(middlewareEventTextChange, {
164
+ element: {
165
+ uuid: activeElem.uuid,
166
+ detail: {
167
+ text: activeElem.detail.text
168
+ }
169
+ },
170
+ position: [...activePosition]
171
+ });
172
+ }
132
173
  hideTextArea();
133
174
  });
134
175
  const textEditCallback = (e) => {
135
176
  var _a;
136
- 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') {
177
+ 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') {
137
178
  activeElem = e.element;
179
+ activePosition = e.position;
138
180
  }
139
181
  showTextArea(e);
140
182
  };