@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.
Files changed (33) hide show
  1. package/base/index.d.ts +0 -1
  2. package/esm2022/base/index.mjs +1 -2
  3. package/esm2022/generators/node-active.generator.mjs +43 -0
  4. package/esm2022/generators/node-collapse.generator.mjs +108 -0
  5. package/esm2022/generators/node-emojis.generator.mjs +72 -0
  6. package/esm2022/generators/node-plus.generator.mjs +97 -0
  7. package/esm2022/generators/node-shape.generator.mjs +19 -0
  8. package/esm2022/mind-node.component.mjs +28 -36
  9. package/esm2022/plugins/with-mind.mjs +3 -3
  10. package/esm2022/plugins/with-node-image.mjs +3 -3
  11. package/esm2022/utils/draw/node-dnd.mjs +2 -2
  12. package/esm2022/utils/node/common.mjs +2 -11
  13. package/fesm2022/plait-mind.mjs +55 -102
  14. package/fesm2022/plait-mind.mjs.map +1 -1
  15. package/{drawer → generators}/node-active.generator.d.ts +1 -1
  16. package/generators/node-collapse.generator.d.ts +8 -0
  17. package/{drawer/node-emojis.drawer.d.ts → generators/node-emojis.generator.d.ts} +3 -3
  18. package/generators/node-plus.generator.d.ts +7 -0
  19. package/{drawer → generators}/node-shape.generator.d.ts +1 -1
  20. package/mind-node.component.d.ts +8 -10
  21. package/package.json +1 -1
  22. package/styles/styles.scss +7 -6
  23. package/utils/node/common.d.ts +1 -2
  24. package/utils/space/node-space.d.ts +1 -1
  25. package/base/base.drawer.d.ts +0 -15
  26. package/drawer/node-collapse.drawer.d.ts +0 -8
  27. package/drawer/node-insert.drawer.d.ts +0 -7
  28. package/esm2022/base/base.drawer.mjs +0 -29
  29. package/esm2022/drawer/node-active.generator.mjs +0 -43
  30. package/esm2022/drawer/node-collapse.drawer.mjs +0 -108
  31. package/esm2022/drawer/node-emojis.drawer.mjs +0 -72
  32. package/esm2022/drawer/node-insert.drawer.mjs +0 -98
  33. 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
- baseDraw(element: MindElement<BaseData>, data: ActiveData): SVGGElement;
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 EmojiDrawer {
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 NodeEmojisDrawer {
14
+ export declare class NodeEmojisGenerator {
15
15
  private board;
16
16
  private viewContainerRef;
17
- emojiDrawers: EmojiDrawer[];
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
- baseDraw(element: MindElement, data: ShapeData): SVGGElement;
9
+ draw(element: MindElement, data: ShapeData): SVGGElement;
10
10
  }
@@ -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 { NodeEmojisDrawer } from './drawer/node-emojis.drawer';
9
- import { NodeInsertDrawer } from './drawer/node-insert.drawer';
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 './drawer/node-active.generator';
12
- import { CollapseDrawer } from './drawer/node-collapse.drawer';
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 './drawer/node-shape.generator';
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
- nodeEmojisDrawer: NodeEmojisDrawer;
28
+ nodeEmojisGenerator: NodeEmojisGenerator;
29
29
  nodeShapeGenerator: NodeShapeGenerator;
30
- nodeInsertDrawer: NodeInsertDrawer;
30
+ nodePlusGenerator: NodePlusGenerator;
31
31
  imageGenerator: ImageGenerator<MindElement<ImageData>>;
32
32
  activeGenerator: NodeActiveGenerator;
33
- collapseDrawer: CollapseDrawer;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/mind",
3
- "version": "0.32.0",
3
+ "version": "0.33.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^16.0.0",
6
6
  "@angular/core": "^16.0.0"
@@ -62,9 +62,11 @@ $primary: #4e8afa;
62
62
  }
63
63
  }
64
64
 
65
- &[class*='pointer-']:not(.pointer-selection) {
66
- :not(.collapsed) > .extend {
67
- display: none;
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
- .quick-insert {
101
+ .plus {
101
102
  display: none;
102
103
  }
103
104
  }
@@ -1,5 +1,4 @@
1
- import { PlaitBoard, PlaitOptionsBoard } from '@plait/core';
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) => 18 | 14;
22
+ export declare const getNodeDefaultFontSize: (isRoot?: boolean) => 14 | 18;
@@ -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=