@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,312 @@
1
+ import { createId, calcPointMoveMaterialInGroup, getMaterialSize, updateMaterialInList, moveInAnchorCommands, moveCurveCtrlInAnchorCommands, addClassName, removeClassName, refinePathMaterial, getMaterialAndGroupQueueFromList, } from '@idraw/util';
2
+ import { coreEventKeys } from '../../static';
3
+ import { ATTR_HELPER_TYPE, HELPER_ANCHOR, HELPER_DIRECTOR, classNameMap, defaultStyles, getRootClassName, getMiddlewarePathEditorStyles, } from './static';
4
+ import { resetRoot, resetAnchorStyle, getAnchorHandlerInfo, getDirectorHandlerInfo } from './dom';
5
+ import { calcPointInCanvas, getPathAnchorCommands } from './util';
6
+ import { calcPathSize, initRoot, initStyles, destroyStyles } from './dom';
7
+ export { getMiddlewarePathEditorStyles };
8
+ export const MiddlewarePathEditor = (opts, config) => {
9
+ const { viewer, eventHub, sharer, calculator } = opts;
10
+ const innerConfig = Object.assign(Object.assign({}, defaultStyles), config);
11
+ const { afterClickAway } = innerConfig;
12
+ const rootClassName = getRootClassName();
13
+ const styles = getMiddlewarePathEditorStyles(innerConfig);
14
+ const container = opts.container;
15
+ const id = `idraw-middleware-path-editor-${createId()}`;
16
+ let root = null;
17
+ let showEditor = false;
18
+ let hasInitedEvent = false;
19
+ let handlerStatus = null;
20
+ let selectedPathMaterial = null;
21
+ let selectedGroupQueue = null;
22
+ let prevPoint = null;
23
+ let moveOriginalStartMaterialSize = null;
24
+ let selectedAnchorHandler = null;
25
+ let selectedAnchorHandlerInfo = null;
26
+ let selectedPathAnchorCommands = null;
27
+ let selectedDirectorHandler = null;
28
+ let selectedDirectorHandlerInfo = null;
29
+ const clearData = () => {
30
+ selectedPathMaterial = null;
31
+ clearMoveData();
32
+ clearSelectedAnchorData();
33
+ };
34
+ const clearSelectedAnchorData = () => {
35
+ clearSelectedDirectorData();
36
+ selectedAnchorHandler = null;
37
+ selectedAnchorHandlerInfo = null;
38
+ selectedPathAnchorCommands = null;
39
+ };
40
+ const clearSelectedDirectorData = () => {
41
+ selectedDirectorHandler = null;
42
+ selectedDirectorHandlerInfo = null;
43
+ };
44
+ const clearSelectedStatus = () => {
45
+ if (!root) {
46
+ return;
47
+ }
48
+ const $selectedHandlers = Array.from(root.getElementsByClassName(classNameMap.selected));
49
+ $selectedHandlers.forEach(($handler) => {
50
+ removeClassName($handler, [classNameMap.selected]);
51
+ });
52
+ };
53
+ const clearMoveData = () => {
54
+ handlerStatus = null;
55
+ prevPoint = null;
56
+ moveOriginalStartMaterialSize = null;
57
+ };
58
+ const mouseDownEvent = (e) => {
59
+ const handler = e.target;
60
+ const helperType = handler === null || handler === void 0 ? void 0 : handler.getAttribute(ATTR_HELPER_TYPE);
61
+ if (helperType === HELPER_ANCHOR && selectedPathMaterial) {
62
+ e.stopPropagation();
63
+ e.preventDefault();
64
+ clearSelectedAnchorData();
65
+ moveOriginalStartMaterialSize = getMaterialSize(selectedPathMaterial);
66
+ const start = calcPointInCanvas(e, root);
67
+ prevPoint = start;
68
+ handlerStatus = 'dragging-anchor';
69
+ selectedAnchorHandler = handler;
70
+ selectedAnchorHandlerInfo = getAnchorHandlerInfo(handler);
71
+ selectedPathAnchorCommands = getPathAnchorCommands(selectedPathMaterial, { calculator });
72
+ window.addEventListener('mousemove', mouseMoveEvent);
73
+ addClassName(selectedAnchorHandler, [classNameMap.selected]);
74
+ viewer.drawFrame();
75
+ }
76
+ else if (helperType === HELPER_DIRECTOR && selectedPathMaterial) {
77
+ e.stopPropagation();
78
+ e.preventDefault();
79
+ clearSelectedDirectorData();
80
+ moveOriginalStartMaterialSize = getMaterialSize(selectedPathMaterial);
81
+ const start = calcPointInCanvas(e, root);
82
+ prevPoint = start;
83
+ handlerStatus = 'dragging-director';
84
+ selectedDirectorHandler = handler;
85
+ selectedDirectorHandlerInfo = getDirectorHandlerInfo(handler);
86
+ selectedPathAnchorCommands = getPathAnchorCommands(selectedPathMaterial, { calculator });
87
+ window.addEventListener('mousemove', mouseMoveEvent);
88
+ addClassName(selectedDirectorHandler, [classNameMap.selected]);
89
+ viewer.drawFrame();
90
+ }
91
+ else {
92
+ clearPathEditCallback();
93
+ afterClickAway === null || afterClickAway === void 0 ? void 0 : afterClickAway();
94
+ }
95
+ };
96
+ const mouseMoveEvent = (e) => {
97
+ if (prevPoint && selectedPathMaterial && moveOriginalStartMaterialSize && selectedPathAnchorCommands) {
98
+ const current = calcPointInCanvas(e, root);
99
+ const queue = [
100
+ ...(selectedGroupQueue || []),
101
+ Object.assign(Object.assign({}, moveOriginalStartMaterialSize), { type: 'group', id: selectedPathMaterial.id, angle: selectedPathMaterial.angle, children: [] }),
102
+ ];
103
+ const { moveX, moveY } = calcPointMoveMaterialInGroup(prevPoint, current, queue);
104
+ const scale = sharer.getActiveStorage('scale') || 1;
105
+ const totalMoveX = calculator.toGridNum(moveX / scale);
106
+ const totalMoveY = calculator.toGridNum(moveY / scale);
107
+ const acmds = [...selectedPathAnchorCommands];
108
+ if (selectedAnchorHandler && selectedAnchorHandlerInfo && handlerStatus === 'dragging-anchor') {
109
+ const newAcmds = moveInAnchorCommands(acmds, {
110
+ type: 'start',
111
+ index: selectedAnchorHandlerInfo.index,
112
+ moveX: totalMoveX,
113
+ moveY: totalMoveY,
114
+ });
115
+ const data = sharer.getActiveStorage('data');
116
+ const newCommands = newAcmds.map(({ id, type, params }) => ({ id, type, params }));
117
+ updateMaterialInList(selectedPathMaterial.id, {
118
+ commands: newCommands,
119
+ }, data.materials);
120
+ selectedPathMaterial.commands = newCommands;
121
+ calculator.modifyVirtualAttributes(selectedPathMaterial, {
122
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
123
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
124
+ groupQueue: selectedGroupQueue || [],
125
+ });
126
+ viewer.drawFrame();
127
+ }
128
+ else if (selectedDirectorHandler && selectedDirectorHandlerInfo && handlerStatus === 'dragging-director') {
129
+ const { type, fromAnchorId } = selectedDirectorHandlerInfo;
130
+ const updatedCmdIndex = acmds.findIndex((item) => item.id === fromAnchorId);
131
+ const newAcmds = moveCurveCtrlInAnchorCommands(acmds, {
132
+ type,
133
+ index: updatedCmdIndex,
134
+ moveX: totalMoveX,
135
+ moveY: totalMoveY,
136
+ });
137
+ const data = sharer.getActiveStorage('data') || { materials: [] };
138
+ const newCommands = newAcmds.map(({ id, type, params }) => ({ id, type, params }));
139
+ updateMaterialInList(selectedPathMaterial.id, {
140
+ commands: newCommands,
141
+ }, data.materials);
142
+ selectedPathMaterial.commands = newCommands;
143
+ calculator.modifyVirtualAttributes(selectedPathMaterial, {
144
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
145
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
146
+ groupQueue: selectedGroupQueue || [],
147
+ });
148
+ viewer.drawFrame();
149
+ }
150
+ }
151
+ };
152
+ const resetPathSize = () => {
153
+ calcPathSize(root);
154
+ };
155
+ const refineAction = () => {
156
+ if (!selectedPathMaterial) {
157
+ return;
158
+ }
159
+ selectedPathMaterial = refinePathMaterial(selectedPathMaterial);
160
+ const data = sharer.getActiveStorage('data') || { materials: [] };
161
+ updateMaterialInList(selectedPathMaterial.id, {
162
+ x: selectedPathMaterial.x,
163
+ y: selectedPathMaterial.y,
164
+ width: selectedPathMaterial.width,
165
+ height: selectedPathMaterial.height,
166
+ commands: selectedPathMaterial.commands,
167
+ }, data.materials);
168
+ calculator.modifyVirtualAttributes(selectedPathMaterial, {
169
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
170
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
171
+ groupQueue: selectedGroupQueue || [],
172
+ });
173
+ viewer.drawFrame();
174
+ };
175
+ const mouseUpEvent = () => {
176
+ window.removeEventListener('mousemove', mouseMoveEvent);
177
+ refineAction();
178
+ clearSelectedStatus();
179
+ clearMoveData();
180
+ resetPathSize();
181
+ };
182
+ const mouseLeaveEvent = () => {
183
+ window.removeEventListener('mousemove', mouseMoveEvent);
184
+ refineAction();
185
+ clearSelectedStatus();
186
+ clearMoveData();
187
+ resetPathSize();
188
+ };
189
+ const onEvents = () => {
190
+ if (hasInitedEvent) {
191
+ return;
192
+ }
193
+ root === null || root === void 0 ? void 0 : root.addEventListener('mousedown', mouseDownEvent);
194
+ window.addEventListener('mouseup', mouseUpEvent);
195
+ window.addEventListener('mouseleave', mouseLeaveEvent);
196
+ hasInitedEvent = true;
197
+ };
198
+ const offEvents = () => {
199
+ root === null || root === void 0 ? void 0 : root.removeEventListener('mousedown', mouseDownEvent);
200
+ window.removeEventListener('mouseup', mouseUpEvent);
201
+ window.removeEventListener('mouseleave', mouseLeaveEvent);
202
+ hasInitedEvent = false;
203
+ };
204
+ const init = () => {
205
+ if (!container) {
206
+ return;
207
+ }
208
+ root = initRoot(container, { id, rootClassName });
209
+ if (!container.contains(root)) {
210
+ container.appendChild(root);
211
+ }
212
+ showEditor = true;
213
+ };
214
+ const destroy = () => {
215
+ offEvents();
216
+ root === null || root === void 0 ? void 0 : root.remove();
217
+ root = null;
218
+ showEditor = false;
219
+ };
220
+ const pathEditCallback = (e) => {
221
+ init();
222
+ const { id } = e;
223
+ if (typeof id === 'string' && id) {
224
+ const data = sharer.getActiveStorage('data');
225
+ const { groupQueue, material } = getMaterialAndGroupQueueFromList(id, data.materials);
226
+ if ((material === null || material === void 0 ? void 0 : material.type) === 'path') {
227
+ selectedPathMaterial = material;
228
+ selectedGroupQueue = [...groupQueue];
229
+ resetRoot(root, {
230
+ material: material,
231
+ groupQueue,
232
+ calculator,
233
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
234
+ styles,
235
+ });
236
+ onEvents();
237
+ const map = sharer.getActiveOverrideMaterialMap() || {};
238
+ map[material.id] = {
239
+ operations: { renderPathTrace: true },
240
+ };
241
+ sharer.setActiveOverrideMaterialMap(map);
242
+ viewer.drawFrame();
243
+ }
244
+ }
245
+ };
246
+ const clearPathEditCallback = () => {
247
+ const map = sharer.getActiveOverrideMaterialMap() || {};
248
+ delete map[selectedPathMaterial === null || selectedPathMaterial === void 0 ? void 0 : selectedPathMaterial.id];
249
+ sharer.setActiveOverrideMaterialMap(map);
250
+ clearData();
251
+ destroy();
252
+ viewer.drawFrame();
253
+ };
254
+ return {
255
+ name: '@middleware/pen-edit',
256
+ use() {
257
+ initStyles(rootClassName, styles);
258
+ eventHub.on(coreEventKeys.PATH_EDIT, pathEditCallback);
259
+ eventHub.on(coreEventKeys.CLEAR_PATH_EDIT, clearPathEditCallback);
260
+ },
261
+ disuse() {
262
+ destroyStyles(rootClassName);
263
+ eventHub.off(coreEventKeys.PATH_EDIT, pathEditCallback);
264
+ eventHub.off(coreEventKeys.CLEAR_PATH_EDIT, clearPathEditCallback);
265
+ },
266
+ beforeDrawFrame() {
267
+ resetAnchorStyle(root, {
268
+ selectedAnchorId: selectedAnchorHandlerInfo === null || selectedAnchorHandlerInfo === void 0 ? void 0 : selectedAnchorHandlerInfo.id,
269
+ material: selectedPathMaterial,
270
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
271
+ calculator,
272
+ styles,
273
+ });
274
+ },
275
+ hover() {
276
+ return !showEditor;
277
+ },
278
+ pointStart() {
279
+ return !showEditor;
280
+ },
281
+ pointMove() {
282
+ return !showEditor;
283
+ },
284
+ pointEnd() {
285
+ return !showEditor;
286
+ },
287
+ pointLeave() {
288
+ return !showEditor;
289
+ },
290
+ doubleClick() {
291
+ return !showEditor;
292
+ },
293
+ contextMenu() {
294
+ return !showEditor;
295
+ },
296
+ wheel() {
297
+ return !showEditor;
298
+ },
299
+ wheelScale() {
300
+ return !showEditor;
301
+ },
302
+ scrollX() {
303
+ return !showEditor;
304
+ },
305
+ scrollY() {
306
+ return !showEditor;
307
+ },
308
+ resize() {
309
+ return !showEditor;
310
+ },
311
+ };
312
+ };
@@ -0,0 +1,5 @@
1
+ import type { Point, Context2DMoveToCommand, Context2DBezierCurveCommand, Context2DEllipseCommand } from '@idraw/types';
2
+ import type { CommandItem } from './types';
3
+ export declare function parseMoveTo(cmd: Context2DMoveToCommand): CommandItem;
4
+ export declare function parseBezierCurveTo(prevPoint: Point, cmd: Context2DBezierCurveCommand): CommandItem;
5
+ export declare function parseEllipse(prevPoint: Point, cmd: Context2DEllipseCommand): CommandItem;
@@ -0,0 +1,37 @@
1
+ import { rotatePoint } from '@idraw/util';
2
+ export function parseMoveTo(cmd) {
3
+ const { id, name, params } = cmd;
4
+ const { x, y } = params;
5
+ const item = {
6
+ id,
7
+ name,
8
+ start: { x, y },
9
+ end: { x, y },
10
+ };
11
+ return item;
12
+ }
13
+ export function parseBezierCurveTo(prevPoint, cmd) {
14
+ const { id, name, params } = cmd;
15
+ const { cp1x, cp1y, cp2x, cp2y, x, y } = params;
16
+ const item = {
17
+ id,
18
+ name,
19
+ start: { x: prevPoint.x, y: prevPoint.y },
20
+ end: { x, y },
21
+ ctrl1: { x: cp1x, y: cp1y },
22
+ ctrl2: { x: cp2x, y: cp2y },
23
+ };
24
+ return item;
25
+ }
26
+ export function parseEllipse(prevPoint, cmd) {
27
+ const { id, name, params } = cmd;
28
+ const { centerX, centerY, endRadian, startRadian } = params;
29
+ const item = {
30
+ id,
31
+ name,
32
+ start: { x: prevPoint.x, y: prevPoint.y },
33
+ end: rotatePoint({ x: centerX, y: centerY }, prevPoint, endRadian - startRadian),
34
+ center: { x: centerX, y: centerY },
35
+ };
36
+ return item;
37
+ }
@@ -0,0 +1,34 @@
1
+ import type { MiddlewarePathEditorStyles, MiddlewarePathEditorConfig } from '@idraw/types';
2
+ export declare const key = "PATH-EDITOR";
3
+ export declare const getRootClassName: () => string;
4
+ export declare const classNameMap: {
5
+ hide: string;
6
+ anchor: string;
7
+ director: string;
8
+ directorLines: string;
9
+ pathLine: string;
10
+ selected: string;
11
+ };
12
+ export declare const ATTR_UUID = "data-uuid";
13
+ export declare const ATTR_X = "data-x";
14
+ export declare const ATTR_Y = "data-y";
15
+ export declare const ATTR_W = "data-w";
16
+ export declare const ATTR_H = "data-h";
17
+ export declare const ATTR_ANGLE = "data-angle";
18
+ export declare const ATTR_TYPE = "data-type";
19
+ export declare const ATTR_HELPER_TYPE = "data-helper-type";
20
+ export declare const ATTR_AHCHOR_CMD_TYPE = "data-anchor-cmd-type";
21
+ export declare const ATTR_AHCHOR_INDEX = "data-anchor-index";
22
+ export declare const ATTR_AHCHOR_ID = "data-anchor-id";
23
+ export declare const ATTR_DIRECTOR_FROM_AHCHOR_ID = "data-director-from-anchor-id";
24
+ export declare const ATTR_DIRECTOR_CONTROL_TYPE = "data-director-control-type";
25
+ export declare const ATTR_DIRECTOR_OPENED_BY_AHCHOR_ID = "data-director-opened-by-anchor-id";
26
+ export declare const HELPER_GROUP = "group";
27
+ export declare const HELPER_ELEMENT = "material";
28
+ export declare const HELPER_ANCHOR = "anchor";
29
+ export declare const HELPER_DIRECTOR = "director";
30
+ export declare const HELPER_DIRECTOR_LINE = "director-line";
31
+ export declare const HELPER_PATH_PREVIEW = "path-preview";
32
+ export declare const HELPER_PATH_DEFINITION = "path-definition";
33
+ export declare const defaultStyles: MiddlewarePathEditorStyles;
34
+ export declare function getMiddlewarePathEditorStyles<C = MiddlewarePathEditorConfig, S = MiddlewarePathEditorStyles>(config: C): S;
@@ -0,0 +1,82 @@
1
+ import { createId, getMiddlewareValidStyles } from '@idraw/util';
2
+ export const key = 'PATH-EDITOR';
3
+ const prefix = `idraw-middleware-path-creator`;
4
+ export const getRootClassName = () => `${prefix}-${createId()}`;
5
+ export const classNameMap = {
6
+ hide: `${prefix}-hide`,
7
+ anchor: `${prefix}-anchor`,
8
+ director: `${prefix}-director`,
9
+ directorLines: `${prefix}-director-lines`,
10
+ pathLine: `${prefix}-path-line`,
11
+ selected: `${prefix}-selected`,
12
+ };
13
+ export const ATTR_UUID = `data-uuid`;
14
+ export const ATTR_X = `data-x`;
15
+ export const ATTR_Y = `data-y`;
16
+ export const ATTR_W = `data-w`;
17
+ export const ATTR_H = `data-h`;
18
+ export const ATTR_ANGLE = `data-angle`;
19
+ export const ATTR_TYPE = `data-type`;
20
+ export const ATTR_HELPER_TYPE = `data-helper-type`;
21
+ export const ATTR_AHCHOR_CMD_TYPE = `data-anchor-cmd-type`;
22
+ export const ATTR_AHCHOR_INDEX = `data-anchor-index`;
23
+ export const ATTR_AHCHOR_ID = `data-anchor-id`;
24
+ export const ATTR_DIRECTOR_FROM_AHCHOR_ID = `data-director-from-anchor-id`;
25
+ export const ATTR_DIRECTOR_CONTROL_TYPE = `data-director-control-type`;
26
+ export const ATTR_DIRECTOR_OPENED_BY_AHCHOR_ID = `data-director-opened-by-anchor-id`;
27
+ export const HELPER_GROUP = 'group';
28
+ export const HELPER_ELEMENT = 'material';
29
+ export const HELPER_ANCHOR = 'anchor';
30
+ export const HELPER_DIRECTOR = 'director';
31
+ export const HELPER_DIRECTOR_LINE = 'director-line';
32
+ export const HELPER_PATH_PREVIEW = 'path-preview';
33
+ export const HELPER_PATH_DEFINITION = 'path-definition';
34
+ export const defaultStyles = {
35
+ zIndex: 2,
36
+ anchorSize: 8,
37
+ anchorSelectedSize: 12,
38
+ anchorBorderWidth: 2,
39
+ anchorBorderColor: '#0c8ce9',
40
+ anchorBackground: '#ffffff',
41
+ anchorHoverBorderColor: '#1671b8',
42
+ anchorHoverBackground: '#cfe4f4',
43
+ anchorActiveBorderColor: '#0d548c',
44
+ anchorActiveBackground: '#88c0ec',
45
+ directorSize: 10,
46
+ directorBorderWidth: 2,
47
+ directorBorderColor: '#7315d1ff',
48
+ directorBackground: '#ffffff',
49
+ directorHoverBorderColor: '#4716b8ff',
50
+ directorHoverBackground: '#ebcff4ff',
51
+ directorActiveBorderColor: '#510d8cff',
52
+ directorActiveBackground: '#c988ecff',
53
+ directorLineColor: '#7315d1ff',
54
+ helperStrokeColor: '#0c8ce9',
55
+ helperStrokeWidth: 1,
56
+ };
57
+ export function getMiddlewarePathEditorStyles(config) {
58
+ const styles = getMiddlewareValidStyles(config, [
59
+ 'zIndex',
60
+ 'anchorSize',
61
+ 'anchorSelectedSize',
62
+ 'anchorBorderWidth',
63
+ 'anchorBorderColor',
64
+ 'anchorBackground',
65
+ 'anchorHoverBorderColor',
66
+ 'anchorHoverBackground',
67
+ 'anchorActiveBorderColor',
68
+ 'anchorActiveBackground',
69
+ 'directorSize',
70
+ 'directorBorderWidth',
71
+ 'directorBorderColor',
72
+ 'directorBackground',
73
+ 'directorHoverBorderColor',
74
+ 'directorHoverBackground',
75
+ 'directorActiveBorderColor',
76
+ 'directorActiveBackground',
77
+ 'directorLineColor',
78
+ 'helperStrokeColor',
79
+ 'helperStrokeWidth',
80
+ ]);
81
+ return styles;
82
+ }
@@ -0,0 +1,26 @@
1
+ import type { Point, Context2DCommand } from '@idraw/types';
2
+ export type PathEditorSharedStorage = {};
3
+ export type CommandItem = {
4
+ id: string;
5
+ name: Context2DCommand['name'];
6
+ start: Point;
7
+ end: Point;
8
+ ctrl1?: Point;
9
+ ctrl2?: Point;
10
+ center?: Point;
11
+ };
12
+ export type Directioner = {
13
+ anchorId: string;
14
+ openedByAnchorId: string;
15
+ anchorPoint: Point;
16
+ directPoint: Point;
17
+ };
18
+ export type AnchorInfo = {
19
+ id: string;
20
+ index: number;
21
+ };
22
+ export type DirectorInfo = {
23
+ type: 'curve-ctrl1' | 'curve-ctrl2';
24
+ fromAnchorId: string;
25
+ openedAnchorId: string;
26
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { StrictMaterial, Point, PathAnchorCommand, ViewCalculator } from '@idraw/types';
2
+ export declare function calcPointInCanvas(e: MouseEvent, container: HTMLElement): Point;
3
+ export declare function getPathAnchorCommands(material: StrictMaterial<'path'> | null, opts: {
4
+ calculator: ViewCalculator;
5
+ }): PathAnchorCommand[];
@@ -0,0 +1,21 @@
1
+ export function calcPointInCanvas(e, container) {
2
+ const { pageX, pageY } = e;
3
+ const rect = container.getBoundingClientRect();
4
+ const scrollLeft = window.scrollX || document.documentElement.scrollLeft;
5
+ const scrollTop = window.scrollY || document.documentElement.scrollTop;
6
+ const containerPageX = rect.left + scrollLeft;
7
+ const containerPageY = rect.top + scrollTop;
8
+ const containerX = pageX - containerPageX;
9
+ const containerY = pageY - containerPageY;
10
+ return {
11
+ x: containerX,
12
+ y: containerY,
13
+ };
14
+ }
15
+ export function getPathAnchorCommands(material, opts) {
16
+ const { calculator } = opts;
17
+ const { id } = material;
18
+ const flatItem = calculator.getVirtualItem(id);
19
+ const cmds = [...(flatItem.anchorCommands || [])];
20
+ return cmds;
21
+ }
@@ -1,5 +1,5 @@
1
- import { keySelectedElementList } from '../selector';
2
- import { coreEventKeys } from '../../config';
1
+ import { keySelectedMaterialList } from '../selector';
2
+ import { coreEventKeys } from '../../static';
3
3
  export const MiddlewarePointer = (opts) => {
4
4
  const { boardContent, eventHub, sharer } = opts;
5
5
  const canvas = boardContent.boardContext.canvas;
@@ -32,11 +32,11 @@ export const MiddlewarePointer = (opts) => {
32
32
  const { left, top } = getCanvasRect();
33
33
  contextMenuPointer.style.left = `${left + point.x}px`;
34
34
  contextMenuPointer.style.top = `${top + point.y}px`;
35
- const selectedElements = sharer.getSharedStorage(keySelectedElementList);
35
+ const selectedMaterials = sharer.getSharedStorage(keySelectedMaterialList);
36
36
  eventHub.trigger(coreEventKeys.CONTEXT_MENU, {
37
37
  pointerContainer: contextMenuPointer,
38
- selectedElements: selectedElements || []
38
+ selectedMaterials: selectedMaterials || [],
39
39
  });
40
- }
40
+ },
41
41
  };
