@idraw/core 0.4.3 → 1.0.0-alpha.1

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 (149) hide show
  1. package/dist/esm/board/index.d.ts +2 -2
  2. package/dist/esm/board/index.js +23 -12
  3. package/dist/esm/board/sharer.d.ts +3 -3
  4. package/dist/esm/board/sharer.js +10 -10
  5. package/dist/esm/board/viewer.d.ts +3 -3
  6. package/dist/esm/board/viewer.js +14 -14
  7. package/dist/esm/board/watcher.d.ts +3 -3
  8. package/dist/esm/board/watcher.js +68 -43
  9. package/dist/esm/core.d.ts +52 -0
  10. package/dist/esm/core.js +393 -0
  11. package/dist/esm/cursor/cursor-image.d.ts +2 -0
  12. package/dist/esm/cursor/cursor-image.js +2 -0
  13. package/dist/esm/cursor/cursor.js +60 -24
  14. package/dist/esm/index.d.ts +12 -61
  15. package/dist/esm/index.js +11 -389
  16. package/dist/esm/middlewares/common.d.ts +4 -0
  17. package/dist/esm/middlewares/common.js +13 -0
  18. package/dist/esm/middlewares/creator/dom.d.ts +11 -0
  19. package/dist/esm/middlewares/creator/dom.js +52 -0
  20. package/dist/esm/middlewares/creator/index.d.ts +5 -0
  21. package/dist/esm/middlewares/creator/index.js +136 -0
  22. package/dist/esm/middlewares/creator/static.d.ts +14 -0
  23. package/dist/esm/middlewares/creator/static.js +19 -0
  24. package/dist/esm/middlewares/creator/styles.d.ts +4 -0
  25. package/dist/esm/middlewares/creator/styles.js +32 -0
  26. package/dist/esm/middlewares/creator/types.d.ts +7 -0
  27. package/dist/esm/middlewares/creator/types.js +1 -0
  28. package/dist/esm/middlewares/creator/util.d.ts +10 -0
  29. package/dist/esm/middlewares/creator/util.js +52 -0
  30. package/dist/esm/middlewares/dragger/index.js +5 -5
  31. package/dist/esm/middlewares/info/draw-info.d.ts +11 -11
  32. package/dist/esm/middlewares/info/draw-info.js +18 -18
  33. package/dist/esm/middlewares/info/index.d.ts +2 -1
  34. package/dist/esm/middlewares/info/index.js +48 -51
  35. package/dist/esm/middlewares/info/static.d.ts +6 -0
  36. package/dist/esm/middlewares/info/{config.js → static.js} +6 -1
  37. package/dist/esm/middlewares/info/types.d.ts +2 -2
  38. package/dist/esm/middlewares/layout-selector/dom.d.ts +10 -0
  39. package/dist/esm/middlewares/layout-selector/dom.js +108 -0
  40. package/dist/esm/middlewares/layout-selector/index.d.ts +1 -1
  41. package/dist/esm/middlewares/layout-selector/index.js +89 -141
  42. package/dist/esm/middlewares/layout-selector/static.d.ts +32 -0
  43. package/dist/esm/middlewares/layout-selector/static.js +39 -0
  44. package/dist/esm/middlewares/layout-selector/styles.d.ts +4 -0
  45. package/dist/esm/middlewares/layout-selector/styles.js +127 -0
  46. package/dist/esm/middlewares/layout-selector/types.d.ts +6 -6
  47. package/dist/esm/middlewares/layout-selector/types.js +2 -2
  48. package/dist/esm/middlewares/layout-selector/util.d.ts +4 -4
  49. package/dist/esm/middlewares/layout-selector/util.js +19 -19
  50. package/dist/esm/middlewares/path-creator/dom.d.ts +29 -0
  51. package/dist/esm/middlewares/path-creator/dom.js +145 -0
  52. package/dist/esm/middlewares/path-creator/index.d.ts +5 -0
  53. package/dist/esm/middlewares/path-creator/index.js +203 -0
  54. package/dist/esm/middlewares/path-creator/static.d.ts +23 -0
  55. package/dist/esm/middlewares/path-creator/static.js +49 -0
  56. package/dist/esm/middlewares/path-creator/types.d.ts +1 -0
  57. package/dist/esm/middlewares/path-editor/calc.d.ts +6 -0
  58. package/dist/esm/middlewares/path-editor/calc.js +51 -0
  59. package/dist/esm/middlewares/path-editor/dom.d.ts +32 -0
  60. package/dist/esm/middlewares/path-editor/dom.js +575 -0
  61. package/dist/esm/middlewares/path-editor/draw.d.ts +7 -0
  62. package/dist/esm/middlewares/path-editor/draw.js +113 -0
  63. package/dist/esm/middlewares/path-editor/index.d.ts +5 -0
  64. package/dist/esm/middlewares/path-editor/index.js +312 -0
  65. package/dist/esm/middlewares/path-editor/parse.d.ts +5 -0
  66. package/dist/esm/middlewares/path-editor/parse.js +37 -0
  67. package/dist/esm/middlewares/path-editor/static.d.ts +34 -0
  68. package/dist/esm/middlewares/path-editor/static.js +82 -0
  69. package/dist/esm/middlewares/path-editor/types.d.ts +26 -0
  70. package/dist/esm/middlewares/path-editor/types.js +1 -0
  71. package/dist/esm/middlewares/path-editor/util.d.ts +5 -0
  72. package/dist/esm/middlewares/path-editor/util.js +21 -0
  73. package/dist/esm/middlewares/pointer/index.js +5 -5
  74. package/dist/esm/middlewares/pointer/types.d.ts +2 -2
  75. package/dist/esm/middlewares/ruler/index.d.ts +2 -0
  76. package/dist/esm/middlewares/ruler/index.js +12 -19
  77. package/dist/esm/middlewares/ruler/static.d.ts +8 -0
  78. package/dist/esm/middlewares/ruler/{config.js → static.js} +16 -3
  79. package/dist/esm/middlewares/ruler/types.d.ts +2 -2
  80. package/dist/esm/middlewares/ruler/util.d.ts +6 -6
  81. package/dist/esm/middlewares/ruler/util.js +31 -31
  82. package/dist/esm/middlewares/scaler/index.js +2 -2
  83. package/dist/esm/middlewares/scroller/dom.d.ts +14 -0
  84. package/dist/esm/middlewares/scroller/dom.js +53 -0
  85. package/dist/esm/middlewares/scroller/index.d.ts +2 -0
  86. package/dist/esm/middlewares/scroller/index.js +111 -46
  87. package/dist/esm/middlewares/scroller/static.d.ts +21 -0
  88. package/dist/esm/middlewares/scroller/static.js +29 -0
  89. package/dist/esm/middlewares/scroller/styles.d.ts +4 -0
  90. package/dist/esm/middlewares/scroller/styles.js +73 -0
  91. package/dist/esm/middlewares/scroller/types.d.ts +8 -6
  92. package/dist/esm/middlewares/scroller/types.js +1 -1
  93. package/dist/esm/middlewares/scroller/util.d.ts +6 -13
  94. package/dist/esm/middlewares/scroller/util.js +15 -144
  95. package/dist/esm/middlewares/selector/dom.d.ts +21 -0
  96. package/dist/esm/middlewares/selector/dom.js +395 -0
  97. package/dist/esm/middlewares/selector/draw-base.d.ts +9 -21
  98. package/dist/esm/middlewares/selector/draw-base.js +19 -43
  99. package/dist/esm/middlewares/selector/draw-reference.d.ts +4 -5
  100. package/dist/esm/middlewares/selector/draw-reference.js +5 -5
  101. package/dist/esm/middlewares/selector/index.d.ts +4 -2
  102. package/dist/esm/middlewares/selector/index.js +315 -439
  103. package/dist/esm/middlewares/selector/reference.d.ts +5 -5
  104. package/dist/esm/middlewares/selector/reference.js +36 -30
  105. package/dist/esm/middlewares/selector/render-frame.d.ts +11 -0
  106. package/dist/esm/middlewares/selector/render-frame.js +107 -0
  107. package/dist/esm/middlewares/selector/resize.d.ts +7 -0
  108. package/dist/esm/middlewares/selector/resize.js +27 -0
  109. package/dist/esm/middlewares/selector/static.d.ts +67 -0
  110. package/dist/esm/middlewares/selector/static.js +92 -0
  111. package/dist/esm/middlewares/selector/styles.d.ts +4 -0
  112. package/dist/esm/middlewares/selector/styles.js +153 -0
  113. package/dist/esm/middlewares/selector/types.d.ts +27 -27
  114. package/dist/esm/middlewares/selector/types.js +1 -1
  115. package/dist/esm/middlewares/selector/util.d.ts +22 -32
  116. package/dist/esm/middlewares/selector/util.js +226 -243
  117. package/dist/esm/middlewares/text-editor/dom.d.ts +5 -0
  118. package/dist/esm/middlewares/text-editor/dom.js +135 -0
  119. package/dist/esm/middlewares/text-editor/index.d.ts +5 -20
  120. package/dist/esm/middlewares/text-editor/index.js +201 -208
  121. package/dist/esm/middlewares/text-editor/static.d.ts +10 -0
  122. package/dist/esm/middlewares/text-editor/static.js +17 -0
  123. package/dist/esm/middlewares/text-editor/types.d.ts +21 -0
  124. package/dist/esm/middlewares/text-editor/types.js +1 -0
  125. package/dist/esm/record.d.ts +5 -5
  126. package/dist/esm/record.js +14 -14
  127. package/dist/esm/{config.d.ts → static.d.ts} +16 -0
  128. package/dist/esm/{config.js → static.js} +18 -2
  129. package/dist/index.global.js +8934 -5647
  130. package/dist/index.global.min.js +1 -1
  131. package/package.json +4 -4
  132. package/dist/esm/middlewares/info/config.d.ts +0 -5
  133. package/dist/esm/middlewares/layout-selector/config.d.ts +0 -11
  134. package/dist/esm/middlewares/layout-selector/config.js +0 -12
  135. package/dist/esm/middlewares/ruler/config.d.ts +0 -7
  136. package/dist/esm/middlewares/scroller/config.d.ts +0 -10
  137. package/dist/esm/middlewares/scroller/config.js +0 -16
  138. package/dist/esm/middlewares/selector/config.d.ts +0 -30
  139. package/dist/esm/middlewares/selector/config.js +0 -38
  140. package/dist/esm/middlewares/selector/draw-auxiliary.js +0 -12
  141. package/dist/esm/middlewares/selector/draw-debug.d.ts +0 -5
  142. package/dist/esm/middlewares/selector/draw-debug.js +0 -30
  143. package/dist/esm/middlewares/selector/draw-wrapper.d.ts +0 -37
  144. package/dist/esm/middlewares/selector/draw-wrapper.js +0 -139
  145. package/dist/esm/middlewares/selector/pattern/icon-rotate.d.ts +0 -4
  146. package/dist/esm/middlewares/selector/pattern/icon-rotate.js +0 -88
  147. package/dist/esm/middlewares/selector/pattern/index.d.ts +0 -8
  148. package/dist/esm/middlewares/selector/pattern/index.js +0 -38
  149. /package/dist/esm/middlewares/{selector/draw-auxiliary.d.ts → path-creator/types.js} +0 -0
