@idraw/core 0.4.0-beta.9 → 0.4.0

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 (101) hide show
  1. package/dist/esm/board/index.d.ts +44 -0
  2. package/dist/esm/board/index.js +366 -0
  3. package/dist/esm/board/sharer.d.ts +21 -0
  4. package/dist/esm/board/sharer.js +101 -0
  5. package/dist/esm/board/viewer.d.ts +32 -0
  6. package/dist/esm/board/viewer.js +165 -0
  7. package/dist/esm/board/watcher.d.ts +15 -0
  8. package/dist/esm/board/watcher.js +218 -0
  9. package/dist/esm/config.d.ts +28 -0
  10. package/dist/esm/config.js +34 -0
  11. package/dist/esm/{lib → cursor}/cursor-image.d.ts +1 -0
  12. package/dist/esm/{lib → cursor}/cursor-image.js +1 -0
  13. package/dist/esm/cursor/cursor.d.ts +7 -0
  14. package/dist/esm/cursor/cursor.js +154 -0
  15. package/dist/esm/index.d.ts +39 -10
  16. package/dist/esm/index.js +296 -17
  17. package/dist/esm/middlewares/dragger/index.d.ts +7 -0
  18. package/dist/esm/{middleware → middlewares}/dragger/index.js +4 -3
  19. package/dist/esm/middlewares/info/config.d.ts +5 -0
  20. package/dist/esm/middlewares/info/config.js +9 -0
  21. package/dist/esm/middlewares/info/draw-info.d.ts +29 -0
  22. package/dist/esm/middlewares/info/draw-info.js +113 -0
  23. package/dist/esm/middlewares/info/index.d.ts +9 -0
  24. package/dist/esm/middlewares/info/index.js +131 -0
  25. package/dist/esm/middlewares/info/types.d.ts +3 -0
  26. package/dist/esm/middlewares/info/types.js +1 -0
  27. package/dist/esm/middlewares/layout-selector/config.d.ts +11 -0
  28. package/dist/esm/middlewares/layout-selector/config.js +12 -0
  29. package/dist/esm/middlewares/layout-selector/index.d.ts +5 -0
  30. package/dist/esm/middlewares/layout-selector/index.js +371 -0
  31. package/dist/esm/middlewares/layout-selector/types.d.ts +17 -0
  32. package/dist/esm/middlewares/layout-selector/types.js +2 -0
  33. package/dist/esm/middlewares/layout-selector/util.d.ts +9 -0
  34. package/dist/esm/middlewares/layout-selector/util.js +78 -0
  35. package/dist/esm/middlewares/pointer/index.d.ts +3 -0
  36. package/dist/esm/middlewares/pointer/index.js +42 -0
  37. package/dist/esm/middlewares/pointer/types.d.ts +3 -0
  38. package/dist/esm/middlewares/pointer/types.js +1 -0
  39. package/dist/esm/middlewares/ruler/config.d.ts +7 -0
  40. package/dist/esm/middlewares/ruler/config.js +21 -0
  41. package/dist/esm/middlewares/ruler/index.d.ts +3 -0
  42. package/dist/esm/middlewares/ruler/index.js +66 -0
  43. package/dist/esm/middlewares/ruler/types.d.ts +3 -0
  44. package/dist/esm/middlewares/ruler/types.js +1 -0
  45. package/dist/esm/{middleware → middlewares}/ruler/util.d.ts +20 -4
  46. package/dist/esm/{middleware → middlewares}/ruler/util.js +99 -26
  47. package/dist/esm/middlewares/scaler/index.d.ts +2 -0
  48. package/dist/esm/{middleware → middlewares}/scaler/index.js +2 -2
  49. package/dist/esm/{middleware → middlewares}/scroller/config.d.ts +4 -0
  50. package/dist/esm/middlewares/scroller/config.js +16 -0
  51. package/dist/esm/middlewares/scroller/index.d.ts +3 -0
  52. package/dist/esm/{middleware → middlewares}/scroller/index.js +47 -6
  53. package/dist/esm/middlewares/scroller/types.d.ts +11 -0
  54. package/dist/esm/middlewares/scroller/types.js +1 -0
  55. package/dist/esm/{middleware → middlewares}/scroller/util.d.ts +3 -2
  56. package/dist/esm/{middleware → middlewares}/scroller/util.js +33 -44
  57. package/dist/esm/{middleware → middlewares}/selector/config.d.ts +9 -1
  58. package/dist/esm/{middleware → middlewares}/selector/config.js +17 -1
  59. package/dist/esm/middlewares/selector/draw-auxiliary.d.ts +1 -0
  60. package/dist/esm/middlewares/selector/draw-auxiliary.js +12 -0
  61. package/dist/esm/middlewares/selector/draw-base.d.ts +30 -0
  62. package/dist/esm/middlewares/selector/draw-base.js +100 -0
  63. package/dist/esm/middlewares/selector/draw-debug.d.ts +5 -0
  64. package/dist/esm/middlewares/selector/draw-debug.js +30 -0
  65. package/dist/esm/middlewares/selector/draw-reference.d.ts +7 -0
  66. package/dist/esm/middlewares/selector/draw-reference.js +31 -0
  67. package/dist/esm/{middleware → middlewares}/selector/draw-wrapper.d.ts +16 -1
  68. package/dist/esm/middlewares/selector/draw-wrapper.js +139 -0
  69. package/dist/esm/middlewares/selector/index.d.ts +11 -0
  70. package/dist/esm/middlewares/selector/index.js +879 -0
  71. package/dist/esm/middlewares/selector/pattern/icon-rotate.d.ts +4 -0
  72. package/dist/esm/middlewares/selector/pattern/icon-rotate.js +88 -0
  73. package/dist/esm/middlewares/selector/pattern/index.d.ts +8 -0
  74. package/dist/esm/middlewares/selector/pattern/index.js +38 -0
  75. package/dist/esm/middlewares/selector/reference.d.ts +13 -0
  76. package/dist/esm/middlewares/selector/reference.js +267 -0
  77. package/dist/esm/{middleware → middlewares}/selector/types.d.ts +11 -5
  78. package/dist/esm/middlewares/selector/types.js +2 -0
  79. package/dist/esm/{middleware → middlewares}/selector/util.d.ts +14 -7
  80. package/dist/esm/{middleware → middlewares}/selector/util.js +46 -43
  81. package/dist/esm/middlewares/text-editor/index.d.ts +20 -0
  82. package/dist/esm/middlewares/text-editor/index.js +286 -0
  83. package/dist/esm/record.d.ts +5 -0
  84. package/dist/esm/record.js +38 -0
  85. package/dist/index.global.js +5740 -1632
  86. package/dist/index.global.min.js +1 -1
  87. package/package.json +5 -6
  88. package/dist/esm/lib/cursor.d.ts +0 -16
  89. package/dist/esm/lib/cursor.js +0 -129
  90. package/dist/esm/middleware/dragger/index.d.ts +0 -7
  91. package/dist/esm/middleware/ruler/index.d.ts +0 -3
  92. package/dist/esm/middleware/ruler/index.js +0 -48
  93. package/dist/esm/middleware/scaler/index.d.ts +0 -3
  94. package/dist/esm/middleware/scroller/config.js +0 -6
  95. package/dist/esm/middleware/scroller/index.d.ts +0 -2
  96. package/dist/esm/middleware/selector/draw-wrapper.js +0 -107
  97. package/dist/esm/middleware/selector/index.d.ts +0 -5
  98. package/dist/esm/middleware/selector/index.js +0 -510
  99. package/dist/esm/middleware/selector/types.js +0 -1
  100. package/dist/esm/middleware/text-editor/index.d.ts +0 -3
  101. package/dist/esm/middleware/text-editor/index.js +0 -147
