@plait/mind 0.32.0 → 0.33.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.
- package/base/index.d.ts +0 -1
- package/esm2022/base/index.mjs +1 -2
- package/esm2022/generators/node-active.generator.mjs +43 -0
- package/esm2022/generators/node-collapse.generator.mjs +108 -0
- package/esm2022/generators/node-emojis.generator.mjs +72 -0
- package/esm2022/generators/node-plus.generator.mjs +97 -0
- package/esm2022/generators/node-shape.generator.mjs +19 -0
- package/esm2022/mind-node.component.mjs +28 -36
- package/esm2022/plugins/with-mind.mjs +3 -3
- package/esm2022/plugins/with-node-image.mjs +3 -3
- package/esm2022/utils/draw/node-dnd.mjs +2 -2
- package/esm2022/utils/node/common.mjs +2 -11
- package/fesm2022/plait-mind.mjs +55 -102
- package/fesm2022/plait-mind.mjs.map +1 -1
- package/{drawer → generators}/node-active.generator.d.ts +1 -1
- package/generators/node-collapse.generator.d.ts +8 -0
- package/{drawer/node-emojis.drawer.d.ts → generators/node-emojis.generator.d.ts} +3 -3
- package/generators/node-plus.generator.d.ts +7 -0
- package/{drawer → generators}/node-shape.generator.d.ts +1 -1
- package/mind-node.component.d.ts +8 -10
- package/package.json +1 -1
- package/styles/styles.scss +7 -6
- package/utils/node/common.d.ts +1 -2
- package/utils/space/node-space.d.ts +1 -1
- package/base/base.drawer.d.ts +0 -15
- package/drawer/node-collapse.drawer.d.ts +0 -8
- package/drawer/node-insert.drawer.d.ts +0 -7
- package/esm2022/base/base.drawer.mjs +0 -29
- package/esm2022/drawer/node-active.generator.mjs +0 -43
- package/esm2022/drawer/node-collapse.drawer.mjs +0 -108
- package/esm2022/drawer/node-emojis.drawer.mjs +0 -72
- package/esm2022/drawer/node-insert.drawer.mjs +0 -98
- package/esm2022/drawer/node-shape.generator.mjs +0 -19
|
@@ -8,6 +8,6 @@ export interface ActiveData {
|
|
|
8
8
|
export declare class NodeActiveGenerator extends Generator<MindElement, ActiveData> {
|
|
9
9
|
abstractOutlineG?: SVGGElement;
|
|
10
10
|
canDraw(element: MindElement<BaseData>, data: ActiveData): boolean;
|
|
11
|
-
|
|
11
|
+
draw(element: MindElement<BaseData>, data: ActiveData): SVGGElement;
|
|
12
12
|
updateAbstractOutline(element: MindElement, activeHandlePosition?: AbstractHandlePosition, resizingLocation?: number): void;
|
|
13
13
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MindElement, BaseData } from '../interfaces';
|
|
2
|
+
import { AfterDraw, Generator } from '@plait/common';
|
|
3
|
+
export declare class CollapseGenerator extends Generator<MindElement> implements AfterDraw {
|
|
4
|
+
canDraw(element: MindElement<BaseData>): boolean;
|
|
5
|
+
draw(element: MindElement<BaseData>): SVGGElement;
|
|
6
|
+
afterDraw(element: MindElement): void;
|
|
7
|
+
private getArrowPoints;
|
|
8
|
+
}
|
|
@@ -2,7 +2,7 @@ import { ComponentRef, ViewContainerRef } from '@angular/core';
|
|
|
2
2
|
import { EmojiData, EmojiItem, MindElement } from '../interfaces';
|
|
3
3
|
import { MindEmojiBaseComponent } from '../base/emoji-base.component';
|
|
4
4
|
import { PlaitMindBoard } from '../plugins/with-mind.board';
|
|
5
|
-
declare class
|
|
5
|
+
declare class EmojiGenerator {
|
|
6
6
|
private board;
|
|
7
7
|
private viewContainerRef;
|
|
8
8
|
componentRef: ComponentRef<MindEmojiBaseComponent> | null;
|
|
@@ -11,10 +11,10 @@ declare class EmojiDrawer {
|
|
|
11
11
|
get nativeElement(): HTMLElement | null;
|
|
12
12
|
destroy(): void;
|
|
13
13
|
}
|
|
14
|
-
export declare class
|
|
14
|
+
export declare class NodeEmojisGenerator {
|
|
15
15
|
private board;
|
|
16
16
|
private viewContainerRef;
|
|
17
|
-
|
|
17
|
+
emojiGenerators: EmojiGenerator[];
|
|
18
18
|
g?: SVGGElement;
|
|
19
19
|
constructor(board: PlaitMindBoard, viewContainerRef: ViewContainerRef);
|
|
20
20
|
drawEmojis(element: MindElement): SVGGElement | undefined;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MindElement, BaseData } from '../interfaces';
|
|
2
|
+
import { AfterDraw, Generator } from '@plait/common';
|
|
3
|
+
export declare class NodePlusGenerator extends Generator<MindElement> implements AfterDraw {
|
|
4
|
+
canDraw(element: MindElement<BaseData>): boolean;
|
|
5
|
+
draw(element: MindElement<BaseData>): SVGGElement;
|
|
6
|
+
afterDraw(element: MindElement): void;
|
|
7
|
+
}
|
|
@@ -6,5 +6,5 @@ export interface ShapeData {
|
|
|
6
6
|
}
|
|
7
7
|
export declare class NodeShapeGenerator extends Generator<MindElement, ShapeData> {
|
|
8
8
|
canDraw(element: MindElement, data: ShapeData): boolean;
|
|
9
|
-
|
|
9
|
+
draw(element: MindElement, data: ShapeData): SVGGElement;
|
|
10
10
|
}
|
package/mind-node.component.d.ts
CHANGED
|
@@ -5,13 +5,13 @@ import { RoughSVG } from 'roughjs/bin/svg';
|
|
|
5
5
|
import { Subject } from 'rxjs';
|
|
6
6
|
import { MindElement } from './interfaces/element';
|
|
7
7
|
import { MindNode } from './interfaces/node';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { NodeEmojisGenerator } from './generators/node-emojis.generator';
|
|
9
|
+
import { NodePlusGenerator } from './generators/node-plus.generator';
|
|
10
10
|
import { PlaitMindBoard } from './plugins/with-mind.board';
|
|
11
|
-
import { NodeActiveGenerator } from './
|
|
12
|
-
import {
|
|
11
|
+
import { NodeActiveGenerator } from './generators/node-active.generator';
|
|
12
|
+
import { CollapseGenerator } from './generators/node-collapse.generator';
|
|
13
13
|
import { CommonPluginElement, ImageGenerator } from '@plait/common';
|
|
14
|
-
import { NodeShapeGenerator } from './
|
|
14
|
+
import { NodeShapeGenerator } from './generators/node-shape.generator';
|
|
15
15
|
import { ImageData } from './interfaces';
|
|
16
16
|
import * as i0 from "@angular/core";
|
|
17
17
|
export declare class MindNodeComponent extends CommonPluginElement<MindElement, PlaitMindBoard> implements OnInit, OnDestroy, OnContextChanged<MindElement, PlaitMindBoard> {
|
|
@@ -25,12 +25,12 @@ export declare class MindNodeComponent extends CommonPluginElement<MindElement,
|
|
|
25
25
|
linkG?: SVGGElement;
|
|
26
26
|
extendG?: SVGGElement;
|
|
27
27
|
destroy$: Subject<void>;
|
|
28
|
-
|
|
28
|
+
nodeEmojisGenerator: NodeEmojisGenerator;
|
|
29
29
|
nodeShapeGenerator: NodeShapeGenerator;
|
|
30
|
-
|
|
30
|
+
nodePlusGenerator: NodePlusGenerator;
|
|
31
31
|
imageGenerator: ImageGenerator<MindElement<ImageData>>;
|
|
32
32
|
activeGenerator: NodeActiveGenerator;
|
|
33
|
-
|
|
33
|
+
collapseGenerator: CollapseGenerator;
|
|
34
34
|
get textManage(): TextManage;
|
|
35
35
|
constructor(viewContainerRef: ViewContainerRef, cdr: ChangeDetectorRef);
|
|
36
36
|
initializeDrawer(): void;
|
|
@@ -38,9 +38,7 @@ export declare class MindNodeComponent extends CommonPluginElement<MindElement,
|
|
|
38
38
|
onContextChanged(value: PlaitPluginElementContext<MindElement, PlaitMindBoard>, previous: PlaitPluginElementContext<MindElement, PlaitMindBoard>): void;
|
|
39
39
|
drawEmojis(): void;
|
|
40
40
|
drawLink(): void;
|
|
41
|
-
destroyLine(): void;
|
|
42
41
|
drawExtend(): void;
|
|
43
|
-
destroyExtend(): void;
|
|
44
42
|
drawTopic(): void;
|
|
45
43
|
updateTopic(): void;
|
|
46
44
|
editTopic(): void;
|
package/package.json
CHANGED
package/styles/styles.scss
CHANGED
|
@@ -62,9 +62,11 @@ $primary: #4e8afa;
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
:not(.
|
|
67
|
-
|
|
65
|
+
&:not(.readonly) {
|
|
66
|
+
&[class*='pointer-']:not(.pointer-selection) {
|
|
67
|
+
:not(.collapsed) > .extend {
|
|
68
|
+
display: none;
|
|
69
|
+
}
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
|
|
@@ -82,8 +84,7 @@ $primary: #4e8afa;
|
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
86
|
|
|
85
|
-
&.pointer-mind
|
|
86
|
-
{
|
|
87
|
+
&.pointer-mind {
|
|
87
88
|
.board-host-svg {
|
|
88
89
|
cursor: default !important;
|
|
89
90
|
}
|
|
@@ -97,7 +98,7 @@ $primary: #4e8afa;
|
|
|
97
98
|
}
|
|
98
99
|
:not(.collapsed) > .extend {
|
|
99
100
|
display: block;
|
|
100
|
-
.
|
|
101
|
+
.plus {
|
|
101
102
|
display: none;
|
|
102
103
|
}
|
|
103
104
|
}
|
package/utils/node/common.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { PlaitBoard
|
|
1
|
+
import { PlaitBoard } from '@plait/core';
|
|
2
2
|
import { MindElement } from '../../interfaces/element';
|
|
3
3
|
export declare function editTopic(element: MindElement): void;
|
|
4
|
-
export declare const temporaryDisableSelection: (board: PlaitOptionsBoard) => void;
|
|
5
4
|
export declare const getSelectedMindElements: (board: PlaitBoard) => MindElement<import("@plait/mind").BaseData>[];
|
|
@@ -19,4 +19,4 @@ export declare const NodeSpace: {
|
|
|
19
19
|
getEmojiTopSpace(board: PlaitMindBoard, element: MindElement): number;
|
|
20
20
|
};
|
|
21
21
|
export declare const getFontSizeBySlateElement: (text: string | Element) => number;
|
|
22
|
-
export declare const getNodeDefaultFontSize: (isRoot?: boolean) =>
|
|
22
|
+
export declare const getNodeDefaultFontSize: (isRoot?: boolean) => 14 | 18;
|
package/base/base.drawer.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { MindElement } from '../interfaces';
|
|
2
|
-
import { PlaitMindBoard } from '../plugins/with-mind.board';
|
|
3
|
-
export declare abstract class BaseDrawer<T = undefined> {
|
|
4
|
-
protected board: PlaitMindBoard;
|
|
5
|
-
g?: SVGGElement;
|
|
6
|
-
constructor(board: PlaitMindBoard);
|
|
7
|
-
draw(element: MindElement, parentG: SVGGElement, data?: T): void;
|
|
8
|
-
abstract canDraw(element: MindElement, data?: T): boolean;
|
|
9
|
-
abstract baseDraw(element: MindElement, data?: T): SVGGElement | undefined;
|
|
10
|
-
destroy(): void;
|
|
11
|
-
}
|
|
12
|
-
export interface AfterDraw {
|
|
13
|
-
afterDraw(element: MindElement): void;
|
|
14
|
-
}
|
|
15
|
-
export declare function hasAfterDraw(value: any): value is AfterDraw;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { MindElement, BaseData } from '../interfaces';
|
|
2
|
-
import { AfterDraw, BaseDrawer } from '../base/base.drawer';
|
|
3
|
-
export declare class CollapseDrawer extends BaseDrawer implements AfterDraw {
|
|
4
|
-
canDraw(element: MindElement<BaseData>): boolean;
|
|
5
|
-
baseDraw(element: MindElement<BaseData>): SVGGElement;
|
|
6
|
-
afterDraw(element: MindElement): void;
|
|
7
|
-
private getArrowPoints;
|
|
8
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { MindElement, BaseData } from '../interfaces';
|
|
2
|
-
import { AfterDraw, BaseDrawer } from '../base/base.drawer';
|
|
3
|
-
export declare class NodeInsertDrawer extends BaseDrawer implements AfterDraw {
|
|
4
|
-
canDraw(element: MindElement<BaseData>): boolean;
|
|
5
|
-
baseDraw(element: MindElement<BaseData>): SVGGElement;
|
|
6
|
-
afterDraw(element: MindElement): void;
|
|
7
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export class BaseDrawer {
|
|
2
|
-
constructor(board) {
|
|
3
|
-
this.board = board;
|
|
4
|
-
}
|
|
5
|
-
draw(element, parentG, data) {
|
|
6
|
-
this.destroy();
|
|
7
|
-
if (this.canDraw && this.canDraw(element, data)) {
|
|
8
|
-
const g = this.baseDraw(element, data);
|
|
9
|
-
if (g) {
|
|
10
|
-
parentG.append(g);
|
|
11
|
-
}
|
|
12
|
-
if (hasAfterDraw(this)) {
|
|
13
|
-
this.afterDraw(element);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
destroy() {
|
|
18
|
-
if (this.g) {
|
|
19
|
-
this.g.remove();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export function hasAfterDraw(value) {
|
|
24
|
-
if (value.afterDraw) {
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5kcmF3ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9iYXNlL2Jhc2UuZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBZ0IsVUFBVTtJQUc1QixZQUFzQixLQUFxQjtRQUFyQixVQUFLLEdBQUwsS0FBSyxDQUFnQjtJQUFHLENBQUM7SUFFL0MsSUFBSSxDQUFDLE9BQW9CLEVBQUUsT0FBb0IsRUFBRSxJQUFRO1FBQ3JELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtZQUM3QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsRUFBRTtnQkFDSCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JCO1lBQ0QsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDM0I7U0FDSjtJQUNMLENBQUM7SUFNRCxPQUFPO1FBQ0gsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ1IsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNuQjtJQUNMLENBQUM7Q0FDSjtBQU1ELE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBVTtJQUNuQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUU7UUFDakIsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNaW5kRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRHJhd2VyPFQgPSB1bmRlZmluZWQ+IHtcbiAgICBnPzogU1ZHR0VsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYm9hcmQ6IFBsYWl0TWluZEJvYXJkKSB7fVxuXG4gICAgZHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudCwgcGFyZW50RzogU1ZHR0VsZW1lbnQsIGRhdGE/OiBUKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5jYW5EcmF3ICYmIHRoaXMuY2FuRHJhdyhlbGVtZW50LCBkYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZyA9IHRoaXMuYmFzZURyYXcoZWxlbWVudCwgZGF0YSk7XG4gICAgICAgICAgICBpZiAoZykge1xuICAgICAgICAgICAgICAgIHBhcmVudEcuYXBwZW5kKGcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc0FmdGVyRHJhdyh0aGlzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJEcmF3KGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgY2FuRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudCwgZGF0YT86IFQpOiBib29sZWFuO1xuXG4gICAgYWJzdHJhY3QgYmFzZURyYXcoZWxlbWVudDogTWluZEVsZW1lbnQsIGRhdGE/OiBUKTogU1ZHR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5nKSB7XG4gICAgICAgICAgICB0aGlzLmcucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWZ0ZXJEcmF3IHtcbiAgICBhZnRlckRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQWZ0ZXJEcmF3KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBZnRlckRyYXcge1xuICAgIGlmICh2YWx1ZS5hZnRlckRyYXcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { ACTIVE_STROKE_WIDTH, PlaitBoard, RectangleClient, createG, drawRoundRectangle } from '@plait/core';
|
|
2
|
-
import { MindElement } from '../interfaces';
|
|
3
|
-
import { getRectangleByNode } from '../utils/position/node';
|
|
4
|
-
import { PRIMARY_COLOR } from '../constants/default';
|
|
5
|
-
import { AbstractNode } from '@plait/layouts';
|
|
6
|
-
import { drawAbstractIncludedOutline } from '../utils/draw/abstract-outline';
|
|
7
|
-
import { DefaultNodeStyle } from '../constants/node-style';
|
|
8
|
-
import { getStrokeWidthByElement } from '../utils/node-style/shape';
|
|
9
|
-
import { Generator } from '@plait/common';
|
|
10
|
-
export class NodeActiveGenerator extends Generator {
|
|
11
|
-
canDraw(element, data) {
|
|
12
|
-
if (data.selected) {
|
|
13
|
-
return true;
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
baseDraw(element, data) {
|
|
20
|
-
const activeG = createG();
|
|
21
|
-
const node = MindElement.getNode(element);
|
|
22
|
-
const rectangle = getRectangleByNode(node);
|
|
23
|
-
const strokeWidth = getStrokeWidthByElement(this.board, element);
|
|
24
|
-
const activeStrokeWidth = ACTIVE_STROKE_WIDTH;
|
|
25
|
-
const activeRectangle = RectangleClient.inflate(rectangle, activeStrokeWidth);
|
|
26
|
-
const strokeG = drawRoundRectangle(PlaitBoard.getRoughSVG(this.board), activeRectangle.x, activeRectangle.y, activeRectangle.x + activeRectangle.width, activeRectangle.y + activeRectangle.height, { stroke: PRIMARY_COLOR, strokeWidth: activeStrokeWidth, fill: '' }, true, DefaultNodeStyle.shape.rectangleRadius + (activeStrokeWidth + strokeWidth) / 2);
|
|
27
|
-
if (AbstractNode.isAbstract(element)) {
|
|
28
|
-
this.abstractOutlineG = drawAbstractIncludedOutline(this.board, PlaitBoard.getRoughSVG(this.board), element);
|
|
29
|
-
activeG.append(this.abstractOutlineG);
|
|
30
|
-
strokeG.classList.add('abstract-element');
|
|
31
|
-
}
|
|
32
|
-
activeG.appendChild(strokeG);
|
|
33
|
-
return activeG;
|
|
34
|
-
}
|
|
35
|
-
updateAbstractOutline(element, activeHandlePosition, resizingLocation) {
|
|
36
|
-
if (this.abstractOutlineG) {
|
|
37
|
-
this.abstractOutlineG.remove();
|
|
38
|
-
}
|
|
39
|
-
this.abstractOutlineG = drawAbstractIncludedOutline(this.board, PlaitBoard.getRoughSVG(this.board), element, activeHandlePosition, resizingLocation);
|
|
40
|
-
this.g.append(this.abstractOutlineG);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1hY3RpdmUuZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvZHJhd2VyL25vZGUtYWN0aXZlLmdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixlQUFlLEVBQ2YsT0FBTyxFQUNQLGtCQUFrQixFQUdyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsV0FBVyxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU8xQyxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsU0FBa0M7SUFHdkUsT0FBTyxDQUFDLE9BQThCLEVBQUUsSUFBZ0I7UUFDcEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNO1lBQ0gsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDTCxDQUFDO0lBRUQsUUFBUSxDQUFDLE9BQThCLEVBQUUsSUFBZ0I7UUFDckQsTUFBTSxPQUFPLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUM5RSxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FDOUIsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ2xDLGVBQWUsQ0FBQyxDQUFDLEVBQ2pCLGVBQWUsQ0FBQyxDQUFDLEVBQ2pCLGVBQWUsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFDekMsZUFBZSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUMxQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFDbkUsSUFBSSxFQUNKLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsQ0FBQyxpQkFBaUIsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQ2pGLENBQUM7UUFDRixJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0csT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN0QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQscUJBQXFCLENBQUMsT0FBb0IsRUFBRSxvQkFBNkMsRUFBRSxnQkFBeUI7UUFDaEgsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLDJCQUEyQixDQUMvQyxJQUFJLENBQUMsS0FBSyxFQUNWLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUNsQyxPQUFPLEVBQ1Asb0JBQW9CLEVBQ3BCLGdCQUFnQixDQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLENBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBQ1RJVkVfU1RST0tFX1dJRFRILFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIGNyZWF0ZUcsXG4gICAgZHJhd1JvdW5kUmVjdGFuZ2xlLFxuICAgIGdldFNlbGVjdGVkRWxlbWVudHMsXG4gICAgaXNTZWxlY3Rpb25Nb3Zpbmdcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQsIEJhc2VEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi91dGlscy9wb3NpdGlvbi9ub2RlJztcbmltcG9ydCB7IFBSSU1BUllfQ09MT1IgfSBmcm9tICcuLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBBYnN0cmFjdE5vZGUgfSBmcm9tICdAcGxhaXQvbGF5b3V0cyc7XG5pbXBvcnQgeyBkcmF3QWJzdHJhY3RJbmNsdWRlZE91dGxpbmUgfSBmcm9tICcuLi91dGlscy9kcmF3L2Fic3RyYWN0LW91dGxpbmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RIYW5kbGVQb3NpdGlvbiB9IGZyb20gJy4uL3BsdWdpbnMvd2l0aC1hYnN0cmFjdC1yZXNpemUuYm9hcmQnO1xuaW1wb3J0IHsgRGVmYXVsdE5vZGVTdHlsZSB9IGZyb20gJy4uL2NvbnN0YW50cy9ub2RlLXN0eWxlJztcbmltcG9ydCB7IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50IH0gZnJvbSAnLi4vdXRpbHMvbm9kZS1zdHlsZS9zaGFwZSc7XG5pbXBvcnQgeyBHZW5lcmF0b3IgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVEYXRhIHtcbiAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICBpc0VkaXRpbmc6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlQWN0aXZlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yPE1pbmRFbGVtZW50LCBBY3RpdmVEYXRhPiB7XG4gICAgYWJzdHJhY3RPdXRsaW5lRz86IFNWR0dFbGVtZW50O1xuXG4gICAgY2FuRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudDxCYXNlRGF0YT4sIGRhdGE6IEFjdGl2ZURhdGEpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRhdGEuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmFzZURyYXcoZWxlbWVudDogTWluZEVsZW1lbnQ8QmFzZURhdGE+LCBkYXRhOiBBY3RpdmVEYXRhKTogU1ZHR0VsZW1lbnQge1xuICAgICAgICBjb25zdCBhY3RpdmVHID0gY3JlYXRlRygpO1xuICAgICAgICBjb25zdCBub2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKG5vZGUpO1xuICAgICAgICBjb25zdCBzdHJva2VXaWR0aCA9IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50KHRoaXMuYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBhY3RpdmVTdHJva2VXaWR0aCA9IEFDVElWRV9TVFJPS0VfV0lEVEg7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKHJlY3RhbmdsZSwgYWN0aXZlU3Ryb2tlV2lkdGgpO1xuICAgICAgICBjb25zdCBzdHJva2VHID0gZHJhd1JvdW5kUmVjdGFuZ2xlKFxuICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKSxcbiAgICAgICAgICAgIGFjdGl2ZVJlY3RhbmdsZS54LFxuICAgICAgICAgICAgYWN0aXZlUmVjdGFuZ2xlLnksXG4gICAgICAgICAgICBhY3RpdmVSZWN0YW5nbGUueCArIGFjdGl2ZVJlY3RhbmdsZS53aWR0aCxcbiAgICAgICAgICAgIGFjdGl2ZVJlY3RhbmdsZS55ICsgYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCxcbiAgICAgICAgICAgIHsgc3Ryb2tlOiBQUklNQVJZX0NPTE9SLCBzdHJva2VXaWR0aDogYWN0aXZlU3Ryb2tlV2lkdGgsIGZpbGw6ICcnIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgRGVmYXVsdE5vZGVTdHlsZS5zaGFwZS5yZWN0YW5nbGVSYWRpdXMgKyAoYWN0aXZlU3Ryb2tlV2lkdGggKyBzdHJva2VXaWR0aCkgLyAyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdChlbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5hYnN0cmFjdE91dGxpbmVHID0gZHJhd0Fic3RyYWN0SW5jbHVkZWRPdXRsaW5lKHRoaXMuYm9hcmQsIFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcodGhpcy5ib2FyZCksIGVsZW1lbnQpO1xuICAgICAgICAgICAgYWN0aXZlRy5hcHBlbmQodGhpcy5hYnN0cmFjdE91dGxpbmVHKTtcbiAgICAgICAgICAgIHN0cm9rZUcuY2xhc3NMaXN0LmFkZCgnYWJzdHJhY3QtZWxlbWVudCcpO1xuICAgICAgICB9XG4gICAgICAgIGFjdGl2ZUcuYXBwZW5kQ2hpbGQoc3Ryb2tlRyk7XG4gICAgICAgIHJldHVybiBhY3RpdmVHO1xuICAgIH1cblxuICAgIHVwZGF0ZUFic3RyYWN0T3V0bGluZShlbGVtZW50OiBNaW5kRWxlbWVudCwgYWN0aXZlSGFuZGxlUG9zaXRpb24/OiBBYnN0cmFjdEhhbmRsZVBvc2l0aW9uLCByZXNpemluZ0xvY2F0aW9uPzogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmFic3RyYWN0T3V0bGluZUcpIHtcbiAgICAgICAgICAgIHRoaXMuYWJzdHJhY3RPdXRsaW5lRy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFic3RyYWN0T3V0bGluZUcgPSBkcmF3QWJzdHJhY3RJbmNsdWRlZE91dGxpbmUoXG4gICAgICAgICAgICB0aGlzLmJvYXJkLFxuICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKSxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBhY3RpdmVIYW5kbGVQb3NpdGlvbixcbiAgICAgICAgICAgIHJlc2l6aW5nTG9jYXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5nIS5hcHBlbmQodGhpcy5hYnN0cmFjdE91dGxpbmVHKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, PlaitPointerType, Transforms, createG, createText, drawLinearPath } from '@plait/core';
|
|
2
|
-
import { MindElement, PlaitMind, MindElementShape, LayoutDirection } from '../interfaces';
|
|
3
|
-
import { BaseDrawer } from '../base/base.drawer';
|
|
4
|
-
import { getRectangleByNode } from '../utils/position/node';
|
|
5
|
-
import { getShapeByElement } from '../utils/node-style/shape';
|
|
6
|
-
import { EXTEND_OFFSET, EXTEND_DIAMETER } from '../constants/default';
|
|
7
|
-
import { isHorizontalLayout, isIndentedLayout, isTopLayout } from '@plait/layouts';
|
|
8
|
-
import { MindQueries } from '../queries';
|
|
9
|
-
import { fromEvent } from 'rxjs';
|
|
10
|
-
import { getChildrenCount } from '../utils/mind';
|
|
11
|
-
import { filter, take } from 'rxjs/operators';
|
|
12
|
-
import { getBranchColorByMindElement, getBranchWidthByMindElement } from '../utils/node-style/branch';
|
|
13
|
-
import { getLayoutDirection, getPointByPlacement, moveXOfPoint, moveYOfPoint, transformPlacement } from '../utils/point-placement';
|
|
14
|
-
import { HorizontalPlacement, VerticalPlacement } from '../interfaces/types';
|
|
15
|
-
export class CollapseDrawer extends BaseDrawer {
|
|
16
|
-
canDraw(element) {
|
|
17
|
-
if (element.children.length && !PlaitMind.isMind(element)) {
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
baseDraw(element) {
|
|
23
|
-
const collapseG = createG();
|
|
24
|
-
this.g = collapseG;
|
|
25
|
-
collapseG.classList.add('collapse-container');
|
|
26
|
-
const node = MindElement.getNode(element);
|
|
27
|
-
const stroke = getBranchColorByMindElement(this.board, element);
|
|
28
|
-
const branchWidth = getBranchWidthByMindElement(this.board, element);
|
|
29
|
-
const layout = MindQueries.getLayoutByElement(element);
|
|
30
|
-
const isUnderlineShape = getShapeByElement(this.board, element) === MindElementShape.underline;
|
|
31
|
-
const isHorizontal = isHorizontalLayout(layout);
|
|
32
|
-
const nodeClient = getRectangleByNode(node);
|
|
33
|
-
let linkDirection = getLayoutDirection(node, isHorizontal);
|
|
34
|
-
if (isIndentedLayout(layout)) {
|
|
35
|
-
linkDirection = isTopLayout(layout) ? LayoutDirection.top : LayoutDirection.bottom;
|
|
36
|
-
}
|
|
37
|
-
let placement = [HorizontalPlacement.right, VerticalPlacement.middle];
|
|
38
|
-
transformPlacement(placement, linkDirection);
|
|
39
|
-
// underline shape and horizontal
|
|
40
|
-
if (isHorizontal && isUnderlineShape && !element.isRoot) {
|
|
41
|
-
placement[1] = VerticalPlacement.bottom;
|
|
42
|
-
}
|
|
43
|
-
let startPoint = getPointByPlacement(nodeClient, placement);
|
|
44
|
-
const endPoint = moveXOfPoint(startPoint, EXTEND_OFFSET, linkDirection);
|
|
45
|
-
const circleCenter = moveXOfPoint(endPoint, EXTEND_DIAMETER / 2, linkDirection);
|
|
46
|
-
const arrowPoints = this.getArrowPoints(circleCenter, linkDirection);
|
|
47
|
-
const arrowLine = drawLinearPath(arrowPoints, {
|
|
48
|
-
stroke,
|
|
49
|
-
strokeWidth: 2
|
|
50
|
-
});
|
|
51
|
-
const extendLine = PlaitBoard.getRoughSVG(this.board).line(startPoint[0], startPoint[1], endPoint[0], endPoint[1], {
|
|
52
|
-
strokeWidth: branchWidth,
|
|
53
|
-
stroke
|
|
54
|
-
});
|
|
55
|
-
const badge = PlaitBoard.getRoughSVG(this.board).circle(circleCenter[0], circleCenter[1], EXTEND_DIAMETER, {
|
|
56
|
-
fill: stroke,
|
|
57
|
-
stroke,
|
|
58
|
-
fillStyle: 'solid'
|
|
59
|
-
});
|
|
60
|
-
const hideCircleG = PlaitBoard.getRoughSVG(this.board).circle(circleCenter[0], circleCenter[1], EXTEND_DIAMETER, {
|
|
61
|
-
fill: '#fff',
|
|
62
|
-
stroke,
|
|
63
|
-
strokeWidth: branchWidth > 3 ? 3 : branchWidth,
|
|
64
|
-
fillStyle: 'solid'
|
|
65
|
-
});
|
|
66
|
-
if (element.isCollapsed) {
|
|
67
|
-
let numberOffset = 0;
|
|
68
|
-
if (getChildrenCount(element) >= 10)
|
|
69
|
-
numberOffset = -2;
|
|
70
|
-
if (getChildrenCount(element) === 1)
|
|
71
|
-
numberOffset = 1;
|
|
72
|
-
const badgeText = createText(circleCenter[0] - 4 + numberOffset, circleCenter[1] + 4, stroke, `${getChildrenCount(element)}`);
|
|
73
|
-
badge.setAttribute('style', 'opacity: 0.15');
|
|
74
|
-
badgeText.setAttribute('style', 'font-size: 12px');
|
|
75
|
-
collapseG.appendChild(badge);
|
|
76
|
-
collapseG.appendChild(badgeText);
|
|
77
|
-
collapseG.appendChild(extendLine);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
collapseG.appendChild(hideCircleG);
|
|
81
|
-
collapseG.appendChild(arrowLine);
|
|
82
|
-
}
|
|
83
|
-
collapseG.appendChild(extendLine);
|
|
84
|
-
return collapseG;
|
|
85
|
-
}
|
|
86
|
-
afterDraw(element) {
|
|
87
|
-
if (!this.g) {
|
|
88
|
-
throw new Error(`can not find quick insert g`);
|
|
89
|
-
}
|
|
90
|
-
fromEvent(this.g, 'mouseup')
|
|
91
|
-
.pipe(filter(() => !PlaitBoard.isPointer(this.board, PlaitPointerType.hand) || !!PlaitBoard.isReadonly(this.board)), take(1))
|
|
92
|
-
.subscribe(() => {
|
|
93
|
-
const isCollapsed = !element.isCollapsed;
|
|
94
|
-
const newElement = { isCollapsed };
|
|
95
|
-
const path = PlaitBoard.findPath(this.board, element);
|
|
96
|
-
Transforms.setNode(this.board, newElement, path);
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
getArrowPoints(circleCenter, linkDirection) {
|
|
100
|
-
let arrowTopPoint = moveXOfPoint(circleCenter, 2, linkDirection);
|
|
101
|
-
arrowTopPoint = moveYOfPoint(arrowTopPoint, 4, linkDirection);
|
|
102
|
-
const arrowMiddlePoint = moveXOfPoint(circleCenter, -2, linkDirection);
|
|
103
|
-
let arrowBottomPoint = moveXOfPoint(circleCenter, 2, linkDirection);
|
|
104
|
-
arrowBottomPoint = moveYOfPoint(arrowBottomPoint, -4, linkDirection);
|
|
105
|
-
return [arrowTopPoint, arrowMiddlePoint, arrowBottomPoint];
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1jb2xsYXBzZS5kcmF3ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9kcmF3ZXIvbm9kZS1jb2xsYXBzZS5kcmF3ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBUyxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkgsT0FBTyxFQUFFLFdBQVcsRUFBWSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RFLE9BQU8sRUFBa0Isa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENB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QUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxjQUFjLENBQUMsWUFBbUIsRUFBRSxhQUE4QjtRQUN0RSxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNqRSxhQUFhLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDcEUsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXJFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdFBvaW50ZXJUeXBlLCBQb2ludCwgVHJhbnNmb3JtcywgY3JlYXRlRywgY3JlYXRlVGV4dCwgZHJhd0xpbmVhclBhdGggfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCwgQmFzZURhdGEsIFBsYWl0TWluZCwgTWluZEVsZW1lbnRTaGFwZSwgTGF5b3V0RGlyZWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBZnRlckRyYXcsIEJhc2VEcmF3ZXIgfSBmcm9tICcuLi9iYXNlL2Jhc2UuZHJhd2VyJztcbmltcG9ydCB7IGdldFJlY3RhbmdsZUJ5Tm9kZSB9IGZyb20gJy4uL3V0aWxzL3Bvc2l0aW9uL25vZGUnO1xuaW1wb3J0IHsgZ2V0U2hhcGVCeUVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9ub2RlLXN0eWxlL3NoYXBlJztcbmltcG9ydCB7IEVYVEVORF9PRkZTRVQsIEVYVEVORF9ESUFNRVRFUiB9IGZyb20gJy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IE1pbmRMYXlvdXRUeXBlLCBpc0hvcml6b250YWxMYXlvdXQsIGlzSW5kZW50ZWRMYXlvdXQsIGlzVG9wTGF5b3V0IH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgTWluZFF1ZXJpZXMgfSBmcm9tICcuLi9xdWVyaWVzJztcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2V0Q2hpbGRyZW5Db3VudCB9IGZyb20gJy4uL3V0aWxzL21pbmQnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ2V0QnJhbmNoQ29sb3JCeU1pbmRFbGVtZW50LCBnZXRCcmFuY2hXaWR0aEJ5TWluZEVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9ub2RlLXN0eWxlL2JyYW5jaCc7XG5pbXBvcnQgeyBnZXRMYXlvdXREaXJlY3Rpb24sIGdldFBvaW50QnlQbGFjZW1lbnQsIG1vdmVYT2ZQb2ludCwgbW92ZVlPZlBvaW50LCB0cmFuc2Zvcm1QbGFjZW1lbnQgfSBmcm9tICcuLi91dGlscy9wb2ludC1wbGFjZW1lbnQnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbFBsYWNlbWVudCwgUG9pbnRQbGFjZW1lbnQsIFZlcnRpY2FsUGxhY2VtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsYXBzZURyYXdlciBleHRlbmRzIEJhc2VEcmF3ZXIgaW1wbGVtZW50cyBBZnRlckRyYXcge1xuICAgIGNhbkRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQ8QmFzZURhdGE+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCAmJiAhUGxhaXRNaW5kLmlzTWluZChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGJhc2VEcmF3KGVsZW1lbnQ6IE1pbmRFbGVtZW50PEJhc2VEYXRhPik6IFNWR0dFbGVtZW50IHtcbiAgICAgICAgY29uc3QgY29sbGFwc2VHID0gY3JlYXRlRygpO1xuICAgICAgICB0aGlzLmcgPSBjb2xsYXBzZUc7XG5cbiAgICAgICAgY29sbGFwc2VHLmNsYXNzTGlzdC5hZGQoJ2NvbGxhcHNlLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSBNaW5kRWxlbWVudC5nZXROb2RlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBzdHJva2UgPSBnZXRCcmFuY2hDb2xvckJ5TWluZEVsZW1lbnQodGhpcy5ib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGJyYW5jaFdpZHRoID0gZ2V0QnJhbmNoV2lkdGhCeU1pbmRFbGVtZW50KHRoaXMuYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBNaW5kUXVlcmllcy5nZXRMYXlvdXRCeUVsZW1lbnQoZWxlbWVudCkgYXMgTWluZExheW91dFR5cGU7XG4gICAgICAgIGNvbnN0IGlzVW5kZXJsaW5lU2hhcGUgPSBnZXRTaGFwZUJ5RWxlbWVudCh0aGlzLmJvYXJkLCBlbGVtZW50KSA9PT0gTWluZEVsZW1lbnRTaGFwZS51bmRlcmxpbmU7XG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbExheW91dChsYXlvdXQpO1xuICAgICAgICBjb25zdCBub2RlQ2xpZW50ID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKG5vZGUpO1xuICAgICAgICBsZXQgbGlua0RpcmVjdGlvbiA9IGdldExheW91dERpcmVjdGlvbihub2RlLCBpc0hvcml6b250YWwpO1xuICAgICAgICBpZiAoaXNJbmRlbnRlZExheW91dChsYXlvdXQpKSB7XG4gICAgICAgICAgICBsaW5rRGlyZWN0aW9uID0gaXNUb3BMYXlvdXQobGF5b3V0KSA/IExheW91dERpcmVjdGlvbi50b3AgOiBMYXlvdXREaXJlY3Rpb24uYm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBsYWNlbWVudDogUG9pbnRQbGFjZW1lbnQgPSBbSG9yaXpvbnRhbFBsYWNlbWVudC5yaWdodCwgVmVydGljYWxQbGFjZW1lbnQubWlkZGxlXTtcblxuICAgICAgICB0cmFuc2Zvcm1QbGFjZW1lbnQocGxhY2VtZW50LCBsaW5rRGlyZWN0aW9uKTtcblxuICAgICAgICAvLyB1bmRlcmxpbmUgc2hhcGUgYW5kIGhvcml6b250YWxcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCAmJiBpc1VuZGVybGluZVNoYXBlICYmICFlbGVtZW50LmlzUm9vdCkge1xuICAgICAgICAgICAgcGxhY2VtZW50WzFdID0gVmVydGljYWxQbGFjZW1lbnQuYm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJ0UG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KG5vZGVDbGllbnQsIHBsYWNlbWVudCk7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gbW92ZVhPZlBvaW50KHN0YXJ0UG9pbnQsIEVYVEVORF9PRkZTRVQsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBjaXJjbGVDZW50ZXIgPSBtb3ZlWE9mUG9pbnQoZW5kUG9pbnQsIEVYVEVORF9ESUFNRVRFUiAvIDIsIGxpbmtEaXJlY3Rpb24pO1xuXG4gICAgICAgIGNvbnN0IGFycm93UG9pbnRzID0gdGhpcy5nZXRBcnJvd1BvaW50cyhjaXJjbGVDZW50ZXIsIGxpbmtEaXJlY3Rpb24pO1xuXG4gICAgICAgIGNvbnN0IGFycm93TGluZSA9IGRyYXdMaW5lYXJQYXRoKGFycm93UG9pbnRzLCB7XG4gICAgICAgICAgICBzdHJva2UsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMlxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBleHRlbmRMaW5lID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5saW5lKHN0YXJ0UG9pbnRbMF0sIHN0YXJ0UG9pbnRbMV0sIGVuZFBvaW50WzBdLCBlbmRQb2ludFsxXSwge1xuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGJyYW5jaFdpZHRoLFxuICAgICAgICAgICAgc3Ryb2tlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGJhZGdlID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5jaXJjbGUoY2lyY2xlQ2VudGVyWzBdLCBjaXJjbGVDZW50ZXJbMV0sIEVYVEVORF9ESUFNRVRFUiwge1xuICAgICAgICAgICAgZmlsbDogc3Ryb2tlLFxuICAgICAgICAgICAgc3Ryb2tlLFxuICAgICAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhpZGVDaXJjbGVHID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5jaXJjbGUoY2lyY2xlQ2VudGVyWzBdLCBjaXJjbGVDZW50ZXJbMV0sIEVYVEVORF9ESUFNRVRFUiwge1xuICAgICAgICAgICAgZmlsbDogJyNmZmYnLFxuICAgICAgICAgICAgc3Ryb2tlLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGJyYW5jaFdpZHRoID4gMyA/IDMgOiBicmFuY2hXaWR0aCxcbiAgICAgICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZWxlbWVudC5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgbGV0IG51bWJlck9mZnNldCA9IDA7XG4gICAgICAgICAgICBpZiAoZ2V0Q2hpbGRyZW5Db3VudChlbGVtZW50KSA+PSAxMCkgbnVtYmVyT2Zmc2V0ID0gLTI7XG4gICAgICAgICAgICBpZiAoZ2V0Q2hpbGRyZW5Db3VudChlbGVtZW50KSA9PT0gMSkgbnVtYmVyT2Zmc2V0ID0gMTtcblxuICAgICAgICAgICAgY29uc3QgYmFkZ2VUZXh0ID0gY3JlYXRlVGV4dChjaXJjbGVDZW50ZXJbMF0gLSA0ICsgbnVtYmVyT2Zmc2V0LCBjaXJjbGVDZW50ZXJbMV0gKyA0LCBzdHJva2UsIGAke2dldENoaWxkcmVuQ291bnQoZWxlbWVudCl9YCk7XG4gICAgICAgICAgICBiYWRnZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ29wYWNpdHk6IDAuMTUnKTtcbiAgICAgICAgICAgIGJhZGdlVGV4dC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2ZvbnQtc2l6ZTogMTJweCcpO1xuICAgICAgICAgICAgY29sbGFwc2VHLmFwcGVuZENoaWxkKGJhZGdlKTtcbiAgICAgICAgICAgIGNvbGxhcHNlRy5hcHBlbmRDaGlsZChiYWRnZVRleHQpO1xuICAgICAgICAgICAgY29sbGFwc2VHLmFwcGVuZENoaWxkKGV4dGVuZExpbmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sbGFwc2VHLmFwcGVuZENoaWxkKGhpZGVDaXJjbGVHKTtcbiAgICAgICAgICAgIGNvbGxhcHNlRy5hcHBlbmRDaGlsZChhcnJvd0xpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29sbGFwc2VHLmFwcGVuZENoaWxkKGV4dGVuZExpbmUpO1xuICAgICAgICByZXR1cm4gY29sbGFwc2VHO1xuICAgIH1cblxuICAgIGFmdGVyRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4gbm90IGZpbmQgcXVpY2sgaW5zZXJ0IGdgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZyb21FdmVudCh0aGlzLmcsICdtb3VzZXVwJylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhUGxhaXRCb2FyZC5pc1BvaW50ZXIodGhpcy5ib2FyZCwgUGxhaXRQb2ludGVyVHlwZS5oYW5kKSB8fCAhIVBsYWl0Qm9hcmQuaXNSZWFkb25seSh0aGlzLmJvYXJkKSksXG4gICAgICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSAhZWxlbWVudC5pc0NvbGxhcHNlZDtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50OiBQYXJ0aWFsPE1pbmRFbGVtZW50PiA9IHsgaXNDb2xsYXBzZWQgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aCh0aGlzLmJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5ib2FyZCwgbmV3RWxlbWVudCwgcGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFycm93UG9pbnRzKGNpcmNsZUNlbnRlcjogUG9pbnQsIGxpbmtEaXJlY3Rpb246IExheW91dERpcmVjdGlvbikge1xuICAgICAgICBsZXQgYXJyb3dUb3BQb2ludCA9IG1vdmVYT2ZQb2ludChjaXJjbGVDZW50ZXIsIDIsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBhcnJvd1RvcFBvaW50ID0gbW92ZVlPZlBvaW50KGFycm93VG9wUG9pbnQsIDQsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBhcnJvd01pZGRsZVBvaW50ID0gbW92ZVhPZlBvaW50KGNpcmNsZUNlbnRlciwgLTIsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBsZXQgYXJyb3dCb3R0b21Qb2ludCA9IG1vdmVYT2ZQb2ludChjaXJjbGVDZW50ZXIsIDIsIGxpbmtEaXJlY3Rpb24pO1xuICAgICAgICBhcnJvd0JvdHRvbVBvaW50ID0gbW92ZVlPZlBvaW50KGFycm93Qm90dG9tUG9pbnQsIC00LCBsaW5rRGlyZWN0aW9uKTtcblxuICAgICAgICByZXR1cm4gW2Fycm93VG9wUG9pbnQsIGFycm93TWlkZGxlUG9pbnQsIGFycm93Qm90dG9tUG9pbnRdO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { MindElement } from '../interfaces';
|
|
2
|
-
import { createForeignObject, createG } from '@plait/core';
|
|
3
|
-
import { getEmojiFontSize } from '../utils/space/emoji';
|
|
4
|
-
import { getEmojiForeignRectangle } from '../utils/position/emoji';
|
|
5
|
-
class EmojiDrawer {
|
|
6
|
-
constructor(board, viewContainerRef) {
|
|
7
|
-
this.board = board;
|
|
8
|
-
this.viewContainerRef = viewContainerRef;
|
|
9
|
-
this.componentRef = null;
|
|
10
|
-
}
|
|
11
|
-
draw(emoji, element) {
|
|
12
|
-
this.destroy();
|
|
13
|
-
const componentType = this.board.drawEmoji(emoji, element);
|
|
14
|
-
this.componentRef = this.viewContainerRef.createComponent(componentType);
|
|
15
|
-
this.componentRef.instance.emojiItem = emoji;
|
|
16
|
-
this.componentRef.instance.board = this.board;
|
|
17
|
-
this.componentRef.instance.element = element;
|
|
18
|
-
this.componentRef.instance.fontSize = getEmojiFontSize(element);
|
|
19
|
-
}
|
|
20
|
-
get nativeElement() {
|
|
21
|
-
if (this.componentRef) {
|
|
22
|
-
return this.componentRef.instance.nativeElement;
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
destroy() {
|
|
29
|
-
if (this.componentRef) {
|
|
30
|
-
this.componentRef.destroy();
|
|
31
|
-
this.componentRef = null;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export class NodeEmojisDrawer {
|
|
36
|
-
constructor(board, viewContainerRef) {
|
|
37
|
-
this.board = board;
|
|
38
|
-
this.viewContainerRef = viewContainerRef;
|
|
39
|
-
this.emojiDrawers = [];
|
|
40
|
-
}
|
|
41
|
-
drawEmojis(element) {
|
|
42
|
-
this.destroy();
|
|
43
|
-
if (MindElement.hasEmojis(element)) {
|
|
44
|
-
this.g = createG();
|
|
45
|
-
this.g.classList.add('emojis');
|
|
46
|
-
const foreignRectangle = getEmojiForeignRectangle(this.board, element);
|
|
47
|
-
const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
|
|
48
|
-
this.g.append(foreignObject);
|
|
49
|
-
const container = document.createElement('div');
|
|
50
|
-
container.classList.add('node-emojis-container');
|
|
51
|
-
foreignObject.append(container);
|
|
52
|
-
this.emojiDrawers = element.data.emojis.map(emojiItem => {
|
|
53
|
-
const drawer = new EmojiDrawer(this.board, this.viewContainerRef);
|
|
54
|
-
drawer.draw(emojiItem, element);
|
|
55
|
-
return drawer;
|
|
56
|
-
});
|
|
57
|
-
this.emojiDrawers.forEach(drawer => {
|
|
58
|
-
container.append(drawer.nativeElement);
|
|
59
|
-
});
|
|
60
|
-
return this.g;
|
|
61
|
-
}
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
destroy() {
|
|
65
|
-
if (this.g) {
|
|
66
|
-
this.g.remove();
|
|
67
|
-
}
|
|
68
|
-
this.emojiDrawers.forEach(drawer => drawer.destroy());
|
|
69
|
-
this.emojiDrawers = [];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbW9qaXMuZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvZHJhd2VyL25vZGUtZW1vamlzLmRyYXdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXdCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR25FLE1BQU0sV0FBVztJQUdiLFlBQW9CLEtBQXFCLEVBQVUsZ0JBQWtDO1FBQWpFLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUZyRixpQkFBWSxHQUFnRCxJQUFJLENBQUM7SUFFdUIsQ0FBQztJQUV6RixJQUFJLENBQUMsS0FBZ0IsRUFBRSxPQUErQjtRQUNsRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFB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LCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbW9qaURhdGEsIEVtb2ppSXRlbSwgTWluZEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1pbmRFbW9qaUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlL2Vtb2ppLWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IGNyZWF0ZUZvcmVpZ25PYmplY3QsIGNyZWF0ZUcgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBnZXRFbW9qaUZvbnRTaXplIH0gZnJvbSAnLi4vdXRpbHMvc3BhY2UvZW1vamknO1xuaW1wb3J0IHsgZ2V0RW1vamlGb3JlaWduUmVjdGFuZ2xlIH0gZnJvbSAnLi4vdXRpbHMvcG9zaXRpb24vZW1vamknO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5cbmNsYXNzIEVtb2ppRHJhd2VyIHtcbiAgICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxNaW5kRW1vamlCYXNlQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRNaW5kQm9hcmQsIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge31cblxuICAgIGRyYXcoZW1vamk6IEVtb2ppSXRlbSwgZWxlbWVudDogTWluZEVsZW1lbnQ8RW1vamlEYXRhPikge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuYm9hcmQuZHJhd0Vtb2ppKGVtb2ppLCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbW9qaUl0ZW0gPSBlbW9qaTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuYm9hcmQgPSB0aGlzLmJvYXJkO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuZm9udFNpemUgPSBnZXRFbW9qaUZvbnRTaXplKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5uYXRpdmVFbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vZGVFbW9qaXNEcmF3ZXIge1xuICAgIGVtb2ppRHJhd2VyczogRW1vamlEcmF3ZXJbXSA9IFtdO1xuXG4gICAgZz86IFNWR0dFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRNaW5kQm9hcmQsIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge31cblxuICAgIGRyYXdFbW9qaXMoZWxlbWVudDogTWluZEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIGlmIChNaW5kRWxlbWVudC5oYXNFbW9qaXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuZyA9IGNyZWF0ZUcoKTtcbiAgICAgICAgICAgIHRoaXMuZy5jbGFzc0xpc3QuYWRkKCdlbW9qaXMnKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25SZWN0YW5nbGUgPSBnZXRFbW9qaUZvcmVpZ25SZWN0YW5nbGUodGhpcy5ib2FyZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gY3JlYXRlRm9yZWlnbk9iamVjdChcbiAgICAgICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLngsXG4gICAgICAgICAgICAgICAgZm9yZWlnblJlY3RhbmdsZS55LFxuICAgICAgICAgICAgICAgIGZvcmVpZ25SZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICAgICAgZm9yZWlnblJlY3RhbmdsZS5oZWlnaHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmcuYXBwZW5kKGZvcmVpZ25PYmplY3QpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbm9kZS1lbW9qaXMtY29udGFpbmVyJyk7XG4gICAgICAgICAgICBmb3JlaWduT2JqZWN0LmFwcGVuZChjb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5lbW9qaURyYXdlcnMgPSBlbGVtZW50LmRhdGEuZW1vamlzLm1hcChlbW9qaUl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyYXdlciA9IG5ldyBFbW9qaURyYXdlcih0aGlzLmJvYXJkLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICAgICAgICAgIGRyYXdlci5kcmF3KGVtb2ppSXRlbSwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdlcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lbW9qaURyYXdlcnMuZm9yRWFjaChkcmF3ZXIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoZHJhd2VyLm5hdGl2ZUVsZW1lbnQhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmcpIHtcbiAgICAgICAgICAgIHRoaXMuZy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtb2ppRHJhd2Vycy5mb3JFYWNoKGRyYXdlciA9PiBkcmF3ZXIuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5lbW9qaURyYXdlcnMgPSBbXTtcbiAgICB9XG59XG4iXX0=
|