@@ -0,0 +1,5 @@
1
+ import type { MiddlewareTextEditorStyles } from '@idraw/types';
2
+ import type { InnerOptions } from './types';
3
+ export declare function initStyles(rootClassName: string, styles: MiddlewareTextEditorStyles): void;
4
+ export declare function destroyStyles(rootClassName: string): void;
5
+ export declare const resetTextArea: (textarea: HTMLDivElement | null, canvasWrapper: HTMLDivElement | null, opts: InnerOptions) => void;
@@ -0,0 +1,135 @@
1
+ import { injectStyles, removeStyles, setHTMLCSSProps, limitAngle, getDefaultMaterialAttributes, enhanceFontFamliy, } from '@idraw/util';
2
+ import { classNameMap } from './static';
3
+ const defaultMaterialAttributes = getDefaultMaterialAttributes();
4
+ export function initStyles(rootClassName, styles) {
5
+ injectStyles({
6
+ type: 'element',
7
+ rootClassName,
8
+ styles: {
9
+ position: 'fixed',
10
+ top: '0',
11
+ bottom: '0',
12
+ left: '0',
13
+ right: '0',
14
+ display: 'block',
15
+ zIndex: styles.zIndex,
16
+ [`&.${classNameMap.hide}`]: {
17
+ display: 'none',
18
+ },
19
+ [`.${classNameMap.textarea}`]: {
20
+ display: 'inline-flex',
21
+ flexDirection: 'column',
22
+ position: 'absolute',
23
+ boxSizing: 'border-box',
24
+ overflow: 'hidden',
25
+ wordBreak: 'break-all',
26
+ padding: '0',
27
+ margin: '0',
28
+ outline: 'none',
29
+ border: `1px solid ${styles.boxBorderColor}`,
30
+ background: `transparent`,
31
+ },
32
+ [`.${classNameMap.canvasWrapper}`]: {
33
+ position: 'absolute',
34
+ },
35
+ },
36
+ });
37
+ }
38
+ export function destroyStyles(rootClassName) {
39
+ removeStyles({ rootClassName, type: 'element' });
40
+ }
41
+ const createBox = (opts) => {
42
+ const { size, parent } = opts;
43
+ const div = document.createElement('div');
44
+ const { x, y, width, height } = size;
45
+ const angle = limitAngle(size.angle || 0);
46
+ setHTMLCSSProps(div, {
47
+ position: 'absolute',
48
+ left: `${x}px`,
49
+ top: `${y}px`,
50
+ width: `${width}px`,
51
+ height: `${height}px`,
52
+ transform: `rotate(${angle}deg)`,
53
+ });
54
+ parent.appendChild(div);
55
+ return div;
56
+ };
57
+ export const resetTextArea = (textarea, canvasWrapper, opts) => {
58
+ if (!textarea || !canvasWrapper) {
59
+ return;
60
+ }
61
+ const { viewScaleInfo, material, groupQueue } = opts;
62
+ const { scale, offsetTop, offsetLeft } = viewScaleInfo;
63
+ if (canvasWrapper === null || canvasWrapper === void 0 ? void 0 : canvasWrapper.children) {
64
+ Array.from(canvasWrapper.children).forEach((child) => {
65
+ child.remove();
66
+ });
67
+ }
68
+ let parent = canvasWrapper;
69
+ for (let i = 0; i < groupQueue.length; i++) {
70
+ const group = groupQueue[i];
71
+ const { x, y, width, height } = group;
72
+ const angle = limitAngle(group.angle || 0);
73
+ const size = {
74
+ x: x * scale,
75
+ y: y * scale,
76
+ width: width * scale,
77
+ height: height * scale,
78
+ angle,
79
+ };
80
+ if (i === 0) {
81
+ size.x += offsetLeft;
82
+ size.y += offsetTop;
83
+ }
84
+ parent = createBox({ size, parent });
85
+ }
86
+ const attributes = Object.assign(Object.assign({}, defaultMaterialAttributes), material);
87
+ let mtrlX = material.x * scale + offsetLeft;
88
+ let mtrlY = material.y * scale + offsetTop;
89
+ let mtrlW = material.width * scale;
90
+ let mtrlH = material.height * scale;
91
+ if (groupQueue.length > 0) {
92
+ mtrlX = material.x * scale;
93
+ mtrlY = material.y * scale;
94
+ mtrlW = material.width * scale;
95
+ mtrlH = material.height * scale;
96
+ }
97
+ let justifyContent = 'center';
98
+ let alignItems = 'center';
99
+ if (attributes.textAlign === 'left') {
100
+ justifyContent = 'start';
101
+ }
102
+ else if (attributes.textAlign === 'right') {
103
+ justifyContent = 'end';
104
+ }
105
+ if (attributes.verticalAlign === 'top') {
106
+ alignItems = 'start';
107
+ }
108
+ else if (attributes.verticalAlign === 'bottom') {
109
+ alignItems = 'end';
110
+ }
111
+ setHTMLCSSProps(textarea, {
112
+ justifyContent: justifyContent,
113
+ alignItems: alignItems,
114
+ transform: `rotate(${limitAngle(material.angle || 0)}deg)`,
115
+ left: `${mtrlX - 1}px`,
116
+ top: `${mtrlY - 1}px`,
117
+ width: `${mtrlW + 2}px`,
118
+ height: `${mtrlH + 2}px`,
119
+ cornerRadius: `${(typeof attributes.cornerRadius === 'number' ? attributes.cornerRadius : 0) * scale}px`,
120
+ color: `${attributes.fill || '#000000'}`,
121
+ textStroke: `${typeof attributes.strokeWidth === 'number' && attributes.strokeWidth > 0
122
+ ? `${attributes.strokeWidth}px ${attributes.stroke}`
123
+ : ''}`,
124
+ '-webkit-text-stroke': `${typeof attributes.strokeWidth === 'number' && attributes.strokeWidth > 0
125
+ ? `${attributes.strokeWidth}px ${attributes.stroke}`
126
+ : ''}`,
127
+ fontSize: `${attributes.fontSize * scale}px`,
128
+ lineHeight: `${(attributes.lineHeight || attributes.fontSize) * scale}px`,
129
+ fontFamily: enhanceFontFamliy(attributes.fontFamily),
130
+ fontWeight: `${attributes.fontWeight}`,
131
+ opacity: attributes.opacity || 1,
132
+ });
133
+ textarea.innerText = attributes.text || '';
134
+ parent.appendChild(textarea);
135
+ };
@@ -1,20 +1,5 @@
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 {};
1
+ import type { Middleware, CoreEventMap, MiddlewareTextEditorConfig } from '@idraw/types';
2
+ import { getMiddlewareTextEditorStyles } from './static';
3
+ import type { ExtendEventMap } from './types';
4
+ export { getMiddlewareTextEditorStyles };
5
+ export declare const MiddlewareTextEditor: Middleware<ExtendEventMap, CoreEventMap & ExtendEventMap, MiddlewareTextEditorConfig>;
@@ -1,287 +1,280 @@
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;
1
+ import { updateMaterialInList, getGroupQueueByMaterialPosition, getMaterialAndGroupQueueFromList, addClassName, removeClassName, createHTMLElement, setHTMLCSSProps, } from '@idraw/util';
2
+ import { coreEventKeys } from '../../static';
3
+ import { initStyles, destroyStyles, resetTextArea } from './dom';
4
+ import { classNameMap, getRootClassName, defaultStyles, getMiddlewareTextEditorStyles } from './static';
5
+ import { triggerChangeEvent } from '../common';
6
+ export { getMiddlewareTextEditorStyles };
7
+ export const MiddlewareTextEditor = (options, config) => {
8
+ const { eventHub, boardContent, viewer, sharer, calculator } = options;
6
9
  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;
10
+ const container = options.container || document.body;
11
+ const innerConfig = Object.assign(Object.assign({}, defaultStyles), config);
12
+ const styles = getMiddlewareTextEditorStyles(innerConfig);
13
+ let activeMtrl = null;
13
14
  let activePosition = [];
14
15
  let originText = '';
16
+ let isShow = false;
15
17
  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);