@@ -0,0 +1,154 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _Cursor_instances, _Cursor_eventHub, _Cursor_container, _Cursor_cursorType, _Cursor_resizeCursorBaseImage, _Cursor_cursorImageMap, _Cursor_init, _Cursor_loadResizeCursorBaseImage, _Cursor_resetCursor, _Cursor_setCursorResize, _Cursor_appendRotateResizeImage;
13
+ import { limitAngle, loadImage, parseAngleToRadian } from '@idraw/util';
14
+ import { CURSOR, CURSOR_RESIZE, CURSOR_DRAG_DEFAULT, CURSOR_DRAG_ACTIVE, CURSOR_RESIZE_ROTATE } from './cursor-image';
15
+ import { coreEventKeys } from '../config';
16
+ export class Cursor {
17
+ constructor(container, opts) {
18
+ _Cursor_instances.add(this);
19
+ _Cursor_eventHub.set(this, void 0);
20
+ _Cursor_container.set(this, void 0);
21
+ _Cursor_cursorType.set(this, null);
22
+ _Cursor_resizeCursorBaseImage.set(this, null);
23
+ _Cursor_cursorImageMap.set(this, {
24
+ auto: CURSOR,
25
+ 'drag-default': CURSOR_DRAG_DEFAULT,
26
+ 'drag-active': CURSOR_DRAG_ACTIVE,
27
+ 'rotate-0': CURSOR_RESIZE,
28
+ rotate: CURSOR_RESIZE_ROTATE
29
+ });
30
+ __classPrivateFieldSet(this, _Cursor_container, container, "f");
31
+ __classPrivateFieldSet(this, _Cursor_eventHub, opts.eventHub, "f");
32
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_init).call(this);
33
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_loadResizeCursorBaseImage).call(this);
34
+ }
35
+ }
36
+ _Cursor_eventHub = new WeakMap(), _Cursor_container = new WeakMap(), _Cursor_cursorType = new WeakMap(), _Cursor_resizeCursorBaseImage = new WeakMap(), _Cursor_cursorImageMap = new WeakMap(), _Cursor_instances = new WeakSet(), _Cursor_init = function _Cursor_init() {
37
+ const eventHub = __classPrivateFieldGet(this, _Cursor_eventHub, "f");
38
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_resetCursor).call(this, 'default');
39
+ eventHub.on(coreEventKeys.CURSOR, (e) => {
40
+ var _a;
41
+ if (e.type === 'over-element' || !e.type) {
42
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_resetCursor).call(this, 'auto');
43
+ }
44
+ else if (e.type === 'resize-rotate') {
45
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_resetCursor).call(this, 'rotate');
46
+ }
47
+ else if (typeof e.type === 'string' && ((_a = e.type) === null || _a === void 0 ? void 0 : _a.startsWith('resize-'))) {
48
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_setCursorResize).call(this, e);
49
+ }
50
+ else if (e.type === 'drag-default') {
51
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_resetCursor).call(this, 'drag-default');
52
+ }
53
+ else if (e.type === 'drag-active') {
54
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_resetCursor).call(this, 'drag-active');
55
+ }
56
+ else {
57
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_resetCursor).call(this, 'auto');
58
+ }
59
+ });
60
+ }, _Cursor_loadResizeCursorBaseImage = function _Cursor_loadResizeCursorBaseImage() {
61
+ loadImage(CURSOR_RESIZE)
62
+ .then((img) => {
63
+ __classPrivateFieldSet(this, _Cursor_resizeCursorBaseImage, img, "f");
64
+ })
65
+ .catch((err) => {
66
+ console.error(err);
67
+ });
68
+ }, _Cursor_resetCursor = function _Cursor_resetCursor(cursorKey) {
69
+ if (__classPrivateFieldGet(this, _Cursor_cursorType, "f") === cursorKey) {
70
+ return;
71
+ }
72
+ __classPrivateFieldSet(this, _Cursor_cursorType, cursorKey, "f");
73
+ const image = __classPrivateFieldGet(this, _Cursor_cursorImageMap, "f")[__classPrivateFieldGet(this, _Cursor_cursorType, "f")] || __classPrivateFieldGet(this, _Cursor_cursorImageMap, "f")['auto'];
74
+ let offsetX = 0;
75
+ let offsetY = 0;
76
+ if (cursorKey.startsWith('rotate-') && __classPrivateFieldGet(this, _Cursor_cursorImageMap, "f")[__classPrivateFieldGet(this, _Cursor_cursorType, "f")]) {
77
+ offsetX = 10;
78
+ offsetY = 10;
79
+ }
80
+ else if (cursorKey === 'rotate') {
81
+ offsetX = 10;
82
+ offsetY = 10;
83
+ }
84
+ if (cursorKey === 'default') {
85
+ __classPrivateFieldGet(this, _Cursor_container, "f").style.cursor = 'default';
86
+ }
87
+ else {
88
+ __classPrivateFieldGet(this, _Cursor_container, "f").style.cursor = `image-set(url(${image})2x) ${offsetX} ${offsetY}, auto`;
89
+ }
90
+ }, _Cursor_setCursorResize = function _Cursor_setCursorResize(e) {
91
+ var _a;
92
+ let totalAngle = 0;
93
+ if (e.type === 'resize-top') {
94
+ totalAngle += 0;
95
+ }
96
+ else if (e.type === 'resize-top-right') {
97
+ totalAngle += 45;
98
+ }
99
+ else if (e.type === 'resize-right') {
100
+ totalAngle += 90;
101
+ }
102
+ else if (e.type === 'resize-bottom-right') {
103
+ totalAngle += 135;
104
+ }
105
+ else if (e.type === 'resize-bottom') {
106
+ totalAngle += 180;
107
+ }
108
+ else if (e.type === 'resize-bottom-left') {
109
+ totalAngle += 225;
110
+ }
111
+ else if (e.type === 'resize-left') {
112
+ totalAngle += 270;
113
+ }
114
+ else if (e.type === 'resize-top-left') {
115
+ totalAngle += 315;
116
+ }
117
+ totalAngle += limitAngle(((_a = e === null || e === void 0 ? void 0 : e.element) === null || _a === void 0 ? void 0 : _a.angle) || 0);
118
+ if (Array.isArray(e.groupQueue) && e.groupQueue.length > 0) {
119
+ e.groupQueue.forEach((group) => {
120
+ totalAngle += limitAngle(group.angle || 0);
121
+ });
122
+ }
123
+ totalAngle = limitAngle(totalAngle);
124
+ const cursorKey = __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_appendRotateResizeImage).call(this, totalAngle);
125
+ __classPrivateFieldGet(this, _Cursor_instances, "m", _Cursor_resetCursor).call(this, cursorKey);
126
+ }, _Cursor_appendRotateResizeImage = function _Cursor_appendRotateResizeImage(angle) {
127
+ const key = `rotate-${angle}`;
128
+ if (!__classPrivateFieldGet(this, _Cursor_cursorImageMap, "f")[key]) {
129
+ const baseImage = __classPrivateFieldGet(this, _Cursor_resizeCursorBaseImage, "f");
130
+ if (baseImage) {
131
+ const canvas = document.createElement('canvas');
132
+ const w = baseImage.width;
133
+ const h = baseImage.height;
134
+ const center = {
135
+ x: w / 2,
136
+ y: h / 2
137
+ };
138
+ canvas.width = w;
139
+ canvas.height = h;
140
+ const ctx = canvas.getContext('2d');
141
+ const radian = parseAngleToRadian(angle);
142
+ ctx.translate(center.x, center.y);
143
+ ctx.rotate(radian);
144
+ ctx.translate(-center.x, -center.y);
145
+ ctx.drawImage(baseImage, 0, 0, w, h);
146
+ ctx.translate(center.x, center.y);
147
+ ctx.rotate(-radian);
148
+ ctx.translate(-center.x, -center.y);
149
+ const base = canvas.toDataURL('image/png');
150
+ __classPrivateFieldGet(this, _Cursor_cursorImageMap, "f")[key] = base;
151
+ }
152
+ }
153
+ return key;
154
+ };
@@ -1,16 +1,25 @@
1
- import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEvent, ViewScaleInfo, LoadItemMap } from '@idraw/types';
2
- export { MiddlewareSelector, middlewareEventSelect, middlewareEventSelectClear } from './middleware/selector';
3
- export { MiddlewareScroller } from './middleware/scroller';
4
- export { MiddlewareScaler, middlewareEventScale } from './middleware/scaler';
5
- export { MiddlewareRuler, middlewareEventRuler } from './middleware/ruler';
6
- export { MiddlewareTextEditor, middlewareEventTextEdit } from './middleware/text-editor';
7
- export { MiddlewareDragger } from './middleware/dragger';
8
- export declare class Core<E extends CoreEvent = CoreEvent> {
1
+ import type { Data, PointSize, CoreOptions, Middleware, ViewSizeInfo, CoreEventMap, ViewScaleInfo, LoadItemMap, ElementType, RecursivePartial, Element, ModifyRecord, ElementPosition, DataLayout, DataGlobal } from '@idraw/types';
2
+ import { Board, Sharer, Calculator } from './board';
3
+ export { coreEventKeys } from './config';
4
+ export type { CoreEventKeys } from './config';
5
+ export { Board, Sharer, Calculator };
6
+ export { MiddlewareSelector } from './middlewares/selector';
7
+ export { MiddlewareScroller } from './middlewares/scroller';
8
+ export { MiddlewareScaler } from './middlewares/scaler';
9
+ export { MiddlewareRuler } from './middlewares/ruler';
10
+ export { MiddlewareTextEditor } from './middlewares/text-editor';
11
+ export { MiddlewareDragger } from './middlewares/dragger';
12
+ export { MiddlewareInfo } from './middlewares/info';
13
+ export { MiddlewareLayoutSelector } from './middlewares/layout-selector';
14
+ export { MiddlewarePointer } from './middlewares/pointer';
15
+ export declare class Core<E extends CoreEventMap = CoreEventMap> {
9
16
  #private;
10
17
  constructor(container: HTMLDivElement, opts: CoreOptions);
18
+ isDestroyed(): boolean;
11
19
  destroy(): void;
12
- use(middleware: BoardMiddleware<any, any>): void;
13
- disuse(middleware: BoardMiddleware<any, any>): void;
20
+ use<C extends any = any>(middleware: Middleware<any, any, any>, config?: C): void;
21
+ disuse(middleware: Middleware<any, any, any>): void;
22
+ resetMiddlewareConfig<C extends any = any>(middleware: Middleware<any, any, any>, config?: Partial<C>): void;
14
23
  setData(data: Data): void;
15
24
  getData(): Data | null;
16
25
  scale(opts: {
@@ -27,10 +36,30 @@ export declare class Core<E extends CoreEvent = CoreEvent> {
27
36
  viewScaleInfo: ViewScaleInfo;
28
37
  };
29
38
  refresh(): void;
39
+ forceRender(): void;
30
40
  setViewScale(opts: {
31
41
  scale: number;
32
42
  offsetX: number;
33
43
  offsetY: number;
34
44
  }): void;
35
45
  getLoadItemMap(): LoadItemMap;
46
+ onBoardWatcherEvents(): void;
47
+ offBoardWatcherEvents(): void;
48
+ createElement<T extends ElementType = ElementType>(type: T, element: RecursivePartial<Element<T>>, opts?: {
49
+ viewCenter?: boolean;
50
+ }): Element<T>;
51
+ updateElement(element: Element): ModifyRecord<'updateElement'> | null;
52
+ modifyElement(element: RecursivePartial<Omit<Element, 'uuid'>> & Pick<Element, 'uuid'>): ModifyRecord<'modifyElement'> | null;
53
+ modifyElements(elements: Array<RecursivePartial<Omit<Element, 'uuid'>> & Pick<Element, 'uuid'>>): ModifyRecord<'modifyElements'> | null;
54
+ addElement(element: Element, opts?: {
55
+ position: ElementPosition;
56
+ }): ModifyRecord<'addElement'>;
57
+ deleteElement(uuid: string): ModifyRecord<'deleteElement'>;
58
+ moveElement(uuid: string, to: ElementPosition): ModifyRecord<'moveElement'>;
59
+ modifyLayout(layout: RecursivePartial<DataLayout> | null): ModifyRecord<'modifyLayout'>;
60
+ modifyGlobal(global: RecursivePartial<DataGlobal> | null): {
61
+ type: "modifyGlobal";
62
+ time: number;
63
+ content: import("@idraw/types").ModifyContentMap["modifyGlobal"];
64
+ };
36
65
  }
package/dist/esm/index.js CHANGED
@@ -9,28 +9,49 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _Core_instances, _Core_board, _Core_container, _Core_initContainer;
13
- import { Board } from '@idraw/board';
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ var _Core_instances, _Core_board, _Core_canvas, _Core_container, _Core_initContainer, _Core_resetData;
24
+ import { deepClone, createElement, getElementPositionFromList, toFlattenElement, deleteElementInList, findElementFromListByPosition, updateElementInListByPosition, insertElementToListByPosition, moveElementPosition, toFlattenLayout, toFlattenGlobal, get, mergeLayout, mergeGlobal } from '@idraw/util';
25
+ import { Board, Sharer, Calculator } from './board';
14
26
  import { createBoardContent, validateElements } from '@idraw/util';
15
- import { Cursor } from './lib/cursor';
16
- export { MiddlewareSelector, middlewareEventSelect, middlewareEventSelectClear } from './middleware/selector';
17
- export { MiddlewareScroller } from './middleware/scroller';
18
- export { MiddlewareScaler, middlewareEventScale } from './middleware/scaler';
19
- export { MiddlewareRuler, middlewareEventRuler } from './middleware/ruler';
20
- export { MiddlewareTextEditor, middlewareEventTextEdit } from './middleware/text-editor';
21
- export { MiddlewareDragger } from './middleware/dragger';
27
+ import { Cursor } from './cursor/cursor';
28
+ import { getModifyElementRecord } from './record';
29
+ export { coreEventKeys } from './config';
30
+ export { Board, Sharer, Calculator };
31
+ export { MiddlewareSelector } from './middlewares/selector';
32
+ export { MiddlewareScroller } from './middlewares/scroller';
33
+ export { MiddlewareScaler } from './middlewares/scaler';
34
+ export { MiddlewareRuler } from './middlewares/ruler';
35
+ export { MiddlewareTextEditor } from './middlewares/text-editor';
36
+ export { MiddlewareDragger } from './middlewares/dragger';
37
+ export { MiddlewareInfo } from './middlewares/info';
38
+ export { MiddlewareLayoutSelector } from './middlewares/layout-selector';
39
+ export { MiddlewarePointer } from './middlewares/pointer';
22
40
  export class Core {
23
41
  constructor(container, opts) {
24
42
  _Core_instances.add(this);
25
43
  _Core_board.set(this, void 0);
44
+ _Core_canvas.set(this, void 0);
26
45
  _Core_container.set(this, void 0);
27
- const { devicePixelRatio = 1, width, height } = opts;
46
+ const { devicePixelRatio = 1, width, height, disableWatcher = false } = opts;
28
47
  __classPrivateFieldSet(this, _Core_container, container, "f");
29
48
  const canvas = document.createElement('canvas');
49
+ canvas.setAttribute('tabindex', '0');
50
+ __classPrivateFieldSet(this, _Core_canvas, canvas, "f");
30
51
  __classPrivateFieldGet(this, _Core_instances, "m", _Core_initContainer).call(this);
31
52
  container.appendChild(canvas);
32
- const boardContent = createBoardContent(canvas, { width, height, devicePixelRatio, offscreen: true });
33
- const board = new Board({ boardContent, container });
53
+ const boardContent = createBoardContent(canvas, { width, height, devicePixelRatio });
54
+ const board = new Board({ boardContent, container, disableWatcher });
34
55
  const sharer = board.getSharer();
35
56
  sharer.setActiveViewSizeInfo({
36
57
  width,
@@ -46,18 +67,26 @@ export class Core {
46
67
  eventHub
47
68
  });
48
69
  }
70
+ isDestroyed() {
71
+ return __classPrivateFieldGet(this, _Core_board, "f").isDestroyed();
72
+ }
49
73
  destroy() {
50
74
  __classPrivateFieldGet(this, _Core_board, "f").destroy();
75
+ __classPrivateFieldGet(this, _Core_canvas, "f").remove();
51
76
  }
52
- use(middleware) {
53
- __classPrivateFieldGet(this, _Core_board, "f").use(middleware);
77
+ use(middleware, config) {
78
+ __classPrivateFieldGet(this, _Core_board, "f").use(middleware, config);
54
79
  }
55
80
  disuse(middleware) {
56
81
  __classPrivateFieldGet(this, _Core_board, "f").disuse(middleware);
57
82
  }
83
+ resetMiddlewareConfig(middleware, config) {
84
+ __classPrivateFieldGet(this, _Core_board, "f").resetMiddlewareConfig(middleware, config);
85
+ }
58
86
  setData(data) {
59
- validateElements((data === null || data === void 0 ? void 0 : data.elements) || []);
60
- __classPrivateFieldGet(this, _Core_board, "f").setData(data);
87
+ const loader = __classPrivateFieldGet(this, _Core_board, "f").getRenderer().getLoader();
88
+ loader.reset();
89
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
61
90
  }
62
91
  getData() {
63
92
  return __classPrivateFieldGet(this, _Core_board, "f").getData();
@@ -101,14 +130,264 @@ export class Core {
101
130
  refresh() {
102
131
  __classPrivateFieldGet(this, _Core_board, "f").getViewer().drawFrame();
103
132
  }
133
+ forceRender() {
134
+ const renderer = __classPrivateFieldGet(this, _Core_board, "f").getRenderer();
135
+ const calculator = renderer.getCalculator();
136
+ const loader = renderer.getLoader();
137
+ const data = this.getData();
138
+ if (data) {
139
+ const { viewScaleInfo, viewSizeInfo } = this.getViewInfo();
140
+ calculator.resetVirtualFlatItemMap(data, {
141
+ viewScaleInfo,
142
+ viewSizeInfo
143
+ });
144
+ }
145
+ loader.reset();
146
+ this.refresh();
147
+ }
104
148
  setViewScale(opts) {
105
149
  __classPrivateFieldGet(this, _Core_board, "f").updateViewScaleInfo(opts);
106
150
  }
107
151
  getLoadItemMap() {
108
152
  return __classPrivateFieldGet(this, _Core_board, "f").getRenderer().getLoadItemMap();
109
153
  }
154
+ onBoardWatcherEvents() {
155
+ __classPrivateFieldGet(this, _Core_board, "f").onWatcherEvents();
156
+ }
157
+ offBoardWatcherEvents() {
158
+ __classPrivateFieldGet(this, _Core_board, "f").offWatcherEvents();
159
+ }
160
+ createElement(type, element, opts) {
161
+ const { viewScaleInfo, viewSizeInfo } = this.getViewInfo();
162
+ return createElement(type, element || {}, (opts === null || opts === void 0 ? void 0 : opts.viewCenter) === true
163
+ ? {
164
+ viewScaleInfo,
165
+ viewSizeInfo
166
+ }
167
+ : undefined);
168
+ }
169
+ updateElement(element) {
170
+ const data = this.getData() || { elements: [] };
171
+ const uuid = element.uuid;
172
+ const position = getElementPositionFromList(uuid, data.elements);
173
+ const beforeElem = findElementFromListByPosition(position, data.elements);
174
+ if (!beforeElem) {
175
+ return null;
176
+ }
177
+ const before = toFlattenElement(beforeElem);
178
+ const updatedElement = updateElementInListByPosition(position, element, data.elements, { strict: true });
179
+ const after = toFlattenElement(updatedElement);
180
+ const loader = __classPrivateFieldGet(this, _Core_board, "f").getRenderer().getLoader();
181
+ loader.resetElementAsset(element);
182
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
183
+ this.refresh();
184
+ const modifyRecord = {
185
+ type: 'updateElement',
186
+ time: Date.now(),
187
+ content: { method: 'updateElement', uuid, before, after }
188
+ };
189
+ return modifyRecord;
190
+ }
191
+ modifyElement(element) {
192
+ const { uuid } = element, restElement = __rest(element, ["uuid"]);
193
+ const data = this.getData() || { elements: [] };
194
+ const position = getElementPositionFromList(uuid, data.elements);
195
+ const beforeElem = findElementFromListByPosition(position, data.elements);
196
+ if (!beforeElem) {
197
+ return null;
198
+ }
199
+ const modifyRecord = getModifyElementRecord({
200
+ modifiedElement: element,
201
+ beforeElement: beforeElem
202
+ });
203
+ updateElementInListByPosition(position, restElement, data.elements);
204
+ const loader = __classPrivateFieldGet(this, _Core_board, "f").getRenderer().getLoader();
205
+ loader.resetElementAsset(Object.assign(Object.assign({}, element), { type: beforeElem.type }));
206
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
207
+ this.refresh();
208
+ return modifyRecord;
209
+ }
210
+ modifyElements(elements) {
211
+ const data = this.getData() || { elements: [] };
212
+ let modifyRecord = null;
213
+ const before = [];
214
+ const after = [];
215
+ elements.forEach((element) => {
216
+ const { uuid } = element, restElement = __rest(element, ["uuid"]);
217
+ const position = getElementPositionFromList(uuid, data.elements);
218
+ const beforeElem = findElementFromListByPosition(position, data.elements);
219
+ if (!beforeElem) {
220
+ return null;
221
+ }
222
+ const tempRecord = getModifyElementRecord({
223
+ modifiedElement: element,
224
+ beforeElement: beforeElem
225
+ });
226
+ if (tempRecord.content) {
227
+ before.push(Object.assign(Object.assign({}, tempRecord.content.before), { uuid }));
228
+ after.push(Object.assign(Object.assign({}, tempRecord.content.after), { uuid }));
229
+ }
230
+ updateElementInListByPosition(position, restElement, data.elements);
231
+ });
232
+ modifyRecord = {
233
+ type: 'modifyElements',
234
+ time: Date.now(),
235
+ content: {
236
+ method: 'modifyElements',
237
+ before,
238
+ after
239
+ }
240
+ };
241
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
242
+ this.refresh();
243
+ return modifyRecord;
244
+ }
245
+ addElement(element, opts) {
246
+ var _a;
247
+ const data = this.getData() || { elements: [] };
248
+ if (!opts || !((_a = opts === null || opts === void 0 ? void 0 : opts.position) === null || _a === void 0 ? void 0 : _a.length)) {
249
+ data.elements.push(element);
250
+ }
251
+ else if (opts === null || opts === void 0 ? void 0 : opts.position) {
252
+ const position = [...((opts === null || opts === void 0 ? void 0 : opts.position) || [])];
253
+ insertElementToListByPosition(element, position, data.elements);
254
+ }
255
+ const position = getElementPositionFromList(element.uuid, data.elements);
256
+ const modifyRecord = {
257
+ type: 'addElement',
258
+ time: Date.now(),
259
+ content: { method: 'addElement', uuid: element.uuid, position, element: deepClone(element) }
260
+ };
261
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
262
+ this.refresh();
263
+ return modifyRecord;
264
+ }
265
+ deleteElement(uuid) {
266
+ const data = this.getData() || { elements: [] };
267
+ const position = getElementPositionFromList(uuid, data.elements);
268
+ const element = findElementFromListByPosition(position, data.elements);
269
+ const modifyRecord = {
270
+ type: 'deleteElement',
271
+ time: Date.now(),
272
+ content: { method: 'deleteElement', uuid, position, element: element ? deepClone(element) : null }
273
+ };
274
+ if (element) {
275
+ const loader = __classPrivateFieldGet(this, _Core_board, "f").getRenderer().getLoader();
276
+ loader.resetElementAsset(element);
277
+ }
278
+ deleteElementInList(uuid, data.elements);
279
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
280
+ this.refresh();
281
+ return modifyRecord;
282
+ }
283
+ moveElement(uuid, to) {
284
+ const data = this.getData() || { elements: [] };
285
+ const from = getElementPositionFromList(uuid, data.elements);
286
+ const modifyRecord = {
287
+ type: 'moveElement',
288
+ time: Date.now(),
289
+ content: { method: 'moveElement', uuid, from: [...from], to: [...to] }
290
+ };
291
+ const { elements: list } = moveElementPosition(data.elements, { from, to });
292
+ data.elements = list;
293
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
294
+ this.refresh();
295
+ return modifyRecord;
296
+ }
297
+ modifyLayout(layout) {
298
+ const data = this.getData() || { elements: [] };
299
+ const modifyRecord = {
300
+ type: 'modifyLayout',
301
+ time: Date.now(),
302
+ content: {
303
+ method: 'modifyLayout',
304
+ before: null,
305
+ after: null
306
+ }
307
+ };
308
+ if (layout === null) {
309
+ if (data.layout) {
310
+ modifyRecord.content.before = toFlattenLayout(data.layout);
311
+ delete data['layout'];
312
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
313
+ this.refresh();
314
+ return modifyRecord;
315
+ }
316
+ else {
317
+ return modifyRecord;
318
+ }
319
+ }
320
+ const beforeLayout = data.layout;
321
+ let before = {};
322
+ const after = toFlattenLayout(layout);
323
+ if (data.layout) {
324
+ Object.keys(after).forEach((key) => {
325
+ let val = get(beforeLayout, key);
326
+ if (val === undefined && /(borderRadius|borderWidth)\[[0-9]{1,}\]$/.test(key)) {
327
+ key = key.replace(/\[[0-9]{1,}\]$/, '');
328
+ val = get(beforeLayout, key);
329
+ }
330
+ before[key] = val;
331
+ });
332
+ before = toFlattenLayout(before);
333
+ modifyRecord.content.before = before;
334
+ }
335
+ else {
336
+ data.layout = {};
337
+ }
338
+ modifyRecord.content.after = after;
339
+ mergeLayout(data.layout, layout);
340
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
341
+ this.refresh();
342
+ return modifyRecord;
343
+ }
344
+ modifyGlobal(global) {
345
+ const data = this.getData() || { elements: [] };
346
+ const modifyRecord = {
347
+ type: 'modifyGlobal',
348
+ time: Date.now(),
349
+ content: {
350
+ method: 'modifyGlobal',
351
+ before: null,
352
+ after: null
353
+ }
354
+ };
355
+ if (global === null) {
356
+ if (data.global) {
357
+ modifyRecord.content.before = toFlattenGlobal(data.global);
358
+ delete data['global'];
359
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
360
+ this.refresh();
361
+ return modifyRecord;
362
+ }
363
+ else {
364
+ return modifyRecord;
365
+ }
366
+ }
367
+ const beforeGlobal = data.global;
368
+ let before = {};
369
+ const after = toFlattenGlobal(global);
370
+ if (data.global) {
371
+ Object.keys(after).forEach((key) => {
372
+ before[key] = get(beforeGlobal, key);
373
+ });
374
+ before = toFlattenGlobal(before);
375
+ modifyRecord.content.before = before;
376
+ }
377
+ else {
378
+ data.global = {};
379
+ }
380
+ modifyRecord.content.after = after;
381
+ mergeGlobal(data.global, global);
382
+ __classPrivateFieldGet(this, _Core_instances, "m", _Core_resetData).call(this, data);
383
+ this.refresh();
384
+ return modifyRecord;
385
+ }
110
386
  }
111
- _Core_board = new WeakMap(), _Core_container = new WeakMap(), _Core_instances = new WeakSet(), _Core_initContainer = function _Core_initContainer() {
387
+ _Core_board = new WeakMap(), _Core_canvas = new WeakMap(), _Core_container = new WeakMap(), _Core_instances = new WeakSet(), _Core_initContainer = function _Core_initContainer() {
112
388
  const container = __classPrivateFieldGet(this, _Core_container, "f");
113
389
  container.style.position = 'relative';
390
+ }, _Core_resetData = function _Core_resetData(data) {
391
+ validateElements((data === null || data === void 0 ? void 0 : data.elements) || []);
392
+ __classPrivateFieldGet(this, _Core_board, "f").setData(data);
114
393
  };
@@ -0,0 +1,7 @@
1
+ import type { Middleware, CoreEventMap, Point } from '@idraw/types';
2
+ declare const keyPrevPoint: unique symbol;
3
+ type DraggerSharedStorage = {
4
+ [keyPrevPoint]: Point | null;
5
+ };
6
+ export declare const MiddlewareDragger: Middleware<DraggerSharedStorage, CoreEventMap>;
7
+ export {};
@@ -1,3 +1,4 @@
1
+ import { coreEventKeys } from '../../config';
1
2
  const key = 'DRAG';
2
3
  const keyPrevPoint = Symbol(`${key}_prevPoint`);
3
4
  export const MiddlewareDragger = (opts) => {
@@ -9,7 +10,7 @@ export const MiddlewareDragger = (opts) => {
9
10
  if (isDragging === true) {
10
11
  return;
11
12
  }
12
- eventHub.trigger('cursor', {
13
+ eventHub.trigger(coreEventKeys.CURSOR, {
13
14
  type: 'drag-default'
14
15
  });
15
16
  },
@@ -17,7 +18,7 @@ export const MiddlewareDragger = (opts) => {
17
18
  const { point } = e;
18
19
  sharer.setSharedStorage(keyPrevPoint, point);
19
20
  isDragging = true;
20
- eventHub.trigger('cursor', {
21
+ eventHub.trigger(coreEventKeys.CURSOR, {
21
22
  type: 'drag-active'
22
23
  });
23
24
  },
@@ -35,7 +36,7 @@ export const MiddlewareDragger = (opts) => {
35
36
  pointEnd() {
36
37
  isDragging = false;
37
38
  sharer.setSharedStorage(keyPrevPoint, null);
38
- eventHub.trigger('cursor', {
39
+ eventHub.trigger(coreEventKeys.CURSOR, {
39
40
  type: 'drag-default'
40
41
  });
41
42
  }
@@ -0,0 +1,5 @@
1
+ import type { MiddlewareInfoStyle } from '@idraw/types';
2
+ export declare const infoFontSize = 10;
3
+ export declare const infoLineHeight = 16;
4
+ export declare const MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE = "@middleware/internal-event/show-info-angle";
5
+ export declare const defaltStyle: MiddlewareInfoStyle;
@@ -0,0 +1,9 @@
1
+ const infoBackground = '#1973bac6';
2
+ const infoTextColor = '#ffffff';
3
+ export const infoFontSize = 10;
4
+ export const infoLineHeight = 16;
5
+ export const MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE = '@middleware/internal-event/show-info-angle';
6
+ export const defaltStyle = {
7
+ textBackground: infoBackground,
8
+ textColor: infoTextColor
9
+ };
@@ -0,0 +1,29 @@
1
+ import type { PointSize, ViewContext2D } from '@idraw/types';
2
+ import type { MiddlewareInfoStyle } from '@idraw/types';
3
+ export declare function drawSizeInfoText(ctx: ViewContext2D, opts: {
4
+ point: PointSize;
5
+ rotateCenter: PointSize;
6
+ angle: number;
7
+ text: string;
8
+ fontSize: number;
9
+ lineHeight: number;
10
+ style: MiddlewareInfoStyle;
11
+ }): void;
12
+ export declare function drawPositionInfoText(ctx: ViewContext2D, opts: {
13
+ point: PointSize;
14
+ rotateCenter: PointSize;
15
+ angle: number;
16
+ text: string;
17
+ fontSize: number;
18
+ lineHeight: number;
19
+ style: MiddlewareInfoStyle;
20
+ }): void;
21
+ export declare function drawAngleInfoText(ctx: ViewContext2D, opts: {
22
+ point: PointSize;
23
+ rotateCenter: PointSize;
24
+ angle: number;
25
+ text: string;
26
+ fontSize: number;
27
+ lineHeight: number;
28
+ style: MiddlewareInfoStyle;
29
+ }): void;