42
42
  };
@@ -1,3 +1,3 @@
1
- import { keySelectedElementList } from '../selector';
1
+ import { keySelectedMaterialList } from '../selector';
2
2
  import type { DeepSelectorSharedStorage } from '../selector';
3
- export type DeepPointerSharedStorage = Pick<DeepSelectorSharedStorage, typeof keySelectedElementList>;
3
+ export type DeepPointerSharedStorage = Pick<DeepSelectorSharedStorage, typeof keySelectedMaterialList>;
@@ -1,3 +1,5 @@
1
1
  import type { Middleware, CoreEventMap, MiddlewareRulerConfig } from '@idraw/types';
2
2
  import type { DeepRulerSharedStorage } from './types';
3
+ import { getMiddlewareRulerStyles } from './static';
4
+ export { getMiddlewareRulerStyles };
3
5
  export declare const MiddlewareRuler: Middleware<DeepRulerSharedStorage, CoreEventMap, MiddlewareRulerConfig>;
@@ -1,11 +1,13 @@
1
1
  import { getViewScaleInfoFromSnapshot, getViewSizeInfoFromSnapshot } from '@idraw/util';
2
- import { drawRulerBackground, drawXRuler, drawYRuler, calcXRulerScaleList, calcYRulerScaleList, drawGrid, drawScrollerSelectedArea } from './util';
3
- import { defaultStyle } from './config';
4
- import { coreEventKeys } from '../../config';
2
+ import { drawRulerBackground, drawXRuler, drawYRuler, calcXRulerScaleList, calcYRulerScaleList, drawGrid, drawScrollerSelectedArea, } from './util';
3
+ import { defaultStyle, getMiddlewareRulerStyles } from './static';
4
+ import { coreEventKeys } from '../../static';
5
+ export { getMiddlewareRulerStyles };
5
6
  export const MiddlewareRuler = (opts, config) => {
6
7
  const { boardContent, viewer, eventHub, calculator } = opts;
7
8
  const { overlayContext, underlayContext } = boardContent;
8
9
  let innerConfig = Object.assign(Object.assign({}, defaultStyle), config);
10
+ let styles = getMiddlewareRulerStyles(innerConfig);
9
11
  let show = true;
10
12
  let showGrid = true;
11
13
  const rulerCallback = (e) => {
@@ -29,27 +31,18 @@ export const MiddlewareRuler = (opts, config) => {
29
31
  },
30
32
  resetConfig(config) {
31
33
  innerConfig = Object.assign(Object.assign({}, innerConfig), config);
34
+ styles = getMiddlewareRulerStyles(innerConfig);
32
35
  },
33
36
  beforeDrawFrame: ({ snapshot }) => {
34
- const { background, borderColor, scaleColor, textColor, gridColor, gridPrimaryColor, selectedAreaColor } = innerConfig;
35
- const style = {
36
- background,
37
- borderColor,
38
- scaleColor,
39
- textColor,
40
- gridColor,
41
- gridPrimaryColor,
42
- selectedAreaColor
43
- };
44
37
  if (show === true) {
45
38
  const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
46
39
  const viewSizeInfo = getViewSizeInfoFromSnapshot(snapshot);
47
- drawRulerBackground(overlayContext, { viewScaleInfo, viewSizeInfo, style });
48
- drawScrollerSelectedArea(overlayContext, { snapshot, calculator, style });
40
+ drawRulerBackground(overlayContext, { viewScaleInfo, viewSizeInfo, styles });
41
+ drawScrollerSelectedArea(overlayContext, { snapshot, calculator, styles });
49
42
  const { list: xList, rulerUnit } = calcXRulerScaleList({ viewScaleInfo, viewSizeInfo });
50
- drawXRuler(overlayContext, { scaleList: xList, style });
43
+ drawXRuler(overlayContext, { scaleList: xList, styles });
51
44
  const { list: yList } = calcYRulerScaleList({ viewScaleInfo, viewSizeInfo });
52
- drawYRuler(overlayContext, { scaleList: yList, style });
45
+ drawYRuler(overlayContext, { scaleList: yList, styles });
53
46
  if (showGrid === true) {
54
47
  const ctx = rulerUnit === 1 ? overlayContext : underlayContext;
55
48
  drawGrid(ctx, {
@@ -57,10 +50,10 @@ export const MiddlewareRuler = (opts, config) => {
57
50
  yList,
58
51
  viewScaleInfo,
59
52
  viewSizeInfo,
60
- style
53
+ styles,
61
54
  });
62
55
  }
63
56
  }
64
- }
57
+ },
65
58
  };
66
59
  };
@@ -0,0 +1,8 @@
1
+ import type { MiddlewareRulerConfig, MiddlewareRulerStyles } from '@idraw/types';
2
+ export declare const rulerSize = 16;
3
+ export declare const fontSize = 10;
4
+ export declare const fontWeight = 100;
5
+ export declare const lineSize = 1;
6
+ export declare const fontFamily = "monospace";
7
+ export declare const defaultStyle: MiddlewareRulerStyles;
8
+ export declare function getMiddlewareRulerStyles<C = MiddlewareRulerConfig, S = MiddlewareRulerStyles>(config: C): S;