@idraw/core 0.3.1 → 0.4.0-alpha.2

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 (74) hide show
  1. package/dist/esm/index.d.ts +19 -55
  2. package/dist/esm/index.js +52 -188
  3. package/dist/esm/lib/cursor-image.d.ts +2 -0
  4. package/dist/esm/lib/cursor-image.js +2 -0
  5. package/dist/esm/lib/cursor.d.ts +16 -0
  6. package/dist/esm/lib/cursor.js +121 -0
  7. package/dist/esm/middleware/scaler/index.d.ts +2 -0
  8. package/dist/esm/middleware/scaler/index.js +22 -0
  9. package/dist/esm/middleware/scroller/config.d.ts +6 -0
  10. package/dist/esm/middleware/scroller/config.js +6 -0
  11. package/dist/esm/middleware/scroller/index.d.ts +2 -0
  12. package/dist/esm/middleware/scroller/index.js +97 -0
  13. package/dist/esm/middleware/scroller/util.d.ts +12 -0
  14. package/dist/esm/middleware/scroller/util.js +192 -0
  15. package/dist/esm/middleware/selector/config.d.ts +20 -0
  16. package/dist/esm/middleware/selector/config.js +20 -0
  17. package/dist/esm/middleware/selector/draw-wrapper.d.ts +22 -0
  18. package/dist/esm/middleware/selector/draw-wrapper.js +111 -0
  19. package/dist/esm/middleware/selector/index.d.ts +3 -0
  20. package/dist/esm/middleware/selector/index.js +454 -0
  21. package/dist/esm/middleware/selector/types.d.ts +40 -0
  22. package/dist/esm/middleware/selector/types.js +1 -0
  23. package/dist/esm/middleware/selector/util.d.ts +53 -0
  24. package/dist/esm/middleware/selector/util.js +789 -0
  25. package/dist/index.global.js +3825 -3991
  26. package/dist/index.global.min.js +1 -1
  27. package/package.json +7 -7
  28. package/LICENSE +0 -21
  29. package/dist/esm/constant/element.d.ts +0 -2
  30. package/dist/esm/constant/element.js +0 -10
  31. package/dist/esm/constant/static.d.ts +0 -11
  32. package/dist/esm/constant/static.js +0 -13
  33. package/dist/esm/lib/calculate.d.ts +0 -5
  34. package/dist/esm/lib/calculate.js +0 -64
  35. package/dist/esm/lib/check.d.ts +0 -28
  36. package/dist/esm/lib/check.js +0 -115
  37. package/dist/esm/lib/config.d.ts +0 -3
  38. package/dist/esm/lib/config.js +0 -20
  39. package/dist/esm/lib/core-event.d.ts +0 -49
  40. package/dist/esm/lib/core-event.js +0 -50
  41. package/dist/esm/lib/diff.d.ts +0 -6
  42. package/dist/esm/lib/diff.js +0 -82
  43. package/dist/esm/lib/draw/base.d.ts +0 -5
  44. package/dist/esm/lib/draw/base.js +0 -90
  45. package/dist/esm/lib/draw/wrapper.d.ts +0 -4
  46. package/dist/esm/lib/draw/wrapper.js +0 -168
  47. package/dist/esm/lib/element.d.ts +0 -15
  48. package/dist/esm/lib/element.js +0 -442
  49. package/dist/esm/lib/engine-temp.d.ts +0 -22
  50. package/dist/esm/lib/engine-temp.js +0 -29
  51. package/dist/esm/lib/engine.d.ts +0 -47
  52. package/dist/esm/lib/engine.js +0 -323
  53. package/dist/esm/lib/helper.d.ts +0 -30
  54. package/dist/esm/lib/helper.js +0 -363
  55. package/dist/esm/lib/index.d.ts +0 -13
  56. package/dist/esm/lib/index.js +0 -13
  57. package/dist/esm/lib/is.d.ts +0 -26
  58. package/dist/esm/lib/is.js +0 -100
  59. package/dist/esm/lib/mapper.d.ts +0 -26
  60. package/dist/esm/lib/mapper.js +0 -89
  61. package/dist/esm/lib/parse.d.ts +0 -2
  62. package/dist/esm/lib/parse.js +0 -32
  63. package/dist/esm/lib/temp.d.ts +0 -11
  64. package/dist/esm/lib/temp.js +0 -19
  65. package/dist/esm/lib/transform.d.ts +0 -4
  66. package/dist/esm/lib/transform.js +0 -20
  67. package/dist/esm/lib/value.d.ts +0 -2
  68. package/dist/esm/lib/value.js +0 -7
  69. package/dist/esm/mixins/element.d.ts +0 -18
  70. package/dist/esm/mixins/element.js +0 -168
  71. package/dist/esm/plugins/helper.d.ts +0 -12
  72. package/dist/esm/plugins/helper.js +0 -16
  73. package/dist/esm/util/filter.d.ts +0 -1
  74. package/dist/esm/util/filter.js +0 -3
