@idraw/core 0.2.0-alpha.9 → 0.3.0-0.3.0-beta.6.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 (55) hide show
  1. package/LICENSE +1 -1
  2. package/dist/esm/constant/element.d.ts +2 -0
  3. package/dist/esm/constant/element.js +10 -0
  4. package/dist/esm/constant/static.d.ts +11 -0
  5. package/dist/esm/constant/static.js +13 -0
  6. package/dist/esm/index.d.ts +59 -0
  7. package/dist/esm/index.js +203 -0
  8. package/dist/esm/lib/calculate.d.ts +5 -0
  9. package/dist/esm/lib/calculate.js +64 -0
  10. package/dist/esm/lib/check.d.ts +28 -0
  11. package/dist/esm/lib/check.js +115 -0
  12. package/dist/esm/lib/config.d.ts +3 -0
  13. package/dist/esm/lib/config.js +20 -0
  14. package/dist/esm/lib/core-event.d.ts +49 -0
  15. package/dist/esm/lib/core-event.js +50 -0
  16. package/dist/esm/lib/diff.d.ts +6 -0
  17. package/dist/esm/lib/diff.js +82 -0
  18. package/dist/esm/lib/draw/base.d.ts +5 -0
  19. package/dist/esm/lib/draw/base.js +90 -0
  20. package/dist/esm/lib/draw/wrapper.d.ts +4 -0
  21. package/dist/esm/lib/draw/wrapper.js +168 -0
  22. package/dist/esm/lib/element.d.ts +15 -0
  23. package/dist/esm/lib/element.js +442 -0
  24. package/dist/esm/lib/engine-temp.d.ts +22 -0
  25. package/dist/esm/lib/engine-temp.js +29 -0
  26. package/dist/esm/lib/engine.d.ts +47 -0
  27. package/dist/esm/lib/engine.js +323 -0
  28. package/dist/esm/lib/helper.d.ts +30 -0
  29. package/dist/esm/lib/helper.js +363 -0
  30. package/dist/esm/lib/index.d.ts +13 -0
  31. package/dist/esm/lib/index.js +13 -0
  32. package/dist/esm/lib/is.d.ts +26 -0
  33. package/dist/esm/lib/is.js +100 -0
  34. package/dist/esm/lib/mapper.d.ts +26 -0
  35. package/dist/esm/lib/mapper.js +89 -0
  36. package/dist/esm/lib/parse.d.ts +2 -0
  37. package/dist/esm/lib/parse.js +32 -0
  38. package/dist/esm/lib/temp.d.ts +11 -0
  39. package/dist/esm/lib/temp.js +19 -0
  40. package/dist/esm/lib/transform.d.ts +4 -0
  41. package/dist/esm/lib/transform.js +20 -0
  42. package/dist/esm/lib/value.d.ts +2 -0
  43. package/dist/esm/lib/value.js +7 -0
  44. package/dist/esm/mixins/element.d.ts +18 -0
  45. package/dist/esm/mixins/element.js +167 -0
  46. package/dist/esm/plugins/helper.d.ts +12 -0
  47. package/dist/esm/plugins/helper.js +16 -0
  48. package/dist/esm/util/filter.d.ts +1 -0
  49. package/dist/esm/util/filter.js +3 -0
  50. package/dist/index.global.js +4564 -4317
  51. package/dist/index.global.min.js +1 -0
  52. package/package.json +11 -12
  53. package/dist/index.cjs.js +0 -4414
  54. package/dist/index.d.ts +0 -172
  55. package/dist/index.es.js +0 -4412
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021 idrawjs
3
+ Copyright (c) 2021-present idrawjs
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,2 @@
1
+ export declare const elementNames: string[];
2
+ export declare const LIMIT_QBLIQUE_ANGLE = 15;
@@ -0,0 +1,10 @@
1
+ const elementTypes = {
2
+ 'text': {},
3
+ 'rect': {},
4
+ 'image': {},
5
+ 'svg': {},
6
+ 'circle': {},
7
+ 'html': {},
8
+ };
9
+ export const elementNames = Object.keys(elementTypes);
10
+ export const LIMIT_QBLIQUE_ANGLE = 15;
@@ -0,0 +1,11 @@
1
+ export declare enum Mode {
2
+ NULL = "null",
3
+ SELECT_ELEMENT = "select-element",
4
+ SELECT_ELEMENT_LIST = "select-element-list",
5
+ SELECT_ELEMENT_WRAPPER_CONTROLLER = "select-element-wrapper-controller",
6
+ SELECT_AREA = "select-area"
7
+ }
8
+ export declare enum CursorStatus {
9
+ DRAGGING = "dragging",
10
+ NULL = "null"
11
+ }
@@ -0,0 +1,13 @@
1
+ export var Mode;
2
+ (function (Mode) {
3
+ Mode["NULL"] = "null";
4
+ Mode["SELECT_ELEMENT"] = "select-element";
5
+ Mode["SELECT_ELEMENT_LIST"] = "select-element-list";
6
+ Mode["SELECT_ELEMENT_WRAPPER_CONTROLLER"] = "select-element-wrapper-controller";
7
+ Mode["SELECT_AREA"] = "select-area";
8
+ })(Mode || (Mode = {}));
9
+ export var CursorStatus;
10
+ (function (CursorStatus) {
11
+ CursorStatus["DRAGGING"] = "dragging";
12
+ CursorStatus["NULL"] = "null";
13
+ })(CursorStatus || (CursorStatus = {}));
@@ -0,0 +1,59 @@
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;
8
+ private _board;
9
+ 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[];
22
+ }): 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;
59
+ }
@@ -0,0 +1,203 @@
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: [] };
16
+ 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();
33
+ });
34
+ this._renderer.on('drawFrameComplete', () => {
35
+ drawFrame();
36
+ });
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
+ }
101
+ addElement(elem) {
102
+ return addElement(this, elem);
103
+ }
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
+ };
152
+ }
153
+ 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);
179
+ }
180
+ pointContextToScreen(p) {
181
+ return this._board.pointContextToScreen(p);
182
+ }
183
+ $getBoardContext() {
184
+ return this._board.getContext();
185
+ }
186
+ $getDisplayContext2D() {
187
+ return this._board.getDisplayContext2D();
188
+ }
189
+ $getOriginContext2D() {
190
+ return this._board.getOriginContext2D();
191
+ }
192
+ $emitChangeData() {
193
+ if (this._coreEvent.has('changeData')) {
194
+ this._coreEvent.trigger('changeData', deepClone(this.$data));
195
+ }
196
+ }
197
+ $getElementHandler() {
198
+ return this._elementHandler;
199
+ }
200
+ }
201
+ Core.is = is;
202
+ Core.check = check;
203
+ export default Core;
@@ -0,0 +1,5 @@
1
+ import { DataElement, DataElemDesc, Point } from '@idraw/types';
2
+ export declare function parseRadianToAngle(radian: number): number;
3
+ export declare function parseAngleToRadian(angle: number): number;
4
+ export declare function calcElementCenter(elem: DataElement<keyof DataElemDesc>): Point;
5
+ export declare function calcRadian(center: Point, start: Point, end: Point): number;
@@ -0,0 +1,64 @@
1
+ export function parseRadianToAngle(radian) {
2
+ return (radian / Math.PI) * 180;
3
+ }
4
+ export function parseAngleToRadian(angle) {
5
+ return (angle / 180) * Math.PI;
6
+ }
7
+ export function calcElementCenter(elem) {
8
+ const p = {
9
+ x: elem.x + elem.w / 2,
10
+ y: elem.y + elem.h / 2
11
+ };
12
+ return p;
13
+ }
14
+ export function calcRadian(center, start, end) {
15
+ const startAngle = calcLineAngle(center, start);
16
+ const endAngle = calcLineAngle(center, end);
17
+ if (endAngle !== null && startAngle !== null) {
18
+ if (startAngle > (Math.PI * 3) / 2 && endAngle < Math.PI / 2) {
19
+ return endAngle + (Math.PI * 2 - startAngle);
20
+ }
21
+ else if (endAngle > (Math.PI * 3) / 2 && startAngle < Math.PI / 2) {
22
+ return startAngle + (Math.PI * 2 - endAngle);
23
+ }
24
+ else {
25
+ return endAngle - startAngle;
26
+ }
27
+ }
28
+ else {
29
+ return 0;
30
+ }
31
+ }
32
+ function calcLineAngle(center, p) {
33
+ const x = p.x - center.x;
34
+ const y = center.y - p.y;
35
+ if (x === 0) {
36
+ if (y < 0) {
37
+ return Math.PI / 2;
38
+ }
39
+ else if (y > 0) {
40
+ return Math.PI * (3 / 2);
41
+ }
42
+ }
43
+ else if (y === 0) {
44
+ if (x < 0) {
45
+ return Math.PI;
46
+ }
47
+ else if (x > 0) {
48
+ return 0;
49
+ }
50
+ }
51
+ if (x > 0 && y < 0) {
52
+ return Math.atan(Math.abs(y) / Math.abs(x));
53
+ }
54
+ else if (x < 0 && y < 0) {
55
+ return Math.PI - Math.atan(Math.abs(y) / Math.abs(x));
56
+ }
57
+ else if (x < 0 && y > 0) {
58
+ return Math.PI + Math.atan(Math.abs(y) / Math.abs(x));
59
+ }
60
+ else if (x > 0 && y > 0) {
61
+ return Math.PI * 2 - Math.atan(Math.abs(y) / Math.abs(x));
62
+ }
63
+ return null;
64
+ }
@@ -0,0 +1,28 @@
1
+ import { DataElementAttrs } from '@idraw/types';
2
+ declare function attrs(attrs: DataElementAttrs): boolean;
3
+ declare function rectDesc(desc: any): boolean;
4
+ declare function circleDesc(desc: any): boolean;
5
+ declare function imageDesc(desc: any): boolean;
6
+ declare function svgDesc(desc: any): boolean;
7
+ declare function htmlDesc(desc: any): boolean;
8
+ declare function textDesc(desc: any): boolean;
9
+ declare const check: {
10
+ attrs: typeof attrs;
11
+ textDesc: typeof textDesc;
12
+ rectDesc: typeof rectDesc;
13
+ circleDesc: typeof circleDesc;
14
+ imageDesc: typeof imageDesc;
15
+ svgDesc: typeof svgDesc;
16
+ htmlDesc: typeof htmlDesc;
17
+ };
18
+ type CheckTypeUtil = {
19
+ attrs: (value: any) => boolean;
20
+ rectDesc: (value: any) => boolean;
21
+ circleDesc: (value: any) => boolean;
22
+ imageDesc: (value: any) => boolean;
23
+ svgDesc: (value: any) => boolean;
24
+ htmlDesc: (value: any) => boolean;
25
+ textDesc: (value: any) => boolean;
26
+ };
27
+ export { CheckTypeUtil };
28
+ export default check;
@@ -0,0 +1,115 @@
1
+ import is from './is';
2
+ function attrs(attrs) {
3
+ const { x, y, w, h, angle } = attrs;
4
+ if (!(is.x(x) && is.y(y) && is.w(w) && is.h(h) && is.angle(angle))) {
5
+ return false;
6
+ }
7
+ if (!(angle >= -360 && angle <= 360)) {
8
+ return false;
9
+ }
10
+ return true;
11
+ }
12
+ function box(desc = {}) {
13
+ const { borderColor, borderRadius, borderWidth } = desc;
14
+ if (desc.hasOwnProperty('borderColor') && !is.color(borderColor)) {
15
+ return false;
16
+ }
17
+ if (desc.hasOwnProperty('borderRadius') && !is.number(borderRadius)) {
18
+ return false;
19
+ }
20
+ if (desc.hasOwnProperty('borderWidth') && !is.number(borderWidth)) {
21
+ return false;
22
+ }
23
+ return true;
24
+ }
25
+ function rectDesc(desc) {
26
+ const { bgColor } = desc;
27
+ if (desc.hasOwnProperty('bgColor') && !is.color(bgColor)) {
28
+ return false;
29
+ }
30
+ if (!box(desc)) {
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+ function circleDesc(desc) {
36
+ const { bgColor, borderColor, borderWidth } = desc;
37
+ if (desc.hasOwnProperty('bgColor') && !is.color(bgColor)) {
38
+ return false;
39
+ }
40
+ if (desc.hasOwnProperty('borderColor') && !is.color(borderColor)) {
41
+ return false;
42
+ }
43
+ if (desc.hasOwnProperty('borderWidth') && !is.number(borderWidth)) {
44
+ return false;
45
+ }
46
+ return true;
47
+ }
48
+ function imageDesc(desc) {
49
+ const { src } = desc;
50
+ if (!is.imageSrc(src)) {
51
+ return false;
52
+ }
53
+ return true;
54
+ }
55
+ function svgDesc(desc) {
56
+ const { svg } = desc;
57
+ if (!is.svg(svg)) {
58
+ return false;
59
+ }
60
+ return true;
61
+ }
62
+ function htmlDesc(desc) {
63
+ const { html } = desc;
64
+ if (!is.html(html)) {
65
+ return false;
66
+ }
67
+ return true;
68
+ }
69
+ function textDesc(desc) {
70
+ const { text, color, fontSize, lineHeight, fontFamily, textAlign, fontWeight, bgColor, strokeWidth, strokeColor } = desc;
71
+ if (!is.text(text)) {
72
+ return false;
73
+ }
74
+ if (!is.color(color)) {
75
+ return false;
76
+ }
77
+ if (!is.fontSize(fontSize)) {
78
+ return false;
79
+ }
80
+ if (desc.hasOwnProperty('bgColor') && !is.color(bgColor)) {
81
+ return false;
82
+ }
83
+ if (desc.hasOwnProperty('fontWeight') && !is.fontWeight(fontWeight)) {
84
+ return false;
85
+ }
86
+ if (desc.hasOwnProperty('lineHeight') && !is.lineHeight(lineHeight)) {
87
+ return false;
88
+ }
89
+ if (desc.hasOwnProperty('fontFamily') && !is.fontFamily(fontFamily)) {
90
+ return false;
91
+ }
92
+ if (desc.hasOwnProperty('textAlign') && !is.textAlign(textAlign)) {
93
+ return false;
94
+ }
95
+ if (desc.hasOwnProperty('strokeWidth') && !is.strokeWidth(strokeWidth)) {
96
+ return false;
97
+ }
98
+ if (desc.hasOwnProperty('strokeColor') && !is.color(strokeColor)) {
99
+ return false;
100
+ }
101
+ if (!box(desc)) {
102
+ return false;
103
+ }
104
+ return true;
105
+ }
106
+ const check = {
107
+ attrs,
108
+ textDesc,
109
+ rectDesc,
110
+ circleDesc,
111
+ imageDesc,
112
+ svgDesc,
113
+ htmlDesc
114
+ };
115
+ export default check;
@@ -0,0 +1,3 @@
1
+ import { IDrawConfig, IDrawConfigStrict } from '@idraw/types';
2
+ declare function mergeConfig(config?: IDrawConfig): IDrawConfigStrict;
3
+ export { mergeConfig };
@@ -0,0 +1,20 @@
1
+ import { deepClone } from '@idraw/util';
2
+ const defaultConfig = {
3
+ elementWrapper: {
4
+ color: '#0d85da',
5
+ lockColor: '#aaaaaa',
6
+ controllerSize: 6,
7
+ lineWidth: 1,
8
+ lineDash: [4, 3]
9
+ }
10
+ };
11
+ function mergeConfig(config) {
12
+ const result = deepClone(defaultConfig);
13
+ if (config) {
14
+ if (config.elementWrapper) {
15
+ result.elementWrapper = Object.assign(Object.assign({}, result.elementWrapper), config.elementWrapper);
16
+ }
17
+ }
18
+ return result;
19
+ }
20
+ export { mergeConfig };
@@ -0,0 +1,49 @@
1
+ import { DataElement, DataElemDesc, Point, IDrawData, ScreenData } from '@idraw/types';
2
+ export type TypeCoreEventSelectBaseArg = {
3
+ index: number | null;
4
+ uuid: string | null;
5
+ };
6
+ export type TypeCoreEventArgMap = {
7
+ error: any;
8
+ mouseOverScreen: Point;
9
+ mouseLeaveScreen: void;
10
+ mouseOverElement: TypeCoreEventSelectBaseArg & {
11
+ element: DataElement<keyof DataElemDesc>;
12
+ };
13
+ mouseLeaveElement: TypeCoreEventSelectBaseArg & {
14
+ element: DataElement<keyof DataElemDesc>;
15
+ };
16
+ screenClickElement: TypeCoreEventSelectBaseArg & {
17
+ element: DataElement<keyof DataElemDesc>;
18
+ };
19
+ screenDoubleClickElement: TypeCoreEventSelectBaseArg & {
20
+ element: DataElement<keyof DataElemDesc>;
21
+ };
22
+ screenSelectElement: TypeCoreEventSelectBaseArg & {
23
+ element: DataElement<keyof DataElemDesc>;
24
+ };
25
+ screenMoveElementStart: TypeCoreEventSelectBaseArg & Point;
26
+ screenMoveElementEnd: TypeCoreEventSelectBaseArg & Point;
27
+ screenChangeElement: TypeCoreEventSelectBaseArg & {
28
+ width: number;
29
+ height: number;
30
+ angle: number;
31
+ };
32
+ changeData: IDrawData;
33
+ changeScreen: ScreenData;
34
+ drawFrameComplete: void;
35
+ drawFrame: void;
36
+ };
37
+ export interface TypeCoreEvent {
38
+ on<T extends keyof TypeCoreEventArgMap>(key: T, callback: (p: TypeCoreEventArgMap[T]) => void): void;
39
+ off<T extends keyof TypeCoreEventArgMap>(key: T, callback: (p: TypeCoreEventArgMap[T]) => void): void;
40
+ trigger<T extends keyof TypeCoreEventArgMap>(key: T, p: TypeCoreEventArgMap[T]): void;
41
+ }
42
+ export declare class CoreEvent implements TypeCoreEvent {
43
+ private _listeners;
44
+ constructor();
45
+ on<T extends keyof TypeCoreEventArgMap>(eventKey: T, callback: (p: TypeCoreEventArgMap[T]) => void): void;
46
+ off<T extends keyof TypeCoreEventArgMap>(eventKey: T, callback: (p: TypeCoreEventArgMap[T]) => void): void;
47
+ trigger<T extends keyof TypeCoreEventArgMap>(eventKey: T, arg: TypeCoreEventArgMap[T]): boolean;
48
+ has<T extends keyof TypeCoreEventArgMap>(name: string): boolean;
49
+ }
@@ -0,0 +1,50 @@
1
+ export class CoreEvent {
2
+ constructor() {
3
+ this._listeners = new Map();
4
+ }
5
+ on(eventKey, callback) {
6
+ if (this._listeners.has(eventKey)) {
7
+ const callbacks = this._listeners.get(eventKey);
8
+ callbacks === null || callbacks === void 0 ? void 0 : callbacks.push(callback);
9
+ this._listeners.set(eventKey, callbacks || []);
10
+ }
11
+ else {
12
+ this._listeners.set(eventKey, [callback]);
13
+ }
14
+ }
15
+ off(eventKey, callback) {
16
+ if (this._listeners.has(eventKey)) {
17
+ const callbacks = this._listeners.get(eventKey);
18
+ if (Array.isArray(callbacks)) {
19
+ for (let i = 0; i < (callbacks === null || callbacks === void 0 ? void 0 : callbacks.length); i++) {
20
+ if (callbacks[i] === callback) {
21
+ callbacks.splice(i, 1);
22
+ break;
23
+ }
24
+ }
25
+ }
26
+ this._listeners.set(eventKey, callbacks || []);
27
+ }
28
+ }
29
+ trigger(eventKey, arg) {
30
+ const callbacks = this._listeners.get(eventKey);
31
+ if (Array.isArray(callbacks)) {
32
+ callbacks.forEach((cb) => {
33
+ cb(arg);
34
+ });
35
+ return true;
36
+ }
37
+ else {
38
+ return false;
39
+ }
40
+ }
41
+ has(name) {
42
+ if (this._listeners.has(name)) {
43
+ const list = this._listeners.get(name);
44
+ if (Array.isArray(list) && list.length > 0) {
45
+ return true;
46
+ }
47
+ }
48
+ return false;
49
+ }
50
+ }
@@ -0,0 +1,6 @@
1
+ import { DataElement, IDrawData, DataElemDesc } from '@idraw/types';
2
+ export declare function isChangeImageElementResource(before: DataElement<'image'>, after: DataElement<'image'>): boolean;
3
+ export declare function isChangeSVGElementResource(before: DataElement<'svg'>, after: DataElement<'svg'>): boolean;
4
+ export declare function isChangeHTMLElementResource(before: DataElement<'html'>, after: DataElement<'html'>): boolean;
5
+ export declare function diffElementResourceChange(before: DataElement<keyof DataElemDesc>, after: DataElement<keyof DataElemDesc>): string | null;
6
+ export declare function diffElementResourceChangeList(before: IDrawData, after: IDrawData): string[];