18
+ const rootClassName = getRootClassName();
19
+ let textarea = null;
20
+ let canvasWrapper = null;
21
+ let root = null;
22
+ const initDOM = () => {
23
+ if (isShow === true) {
24
+ return;
25
+ }
26
+ textarea = createHTMLElement('div', {
27
+ className: classNameMap.textarea,
28
+ contenteditable: 'true',
29
+ });
30
+ canvasWrapper = createHTMLElement('div', {
31
+ className: classNameMap.canvasWrapper,
32
+ }, [textarea]);
33
+ root = createHTMLElement('div', {
34
+ id,
35
+ className: rootClassName,
36
+ }, [canvasWrapper]);
37
+ container.appendChild(root);
38
+ };
39
+ const destroyDOM = () => {
40
+ root === null || root === void 0 ? void 0 : root.remove();
41
+ };
27
42
  const showTextArea = (e) => {
43
+ if (!root || !textarea) {
44
+ return;
45
+ }
28
46
  resetCanvasWrapper();
29
- resetTextArea(e);
30
- mask.style.display = 'block';
47
+ resetTextArea(textarea, canvasWrapper, e);
48
+ removeClassName(root, [classNameMap.hide]);
31
49
  originText = '';
32
- if (activeElem === null || activeElem === void 0 ? void 0 : activeElem.uuid) {
33
- sharer.setActiveOverrideElemenentMap({
34
- [activeElem.uuid]: {
35
- operations: { invisible: true }
36
- }
50
+ isShow = true;
51
+ textarea.focus();
52
+ if (activeMtrl === null || activeMtrl === void 0 ? void 0 : activeMtrl.id) {
53
+ sharer.setActiveOverrideMaterialMap({
54
+ [activeMtrl.id]: {
55
+ operations: { invisible: true },
56
+ },
37
57
  });
38
- originText = activeElem.detail.text || '';
58
+ originText = activeMtrl.text || '';
39
59
  viewer.drawFrame();
40
60
  }
41
61
  };
42
62
  const hideTextArea = () => {
43
- if (activeElem === null || activeElem === void 0 ? void 0 : activeElem.uuid) {
44
- const map = sharer.getActiveOverrideElemenentMap();
63
+ if (activeMtrl === null || activeMtrl === void 0 ? void 0 : activeMtrl.id) {
64
+ const map = sharer.getActiveOverrideMaterialMap();
45
65
  if (map) {
46
- delete map[activeElem.uuid];
66
+ delete map[activeMtrl.id];
47
67
  }
48
- sharer.setActiveOverrideElemenentMap(map);
68
+ sharer.setActiveOverrideMaterialMap(map);
49
69
  viewer.drawFrame();
50
70
  }
51
- mask.style.display = 'none';
52
- activeElem = null;
71
+ if (root) {
72
+ addClassName(root, [classNameMap.hide]);
73
+ }
74
+ activeMtrl = null;
53
75
  activePosition = [];
76
+ isShow = false;
77
+ destroyDOM();
54
78
  };
55
79
  const getCanvasRect = () => {
56
80
  const clientRect = canvas.getBoundingClientRect();
57
81
  const { left, top, width, height } = clientRect;
58
82
  return { left, top, width, height };
59
83
  };
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.flexDirection = 'column';
127
- textarea.style.justifyContent = justifyContent;
128
- textarea.style.alignItems = alignItems;
129
- textarea.style.position = 'absolute';
130
- textarea.style.left = `${elemX - 1}px`;
131
- textarea.style.top = `${elemY - 1}px`;
132
- textarea.style.width = `${elemW + 2}px`;
133
- textarea.style.height = `${elemH + 2}px`;
134
- textarea.style.transform = `rotate(${limitAngle(element.angle || 0)}deg)`;
135
- textarea.style.boxSizing = 'border-box';
136
- textarea.style.border = '1px solid #1973ba';
137
- textarea.style.resize = 'none';
138
- textarea.style.overflow = 'hidden';
139
- textarea.style.wordBreak = 'break-all';
140
- textarea.style.borderRadius = `${(typeof detail.borderRadius === 'number' ? detail.borderRadius : 0) * scale}px`;
141
- textarea.style.background = `${detail.background || 'transparent'}`;
142
- textarea.style.color = `${detail.color || '#333333'}`;
143
- textarea.style.fontSize = `${detail.fontSize * scale}px`;
144
- textarea.style.lineHeight = `${(detail.lineHeight || detail.fontSize) * scale}px`;
145
- textarea.style.fontFamily = enhanceFontFamliy(detail.fontFamily);
146
- textarea.style.fontWeight = `${detail.fontWeight}`;
147
- textarea.style.padding = '0';
148
- textarea.style.margin = '0';
149
- textarea.style.outline = 'none';
150
- textarea.innerText = detail.text || '';
151
- parent.appendChild(textarea);
152
- };
153
84
  const resetCanvasWrapper = () => {
85
+ if (!canvasWrapper) {
86
+ return;
87
+ }
154
88
  const { left, top, width, height } = getCanvasRect();
155
- canvasWrapper.style.position = 'absolute';
156
- canvasWrapper.style.overflow = 'hidden';
157
- canvasWrapper.style.top = `${top}px`;
158
- canvasWrapper.style.left = `${left}px`;
159
- canvasWrapper.style.width = `${width}px`;
160
- canvasWrapper.style.height = `${height}px`;
89
+ setHTMLCSSProps(canvasWrapper, {
90
+ position: 'absolute',
91
+ overflow: 'hidden',
92
+ top: `${top}px`,
93
+ left: `${left}px`,
94
+ width: `${width}px`,
95
+ height: `${height}px`,
96
+ });
161
97
  };
162
98
  const maskClickEvent = () => {
163
99
  hideTextArea();
164
100
  };
165
- const textareaClickEvent = (e) => {
101
+ const textareaDoubleClickEvent = (e) => {
102
+ var _a;
166
103
  e.stopPropagation();
104
+ e.preventDefault();
105
+ (_a = window === null || window === void 0 ? void 0 : window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
106
+ };
107
+ const textareaSelectStartEvent = (e) => {
108
+ if (e.attributes === 2) {
109
+ e.preventDefault();
110
+ }
167
111
  };
168
112
  const textareaInputEvent = () => {
169
- if (activeElem && activePosition) {
170
- activeElem.detail.text = textarea.innerText || '';
113
+ if (!textarea) {
114
+ return;
115
+ }
116
+ if (activeMtrl && activePosition) {
117
+ activeMtrl.text = textarea.innerText || '';
171
118
  eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
172
- element: {
173
- uuid: activeElem.uuid,
174
- detail: {
175
- text: activeElem.detail.text
176
- }
119
+ material: {
120
+ id: activeMtrl.id,
121
+ attributes: {
122
+ text: activeMtrl.text,
123
+ },
177
124
  },
178
- position: [...(activePosition || [])]
125
+ position: [...(activePosition || [])],
126
+ });
127
+ const virtualItem = calculator.getVirtualItem(activeMtrl.id);
128
+ const data = sharer.getActiveStorage('data') || { materials: [] };
129
+ calculator.modifyVirtualAttributes(activeMtrl, {
130
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
131
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
132
+ groupQueue: getGroupQueueByMaterialPosition(data.materials, (virtualItem === null || virtualItem === void 0 ? void 0 : virtualItem.position) || []) || [],
179
133
  });
180
- calculator.modifyText(activeElem);
181
134
  viewer.drawFrame();
182
135
  }
183
136
  };
184
137
  const textareaBlurEvent = () => {
185
- if (activeElem && activePosition) {
186
- activeElem.detail.text = textarea.innerText || '';
138
+ if (activeMtrl && activePosition) {
139
+ activeMtrl.text = (textarea === null || textarea === void 0 ? void 0 : textarea.innerText) || '';
187
140
  eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
188
- element: {
189
- uuid: activeElem.uuid,
190
- detail: {
191
- text: activeElem.detail.text
192
- }
141
+ material: {
142
+ id: activeMtrl.id,
143
+ attributes: {
144
+ text: activeMtrl.text,
145
+ },
193
146
  },
194
- position: [...activePosition]
147
+ position: [...activePosition],
195
148
  });
196
- const data = sharer.getActiveStorage('data') || { elements: [] };
149
+ const data = sharer.getActiveStorage('data') || { materials: [] };
197
150
  const updateContent = {
198
- detail: {
199
- text: activeElem.detail.text
200
- }
151
+ text: activeMtrl.text,
201
152
  };
202
- updateElementInList(activeElem.uuid, updateContent, data.elements);
203
- eventHub.trigger(coreEventKeys.CHANGE, {
204
- selectedElements: [
205
- Object.assign(Object.assign({}, activeElem), { detail: Object.assign(Object.assign({}, activeElem.detail), updateContent.detail) })
153
+ updateMaterialInList(activeMtrl.id, updateContent, data.materials);
154
+ triggerChangeEvent(eventHub, {
155
+ selectedMaterials: [
156
+ Object.assign(Object.assign(Object.assign({}, activeMtrl), activeMtrl), updateContent),
206
157
  ],
207
158
  data,
208
- type: 'modifyElement',
159
+ type: 'modifyMaterial',
209
160
  modifyRecord: {
210
- type: 'modifyElement',
161
+ type: 'modifyMaterial',
211
162
  time: Date.now(),
212
163
  content: {
213
- method: 'modifyElement',
214
- uuid: activeElem.uuid,
164
+ method: 'modifyMaterial',
165
+ id: activeMtrl.id,
215
166
  before: {
216
- 'detail.text': originText
167
+ 'attributes.text': originText,
217
168
  },
218
169
  after: {
219
- 'detail.text': activeElem.detail.text
220
- }
221
- }
222
- }
170
+ 'attributes.text': activeMtrl.text,
171
+ },
172
+ },
173
+ },
174
+ });
175
+ const virtualItem = calculator.getVirtualItem(activeMtrl.id);
176
+ calculator.modifyVirtualAttributes(activeMtrl, {
177
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
178
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
179
+ groupQueue: getGroupQueueByMaterialPosition(data.materials, (virtualItem === null || virtualItem === void 0 ? void 0 : virtualItem.position) || []) || [],
223
180
  });
224
- calculator.modifyText(activeElem);
225
181
  viewer.drawFrame();
226
182
  }
227
183
  hideTextArea();
228
184
  };
229
- const textareaKeyDownEvent = (e) => {
230
- e.stopPropagation();
231
- };
232
- const textareaKeyPressEvent = (e) => {
233
- e.stopPropagation();
234
- };
235
- const textareaKeyUpEvent = (e) => {
185
+ const preventDefaultEvent = (e) => {
236
186
  e.stopPropagation();
237
187
  };
238
188
  const textareaWheelEvent = (e) => {
239
189
  e.stopPropagation();
240
190
  e.preventDefault();
241
191
  };
242
- mask.addEventListener('click', maskClickEvent);
243
- textarea.addEventListener('click', textareaClickEvent);
244
- textarea.addEventListener('input', textareaInputEvent);
245
- textarea.addEventListener('blur', textareaBlurEvent);
246
- textarea.addEventListener('keydown', textareaKeyDownEvent);
247
- textarea.addEventListener('keypress', textareaKeyPressEvent);
248
- textarea.addEventListener('keyup', textareaKeyUpEvent);
249
- textarea.addEventListener('wheel', textareaWheelEvent);
192
+ const onEvents = () => {
193
+ root === null || root === void 0 ? void 0 : root.addEventListener('click', maskClickEvent);
194
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('mousedown', preventDefaultEvent);
195
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('mouseover', preventDefaultEvent);
196
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('mouseenter', preventDefaultEvent);
197
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('mouseleave', preventDefaultEvent);
198
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('dblclick', textareaDoubleClickEvent);
199
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('selectstart', textareaSelectStartEvent);
200
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('click', preventDefaultEvent);
201
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('input', textareaInputEvent);
202
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('blur', textareaBlurEvent);
203
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('keydown', preventDefaultEvent);
204
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('keypress', preventDefaultEvent);
205
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('keyup', preventDefaultEvent);
206
+ textarea === null || textarea === void 0 ? void 0 : textarea.addEventListener('wheel', textareaWheelEvent);
207
+ };
208
+ const offEvents = () => {
209
+ root === null || root === void 0 ? void 0 : root.removeEventListener('click', maskClickEvent);
210
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('mousedown', preventDefaultEvent);
211
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('mouseover', preventDefaultEvent);
212
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('mouseenter', preventDefaultEvent);
213
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('mouseleave', preventDefaultEvent);
214
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('dblclick', textareaDoubleClickEvent);
215
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('selectstart', textareaSelectStartEvent);
216
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('click', preventDefaultEvent);
217
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('input', textareaInputEvent);
218
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('blur', textareaBlurEvent);
219
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('keydown', preventDefaultEvent);
220
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('keypress', preventDefaultEvent);
221
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('keyup', preventDefaultEvent);
222
+ textarea === null || textarea === void 0 ? void 0 : textarea.removeEventListener('wheel', textareaWheelEvent);
223
+ };
250
224
  const textEditCallback = (e) => {
251
- var _a;
252
- 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') {
253
- activeElem = e.element;
254
- activePosition = e.position;
225
+ const { id } = e;
226
+ if (!(typeof id === 'string' && id)) {
227
+ return;
228
+ }
229
+ initDOM();
230
+ onEvents();
231
+ const data = sharer.getActiveStorage('data');
232
+ const { material, groupQueue, position } = getMaterialAndGroupQueueFromList(id, data.materials);
233
+ if ((material === null || material === void 0 ? void 0 : material.type) === 'text') {
234
+ activeMtrl = material;
235
+ activePosition = position;
236
+ showTextArea({
237
+ material: activeMtrl,
238
+ groupQueue,
239
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
240
+ styles,
241
+ });
242
+ }
243
+ };
244
+ const preventAction = () => {
245
+ if (isShow === true) {
246
+ return false;
255
247
  }
256
- showTextArea(e);
257
248
  };
258
249
  return {
259
250
  name: '@middleware/text-editor',
260
251
  use() {
252
+ initStyles(rootClassName, styles);
261
253
  eventHub.on(coreEventKeys.TEXT_EDIT, textEditCallback);
262
254
  },
263
255
  disuse() {
256
+ destroyStyles(rootClassName);
264
257
  eventHub.off(coreEventKeys.TEXT_EDIT, textEditCallback);
265
- mask.removeEventListener('click', maskClickEvent);
266
- textarea.removeEventListener('click', textareaClickEvent);
267
- textarea.removeEventListener('input', textareaInputEvent);
268
- textarea.removeEventListener('blur', textareaBlurEvent);
269
- textarea.removeEventListener('keydown', textareaKeyDownEvent);
270
- textarea.removeEventListener('keypress', textareaKeyPressEvent);
271
- textarea.removeEventListener('keyup', textareaKeyUpEvent);
272
- textarea.removeEventListener('wheel', textareaWheelEvent);
273
- canvasWrapper.removeChild(textarea);
274
- mask.removeChild(canvasWrapper);
275
- container.removeChild(mask);
276
- textarea.remove();
277
- canvasWrapper.remove();
278
- mask = null;
258
+ offEvents();
259
+ destroyDOM();
279
260
  textarea = null;
280
261
  canvasWrapper = null;
281
- mask = null;
282
- activeElem = null;
262
+ root = null;
263
+ activeMtrl = null;
283
264
  activePosition = null;
284
265
  originText = null;
285
- }
266
+ },
267
+ hover: preventAction,
268
+ pointStart: preventAction,
269
+ pointMove: preventAction,
270
+ pointEnd: preventAction,
271
+ pointLeave: preventAction,
272
+ doubleClick: preventAction,
273
+ contextMenu: preventAction,
274
+ wheel: preventAction,
275
+ wheelScale: preventAction,
276
+ scrollX: preventAction,
277
+ scrollY: preventAction,
278
+ resize: preventAction,
286
279
  };
287
280
  };