@@ -1,59 +1,23 @@
1
- import { IDrawData, Point, BoardSizeOptions, IDrawConfig, DataElementBase, DataElement, DataElemDesc, IDrawContext, CoreOptions, ScreenContext, ScreenData } from '@idraw/types';
2
- import { IsTypeUtil } from './lib/is';
3
- import { CheckTypeUtil } from './lib/check';
4
- import { Element, TypeCoreEventArgMap } from './lib';
5
- import { Engine } from './lib/engine';
6
- export default class Core {
7
- $data: IDrawData;
1
+ import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEvent } from '@idraw/types';
2
+ export { MiddlewareSelector } from './middleware/selector';
3
+ export { MiddlewareScroller } from './middleware/scroller';
4
+ export { MiddlewareScaler } from './middleware/scaler';
5
+ export declare class Core {
8
6
  private _board;
9
7
  private _opts;
10
- private _config;
11
- private _renderer;
12
- private _elementHandler;
13
- private _coreEvent;
14
- private _tempData;
15
- private _engine;
16
- static is: IsTypeUtil;
17
- static check: CheckTypeUtil;
18
- constructor(mount: HTMLDivElement, opts: CoreOptions, config?: IDrawConfig);
19
- private _emitChangeScreen;
20
- $draw(opts?: {
21
- resourceChangeUUIDs?: string[];
8
+ private _container;
9
+ private _canvas;
10
+ constructor(container: HTMLDivElement, opts: CoreOptions);
11
+ use(middleware: BoardMiddleware<any, any>): void;
12
+ setData(data: Data): void;
13
+ getData(): Data | null;
14
+ scale(opts: {
15
+ scale: number;
16
+ point: PointSize;
22
17
  }): void;
23
- getElement(uuid: string): DataElement<keyof DataElemDesc> | null;
24
- getElementByIndex(index: number): DataElement<keyof DataElemDesc> | null;
25
- selectElementByIndex(index: number): void;
26
- selectElement(uuid: string): void;
27
- cancelElementByIndex(index: number): void;
28
- cancelElement(uuid: string): void;
29
- moveUpElement(uuid: string): void;
30
- moveDownElement(uuid: string): void;
31
- updateElement(elem: DataElement<keyof DataElemDesc>): void;
32
- addElement(elem: DataElementBase<keyof DataElemDesc>): string | null;
33
- deleteElement(uuid: string): void;
34
- insertElementBefore(elem: DataElementBase<keyof DataElemDesc>, beforeUUID: string): any;
35
- insertElementBeforeIndex(elem: DataElementBase<keyof DataElemDesc>, index: number): any;
36
- getSelectedElements(): DataElement<keyof DataElemDesc>[];
37
- insertElementAfter(elem: DataElementBase<keyof DataElemDesc>, beforeUUID: string): any;
38
- insertElementAfterIndex(elem: DataElementBase<keyof DataElemDesc>, index: number): any;
39
- resetSize(opts: BoardSizeOptions): void;
40
- scale(ratio: number): ScreenContext;
41
- scrollLeft(left: number): ScreenContext;
42
- scrollTop(top: number): ScreenContext;
43
- getScreenTransform(): ScreenData;
44
- getData(): IDrawData;
45
- setData(data: any | IDrawData, opts?: {
46
- triggerChangeEvent: boolean;
47
- }): void;
48
- clearOperation(): void;
49
- on<T extends keyof TypeCoreEventArgMap>(key: T, callback: (p: TypeCoreEventArgMap[T]) => void): void;
50
- off<T extends keyof TypeCoreEventArgMap>(key: T, callback: (p: TypeCoreEventArgMap[T]) => void): void;
51
- getEngine(): Engine;
52
- pointScreenToContext(p: Point): Point;
53
- pointContextToScreen(p: Point): Point;
54
- $getBoardContext(): IDrawContext;
55
- $getDisplayContext2D(): CanvasRenderingContext2D;
56
- $getOriginContext2D(): CanvasRenderingContext2D;
57
- $emitChangeData(): void;
58
- $getElementHandler(): Element;
18
+ resize(newViewSize: Partial<ViewSizeInfo>): void;
19
+ clear(): void;
20
+ on<T extends keyof CoreEvent>(name: T, callback: (e: CoreEvent[T]) => void): void;
21
+ off<T extends keyof CoreEvent>(name: T, callback: (e: CoreEvent[T]) => void): void;
22
+ trigger<T extends keyof CoreEvent>(name: T, e: CoreEvent[T]): void;
59
23
  }
package/dist/esm/index.js CHANGED
@@ -1,203 +1,67 @@
1
- import Board from '@idraw/board';
2
- import { deepClone } from '@idraw/util';
3
- import Renderer from '@idraw/renderer';
4
- import is from './lib/is';
5
- import check from './lib/check';
6
- import { Element, mergeConfig, CoreEvent, parseData, TempData, diffElementResourceChangeList } from './lib';
7
- import { getSelectedElements, updateElement, selectElementByIndex, selectElement, cancelElementByIndex, cancelElement, getElement, getElementByIndex, moveUpElement, moveDownElement, addElement, deleteElement, insertElementBefore, insertElementBeforeIndex, insertElementAfter, insertElementAfterIndex } from './mixins/element';
8
- import { Engine } from './lib/engine';
9
- import { drawElementWrapper, drawAreaWrapper, drawElementListWrappers } from './lib/draw/wrapper';
10
- class Core {
11
- constructor(mount, opts, config) {
12
- var _a, _b, _c;
13
- this._coreEvent = new CoreEvent();
14
- this._tempData = new TempData();
15
- this.$data = { elements: [] };
1
+ import { Board } from '@idraw/board';
2
+ import { createBoardContexts, validateElements } from '@idraw/util';
3
+ import { Cursor } from './lib/cursor';
4
+ export { MiddlewareSelector } from './middleware/selector';
5
+ export { MiddlewareScroller } from './middleware/scroller';
6
+ export { MiddlewareScaler } from './middleware/scaler';
7
+ export class Core {
8
+ constructor(container, opts) {
9
+ const { devicePixelRatio = 1, width, height } = opts;
16
10
  this._opts = opts;
17
- this._config = mergeConfig(config || {});
18
- this._board = new Board(mount, Object.assign(Object.assign({}, this._opts), { canScroll: (_a = config === null || config === void 0 ? void 0 : config.scrollWrapper) === null || _a === void 0 ? void 0 : _a.use, scrollConfig: Object.assign({ color: ((_b = config === null || config === void 0 ? void 0 : config.scrollWrapper) === null || _b === void 0 ? void 0 : _b.color) || '#000000', width: ((_c = config === null || config === void 0 ? void 0 : config.scrollWrapper) === null || _c === void 0 ? void 0 : _c.width) || 12 }, ((config === null || config === void 0 ? void 0 : config.scrollWrapper) || {})) }));
19
- this._renderer = new Renderer();
20
- const drawFrame = () => {
21
- const helperCtx = this._board.getHelperContext();
22
- const helperConfig = this._engine.getHelperConfig();
23
- this._board.clear();
24
- const { contextWidth, contextHeight, devicePixelRatio } = this._opts;
25
- helperCtx.clearRect(0, 0, contextWidth * devicePixelRatio, contextHeight * devicePixelRatio);
26
- drawElementWrapper(helperCtx, helperConfig);
27
- drawAreaWrapper(helperCtx, helperConfig);
28
- drawElementListWrappers(helperCtx, helperConfig);
29
- this._board.draw();
30
- };
31
- this._renderer.on('drawFrame', () => {
32
- drawFrame();
11
+ this._container = container;
12
+ const canvas = document.createElement('canvas');
13
+ this._canvas = canvas;
14
+ container.appendChild(canvas);
15
+ const ctx = canvas.getContext('2d');
16
+ const viewContent = createBoardContexts(ctx, { devicePixelRatio });
17
+ const board = new Board({ viewContent });
18
+ const sharer = board.getSharer();
19
+ sharer.setActiveViewSizeInfo({
20
+ width,
21
+ height,
22
+ devicePixelRatio,
23
+ contextWidth: width,
24
+ contextHeight: height
33
25
  });
34
- this._renderer.on('drawFrameComplete', () => {
35
- drawFrame();
26
+ this._board = board;
27
+ this.resize(sharer.getActiveViewSizeInfo());
28
+ const eventHub = board.getEventHub();
29
+ new Cursor(container, {
30
+ eventHub
36
31
  });
37
- this._elementHandler = new Element(this._board.getContext());
38
- this._engine = new Engine({
39
- coreEvent: this._coreEvent,
40
- board: this._board,
41
- element: this._elementHandler,
42
- config: this._config,
43
- drawFeekback: this.$draw.bind(this),
44
- getDataFeekback: () => this.$data,
45
- selectElementByIndex: this.selectElementByIndex.bind(this),
46
- emitChangeScreen: this._emitChangeScreen.bind(this),
47
- emitChangeData: this.$emitChangeData.bind(this)
48
- });
49
- this._engine.init();
50
- this._renderer.on('drawFrame', () => {
51
- this._coreEvent.trigger('drawFrame', undefined);
52
- });
53
- this._renderer.on('drawFrameComplete', () => {
54
- this._coreEvent.trigger('drawFrameComplete', undefined);
55
- });
56
- this._tempData.set('hasInited', true);
57
- }
58
- _emitChangeScreen() {
59
- if (this._coreEvent.has('changeScreen')) {
60
- this._coreEvent.trigger('changeScreen', Object.assign({}, this.getScreenTransform()));
61
- }
62
- }
63
- $draw(opts) {
64
- this._engine.updateHelperConfig({
65
- width: this._opts.width,
66
- height: this._opts.height,
67
- devicePixelRatio: this._opts.devicePixelRatio
68
- });
69
- this._renderer.thaw();
70
- this._renderer.render(this._board.getContext(), this.$data, {
71
- changeResourceUUIDs: (opts === null || opts === void 0 ? void 0 : opts.resourceChangeUUIDs) || []
72
- });
73
- }
74
- getElement(uuid) {
75
- return getElement(this, uuid);
76
- }
77
- getElementByIndex(index) {
78
- return getElementByIndex(this, index);
79
- }
80
- selectElementByIndex(index) {
81
- return selectElementByIndex(this, index);
82
- }
83
- selectElement(uuid) {
84
- return selectElement(this, uuid);
85
- }
86
- cancelElementByIndex(index) {
87
- return cancelElementByIndex(this, index);
88
- }
89
- cancelElement(uuid) {
90
- return cancelElement(this, uuid);
91
- }
92
- moveUpElement(uuid) {
93
- return moveUpElement(this, uuid);
94
- }
95
- moveDownElement(uuid) {
96
- return moveDownElement(this, uuid);
97
- }
98
- updateElement(elem) {
99
- return updateElement(this, elem);
100
32
  }
101
- addElement(elem) {
102
- return addElement(this, elem);
33
+ use(middleware) {
34
+ this._board.use(middleware);
103
35
  }
104
- deleteElement(uuid) {
105
- return deleteElement(this, uuid);
106
- }
107
- insertElementBefore(elem, beforeUUID) {
108
- return insertElementBefore(this, elem, beforeUUID);
109
- }
110
- insertElementBeforeIndex(elem, index) {
111
- return insertElementBeforeIndex(this, elem, index);
112
- }
113
- getSelectedElements() {
114
- return getSelectedElements(this);
115
- }
116
- insertElementAfter(elem, beforeUUID) {
117
- return insertElementAfter(this, elem, beforeUUID);
118
- }
119
- insertElementAfterIndex(elem, index) {
120
- return insertElementAfterIndex(this, elem, index);
121
- }
122
- resetSize(opts) {
123
- this._opts = Object.assign(Object.assign({}, this._opts), opts);
124
- this._board.resetSize(opts);
125
- this.$draw();
126
- }
127
- scale(ratio) {
128
- const screen = this._board.scale(ratio);
129
- this.$draw();
130
- this._emitChangeScreen();
131
- return screen;
132
- }
133
- scrollLeft(left) {
134
- const screen = this._board.scrollX(0 - left);
135
- this.$draw();
136
- this._emitChangeScreen();
137
- return screen;
138
- }
139
- scrollTop(top) {
140
- const screen = this._board.scrollY(0 - top);
141
- this.$draw();
142
- this._emitChangeScreen();
143
- return screen;
144
- }
145
- getScreenTransform() {
146
- const transform = this._board.getTransform();
147
- return {
148
- scale: transform.scale,
149
- scrollTop: Math.max(0, 0 - transform.scrollY),
150
- scrollLeft: Math.max(0, 0 - transform.scrollX)
151
- };
36
+ setData(data) {
37
+ validateElements((data === null || data === void 0 ? void 0 : data.elements) || []);
38
+ this._board.setData(data);
152
39
  }
153
40
  getData() {
154
- return deepClone(this.$data);
155
- }
156
- setData(data, opts) {
157
- const resourceChangeUUIDs = diffElementResourceChangeList(this.$data, data);
158
- this.$data = this._elementHandler.initData(deepClone(parseData(data)));
159
- if (opts && opts.triggerChangeEvent === true) {
160
- this.$emitChangeData();
161
- }
162
- this.$draw({ resourceChangeUUIDs });
163
- }
164
- clearOperation() {
165
- this._tempData.clear();
166
- this.$draw();
167
- }
168
- on(key, callback) {
169
- this._coreEvent.on(key, callback);
170
- }
171
- off(key, callback) {
172
- this._coreEvent.off(key, callback);
173
- }
174
- getEngine() {
175
- return this._engine;
176
- }
177
- pointScreenToContext(p) {
178
- return this._board.pointScreenToContext(p);
41
+ return this._board.getData();
179
42
  }
180
- pointContextToScreen(p) {
181
- return this._board.pointContextToScreen(p);
43
+ scale(opts) {
44
+ this._board.scale(opts);
182
45
  }
183
- $getBoardContext() {
184
- return this._board.getContext();
46
+ resize(newViewSize) {
47
+ const { _board: board } = this;
48
+ const sharer = board.getSharer();
49
+ const viewSizeInfo = sharer.getActiveViewSizeInfo();
50
+ board.resize(Object.assign(Object.assign({}, viewSizeInfo), newViewSize));
185
51
  }
186
- $getDisplayContext2D() {
187
- return this._board.getDisplayContext2D();
52
+ clear() {
53
+ this._board.clear();
188
54
  }
189
- $getOriginContext2D() {
190
- return this._board.getOriginContext2D();
55
+ on(name, callback) {
56
+ const eventHub = this._board.getEventHub();
57
+ eventHub.on(name, callback);
191
58
  }
192
- $emitChangeData() {
193
- if (this._coreEvent.has('changeData')) {
194
- this._coreEvent.trigger('changeData', deepClone(this.$data));
195
- }
59
+ off(name, callback) {
60
+ const eventHub = this._board.getEventHub();
61
+ eventHub.off(name, callback);
196
62
  }
197
- $getElementHandler() {
198
- return this._elementHandler;
63
+ trigger(name, e) {
64
+ const eventHub = this._board.getEventHub();
65
+ eventHub.trigger(name, e);
199
66
  }
200
67
  }
201
- Core.is = is;
202
- Core.check = check;
203
- export default Core;
@@ -0,0 +1,2 @@
1
+ export declare const CURSOR = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF92lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDktMTdUMTY6MDc6MjYrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTA5LTE3VDE2OjEyOjUwKzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTA5LTE3VDE2OjEyOjUwKzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjliMGM0MzI2LWU4ZTQtNDlkNy04MmUzLTgxODkwYTE2ZmU1YSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjMzOGFhZDBmLWZkZjMtODE0MS1iMTZmLWNiZWIzNTQyYTJhMCIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjUwODAxNzc1LWZlNGEtNDQyMy05NDQ3LThkYWRhNzZhYTllOSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTA4MDE3NzUtZmU0YS00NDIzLTk0NDctOGRhZGE3NmFhOWU5IiBzdEV2dDp3aGVuPSIyMDIzLTA5LTE3VDE2OjA3OjI2KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OWIwYzQzMjYtZThlNC00OWQ3LTgyZTMtODE4OTBhMTZmZTVhIiBzdEV2dDp3aGVuPSIyMDIzLTA5LTE3VDE2OjEyOjUwKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7W6XrzAAAGLklEQVRYhb2Xf2iUdRzHX/txtfXLplZ6Wblm6fzRmG6r7Uou1AxKRjQKYUqgaLBACFogppcK1h8aLRkMSYaJIA5hYMomZpskEfPOufCaDpZ6t7rbre263U3vzn3643meu+eu3XNzvz7w4bbdc/e89nl/Pu/v50HUCAQCx1tbW0uAx4CHgSwggxkKERkziUQif2mQ0WjU53a7vwSeBB4BTEDmTICmBBwYGDivVlDjlFAo9KvT6dwIPAHkANkq6MwDXr169bCISENDg9TX14s+BgcHf2hubi5mBmRPCXj06NFPREQ6OjoEkPLycrl06VIMMhKJeFwu1xdMs+wpAYuLi9eIiIyOjkpeXp4AAsj27dvF7/fHQIPB4C9dXV0fME2ypwQEXvX7/bdFRNauXRsDBMRkMsnhw4cTZB8YGGhsamp6hSmW3Qhw1Y0bN86LiNTW1iYAallWViZtbW162ftcLtdO/i/7tAAWtba2ficicvLkyTEBtdy6dasMDg7GQIeHh9s7OzvfBx5nkrIbAS7du3fvxyIiPT09hoBa1tXVJcv+fWNj4zLgUeAhJiC7EeDLwOsiMioisnDhwnFBrlixQi5evKiX/c6tW7c+R5E9lweU3QjwReDV/v7+bhGRqqqqcQFquWnTJvH5fHrZLzocjkoSZU9bTSPA54GV165daxYROXDgwAMBannw4MFk2RsaGhqWME7ZjQDNwIrTp09/JSLS0tIyIUBACgoK5MKFCzHIcDj85+3btz8FZpFGdiPAZ4DCmpqaTSIiPp9vwoBaVlVVidfr1ct+/sqVK+9iILsR4FzgJcASDoeHRUSKioomDQnI/v37E2T3+Xz1hw4dWjSW7EaAeUA+UNbX12cXEdmyZcuUAAJiNpvlzJkzetl73G53rVrN2EmUCjATuA9EgYjL5eoGKCkpGatNHijmz5/Pxo0b2blzJ2azOfZ3k8lUYDabv45Go/Y7d+6sIY0VZQOjGqDT6bxeWlrKqlWrJgRlsVhYv349FRUVWCwWcnJyEt4PBoOuoaEhu9frvdzR0fHTtm3buolvRpLqe3OBp4EllZWV74mIRKNRyc3NTSvf7Nmzpbq6Wk6cOCFut1uSY2RkJOB0Ou3Nzc3Ha2trPwPWAGXAEuBZFFPPAbKMevBhYA6wCKgIBoP9IiKrV682hLPZbP8DEpH7vb29N1paWn602WwHFyxYsAX4EKgE3gIsQBFQgOIeT6j3z0wFqEkc60OPx9Odn58/t6SkhPb29jFLbrVa2bNnDwBer7fv5s2bPQ6Ho7upqcnZ1tbmASJq3gPC6utdYESXYfWeo6mkBaUHRQ/odrv/yM/Pt5SWlqb8kAbncDh+W7lyZYN683u6DOvAwipsOOnniA4wZf9lqhdoVYzY7fbrQMpBsdlsWK1WRkZGAtXV1d8D/wA+wKNLr5o+YEC9ZggIAEHiFbyfDhCUCcoFngIWFxYWrtMaat68eQl9V15eHmu2+vr6OuAd4A2gGFgMLERp/mdQ+noWyuadi9Jr2aQ4k42GBPXDs1Ga97WhoaFbIiIbNmxIANTWq87Ozp9VuApgGfACihPkoRjwI+p3mlSgtA9ZRkYNYwwKJBr2rl27sFqthEKhwZqamqOAX5f/AsPE5btLvM/GJWO6yFb/82eBonPnztWJiJw9e1YAWb58eUzaI0eOfAO8CbwCPIfiZZN+eEoncSaKLPOApbt3794uIuL1ehOktdvtF4C3gRKURXcOSn9lTRRsvIAZKI4+l/gjQFREZMeOHSIiEggE+tetW/cRitkuRhmERxnnxjxZQFDWnzzURwCv1+vUHxHHjh37lri0C1Am9KGpgDMC1G8SQnxxCHs8Hqf2RldX10+bN28+i+JjwyT62KSaP13oAfWTHO7t7f0dIBQK/b1v375GlEnVjPYuyoQaHlNTDahVMALca29vdwBcvnz5+KlTp26OATft1UuODBS7yEOxj0K/329HOSWWopjxlE1tchhtM7FriPfgXSDDbrfXo0gbJr4QzIi0WiRPYBbKZJrUV23b0dYn7XSYcsBkS9EiO/k6lApq1cwiPjzaAM1Y9cYC1G6uAWrPCtrvMwoHqU02Q5caIEzj1KaS+D+vIjxtLug31gAAAABJRU5ErkJggg==";
2
+ export declare const CURSOR_RESIZE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAApCAYAAABHomvIAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF92lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDktMTdUMTY6MzE6MjMrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTA5LTE3VDE2OjQ0OjIyKzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTA5LTE3VDE2OjQ0OjIyKzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY0MTBhYjUzLWM0ZjEtNDVhNS04MjhkLTIxOTczOWFjOTk3MSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjBkMDNmNjM5LTE5MzctY2Y0MC1hMTg0LTIyMjg0NzczNWNmYSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyYjQwZGRmLWE0ZGEtNDY3MC1iYzc2LTBhYjY3ZmI5M2I0ZSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODJiNDBkZGYtYTRkYS00NjcwLWJjNzYtMGFiNjdmYjkzYjRlIiBzdEV2dDp3aGVuPSIyMDIzLTA5LTE3VDE2OjMxOjIzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjQxMGFiNTMtYzRmMS00NWE1LTgyOGQtMjE5NzM5YWM5OTcxIiBzdEV2dDp3aGVuPSIyMDIzLTA5LTE3VDE2OjQ0OjIyKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz57vRudAAAEk0lEQVRYhe3ZW0jbVxzA8e8/MX+NYnG9uI4xE3bvoLt0FzradRfGBtsYo32YdAhb6WQyBqV7KOylpYjzZShDGfjmyxgbgjjwyRm16SYMhgiNKDhbL3VtNF4xJOnf3x7+59i/Wf4aTbInf3AwJMdzPjnnf/n9/jFEhGzDMIxMb3uAIsDs6ek5urS05Dtz5syE+uwekAQS6u89YD19gC0NIpJ1c8GZQHlXV9fJRCIxGo/HxxoaGj4CngWOAEGgEihXfT07MeQC3MB1dna+lkgkRkXF6urq3xcuXPgUOAE8DzwGPOiGLARwEy4ej4+JiITD4elr167NiIgsLi7eqq2trQPeBI4Bj7sh8w10xZmmeds0zdn+/v5/RERisdjUuXPnvgLeAl50Q+YTaAA+oKy7u/uE3laNAwSQ4uLiu6FQ6G4G5DG13YeAMjWWkU+gBygJhULHNe769etTTpwDGXUiz58//yXwujp5qoAHgBLAk0+gNxKJHEulUiMKN2ma5gwgPp/vjhOXjlxYWJisq6urBV5RW30IKAW8eQPGYrGjlmXdEBEZHBy8aZrmFCCmac729fVtAHt7e6MO5N2+vr47IiJLS0s3L126dBZ4Sh2LZUBRwVdwYGBgVuwOYh/zsoF0bnPBVzDTMRgOh6dFhROokSIi8/Pz0+pEeaPQx+DGWdzV1XVSX2LcgCIic3NzMzU1NV8D7wIvq9WrLNRZvOk62NHRccqJTAdGo9Hb1dXV3wAfYt9VjgAPFfI66EQWAxU9PT0fuwEvXrzYBJwF3gFeAAJAhfrfrO4k/7lxZxnr2JlJqry8POnWyePx6H4JR0vhktVkHGOXQI20SkpKLLcOhmGsA5YCaZiVLS5XoADi9XpdkznDMERhnE0fCgUHZhvOW+CO4/8A5hR7wFxjD5hr7AFzjZyBlmVlrOYdYaS1HUUuQA/gWV9fd51URDyqn1c1j6MVFGjoidfW1oq2ABrYj0V82OmVzwHNajVdB88C5wOKTdM87NaxsrKyQsFKHC2BnTDo+/TWt8Bd5INeVC44NDT0xXYZdXNz8w/AaeyS8yjwCPdzQu92ht2m/OUjIyOfS1pkAoqItLS0fA+8D7wKPA0cxs6qC1O4T0xMfKYnb21tnXEDNjc3z+nXbW1t3wFvYz9dCAL7KUThHovFPtGTNjU1jQFSX18/lg68cuXKLUAaGxs3vkB7e/u3wHHgCQpUdnpTqdQvesJgMDisUVevXh3Xry9fvnxTv66qqprQ/cfHx/vVNj/J/couv0DAv7q6+pMDeYPNSalkwkUikX7s4ukl4FHgAODPN1CXnPsWFxd/dCAjW+GGhoZCwAfYpeczwMPAPjVW3gv3IvXN98disZ8dyBGNCwQC4/r94eHhfuy6+JS6zATUCeJXY+W9cNfIUuDAwsLCr05kIBDYeBQ8Ojr6h8Lpx25BtbWlGpfv62BG5PLy8m+SFpOTk38C76mVe84NVyhgOvLgysrK7xoXjUb/Uqt2XG1rEDiYCbcd0MgwsWtk+J1EI03An0wmw5Zlefx+/2n1eRKIO5r+rWTTpFsZ/gWFrGMmeObuqwAAAABJRU5ErkJggg==";
@@ -0,0 +1,2 @@
1
+ export const CURSOR = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF92lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDktMTdUMTY6MDc6MjYrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTA5LTE3VDE2OjEyOjUwKzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTA5LTE3VDE2OjEyOjUwKzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjliMGM0MzI2LWU4ZTQt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';
2
+ export const CURSOR_RESIZE = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAApCAYAAABHomvIAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF92lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDktMTdUMTY6MzE6MjMrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTA5LTE3VDE2OjQ0OjIyKzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTA5LTE3VDE2OjQ0OjIyKzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY0MTBhYjUzLWM0ZjEtNDVhNS04MjhkLTIxOTczOWFjOTk3MSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjBkMDNmNjM5LTE5MzctY2Y0MC1hMTg0LTIyMjg0NzczNWNmYSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyYjQwZGRmLWE0ZGEtNDY3MC1iYzc2LTBhYjY3ZmI5M2I0ZSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODJiNDBkZGYtYTRkYS00NjcwLWJjNzYtMGFiNjdmYjkzYjRlIiBzdEV2dDp3aGVuPSIyMDIzLTA5LTE3VDE2OjMxOjIzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjQxMGFiNTMtYzRmMS00NWE1LTgyOGQtMjE5NzM5YWM5OTcxIiBzdEV2dDp3aGVuPSIyMDIzLTA5LTE3VDE2OjQ0OjIyKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz57vRudAAAEk0lEQVRYhe3ZW0jbVxzA8e8/MX+NYnG9uI4xE3bvoLt0FzradRfGBtsYo32YdAhb6WQyBqV7KOylpYjzZShDGfjmyxgbgjjwyRm16SYMhgiNKDhbL3VtNF4xJOnf3x7+59i/Wf4aTbInf3AwJMdzPjnnf/n9/jFEhGzDMIxMb3uAIsDs6ek5urS05Dtz5syE+uwekAQS6u89YD19gC0NIpJ1c8GZQHlXV9fJRCIxGo/HxxoaGj4CngWOAEGgEihXfT07MeQC3MB1dna+lkgkRkXF6urq3xcuXPgUOAE8DzwGPOiGLARwEy4ej4+JiITD4elr167NiIgsLi7eqq2trQPeBI4Bj7sh8w10xZmmeds0zdn+/v5/RERisdjUuXPnvgLeAl50Q+YTaAA+oKy7u/uE3laNAwSQ4uLiu6FQ6G4G5DG13YeAMjWWkU+gBygJhULHNe769etTTpwDGXUiz58//yXwujp5qoAHgBLAk0+gNxKJHEulUiMKN2ma5gwgPp/vjhOXjlxYWJisq6urBV5RW30IKAW8eQPGYrGjlmXdEBEZHBy8aZrmFCCmac729fVtAHt7e6MO5N2+vr47IiJLS0s3L126dBZ4Sh2LZUBRwVdwYGBgVuwOYh/zsoF0bnPBVzDTMRgOh6dFhROokSIi8/Pz0+pEeaPQx+DGWdzV1XVSX2LcgCIic3NzMzU1NV8D7wIvq9WrLNRZvOk62NHRccqJTAdGo9Hb1dXV3wAfYt9VjgAPFfI66EQWAxU9PT0fuwEvXrzYBJwF3gFeAAJAhfrfrO4k/7lxZxnr2JlJqry8POnWyePx6H4JR0vhktVkHGOXQI20SkpKLLcOhmGsA5YCaZiVLS5XoADi9XpdkznDMERhnE0fCgUHZhvOW+CO4/8A5hR7wFxjD5hr7AFzjZyBlmVlrOYdYaS1HUUuQA/gWV9fd51URDyqn1c1j6MVFGjoidfW1oq2ABrYj0V82OmVzwHNajVdB88C5wOKTdM87NaxsrKyQsFKHC2BnTDo+/TWt8Bd5INeVC44NDT0xXYZdXNz8w/AaeyS8yjwCPdzQu92ht2m/OUjIyOfS1pkAoqItLS0fA+8D7wKPA0cxs6qC1O4T0xMfKYnb21tnXEDNjc3z+nXbW1t3wFvYz9dCAL7KUThHovFPtGTNjU1jQFSX18/lg68cuXKLUAaGxs3vkB7e/u3wHHgCQpUdnpTqdQvesJgMDisUVevXh3Xry9fvnxTv66qqprQ/cfHx/vVNj/J/couv0DAv7q6+pMDeYPNSalkwkUikX7s4ukl4FHgAODPN1CXnPsWFxd/dCAjW+GGhoZCwAfYpeczwMPAPjVW3gv3IvXN98disZ8dyBGNCwQC4/r94eHhfuy6+JS6zATUCeJXY+W9cNfIUuDAwsLCr05kIBDYeBQ8Ojr6h8Lpx25BtbWlGpfv62BG5PLy8m+SFpOTk38C76mVe84NVyhgOvLgysrK7xoXjUb/Uqt2XG1rEDiYCbcd0MgwsWtk+J1EI03An0wmw5Zlefx+/2n1eRKIO5r+rWTTpFsZ/gWFrGMmeObuqwAAAABJRU5ErkJggg==';
@@ -0,0 +1,16 @@
1
+ import type { UtilEventEmitter, CoreEvent } from '@idraw/types';
2
+ export declare class Cursor {
3
+ private _eventHub;
4
+ private _container;
5
+ private _cursorType;
6
+ private _resizeCursorBaseImage;
7
+ private _cursorImageMap;
8
+ constructor(container: HTMLDivElement, opts: {
9
+ eventHub: UtilEventEmitter<CoreEvent>;
10
+ });
11
+ private _init;
12
+ private _loadResizeCursorBaseImage;
13
+ private _resetCursor;
14
+ private _setCursorResize;
15
+ private _appendRotateResizeImage;
16
+ }
@@ -0,0 +1,121 @@
1
+ import { limitAngle, loadImage, parseAngleToRadian } from '@idraw/util';
2
+ import { CURSOR, CURSOR_RESIZE } from './cursor-image';
3
+ export class Cursor {
4
+ constructor(container, opts) {
5
+ this._cursorType = null;
6
+ this._resizeCursorBaseImage = null;
7
+ this._cursorImageMap = {
8
+ auto: CURSOR,
9
+ 'rotate-0': CURSOR_RESIZE
10
+ };
11
+ this._container = container;
12
+ this._eventHub = opts.eventHub;
13
+ this._init();
14
+ this._loadResizeCursorBaseImage();
15
+ }
16
+ _init() {
17
+ const { _eventHub: eventHub } = this;
18
+ this._resetCursor('auto');
19
+ eventHub.on('cursor', (e) => {
20
+ var _a;
21
+ if (e.type === 'over-element' || !e.type) {
22
+ this._resetCursor('auto');
23
+ }
24
+ else if (typeof e.type === 'string' && ((_a = e.type) === null || _a === void 0 ? void 0 : _a.startsWith('resize-'))) {
25
+ this._setCursorResize(e);
26
+ }
27
+ else {
28
+ this._resetCursor('auto');
29
+ }
30
+ });
31
+ }
32
+ _loadResizeCursorBaseImage() {
33
+ loadImage(CURSOR_RESIZE)
34
+ .then((img) => {
35
+ this._resizeCursorBaseImage = img;
36
+ })
37
+ .catch((err) => {
38
+ console.error(err);
39
+ });
40
+ }
41
+ _resetCursor(cursorKey) {
42
+ if (this._cursorType === cursorKey) {
43
+ return;
44
+ }
45
+ this._cursorType = cursorKey;
46
+ const image = this._cursorImageMap[this._cursorType] || this._cursorImageMap['auto'];
47
+ let offsetX = 0;
48
+ let offsetY = 0;
49
+ if (cursorKey.startsWith('rotate-') && this._cursorImageMap[this._cursorType]) {
50
+ offsetX = 10;
51
+ offsetY = 10;
52
+ }
53
+ this._container.style.cursor = `image-set(url(${image})2x) ${offsetX} ${offsetY}, auto`;
54
+ }
55
+ _setCursorResize(e) {
56
+ var _a;
57
+ let totalAngle = 0;
58
+ if (e.type === 'resize-top') {
59
+ totalAngle += 0;
60
+ }
61
+ else if (e.type === 'resize-top-right') {
62
+ totalAngle += 45;
63
+ }
64
+ else if (e.type === 'resize-right') {
65
+ totalAngle += 90;
66
+ }
67
+ else if (e.type === 'resize-bottom-right') {
68
+ totalAngle += 135;
69
+ }
70
+ else if (e.type === 'resize-bottom') {
71
+ totalAngle += 180;
72
+ }
73
+ else if (e.type === 'resize-bottom-left') {
74
+ totalAngle += 225;
75
+ }
76
+ else if (e.type === 'resize-left') {
77
+ totalAngle += 270;
78
+ }
79
+ else if (e.type === 'resize-top-left') {
80
+ totalAngle += 315;
81
+ }
82
+ totalAngle += limitAngle(((_a = e === null || e === void 0 ? void 0 : e.element) === null || _a === void 0 ? void 0 : _a.angle) || 0);
83
+ if (Array.isArray(e.groupQueue) && e.groupQueue.length > 0) {
84
+ e.groupQueue.forEach((group) => {
85
+ totalAngle += limitAngle(group.angle || 0);
86
+ });
87
+ }
88
+ totalAngle = limitAngle(totalAngle);
89
+ const cursorKey = this._appendRotateResizeImage(totalAngle);
90
+ this._resetCursor(cursorKey);
91
+ }
92
+ _appendRotateResizeImage(angle) {
93
+ const key = `rotate-${angle}`;
94
+ if (!this._cursorImageMap[key]) {
95
+ const baseImage = this._resizeCursorBaseImage;
96
+ if (baseImage) {
97
+ const canvas = document.createElement('canvas');
98
+ const w = baseImage.width;
99
+ const h = baseImage.height;
100
+ const center = {
101
+ x: w / 2,
102
+ y: h / 2
103
+ };
104
+ canvas.width = w;
105
+ canvas.height = h;
106
+ const ctx = canvas.getContext('2d');
107
+ const radian = parseAngleToRadian(angle);
108
+ ctx.translate(center.x, center.y);
109
+ ctx.rotate(radian);
110
+ ctx.translate(-center.x, -center.y);
111
+ ctx.drawImage(baseImage, 0, 0, w, h);
112
+ ctx.translate(center.x, center.y);
113
+ ctx.rotate(-radian);
114
+ ctx.translate(-center.x, -center.y);
115
+ const base = canvas.toDataURL('image/png');
116
+ this._cursorImageMap[key] = base;
117
+ }
118
+ }
119
+ return key;
120
+ }
121
+ }
@@ -0,0 +1,2 @@
1
+ import type { BoardMiddleware } from '@idraw/types';
2
+ export declare const MiddlewareScaler: BoardMiddleware;
@@ -0,0 +1,22 @@
1
+ export const MiddlewareScaler = (opts) => {
2
+ const key = 'SCALE';
3
+ const { viewer, sharer } = opts;
4
+ return {
5
+ mode: key,
6
+ isDefault: true,
7
+ wheelScale(e) {
8
+ const { deltaY, point } = e;
9
+ const { scale } = sharer.getActiveViewScaleInfo();
10
+ let newScaleNum = scale;
11
+ if (deltaY < 0) {
12
+ newScaleNum = scale * 1.1;
13
+ }
14
+ else if (deltaY > 0) {
15
+ newScaleNum = scale * 0.9;
16
+ }
17
+ const { moveX, moveY } = viewer.scale({ scale: newScaleNum, point });
18
+ viewer.scroll({ moveX, moveY });
19
+ viewer.drawFrame();
20
+ }
21
+ };
22
+ };
@@ -0,0 +1,6 @@
1
+ export declare const key = "SCROLL";
2
+ export declare const keyXThumbRect: unique symbol;
3
+ export declare const keyYThumbRect: unique symbol;
4
+ export declare const keyPrevPoint: unique symbol;
5
+ export declare const keyActivePoint: unique symbol;
6
+ export declare const keyActiveThumbType: unique symbol;
@@ -0,0 +1,6 @@
1
+ export const key = 'SCROLL';
2
+ export const keyXThumbRect = Symbol(`${key}_xThumbRect`);
3
+ export const keyYThumbRect = Symbol(`${key}_yThumbRect`);
4
+ export const keyPrevPoint = Symbol(`${key}_prevPoint`);
5
+ export const keyActivePoint = Symbol(`${key}_activePoint`);
6
+ export const keyActiveThumbType = Symbol(`${key}_activeThumbType`);
@@ -0,0 +1,2 @@
1
+ import type { BoardMiddleware } from '@idraw/types';
2
+ export declare const MiddlewareScroller: BoardMiddleware;
@@ -0,0 +1,97 @@
1
+ import { drawScroller, isPointInScrollThumb } from './util';
2
+ import { key, keyXThumbRect, keyYThumbRect, keyPrevPoint, keyActivePoint, keyActiveThumbType } from './config';
3
+ export const MiddlewareScroller = (opts) => {
4
+ const { viewer, viewContent, sharer } = opts;
5
+ const { helperContext } = viewContent;
6
+ sharer.setSharedStorage(keyXThumbRect, null);
7
+ sharer.setSharedStorage(keyYThumbRect, null);
8
+ const clear = () => {
9
+ sharer.setSharedStorage(keyPrevPoint, null);
10
+ sharer.setSharedStorage(keyActivePoint, null);
11
+ sharer.setSharedStorage(keyActiveThumbType, null);
12
+ };
13
+ clear();
14
+ const scrollX = (p) => {
15
+ const prevPoint = sharer.getSharedStorage(keyPrevPoint);
16
+ if (prevPoint) {
17
+ const { offsetLeft, offsetRight } = sharer.getActiveViewScaleInfo();
18
+ const { width } = sharer.getActiveViewSizeInfo();
19
+ const thumbMoveX = -(p.x - prevPoint.x);
20
+ const totalWidth = width + Math.abs(offsetLeft) + Math.abs(offsetRight);
21
+ const moveX = (thumbMoveX * totalWidth) / width;
22
+ viewer.scroll({ moveX });
23
+ viewer.drawFrame();
24
+ }
25
+ };
26
+ const scrollY = (p) => {
27
+ const prevPoint = sharer.getSharedStorage(keyPrevPoint);
28
+ if (prevPoint) {
29
+ const { offsetTop, offsetBottom } = sharer.getActiveViewScaleInfo();
30
+ const { height } = sharer.getActiveViewSizeInfo();
31
+ const thumbMoveY = -(p.y - prevPoint.y);
32
+ const totalHeight = height + Math.abs(offsetTop) + Math.abs(offsetBottom);
33
+ const moveY = (thumbMoveY * totalHeight) / height;
34
+ viewer.scroll({ moveY });
35
+ viewer.drawFrame();
36
+ }
37
+ };
38
+ const getThumbType = (p) => {
39
+ return isPointInScrollThumb(helperContext, p, {
40
+ xThumbRect: sharer.getSharedStorage(keyXThumbRect),
41
+ yThumbRect: sharer.getSharedStorage(keyYThumbRect)
42
+ });
43
+ };
44
+ return {
45
+ mode: key,
46
+ wheelX: (e) => {
47
+ if (e.deltaX >= 0 || e.deltaX < 0) {
48
+ viewer.scroll({ moveX: 0 - e.deltaX });
49
+ viewer.drawFrame();
50
+ }
51
+ },
52
+ wheelY: (e) => {
53
+ if (e.deltaY >= 0 || e.deltaY < 0) {
54
+ viewer.scroll({ moveY: 0 - e.deltaY });
55
+ viewer.drawFrame();
56
+ }
57
+ },
58
+ pointStart: (e) => {
59
+ const { point } = e;
60
+ const thumbType = getThumbType(point);
61
+ if (thumbType === 'X' || thumbType === 'Y') {
62
+ sharer.setSharedStorage(keyActiveThumbType, thumbType);
63
+ sharer.setSharedStorage(keyPrevPoint, point);
64
+ return false;
65
+ }
66
+ },
67
+ pointMove: (e) => {
68
+ const { point } = e;
69
+ const activeThumbType = sharer.getSharedStorage(keyActiveThumbType);
70
+ if (activeThumbType === 'X' || activeThumbType === 'Y') {
71
+ sharer.setSharedStorage(keyActivePoint, point);
72
+ if (activeThumbType === 'X') {
73
+ scrollX(point);
74
+ }
75
+ else if (activeThumbType === 'Y') {
76
+ scrollY(point);
77
+ }
78
+ sharer.setSharedStorage(keyPrevPoint, point);
79
+ return false;
80
+ }
81
+ },
82
+ pointEnd: (e) => {
83
+ const activeThumbType = sharer.getSharedStorage(keyActiveThumbType);
84
+ clear();
85
+ if (activeThumbType === 'X' || activeThumbType === 'Y') {
86
+ viewer.scroll({ moveX: 0, moveY: 0 });
87
+ viewer.drawFrame();
88
+ return false;
89
+ }
90
+ },
91
+ beforeDrawFrame({ snapshot }) {
92
+ const { xThumbRect, yThumbRect } = drawScroller(helperContext, { snapshot });
93
+ sharer.setSharedStorage(keyXThumbRect, xThumbRect);
94
+ sharer.setSharedStorage(keyYThumbRect, yThumbRect);
95
+ }
96
+ };
97
+ };