@idraw/core 0.4.2 → 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 -207
  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 -5646
  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
@@ -1,13 +1,13 @@
1
- import type { Data, Element, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator } from '@idraw/types';
2
- export declare function calcReferenceInfo(uuid: string, opts: {
1
+ import type { Data, StrictMaterial, Point, ViewScaleInfo, ViewSizeInfo, ViewCalculator } from '@idraw/types';
2
+ export declare function calcReferenceInfo(id: string, opts: {
3
3
  data: Data;
4
- groupQueue: Element<'group'>[];
4
+ groupQueue: StrictMaterial<'group'>[];
5
5
  calculator: ViewCalculator;
6
6
  viewScaleInfo: ViewScaleInfo;
7
7
  viewSizeInfo: ViewSizeInfo;
8
8
  }): {
9
9
  offsetX: number | null;
10
10
  offsetY: number | null;
11
- yLines: PointSize[][];
12
- xLines: PointSize[][];
11
+ yLines: Point[][];
12
+ xLines: Point[][];
13
13
  } | null;
@@ -1,13 +1,13 @@
1
1
  import { is } from '@idraw/util';
2
2
  const unitSize = 2;
3
- function getViewBoxInfo(rectInfo) {
3
+ function getViewBoxInfo(boundingBox) {
4
4
  const boxInfo = {
5
- minX: rectInfo.topLeft.x,
6
- minY: rectInfo.topLeft.y,
7
- maxX: rectInfo.bottomRight.x,
8
- maxY: rectInfo.bottomRight.y,
9
- midX: rectInfo.center.x,
10
- midY: rectInfo.center.y
5
+ minX: boundingBox.topLeft.x,
6
+ minY: boundingBox.topLeft.y,
7
+ maxX: boundingBox.bottomRight.x,
8
+ maxY: boundingBox.bottomRight.y,
9
+ midX: boundingBox.center.x,
10
+ midY: boundingBox.center.y,
11
11
  };
12
12
  return boxInfo;
13
13
  }
@@ -38,27 +38,33 @@ const getClosestNumInSortedKeys = (sortedKeys, target) => {
38
38
  if (right < 0) {
39
39
  return sortedKeys[left];
40
40
  }
41
- return Math.abs(sortedKeys[right] - target) <= Math.abs(sortedKeys[left] - target) ? sortedKeys[right] : sortedKeys[left];
41
+ return Math.abs(sortedKeys[right] - target) <= Math.abs(sortedKeys[left] - target)
42
+ ? sortedKeys[right]
43
+ : sortedKeys[left];
42
44
  };
43
45
  const isEqualNum = (a, b) => Math.abs(a - b) < 0.00001;
44
- export function calcReferenceInfo(uuid, opts) {
45
- var _a, _b;
46
+ export function calcReferenceInfo(id, opts) {
47
+ var _a;
46
48
  const { data, groupQueue, calculator, viewScaleInfo, viewSizeInfo } = opts;
47
- let targetElements = data.elements || [];
49
+ let targetMaterials = data.materials || [];
48
50
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
49
- targetElements = ((_b = (_a = groupQueue[groupQueue.length - 1]) === null || _a === void 0 ? void 0 : _a.detail) === null || _b === void 0 ? void 0 : _b.children) || [];
51
+ targetMaterials = ((_a = groupQueue[groupQueue.length - 1]) === null || _a === void 0 ? void 0 : _a.children) || [];
50
52
  }
51
- const siblingViewRectInfoList = [];
52
- targetElements.forEach((elem) => {
53
- if (elem.uuid !== uuid) {
54
- const info = calculator.calcViewRectInfoFromRange(elem.uuid, { checkVisible: true, viewScaleInfo, viewSizeInfo });
53
+ const siblingBoundingInfoList = [];
54
+ targetMaterials.forEach((mtrl) => {
55
+ if (mtrl.id !== id) {
56
+ const info = calculator.calcViewBoundingInfoFromRange(mtrl.id, {
57
+ checkVisible: true,
58
+ viewScaleInfo,
59
+ viewSizeInfo,
60
+ });
55
61
  if (info) {
56
- siblingViewRectInfoList.push(info);
62
+ siblingBoundingInfoList.push(info);
57
63
  }
58
64
  }
59
65
  });
60
- const targetRectInfo = calculator.calcViewRectInfoFromRange(uuid, { viewScaleInfo, viewSizeInfo });
61
- if (!targetRectInfo) {
66
+ const targetBoundingBox = calculator.calcViewBoundingInfoFromRange(id, { viewScaleInfo, viewSizeInfo });
67
+ if (!targetBoundingBox) {
62
68
  return null;
63
69
  }
64
70
  const vTargetLineDotMap = {};
@@ -69,14 +75,14 @@ export function calcReferenceInfo(uuid, opts) {
69
75
  const hHelperLineDotMapList = [];
70
76
  let sortedRefXKeys = [];
71
77
  let sortedRefYKeys = [];
72
- const targetBox = getViewBoxInfo(targetRectInfo);
78
+ const targetBox = getViewBoxInfo(targetBoundingBox);
73
79
  vTargetLineDotMap[targetBox.minX] = [targetBox.minY, targetBox.midY, targetBox.maxY];
74
80
  vTargetLineDotMap[targetBox.midX] = [targetBox.minY, targetBox.midY, targetBox.maxY];
75
81
  vTargetLineDotMap[targetBox.maxX] = [targetBox.minY, targetBox.midY, targetBox.maxY];
76
82
  hTargetLineDotMap[targetBox.minY] = [targetBox.minX, targetBox.midX, targetBox.maxX];
77
83
  hTargetLineDotMap[targetBox.midY] = [targetBox.minX, targetBox.midX, targetBox.maxX];
78
84
  hTargetLineDotMap[targetBox.maxY] = [targetBox.minX, targetBox.midX, targetBox.maxX];
79
- siblingViewRectInfoList.forEach((info) => {
85
+ siblingBoundingInfoList.forEach((info) => {
80
86
  const box = getViewBoxInfo(info);
81
87
  if (!vRefLineDotMap[box.minX]) {
82
88
  vRefLineDotMap[box.minX] = [];
@@ -174,7 +180,7 @@ export function calcReferenceInfo(uuid, opts) {
174
180
  if (isEqualNum(offsetX, closestMinX - targetBox.minX)) {
175
181
  const vLine = {
176
182
  x: closestMinX,
177
- yList: []
183
+ yList: [],
178
184
  };
179
185
  vLine.yList.push(newTargetBox.minY);
180
186
  vLine.yList.push(newTargetBox.maxY);
@@ -184,7 +190,7 @@ export function calcReferenceInfo(uuid, opts) {
184
190
  if (isEqualNum(offsetX, closestMidX - targetBox.minX)) {
185
191
  const vLine = {
186
192
  x: closestMidX,
187
- yList: []
193
+ yList: [],
188
194
  };
189
195
  vLine.yList.push(newTargetBox.minY);
190
196
  vLine.yList.push(newTargetBox.maxY);
@@ -194,7 +200,7 @@ export function calcReferenceInfo(uuid, opts) {
194
200
  if (isEqualNum(offsetX, closestMaxX - targetBox.minX)) {
195
201
  const vLine = {
196
202
  x: closestMaxX,
197
- yList: []
203
+ yList: [],
198
204
  };
199
205
  vLine.yList.push(newTargetBox.minY);
200
206
  vLine.yList.push(newTargetBox.maxY);
@@ -206,7 +212,7 @@ export function calcReferenceInfo(uuid, opts) {
206
212
  if (isEqualNum(offsetY, closestMinY - targetBox.minY)) {
207
213
  const hLine = {
208
214
  y: closestMinY,
209
- xList: []
215
+ xList: [],
210
216
  };
211
217
  hLine.xList.push(newTargetBox.minX);
212
218
  hLine.xList.push(newTargetBox.maxX);
@@ -216,7 +222,7 @@ export function calcReferenceInfo(uuid, opts) {
216
222
  if (isEqualNum(offsetY, closestMidY - targetBox.midY)) {
217
223
  const hLine = {
218
224
  y: closestMidY,
219
- xList: []
225
+ xList: [],
220
226
  };
221
227
  hLine.xList.push(newTargetBox.minX);
222
228
  hLine.xList.push(newTargetBox.maxX);
@@ -226,7 +232,7 @@ export function calcReferenceInfo(uuid, opts) {
226
232
  if (isEqualNum(offsetY, closestMaxY - targetBox.maxY)) {
227
233
  const hLine = {
228
234
  y: closestMaxY,
229
- xList: []
235
+ xList: [],
230
236
  };
231
237
  hLine.xList.push(newTargetBox.minX);
232
238
  hLine.xList.push(newTargetBox.maxX);
@@ -241,7 +247,7 @@ export function calcReferenceInfo(uuid, opts) {
241
247
  item.yList.forEach((y) => {
242
248
  yLines[i].push({
243
249
  x: item.x,
244
- y
250
+ y,
245
251
  });
246
252
  });
247
253
  });
@@ -253,7 +259,7 @@ export function calcReferenceInfo(uuid, opts) {
253
259
  item.xList.forEach((x) => {
254
260
  xLines[i].push({
255
261
  x,
256
- y: item.y
262
+ y: item.y,
257
263
  });
258
264
  });
259
265
  });
@@ -262,6 +268,6 @@ export function calcReferenceInfo(uuid, opts) {
262
268
  offsetX,
263
269
  offsetY,
264
270
  yLines,
265
- xLines
271
+ xLines,
266
272
  };
267
273
  }
@@ -0,0 +1,11 @@
1
+ import type { BoardViewerFrameSnapshot, BoardMiddlewareOptions, MiddlewareSelectorStyles } from '@idraw/types';
2
+ import type { ActionType, DeepSelectorSharedStorage } from './types';
3
+ import { keyActionType, keyResizeType, keyGroupQueue, keyHoverMaterial, keySelectedMaterialList } from './static';
4
+ export { keySelectedMaterialList, keyHoverMaterial, keyActionType, keyResizeType, keyGroupQueue };
5
+ export type { DeepSelectorSharedStorage, ActionType };
6
+ export type RenderFrameOptions = Pick<BoardMiddlewareOptions<DeepSelectorSharedStorage>, 'sharer' | 'calculator' | 'boardContent'> & {
7
+ snapshot: BoardViewerFrameSnapshot<DeepSelectorSharedStorage>;
8
+ $root: HTMLDivElement | null;
9
+ styles: MiddlewareSelectorStyles;
10
+ };
11
+ export declare function renderFrame({ $root, styles, snapshot, sharer, calculator, boardContent }: RenderFrameOptions): void;
@@ -0,0 +1,107 @@
1
+ import { drawReferenceLines } from './draw-reference';
2
+ import { calcSelectedMaterialsArea } from './util';
3
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyHoverMaterial, keySelectedMaterialList, keyEnableSnapToGrid, } from './static';
4
+ import { calcReferenceInfo } from './reference';
5
+ import { renderMaterialHoverBox, clearMaterialHoverBox, renderMaterialLockedBox, clearMaterialLockedBox, resetMaterialNestedBox, resetMaterialSelectedBox, resetMaterialSelectionAreaBox, } from './dom';
6
+ export { keySelectedMaterialList, keyHoverMaterial, keyActionType, keyResizeType, keyGroupQueue };
7
+ export function renderFrame({ $root, styles, snapshot, sharer, calculator, boardContent }) {
8
+ var _a, _b;
9
+ const { activeStore, sharedStore } = snapshot;
10
+ const { overlayContext } = boardContent;
11
+ const { scale, offsetLeft, offsetTop, offsetRight, offsetBottom, width, height, contextHeight, contextWidth, devicePixelRatio, } = activeStore;
12
+ const viewScaleInfo = { scale, offsetLeft, offsetTop, offsetRight, offsetBottom };
13
+ const viewSizeInfo = { width, height, contextHeight, contextWidth, devicePixelRatio };
14
+ const selectedMaterials = sharedStore[keySelectedMaterialList];
15
+ const mtrl = selectedMaterials[0];
16
+ const hoverMaterial = sharedStore[keyHoverMaterial];
17
+ const actionType = sharedStore[keyActionType];
18
+ const areaStart = sharedStore[keyAreaStart];
19
+ const areaEnd = sharedStore[keyAreaEnd];
20
+ const groupQueue = sharedStore[keyGroupQueue];
21
+ const enableSnapToGrid = sharedStore[keyEnableSnapToGrid];
22
+ const isHoverLocked = !!((_a = hoverMaterial === null || hoverMaterial === void 0 ? void 0 : hoverMaterial.operations) === null || _a === void 0 ? void 0 : _a.locked);
23
+ const helperOpts = {
24
+ material: null,
25
+ groupQueue: groupQueue || [],
26
+ viewScaleInfo,
27
+ viewSizeInfo,
28
+ calculator,
29
+ };
30
+ resetMaterialNestedBox($root, helperOpts);
31
+ clearMaterialHoverBox($root);
32
+ clearMaterialLockedBox($root);
33
+ if (hoverMaterial && (hoverMaterial === null || hoverMaterial === void 0 ? void 0 : hoverMaterial.id) !== ((_b = selectedMaterials[0]) === null || _b === void 0 ? void 0 : _b.id)) {
34
+ helperOpts.material = hoverMaterial;
35
+ if (isHoverLocked) {
36
+ renderMaterialLockedBox($root, helperOpts);
37
+ }
38
+ else {
39
+ renderMaterialHoverBox($root, helperOpts);
40
+ }
41
+ }
42
+ resetMaterialSelectedBox($root, Object.assign(Object.assign({}, helperOpts), { material: selectedMaterials.length === 1 ? selectedMaterials[0] : null }));
43
+ resetMaterialSelectionAreaBox($root, Object.assign(Object.assign({}, helperOpts), { areaStart,
44
+ areaEnd,
45
+ selectedMaterials }));
46
+ if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
47
+ if (mtrl && ['select', 'drag', 'resize'].includes(actionType)) {
48
+ if (actionType === 'drag') {
49
+ if (enableSnapToGrid === true) {
50
+ const referenceInfo = calcReferenceInfo(mtrl.id, {
51
+ calculator,
52
+ data: activeStore.data,
53
+ groupQueue,
54
+ viewScaleInfo,
55
+ viewSizeInfo,
56
+ });
57
+ if (referenceInfo) {
58
+ const { offsetX, offsetY, xLines, yLines } = referenceInfo;
59
+ if (offsetX === 0 || offsetY === 0) {
60
+ drawReferenceLines(overlayContext, {
61
+ xLines,
62
+ yLines,
63
+ styles,
64
+ });
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ else {
72
+ if (mtrl && ['select', 'drag', 'resize'].includes(actionType)) {
73
+ if (actionType === 'drag') {
74
+ if (enableSnapToGrid === true) {
75
+ const referenceInfo = calcReferenceInfo(mtrl.id, {
76
+ calculator,
77
+ data: activeStore.data,
78
+ groupQueue,
79
+ viewScaleInfo,
80
+ viewSizeInfo,
81
+ });
82
+ if (referenceInfo) {
83
+ const { offsetX, offsetY, xLines, yLines } = referenceInfo;
84
+ if (offsetX === 0 || offsetY === 0) {
85
+ drawReferenceLines(overlayContext, {
86
+ xLines,
87
+ yLines,
88
+ styles,
89
+ });
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ else if (actionType === 'area' && areaStart && areaEnd) {
96
+ }
97
+ else if (['drag-list', 'drag-list-end'].includes(actionType)) {
98
+ const listAreaSize = calcSelectedMaterialsArea(sharer.getSharedStorage(keySelectedMaterialList), {
99
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
100
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
101
+ calculator,
102
+ });
103
+ if (listAreaSize) {
104
+ }
105
+ }
106
+ }
107
+ }
@@ -0,0 +1,7 @@
1
+ import type { Material } from '@idraw/types';
2
+ export declare const dragAndResizeMaterial: (mtrl: Material, opts: {
3
+ x: number;
4
+ y: number;
5
+ width: number;
6
+ height: number;
7
+ }) => void;
@@ -0,0 +1,27 @@
1
+ import { scalePathCommands } from '@idraw/util';
2
+ export const dragAndResizeMaterial = (mtrl, opts) => {
3
+ const { x, y, width, height } = opts;
4
+ const prevWidth = mtrl.width;
5
+ const prevHeight = mtrl.height;
6
+ mtrl.x = x;
7
+ mtrl.y = y;
8
+ mtrl.width = width;
9
+ mtrl.height = height;
10
+ if (mtrl.type === 'circle') {
11
+ mtrl.cx = x + width / 2;
12
+ mtrl.cy = y + height / 2;
13
+ mtrl.r = Math.min(width, height) / 2;
14
+ }
15
+ else if (mtrl.type === 'ellipse') {
16
+ mtrl.cx = x + width / 2;
17
+ mtrl.cy = y + height / 2;
18
+ mtrl.rx = width / 2;
19
+ mtrl.ry = height / 2;
20
+ }
21
+ else if (mtrl.type === 'path') {
22
+ const scaleW = width / prevWidth;
23
+ const scaleH = height / prevHeight;
24
+ const svgMtrl = mtrl;
25
+ svgMtrl.commands = scalePathCommands(svgMtrl.commands, scaleW, scaleH);
26
+ }
27
+ };
@@ -0,0 +1,67 @@
1
+ import type { MiddlewareSelectorStyles, StoreSharer } from '@idraw/types';
2
+ import type { DeepSelectorSharedStorage } from './types';
3
+ export declare const key = "SELECTOR";
4
+ export declare const prefix = "idraw-middleware-selector";
5
+ export declare const getRootClassName: () => string;
6
+ export declare const ATTR_BOX_TYPE = "data-idraw-box-type";
7
+ export declare const ATTR_MATERIAL_ID = "data-idraw-material-id";
8
+ export declare const ATTR_HANDLER_TYPE = "data-idraw-handler-type";
9
+ export declare const BOX_GROUP = "box-group";
10
+ export declare const BOX_TARGET = "box-material";
11
+ export declare const classNameMap: {
12
+ materialBox: string;
13
+ groupBox: string;
14
+ nestedBox: string;
15
+ nestedTargetBox: string;
16
+ hoverBox: string;
17
+ hoverTargetBox: string;
18
+ lockedBox: string;
19
+ lockedTargetBox: string;
20
+ selectedBox: string;
21
+ selectedTargetBox: string;
22
+ hideHandler: string;
23
+ edgeHandler: string;
24
+ edgeTopHandler: string;
25
+ edgeRightHandler: string;
26
+ edgeBottomHandler: string;
27
+ edgeLeftHandler: string;
28
+ cornerHandler: string;
29
+ cornerTopLeftHandler: string;
30
+ cornerTopRightHandler: string;
31
+ cornerBottomLeftHandler: string;
32
+ cornerBottomRightHandler: string;
33
+ rotateHandler: string;
34
+ selectionAreaBox: string;
35
+ };
36
+ export declare const keyPrevPoint: unique symbol;
37
+ export declare const keyPointStartMaterialSizeList: unique symbol;
38
+ export declare const keyMoveOriginalStartPoint: unique symbol;
39
+ export declare const keyMoveOriginalStartMaterialSize: unique symbol;
40
+ export declare const keyInBusyMode: unique symbol;
41
+ export declare const keyHasChangedData: unique symbol;
42
+ export declare const keyStartResizeGroupRecord: unique symbol;
43
+ export declare const keyEndResizeGroupRecord: unique symbol;
44
+ export declare const keyActionType: unique symbol;
45
+ export declare const keyResizeType: unique symbol;
46
+ export declare const keyAreaStart: unique symbol;
47
+ export declare const keyAreaEnd: unique symbol;
48
+ export declare const keyHoverMaterial: unique symbol;
49
+ export declare const keySelectedMaterialList: unique symbol;
50
+ export declare const keySelectedMaterialListVertexes: unique symbol;
51
+ export declare const keySelectedMaterialPosition: unique symbol;
52
+ export declare const keyGroupQueue: unique symbol;
53
+ export declare const keyIsMoving: unique symbol;
54
+ export declare const keyEnableSelectInGroup: unique symbol;
55
+ export declare const keyEnableSnapToGrid: unique symbol;
56
+ export declare const selectedBoxBorderWidth = 1.5;
57
+ export declare const selectedNestedBoxBorderWidth = 2;
58
+ export declare const hoverBoxBorderWidth = 1;
59
+ export declare const lockedBoxBorderWidth = 2;
60
+ export declare const cornerHandlerSize = 10;
61
+ export declare const cornerHandlerBorderWidth = 1.5;
62
+ export declare const edgeHandlerSize = 10;
63
+ export declare const selectionAreaBorderWidth = 1;
64
+ export declare const rotateHandlerSize = 20;
65
+ export declare const defaultStyle: MiddlewareSelectorStyles;
66
+ export declare const getSvgRotate: (currentColor: string) => string;
67
+ export declare const clearStorage: (sharer: StoreSharer<DeepSelectorSharedStorage>) => void;
@@ -0,0 +1,92 @@
1
+ import { createId } from '@idraw/util';
2
+ export const key = 'SELECTOR';
3
+ export const prefix = `idraw-middleware-selector`;
4
+ export const getRootClassName = () => `${prefix}-${createId()}`;
5
+ export const ATTR_BOX_TYPE = 'data-idraw-box-type';
6
+ export const ATTR_MATERIAL_ID = 'data-idraw-material-id';
7
+ export const ATTR_HANDLER_TYPE = 'data-idraw-handler-type';
8
+ export const BOX_GROUP = 'box-group';
9
+ export const BOX_TARGET = 'box-material';
10
+ export const classNameMap = {
11
+ materialBox: `${prefix}-materialBox`,
12
+ groupBox: `${prefix}-groupBox`,
13
+ nestedBox: `${prefix}-nestedBox`,
14
+ nestedTargetBox: `${prefix}-nestedTargetBox`,
15
+ hoverBox: `${prefix}-hoverBox`,
16
+ hoverTargetBox: `${prefix}-hoverTargetBox`,
17
+ lockedBox: `${prefix}-lockedBox`,
18
+ lockedTargetBox: `${prefix}-lockedTargetBox`,
19
+ selectedBox: `${prefix}-selectedBox`,
20
+ selectedTargetBox: `${prefix}-selectedTargetBox`,
21
+ hideHandler: `${prefix}-hideHandler`,
22
+ edgeHandler: `${prefix}-edgeHandler`,
23
+ edgeTopHandler: `${prefix}-edgeTopHandler`,
24
+ edgeRightHandler: `${prefix}-edgeRightandler`,
25
+ edgeBottomHandler: `${prefix}-edgeBottomHandler`,
26
+ edgeLeftHandler: `${prefix}-edgeLeftHandler`,
27
+ cornerHandler: `${prefix}-cornerHandler`,
28
+ cornerTopLeftHandler: `${prefix}-cornerTopLeftHandler`,
29
+ cornerTopRightHandler: `${prefix}-cornerTopRightHandler`,
30
+ cornerBottomLeftHandler: `${prefix}-cornerBottomLeftHandler`,
31
+ cornerBottomRightHandler: `${prefix}-cornerBottomRightHandler`,
32
+ rotateHandler: `${prefix}-rotateHandler`,
33
+ selectionAreaBox: `${prefix}-selectionAreaBox`,
34
+ };
35
+ export const keyPrevPoint = Symbol(`${key}_prevPoint`);
36
+ export const keyPointStartMaterialSizeList = Symbol(`${key}_pointStartMaterialSizeList`);
37
+ export const keyMoveOriginalStartPoint = Symbol(`${key}_moveOriginalStartPoint`);
38
+ export const keyMoveOriginalStartMaterialSize = Symbol(`${key}_moveOriginalStartMaterialSize`);
39
+ export const keyInBusyMode = Symbol(`${key}_inBusyMode`);
40
+ export const keyHasChangedData = Symbol(`${key}_hasChangedData`);
41
+ export const keyStartResizeGroupRecord = Symbol(`${key}_startResizeGroupRecord`);
42
+ export const keyEndResizeGroupRecord = Symbol(`${key}_endResizeGroupRecord`);
43
+ export const keyActionType = Symbol(`${key}_actionType`);
44
+ export const keyResizeType = Symbol(`${key}_resizeType`);
45
+ export const keyAreaStart = Symbol(`${key}_areaStart`);
46
+ export const keyAreaEnd = Symbol(`${key}_areaEnd`);
47
+ export const keyHoverMaterial = Symbol(`${key}_hoverMaterial`);
48
+ export const keySelectedMaterialList = Symbol(`${key}_selectedMaterialList`);
49
+ export const keySelectedMaterialListVertexes = Symbol(`${key}_selectedMaterialListVertexes`);
50
+ export const keySelectedMaterialPosition = Symbol(`${key}_selectedMaterialPosition`);
51
+ export const keyGroupQueue = Symbol(`${key}_groupQueue`);
52
+ export const keyIsMoving = Symbol(`${key}_isMoving`);
53
+ export const keyEnableSelectInGroup = Symbol(`${key}_enableSelectInGroup`);
54
+ export const keyEnableSnapToGrid = Symbol(`${key}_enableSnapToGrid`);
55
+ export const selectedBoxBorderWidth = 1.5;
56
+ export const selectedNestedBoxBorderWidth = 2;
57
+ export const hoverBoxBorderWidth = 1;
58
+ export const lockedBoxBorderWidth = 2;
59
+ export const cornerHandlerSize = 10;
60
+ export const cornerHandlerBorderWidth = 1.5;
61
+ export const edgeHandlerSize = 10;
62
+ export const selectionAreaBorderWidth = 1;
63
+ export const rotateHandlerSize = 20;
64
+ export const defaultStyle = {
65
+ zIndex: 1,
66
+ activeColor: '#1973ba',
67
+ handlerBorderColor: '#1973ba',
68
+ handlerBackground: '#ffffff',
69
+ handlerHoverBackground: '#aad4f6',
70
+ handlerActiveBackground: '#63b8f8',
71
+ selectionAreaBorderColor: '#1973ba',
72
+ selectionAreaBackground: '#1973ba3f',
73
+ lockedColor: '#5b5959b5',
74
+ referenceColor: '#f7276e',
75
+ };
76
+ export const getSvgRotate = (currentColor) => `<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200" fill="${currentColor}" >
77
+ <path d="M512 0c282.8 0 512 229.2 512 512s-229.2 512 -512 512S0 794.8 0 512 229.2 0 512 0zm309.8 253.8c0 -10.5 -6.5 -19.8 -15.7 -23.8 -9.7 -4 -21 -2 -28.2 5.6l-52.5 52c-56.9 -53.7 -133.9 -85.5 -213.4 -85.5 -170.7 0 -309.8 139.2 -309.8 309.8 0 170.6 139.2 309.8 309.8 309.8 92.4 0 179.5 -40.8 238.4 -111.8 4 -5.2 4 -12.9 -0.8 -17.3L694.3 637c-2.8 -2.4 -6.5 -3.6 -10.1 -3.6 -3.6 0.4 -7.3 2 -9.3 4.8 -39.5 51.2 -98.8 80.3 -163 80.3 -113.8 0 -206.5 -92.8 -206.5 -206.5 0 -113.8 92.8 -206.5 206.5 -206.5 52.8 0 102.9 20.2 140.8 55.3L597 416.5c-7.7 7.3 -9.7 18.6 -5.6 27.9 4 9.7 13.3 16.1 23.8 16.1H796c14.1 0 25.8 -11.7 25.8 -25.8V253.8z" />
78
+ </svg>`;
79
+ export const clearStorage = (sharer) => {
80
+ sharer.setSharedStorage(keyStartResizeGroupRecord, null);
81
+ sharer.setSharedStorage(keyEndResizeGroupRecord, null);
82
+ sharer.setSharedStorage(keyActionType, null);
83
+ sharer.setSharedStorage(keyResizeType, null);
84
+ sharer.setSharedStorage(keyAreaStart, null);
85
+ sharer.setSharedStorage(keyAreaEnd, null);
86
+ sharer.setSharedStorage(keyGroupQueue, []);
87
+ sharer.setSharedStorage(keyHoverMaterial, null);
88
+ sharer.setSharedStorage(keySelectedMaterialList, []);
89
+ sharer.setSharedStorage(keySelectedMaterialListVertexes, null);
90
+ sharer.setSharedStorage(keySelectedMaterialPosition, []);
91
+ sharer.setSharedStorage(keyIsMoving, null);
92
+ };
@@ -0,0 +1,4 @@
1
+ import type { MiddlewareSelectorStyles, MiddlewareSelectorConfig } from '@idraw/types';
2
+ export declare function initStyles(rootClassName: string, styles: MiddlewareSelectorStyles): void;
3
+ export declare function destroyStyles(rootClassName: string): void;
4
+ export declare function getMiddlewareSelectorStyles<C = MiddlewareSelectorConfig, S = MiddlewareSelectorStyles>(config: C): S;
@@ -0,0 +1,153 @@
1
+ import { injectStyles, removeStyles, getMiddlewareValidStyles } from '@idraw/util';
2
+ import { classNameMap, getSvgRotate, selectedBoxBorderWidth, selectedNestedBoxBorderWidth, hoverBoxBorderWidth, lockedBoxBorderWidth, edgeHandlerSize, cornerHandlerSize, cornerHandlerBorderWidth, selectionAreaBorderWidth, rotateHandlerSize, } from './static';
3
+ export function initStyles(rootClassName, styles) {
4
+ const cls = (str) => `.${str}`;
5
+ const stylesProps = {
6
+ display: 'flex',
7
+ position: 'absolute',
8
+ zIndex: styles.zIndex,
9
+ top: 0,
10
+ left: 0,
11
+ right: 0,
12
+ bottom: 0,
13
+ overflow: 'hidden',
14
+ [cls(classNameMap.hoverTargetBox)]: {
15
+ position: 'absolute',
16
+ outline: `${hoverBoxBorderWidth}px solid ${styles.activeColor}`,
17
+ },
18
+ [cls(classNameMap.nestedBox)]: {
19
+ position: 'absolute',
20
+ [`&${cls(classNameMap.groupBox)}`]: {
21
+ outline: `${selectedNestedBoxBorderWidth}px dashed ${styles.activeColor}`,
22
+ },
23
+ [cls(classNameMap.groupBox)]: {
24
+ outline: `${selectedNestedBoxBorderWidth}px dashed ${styles.activeColor}`,
25
+ },
26
+ },
27
+ [cls(classNameMap.lockedTargetBox)]: {
28
+ position: 'absolute',
29
+ outline: `${lockedBoxBorderWidth}px solid ${styles.lockedColor}`,
30
+ },
31
+ [cls(classNameMap.selectedBox)]: {
32
+ position: 'absolute',
33
+ [`&${cls(classNameMap.hideHandler)}`]: {
34
+ [cls(classNameMap.cornerHandler)]: {
35
+ display: 'none',
36
+ },
37
+ [cls(classNameMap.edgeHandler)]: {
38
+ display: 'none',
39
+ },
40
+ [cls(classNameMap.rotateHandler)]: {
41
+ display: 'none',
42
+ },
43
+ },
44
+ },
45
+ [cls(classNameMap.selectedTargetBox)]: {
46
+ position: 'absolute',
47
+ outline: `${selectedBoxBorderWidth}px solid ${styles.handlerBorderColor}`,
48
+ [cls(classNameMap.cornerHandler)]: {
49
+ position: 'absolute',
50
+ outline: `${cornerHandlerBorderWidth}px solid ${styles.handlerBorderColor}`,
51
+ background: styles.handlerBackground,
52
+ width: `${cornerHandlerSize}px`,
53
+ height: `${cornerHandlerSize}px`,
54
+ ['&:hover']: {
55
+ background: styles.handlerHoverBackground,
56
+ },
57
+ ['&:active']: {
58
+ background: styles.handlerActiveBackground,
59
+ },
60
+ [`&${cls(classNameMap.cornerTopLeftHandler)}`]: {
61
+ top: `${-cornerHandlerSize / 2}px`,
62
+ left: `${-cornerHandlerSize / 2}px`,
63
+ },
64
+ [`&${cls(classNameMap.cornerTopRightHandler)}`]: {
65
+ top: `${-cornerHandlerSize / 2}px`,
66
+ right: `${-cornerHandlerSize / 2}px`,
67
+ },
68
+ [`&${cls(classNameMap.cornerBottomLeftHandler)}`]: {
69
+ bottom: `${-cornerHandlerSize / 2}px`,
70
+ left: `${-cornerHandlerSize / 2}px`,
71
+ },
72
+ [`&${cls(classNameMap.cornerBottomRightHandler)}`]: {
73
+ bottom: `${-cornerHandlerSize / 2}px`,
74
+ right: `${-cornerHandlerSize / 2}px`,
75
+ },
76
+ },
77
+ [cls(classNameMap.rotateHandler)]: {
78
+ position: 'absolute',
79
+ top: -40,
80
+ left: `50%`,
81
+ transform: `translateX(-50%)`,
82
+ width: rotateHandlerSize,
83
+ height: rotateHandlerSize,
84
+ background: '#FFFFFF',
85
+ borderRadius: `${rotateHandlerSize / 2}px`,
86
+ ['&::after']: {
87
+ display: 'inline-block',
88
+ content: '""',
89
+ position: 'absolute',
90
+ top: 0,
91
+ bottom: 0,
92
+ left: 0,
93
+ right: 0,
94
+ backgroundImage: `url(data:image/svg+xml,${encodeURIComponent(getSvgRotate(styles.activeColor))})`,
95
+ backgroundPosition: 'center',
96
+ backgroundSize: `${rotateHandlerSize}px`,
97
+ },
98
+ },
99
+ [cls(classNameMap.edgeHandler)]: {
100
+ position: 'absolute',
101
+ background: 'transparent',
102
+ [`&${cls(classNameMap.edgeLeftHandler)}`]: {
103
+ width: `${edgeHandlerSize}px`,
104
+ top: `${edgeHandlerSize / 2}px`,
105
+ left: `${-edgeHandlerSize / 2}px`,
106
+ bottom: `${edgeHandlerSize / 2}px`,
107
+ },
108
+ [`&${cls(classNameMap.edgeRightHandler)}`]: {
109
+ width: `${edgeHandlerSize}px`,
110
+ top: `${edgeHandlerSize / 2}px`,
111
+ right: `${-edgeHandlerSize / 2}px`,
112
+ bottom: `${edgeHandlerSize / 2}px`,
113
+ },
114
+ [`&${cls(classNameMap.edgeTopHandler)}`]: {
115
+ height: `${edgeHandlerSize}px`,
116
+ top: `${-edgeHandlerSize / 2}px`,
117
+ left: `${edgeHandlerSize / 2}px`,
118
+ right: `${edgeHandlerSize / 2}px`,
119
+ },
120
+ [`&${cls(classNameMap.edgeBottomHandler)}`]: {
121
+ height: `${edgeHandlerSize}px`,
122
+ bottom: `${-edgeHandlerSize / 2}px`,
123
+ left: `${edgeHandlerSize / 2}px`,
124
+ right: `${edgeHandlerSize / 2}px`,
125
+ },
126
+ },
127
+ },
128
+ [cls(classNameMap.selectionAreaBox)]: {
129
+ position: 'absolute',
130
+ outline: `${selectionAreaBorderWidth}px solid ${styles.selectionAreaBorderColor}`,
131
+ background: styles.selectionAreaBackground,
132
+ },
133
+ };
134
+ injectStyles({ styles: stylesProps, rootClassName, type: 'element' });
135
+ }
136
+ export function destroyStyles(rootClassName) {
137
+ removeStyles({ rootClassName, type: 'element' });
138
+ }
139
+ export function getMiddlewareSelectorStyles(config) {
140
+ const styles = getMiddlewareValidStyles(config, [
141
+ 'zIndex',
142
+ 'activeColor',
143
+ 'handlerBorderColor',
144
+ 'handlerBackground',
145
+ 'handlerHoverBackground',
146
+ 'handlerActiveBackground',
147
+ 'selectionAreaBackground',
148
+ 'selectionAreaBorderColor',
149
+ 'lockedColor',
150
+ 'referenceColor',
151
+ ]);
152
+ return styles;
153
+ }