@plait/mind 0.2.0-next.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 (125) hide show
  1. package/README.md +24 -0
  2. package/constants/default.d.ts +12 -0
  3. package/constants/index.d.ts +2 -0
  4. package/constants/node.d.ts +17 -0
  5. package/draw/abstract.d.ts +4 -0
  6. package/draw/indented-link.d.ts +3 -0
  7. package/draw/link/abstract-link.d.ts +3 -0
  8. package/draw/link/logic-link.d.ts +3 -0
  9. package/draw/link.d.ts +3 -0
  10. package/draw/richtext.d.ts +14 -0
  11. package/draw/shape.d.ts +3 -0
  12. package/esm2020/constants/default.mjs +13 -0
  13. package/esm2020/constants/index.mjs +3 -0
  14. package/esm2020/constants/node.mjs +19 -0
  15. package/esm2020/draw/abstract.mjs +48 -0
  16. package/esm2020/draw/indented-link.mjs +44 -0
  17. package/esm2020/draw/link/abstract-link.mjs +42 -0
  18. package/esm2020/draw/link/logic-link.mjs +51 -0
  19. package/esm2020/draw/link.mjs +158 -0
  20. package/esm2020/draw/richtext.mjs +35 -0
  21. package/esm2020/draw/shape.mjs +18 -0
  22. package/esm2020/interfaces/abstract.mjs +6 -0
  23. package/esm2020/interfaces/element-data.mjs +2 -0
  24. package/esm2020/interfaces/element.mjs +59 -0
  25. package/esm2020/interfaces/index.mjs +6 -0
  26. package/esm2020/interfaces/layout.mjs +19 -0
  27. package/esm2020/interfaces/node.mjs +23 -0
  28. package/esm2020/interfaces/types.mjs +13 -0
  29. package/esm2020/layout-option.mjs +72 -0
  30. package/esm2020/mind.component.mjs +50 -0
  31. package/esm2020/mind.module.mjs +21 -0
  32. package/esm2020/node.component.mjs +742 -0
  33. package/esm2020/plait-mind.mjs +5 -0
  34. package/esm2020/plugins/emoji/emoji-base.component.mjs +21 -0
  35. package/esm2020/plugins/emoji/emoji.drawer.mjs +79 -0
  36. package/esm2020/plugins/emoji/emoji.mjs +15 -0
  37. package/esm2020/plugins/emoji/index.mjs +4 -0
  38. package/esm2020/plugins/emoji/with-mind-emoji.mjs +8 -0
  39. package/esm2020/plugins/with-abstract.mjs +92 -0
  40. package/esm2020/plugins/with-dnd.mjs +276 -0
  41. package/esm2020/plugins/with-mind.mjs +183 -0
  42. package/esm2020/public-api.mjs +14 -0
  43. package/esm2020/queries/get-available-sublayouts-by-element.mjs +29 -0
  44. package/esm2020/queries/get-branch-mindmap-layouts-by-element.mjs +18 -0
  45. package/esm2020/queries/get-correct-layout-by-element.mjs +50 -0
  46. package/esm2020/queries/get-layout-by-element.mjs +16 -0
  47. package/esm2020/queries/get-layout-parent-by-element.mjs +17 -0
  48. package/esm2020/queries/index.mjs +13 -0
  49. package/esm2020/transforms/index.mjs +10 -0
  50. package/esm2020/transforms/layout.mjs +23 -0
  51. package/esm2020/transforms/node.mjs +44 -0
  52. package/esm2020/utils/abstract/common.mjs +25 -0
  53. package/esm2020/utils/abstract/resize.mjs +169 -0
  54. package/esm2020/utils/clipboard.mjs +71 -0
  55. package/esm2020/utils/colors.mjs +41 -0
  56. package/esm2020/utils/direction-corrector.mjs +54 -0
  57. package/esm2020/utils/direction-detector.mjs +56 -0
  58. package/esm2020/utils/draw-placeholder.mjs +311 -0
  59. package/esm2020/utils/drop-target-corrector.mjs +86 -0
  60. package/esm2020/utils/graph.mjs +24 -0
  61. package/esm2020/utils/index.mjs +14 -0
  62. package/esm2020/utils/is-virtual-key.mjs +13 -0
  63. package/esm2020/utils/layout.mjs +105 -0
  64. package/esm2020/utils/mindmap.mjs +295 -0
  65. package/esm2020/utils/node-space.mjs +72 -0
  66. package/esm2020/utils/node.mjs +6 -0
  67. package/esm2020/utils/path.mjs +11 -0
  68. package/esm2020/utils/point-placement.mjs +99 -0
  69. package/esm2020/utils/shape.mjs +17 -0
  70. package/esm2020/utils/weak-maps.mjs +3 -0
  71. package/fesm2015/plait-mind.mjs +3583 -0
  72. package/fesm2015/plait-mind.mjs.map +1 -0
  73. package/fesm2020/plait-mind.mjs +3595 -0
  74. package/fesm2020/plait-mind.mjs.map +1 -0
  75. package/index.d.ts +5 -0
  76. package/interfaces/abstract.d.ts +4 -0
  77. package/interfaces/element-data.d.ts +11 -0
  78. package/interfaces/element.d.ts +39 -0
  79. package/interfaces/index.d.ts +5 -0
  80. package/interfaces/layout.d.ts +10 -0
  81. package/interfaces/node.d.ts +33 -0
  82. package/interfaces/types.d.ts +11 -0
  83. package/layout-option.d.ts +2 -0
  84. package/mind.component.d.ts +16 -0
  85. package/mind.module.d.ts +11 -0
  86. package/node.component.d.ts +60 -0
  87. package/package.json +31 -0
  88. package/plugins/emoji/emoji-base.component.d.ts +12 -0
  89. package/plugins/emoji/emoji.d.ts +6 -0
  90. package/plugins/emoji/emoji.drawer.d.ts +22 -0
  91. package/plugins/emoji/index.d.ts +3 -0
  92. package/plugins/emoji/with-mind-emoji.d.ts +8 -0
  93. package/plugins/with-abstract.d.ts +2 -0
  94. package/plugins/with-dnd.d.ts +11 -0
  95. package/plugins/with-mind.d.ts +2 -0
  96. package/public-api.d.ts +10 -0
  97. package/queries/get-available-sublayouts-by-element.d.ts +8 -0
  98. package/queries/get-branch-mindmap-layouts-by-element.d.ts +3 -0
  99. package/queries/get-correct-layout-by-element.d.ts +9 -0
  100. package/queries/get-layout-by-element.d.ts +3 -0
  101. package/queries/get-layout-parent-by-element.d.ts +8 -0
  102. package/queries/index.d.ts +7 -0
  103. package/styles/styles.scss +99 -0
  104. package/transforms/index.d.ts +7 -0
  105. package/transforms/layout.d.ts +3 -0
  106. package/transforms/node.d.ts +8 -0
  107. package/utils/abstract/common.d.ts +5 -0
  108. package/utils/abstract/resize.d.ts +21 -0
  109. package/utils/clipboard.d.ts +7 -0
  110. package/utils/colors.d.ts +4 -0
  111. package/utils/direction-corrector.d.ts +3 -0
  112. package/utils/direction-detector.d.ts +9 -0
  113. package/utils/draw-placeholder.d.ts +42 -0
  114. package/utils/drop-target-corrector.d.ts +8 -0
  115. package/utils/graph.d.ts +5 -0
  116. package/utils/index.d.ts +13 -0
  117. package/utils/is-virtual-key.d.ts +1 -0
  118. package/utils/layout.d.ts +12 -0
  119. package/utils/mindmap.d.ts +33 -0
  120. package/utils/node-space.d.ts +9 -0
  121. package/utils/node.d.ts +2 -0
  122. package/utils/path.d.ts +4 -0
  123. package/utils/point-placement.d.ts +8 -0
  124. package/utils/shape.d.ts +3 -0
  125. package/utils/weak-maps.d.ts +5 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # mindmap
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.3.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project mindmap` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project mindmap`.
8
+ > Note: Don't forget to add `--project mindmap` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build mindmap` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build mindmap`, go to the dist folder `cd dist/mind` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test mindmap` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -0,0 +1,12 @@
1
+ export declare const BASE = 4;
2
+ export declare const PRIMARY_COLOR = "#6698FF";
3
+ export declare const MINDMAP_KEY = "plait-mindmap";
4
+ export declare const MAX_RADIUS: number;
5
+ export declare const TRANSPARENT = "transparent";
6
+ export declare const GRAY_COLOR = "#AAAAAA";
7
+ export declare const STROKE_WIDTH = 3;
8
+ export declare const EXTEND_OFFSET = 8;
9
+ export declare const EXTEND_RADIUS = 16;
10
+ export declare const QUICK_INSERT_CIRCLE_OFFSET = 9;
11
+ export declare const QUICK_INSERT_CIRCLE_COLOR = "#6698FF";
12
+ export declare const QUICK_INSERT_INNER_CROSS_COLOR = "white";
@@ -0,0 +1,2 @@
1
+ export * from './default';
2
+ export * from './node';
@@ -0,0 +1,17 @@
1
+ export declare const TOPIC_COLOR = "#333";
2
+ export declare const TOPIC_FONT_SIZE = 14;
3
+ export declare const NODE_FILL = "#FFFFFF";
4
+ export declare const ROOT_NODE_FILL = "#F5F5F5";
5
+ export declare const ROOT_NODE_STROKE = "#F5F5F5";
6
+ export declare const ROOT_TOPIC_FONT_SIZE = 18;
7
+ export declare const NODE_MIN_WIDTH = 18;
8
+ export declare const COLORS: string[];
9
+ export declare enum MindmapNodeShape {
10
+ roundRectangle = "round-rectangle",
11
+ underline = "underline"
12
+ }
13
+ export declare const ABSTRACT_HANDLE_COLOR = "#6698FF80";
14
+ export declare const ABSTRACT_INCLUDED_OUTLINE_OFFSET = 3.5;
15
+ export declare const ABSTRACT_HANDLE_LENGTH = 12;
16
+ export declare const TOPIC_DEFAULT_MAX_WORD_COUNT = 34;
17
+ export declare const ABSTRACT_HANDLE_MASK_WIDTH = 8;
@@ -0,0 +1,4 @@
1
+ import { PlaitBoard } from '@plait/core';
2
+ import { RoughSVG } from 'roughjs/bin/svg';
3
+ import { AbstractHandlePosition, MindElement } from '../interfaces';
4
+ export declare function drawAbstractIncludedOutline(board: PlaitBoard, roughSVG: RoughSVG, element: MindElement, handlePosition?: AbstractHandlePosition, resizingLocation?: number): SVGGElement;
@@ -0,0 +1,3 @@
1
+ import { RoughSVG } from 'roughjs/bin/svg';
2
+ import { MindmapNode } from '../interfaces/node';
3
+ export declare function drawIndentedLink(roughSVG: RoughSVG, node: MindmapNode, child: MindmapNode, defaultStroke?: string | null, needDrawUnderline?: boolean): SVGGElement;
@@ -0,0 +1,3 @@
1
+ import { PlaitBoard } from '@plait/core';
2
+ import { MindmapNode } from '../../interfaces/node';
3
+ export declare function drawAbstractLink(board: PlaitBoard, node: MindmapNode, isHorizontal: boolean): SVGGElement;
@@ -0,0 +1,3 @@
1
+ import { RoughSVG } from 'roughjs/bin/svg';
2
+ import { MindmapNode } from '../../interfaces/node';
3
+ export declare function drawLogicLink(roughSVG: RoughSVG, node: MindmapNode, parent: MindmapNode, isHorizontal: boolean): SVGGElement;
package/draw/link.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { RoughSVG } from 'roughjs/bin/svg';
2
+ import { MindmapNode } from '../interfaces/node';
3
+ export declare function drawLink(roughSVG: RoughSVG, node: MindmapNode, child: MindmapNode, defaultStroke?: string | null, isHorizontal?: boolean, needDrawUnderline?: boolean): SVGGElement;
@@ -0,0 +1,14 @@
1
+ import { ViewContainerRef } from '@angular/core';
2
+ import { MindmapNode } from '../interfaces/node';
3
+ export declare function drawMindmapNodeRichtext(node: MindmapNode, viewContainerRef: ViewContainerRef): {
4
+ richtextComponentRef: import("@angular/core").ComponentRef<import("@plait/richtext").PlaitRichtextComponent>;
5
+ richtextG: SVGGElement;
6
+ foreignObject: SVGForeignObjectElement;
7
+ };
8
+ export declare function updateMindNodeTopicSize(node: MindmapNode, g: SVGGElement, isEditable: boolean): void;
9
+ export declare function getRichtextRectangleByNode(node: MindmapNode): {
10
+ width: number;
11
+ height: number;
12
+ x: number;
13
+ y: number;
14
+ };
@@ -0,0 +1,3 @@
1
+ import { MindmapNode } from '../interfaces/node';
2
+ import { PlaitBoard } from '@plait/core';
3
+ export declare function drawRectangleNode(board: PlaitBoard, node: MindmapNode): SVGGElement;
@@ -0,0 +1,13 @@
1
+ export const BASE = 4;
2
+ export const PRIMARY_COLOR = '#6698FF';
3
+ export const MINDMAP_KEY = 'plait-mindmap';
4
+ export const MAX_RADIUS = BASE * 4;
5
+ export const TRANSPARENT = 'transparent';
6
+ export const GRAY_COLOR = '#AAAAAA';
7
+ export const STROKE_WIDTH = 3;
8
+ export const EXTEND_OFFSET = 8;
9
+ export const EXTEND_RADIUS = 16;
10
+ export const QUICK_INSERT_CIRCLE_OFFSET = 9;
11
+ export const QUICK_INSERT_CIRCLE_COLOR = '#6698FF';
12
+ export const QUICK_INSERT_INNER_CROSS_COLOR = 'white';
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2NvbnN0YW50cy9kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDO0FBQzNDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQztBQUNwQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRTlCLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDL0IsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUVoQyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsU0FBUyxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBCQVNFID0gNDtcbmV4cG9ydCBjb25zdCBQUklNQVJZX0NPTE9SID0gJyM2Njk4RkYnO1xuZXhwb3J0IGNvbnN0IE1JTkRNQVBfS0VZID0gJ3BsYWl0LW1pbmRtYXAnO1xuZXhwb3J0IGNvbnN0IE1BWF9SQURJVVMgPSBCQVNFICogNDtcblxuZXhwb3J0IGNvbnN0IFRSQU5TUEFSRU5UID0gJ3RyYW5zcGFyZW50JztcbmV4cG9ydCBjb25zdCBHUkFZX0NPTE9SID0gJyNBQUFBQUEnO1xuZXhwb3J0IGNvbnN0IFNUUk9LRV9XSURUSCA9IDM7XG5cbmV4cG9ydCBjb25zdCBFWFRFTkRfT0ZGU0VUID0gODtcbmV4cG9ydCBjb25zdCBFWFRFTkRfUkFESVVTID0gMTY7XG5cbmV4cG9ydCBjb25zdCBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA9IDk7XG5leHBvcnQgY29uc3QgUVVJQ0tfSU5TRVJUX0NJUkNMRV9DT0xPUiA9ICcjNjY5OEZGJztcbmV4cG9ydCBjb25zdCBRVUlDS19JTlNFUlRfSU5ORVJfQ1JPU1NfQ09MT1IgPSAnd2hpdGUnO1xuIl19
@@ -0,0 +1,3 @@
1
+ export * from './default';
2
+ export * from './node';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9jb25zdGFudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RlZmF1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9ub2RlJztcbiJdfQ==
@@ -0,0 +1,19 @@
1
+ export const TOPIC_COLOR = '#333';
2
+ export const TOPIC_FONT_SIZE = 14;
3
+ export const NODE_FILL = '#FFFFFF';
4
+ export const ROOT_NODE_FILL = '#F5F5F5';
5
+ export const ROOT_NODE_STROKE = '#F5F5F5';
6
+ export const ROOT_TOPIC_FONT_SIZE = 18;
7
+ export const NODE_MIN_WIDTH = 18;
8
+ export const COLORS = ['#A287E1', '#6F81DB', '#6EC4C4', '#DFB85D', '#B1C774', '#77C386', '#C28976', '#E48484', '#E482D4', '#69B1E4'];
9
+ export var MindmapNodeShape;
10
+ (function (MindmapNodeShape) {
11
+ MindmapNodeShape["roundRectangle"] = "round-rectangle";
12
+ MindmapNodeShape["underline"] = "underline";
13
+ })(MindmapNodeShape || (MindmapNodeShape = {}));
14
+ export const ABSTRACT_HANDLE_COLOR = '#6698FF80'; //PRIMARY_COLOR 50% 透明度
15
+ export const ABSTRACT_INCLUDED_OUTLINE_OFFSET = 3.5;
16
+ export const ABSTRACT_HANDLE_LENGTH = 12;
17
+ export const TOPIC_DEFAULT_MAX_WORD_COUNT = 34;
18
+ export const ABSTRACT_HANDLE_MASK_WIDTH = 8;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2NvbnN0YW50cy9ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRXJJLE1BQU0sQ0FBTixJQUFZLGdCQUdYO0FBSEQsV0FBWSxnQkFBZ0I7SUFDeEIsc0RBQWtDLENBQUE7SUFDbEMsMkNBQXVCLENBQUE7QUFDM0IsQ0FBQyxFQUhXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFHM0I7QUFFRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxXQUFXLENBQUMsQ0FBQyx1QkFBdUI7QUFDekUsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsR0FBRyxDQUFDO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFRPUElDX0NPTE9SID0gJyMzMzMnO1xuZXhwb3J0IGNvbnN0IFRPUElDX0ZPTlRfU0laRSA9IDE0O1xuZXhwb3J0IGNvbnN0IE5PREVfRklMTCA9ICcjRkZGRkZGJztcbmV4cG9ydCBjb25zdCBST09UX05PREVfRklMTCA9ICcjRjVGNUY1JztcbmV4cG9ydCBjb25zdCBST09UX05PREVfU1RST0tFID0gJyNGNUY1RjUnO1xuZXhwb3J0IGNvbnN0IFJPT1RfVE9QSUNfRk9OVF9TSVpFID0gMTg7XG5leHBvcnQgY29uc3QgTk9ERV9NSU5fV0lEVEggPSAxODtcblxuZXhwb3J0IGNvbnN0IENPTE9SUyA9IFsnI0EyODdFMScsICcjNkY4MURCJywgJyM2RUM0QzQnLCAnI0RGQjg1RCcsICcjQjFDNzc0JywgJyM3N0MzODYnLCAnI0MyODk3NicsICcjRTQ4NDg0JywgJyNFNDgyRDQnLCAnIzY5QjFFNCddO1xuXG5leHBvcnQgZW51bSBNaW5kbWFwTm9kZVNoYXBlIHtcbiAgICByb3VuZFJlY3RhbmdsZSA9ICdyb3VuZC1yZWN0YW5nbGUnLFxuICAgIHVuZGVybGluZSA9ICd1bmRlcmxpbmUnXG59XG5cbmV4cG9ydCBjb25zdCBBQlNUUkFDVF9IQU5ETEVfQ09MT1IgPSAnIzY2OThGRjgwJzsgLy9QUklNQVJZX0NPTE9SIDUwJSDpgI/mmI7luqZcbmV4cG9ydCBjb25zdCBBQlNUUkFDVF9JTkNMVURFRF9PVVRMSU5FX09GRlNFVCA9IDMuNTtcbmV4cG9ydCBjb25zdCBBQlNUUkFDVF9IQU5ETEVfTEVOR1RIID0gMTI7XG5cbmV4cG9ydCBjb25zdCBUT1BJQ19ERUZBVUxUX01BWF9XT1JEX0NPVU5UID0gMzQ7XG5leHBvcnQgY29uc3QgQUJTVFJBQ1RfSEFORExFX01BU0tfV0lEVEggPSA4O1xuIl19
@@ -0,0 +1,48 @@
1
+ import { drawAbstractRoundRectangle, createG, getRectangleByElements, RectangleClient } from '@plait/core';
2
+ import { ABSTRACT_HANDLE_COLOR, ABSTRACT_HANDLE_LENGTH, ABSTRACT_INCLUDED_OUTLINE_OFFSET, PRIMARY_COLOR } from '../constants';
3
+ import { AbstractHandlePosition, MindElement } from '../interfaces';
4
+ import { isHorizontalLayout } from '@plait/layouts';
5
+ import { MindmapQueries } from '../queries';
6
+ import { getLayoutDirection, getPointByPlacement, movePoint, transformPlacement } from '../utils/point-placement';
7
+ import { HorizontalPlacement, VerticalPlacement } from '../interfaces/types';
8
+ import { getRectangleByResizingLocation } from '../utils/abstract/resize';
9
+ export function drawAbstractIncludedOutline(board, roughSVG, element, handlePosition = AbstractHandlePosition.start, resizingLocation) {
10
+ const abstractIncludedG = createG();
11
+ const parentElement = MindElement.getParent(element);
12
+ const nodeLayout = MindmapQueries.getCorrectLayoutByElement(element);
13
+ const isHorizontal = isHorizontalLayout(nodeLayout);
14
+ const includedElements = parentElement.children.slice(element.start, element.end + 1);
15
+ let abstractRectangle = getRectangleByElements(board, includedElements, true);
16
+ abstractRectangle = RectangleClient.getOutlineRectangle(abstractRectangle, -ABSTRACT_INCLUDED_OUTLINE_OFFSET);
17
+ if (resizingLocation) {
18
+ abstractRectangle = getRectangleByResizingLocation(abstractRectangle, resizingLocation, handlePosition, isHorizontal);
19
+ }
20
+ const rectangle = drawAbstractRoundRectangle(roughSVG, abstractRectangle.x, abstractRectangle.y, abstractRectangle.x + abstractRectangle.width, abstractRectangle.y + abstractRectangle.height, isHorizontal, {
21
+ stroke: PRIMARY_COLOR,
22
+ strokeWidth: 1,
23
+ fillStyle: 'solid'
24
+ });
25
+ const handleOptions = {
26
+ stroke: ABSTRACT_HANDLE_COLOR,
27
+ strokeWidth: 3,
28
+ fillStyle: 'solid'
29
+ };
30
+ const startPlacement = [HorizontalPlacement.center, VerticalPlacement.top];
31
+ const endPlacement = [HorizontalPlacement.center, VerticalPlacement.bottom];
32
+ const linkDirection = getLayoutDirection(MindElement.getNode(element), isHorizontal);
33
+ transformPlacement(startPlacement, linkDirection);
34
+ transformPlacement(endPlacement, linkDirection);
35
+ let startCenterPoint = getPointByPlacement(abstractRectangle, startPlacement);
36
+ let endCenterPoint = getPointByPlacement(abstractRectangle, endPlacement);
37
+ const startPoint1 = movePoint(startCenterPoint, -ABSTRACT_HANDLE_LENGTH / 2, linkDirection);
38
+ const startPoint2 = movePoint(startCenterPoint, ABSTRACT_HANDLE_LENGTH / 2, linkDirection);
39
+ const endPoint1 = movePoint(endCenterPoint, -ABSTRACT_HANDLE_LENGTH / 2, linkDirection);
40
+ const endPoint2 = movePoint(endCenterPoint, ABSTRACT_HANDLE_LENGTH / 2, linkDirection);
41
+ const startHandle = roughSVG.line(startPoint1[0], startPoint1[1], startPoint2[0], startPoint2[1], handleOptions);
42
+ const endHandle = roughSVG.line(endPoint1[0], endPoint1[1], endPoint2[0], endPoint2[1], handleOptions);
43
+ abstractIncludedG.append(startHandle);
44
+ abstractIncludedG.append(endHandle);
45
+ abstractIncludedG.append(rectangle);
46
+ return abstractIncludedG;
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9kcmF3L2Fic3RyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxPQUFPLEVBQUUsc0JBQXNCLEVBQWMsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxnQ0FBZ0MsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQXFCLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEgsT0FBTyxFQUFFLG1CQUFtQixFQUFrQixpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTFFLE1BQU0sVUFBVSwyQkFBMkIsQ0FDdkMsS0FBaUIsRUFDakIsUUFBa0IsRUFDbEIsT0FBb0IsRUFDcEIsaUJBQXlDLHNCQUFzQixDQUFDLEtBQUssRUFDckUsZ0JBQXlCO0lBRXpCLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFFcEMsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFzQixDQUFDO0lBQzFGLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLFVBQVUs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QWEsQ0FBQyxDQUFDO0lBRXZHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0QyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXBDLE9BQU8saUJBQWlCLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRyYXdBYnN0cmFjdFJvdW5kUmVjdGFuZ2xlLCBjcmVhdGVHLCBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzLCBQbGFpdEJvYXJkLCBSZWN0YW5nbGVDbGllbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBBQlNUUkFDVF9IQU5ETEVfQ09MT1IsIEFCU1RSQUNUX0hBTkRMRV9MRU5HVEgsIEFCU1RSQUNUX0lOQ0xVREVEX09VVExJTkVfT0ZGU0VULCBQUklNQVJZX0NPTE9SIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFJvdWdoU1ZHIH0gZnJvbSAncm91Z2hqcy9iaW4vc3ZnJztcbmltcG9ydCB7IEFic3RyYWN0SGFuZGxlUG9zaXRpb24sIE1pbmRFbGVtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNaW5kbWFwTGF5b3V0VHlwZSwgaXNIb3Jpem9udGFsTGF5b3V0IH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgTWluZG1hcFF1ZXJpZXMgfSBmcm9tICcuLi9xdWVyaWVzJztcbmltcG9ydCB7IGdldExheW91dERpcmVjdGlvbiwgZ2V0UG9pbnRCeVBsYWNlbWVudCwgbW92ZVBvaW50LCB0cmFuc2Zvcm1QbGFjZW1lbnQgfSBmcm9tICcuLi91dGlscy9wb2ludC1wbGFjZW1lbnQnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbFBsYWNlbWVudCwgUG9pbnRQbGFjZW1lbnQsIFZlcnRpY2FsUGxhY2VtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90eXBlcyc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeVJlc2l6aW5nTG9jYXRpb24gfSBmcm9tICcuLi91dGlscy9hYnN0cmFjdC9yZXNpemUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZHJhd0Fic3RyYWN0SW5jbHVkZWRPdXRsaW5lKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIHJvdWdoU1ZHOiBSb3VnaFNWRyxcbiAgICBlbGVtZW50OiBNaW5kRWxlbWVudCxcbiAgICBoYW5kbGVQb3NpdGlvbjogQWJzdHJhY3RIYW5kbGVQb3NpdGlvbiA9IEFic3RyYWN0SGFuZGxlUG9zaXRpb24uc3RhcnQsXG4gICAgcmVzaXppbmdMb2NhdGlvbj86IG51bWJlclxuKSB7XG4gICAgY29uc3QgYWJzdHJhY3RJbmNsdWRlZEcgPSBjcmVhdGVHKCk7XG5cbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gTWluZEVsZW1lbnQuZ2V0UGFyZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IG5vZGVMYXlvdXQgPSBNaW5kbWFwUXVlcmllcy5nZXRDb3JyZWN0TGF5b3V0QnlFbGVtZW50KGVsZW1lbnQpIGFzIE1pbmRtYXBMYXlvdXRUeXBlO1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbExheW91dChub2RlTGF5b3V0KTtcblxuICAgIGNvbnN0IGluY2x1ZGVkRWxlbWVudHMgPSBwYXJlbnRFbGVtZW50LmNoaWxkcmVuLnNsaWNlKGVsZW1lbnQuc3RhcnQhLCBlbGVtZW50LmVuZCEgKyAxKTtcbiAgICBsZXQgYWJzdHJhY3RSZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCBpbmNsdWRlZEVsZW1lbnRzLCB0cnVlKTtcbiAgICBhYnN0cmFjdFJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRPdXRsaW5lUmVjdGFuZ2xlKGFic3RyYWN0UmVjdGFuZ2xlLCAtQUJTVFJBQ1RfSU5DTFVERURfT1VUTElORV9PRkZTRVQpO1xuXG4gICAgaWYgKHJlc2l6aW5nTG9jYXRpb24pIHtcbiAgICAgICAgYWJzdHJhY3RSZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeVJlc2l6aW5nTG9jYXRpb24oYWJzdHJhY3RSZWN0YW5nbGUsIHJlc2l6aW5nTG9jYXRpb24sIGhhbmRsZVBvc2l0aW9uLCBpc0hvcml6b250YWwpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3RhbmdsZSA9IGRyYXdBYnN0cmFjdFJvdW5kUmVjdGFuZ2xlKFxuICAgICAgICByb3VnaFNWRyxcbiAgICAgICAgYWJzdHJhY3RSZWN0YW5nbGUueCxcbiAgICAgICAgYWJzdHJhY3RSZWN0YW5nbGUueSxcbiAgICAgICAgYWJzdHJhY3RSZWN0YW5nbGUueCArIGFic3RyYWN0UmVjdGFuZ2xlLndpZHRoLFxuICAgICAgICBhYnN0cmFjdFJlY3RhbmdsZS55ICsgYWJzdHJhY3RSZWN0YW5nbGUuaGVpZ2h0LFxuICAgICAgICBpc0hvcml6b250YWwsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHN0cm9rZTogUFJJTUFSWV9DT0xPUixcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgaGFuZGxlT3B0aW9ucyA9IHtcbiAgICAgICAgc3Ryb2tlOiBBQlNUUkFDVF9IQU5ETEVfQ09MT1IsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAzLFxuICAgICAgICBmaWxsU3R5bGU6ICdzb2xpZCdcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhcnRQbGFjZW1lbnQgPSBbSG9yaXpvbnRhbFBsYWNlbWVudC5jZW50ZXIsIFZlcnRpY2FsUGxhY2VtZW50LnRvcF0gYXMgUG9pbnRQbGFjZW1lbnQ7XG4gICAgY29uc3QgZW5kUGxhY2VtZW50ID0gW0hvcml6b250YWxQbGFjZW1lbnQuY2VudGVyLCBWZXJ0aWNhbFBsYWNlbWVudC5ib3R0b21dIGFzIFBvaW50UGxhY2VtZW50O1xuXG4gICAgY29uc3QgbGlua0RpcmVjdGlvbiA9IGdldExheW91dERpcmVjdGlvbihNaW5kRWxlbWVudC5nZXROb2RlKGVsZW1lbnQpLCBpc0hvcml6b250YWwpO1xuXG4gICAgdHJhbnNmb3JtUGxhY2VtZW50KHN0YXJ0UGxhY2VtZW50LCBsaW5rRGlyZWN0aW9uKTtcbiAgICB0cmFuc2Zvcm1QbGFjZW1lbnQoZW5kUGxhY2VtZW50LCBsaW5rRGlyZWN0aW9uKTtcblxuICAgIGxldCBzdGFydENlbnRlclBvaW50ID0gZ2V0UG9pbnRCeVBsYWNlbWVudChhYnN0cmFjdFJlY3RhbmdsZSwgc3RhcnRQbGFjZW1lbnQpO1xuICAgIGxldCBlbmRDZW50ZXJQb2ludCA9IGdldFBvaW50QnlQbGFjZW1lbnQoYWJzdHJhY3RSZWN0YW5nbGUsIGVuZFBsYWNlbWVudCk7XG5cbiAgICBjb25zdCBzdGFydFBvaW50MSA9IG1vdmVQb2ludChzdGFydENlbnRlclBvaW50LCAtQUJTVFJBQ1RfSEFORExFX0xFTkdUSCAvIDIsIGxpbmtEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHN0YXJ0UG9pbnQyID0gbW92ZVBvaW50KHN0YXJ0Q2VudGVyUG9pbnQsIEFCU1RSQUNUX0hBTkRMRV9MRU5HVEggLyAyLCBsaW5rRGlyZWN0aW9uKTtcblxuICAgIGNvbnN0IGVuZFBvaW50MSA9IG1vdmVQb2ludChlbmRDZW50ZXJQb2ludCwgLUFCU1RSQUNUX0hBTkRMRV9MRU5HVEggLyAyLCBsaW5rRGlyZWN0aW9uKTtcbiAgICBjb25zdCBlbmRQb2ludDIgPSBtb3ZlUG9pbnQoZW5kQ2VudGVyUG9pbnQsIEFCU1RSQUNUX0hBTkRMRV9MRU5HVEggLyAyLCBsaW5rRGlyZWN0aW9uKTtcblxuICAgIGNvbnN0IHN0YXJ0SGFuZGxlID0gcm91Z2hTVkcubGluZShzdGFydFBvaW50MVswXSwgc3RhcnRQb2ludDFbMV0sIHN0YXJ0UG9pbnQyWzBdLCBzdGFydFBvaW50MlsxXSwgaGFuZGxlT3B0aW9ucyk7XG4gICAgY29uc3QgZW5kSGFuZGxlID0gcm91Z2hTVkcubGluZShlbmRQb2ludDFbMF0sIGVuZFBvaW50MVsxXSwgZW5kUG9pbnQyWzBdLCBlbmRQb2ludDJbMV0sIGhhbmRsZU9wdGlvbnMpO1xuXG4gICAgYWJzdHJhY3RJbmNsdWRlZEcuYXBwZW5kKHN0YXJ0SGFuZGxlKTtcbiAgICBhYnN0cmFjdEluY2x1ZGVkRy5hcHBlbmQoZW5kSGFuZGxlKTtcbiAgICBhYnN0cmFjdEluY2x1ZGVkRy5hcHBlbmQocmVjdGFuZ2xlKTtcblxuICAgIHJldHVybiBhYnN0cmFjdEluY2x1ZGVkRztcbn1cbiJdfQ==
@@ -0,0 +1,44 @@
1
+ import { pointsOnBezierCurves } from 'points-on-curve';
2
+ import { MindmapNodeShape, STROKE_WIDTH } from '../constants';
3
+ import { getLinkLineColorByMindmapElement } from '../utils/colors';
4
+ import { getNodeShapeByElement, getRectangleByNode, isChildUp } from '../utils';
5
+ import { MindmapLayoutType } from '@plait/layouts';
6
+ import { MindmapQueries } from '../queries';
7
+ export function drawIndentedLink(roughSVG, node, child, defaultStroke = null, needDrawUnderline = true) {
8
+ const isUnderlineShap = getNodeShapeByElement(child.origin) === MindmapNodeShape.underline;
9
+ let beginX, beginY, endX, endY, beginNode = node, endNode = child;
10
+ const beginRectangle = getRectangleByNode(beginNode);
11
+ const endRectangle = getRectangleByNode(endNode);
12
+ beginX = beginNode.x + beginNode.width / 2;
13
+ beginY = isChildUp(node, child) ? beginRectangle.y : beginRectangle.y + beginRectangle.height;
14
+ endX = node.left ? endNode.x + endNode.hGap + endRectangle.width : endNode.x + endNode.hGap;
15
+ endY = isUnderlineShap ? endNode.y + endNode.height - endNode.vGap : endNode.y + endNode.height / 2;
16
+ //根据位置,设置正负参数
17
+ let plusMinus = isChildUp(node, child) ? (node.left ? [-1, -1] : [1, -1]) : node.left ? [-1, 1] : [1, 1];
18
+ const layout = MindmapQueries.getCorrectLayoutByElement(node.origin);
19
+ const strokeWidth = child.origin.linkLineWidth ? child.origin.linkLineWidth : STROKE_WIDTH;
20
+ if (beginNode.origin.isRoot) {
21
+ if (layout === MindmapLayoutType.leftBottomIndented || layout === MindmapLayoutType.rightBottomIndented) {
22
+ beginY += strokeWidth;
23
+ }
24
+ if (layout === MindmapLayoutType.leftTopIndented || layout === MindmapLayoutType.rightTopIndented) {
25
+ beginY -= strokeWidth;
26
+ }
27
+ }
28
+ let curve = [
29
+ [beginX, beginY],
30
+ [beginX, beginY],
31
+ [beginX, beginY],
32
+ [beginX, endY - (endNode.hGap * 3 * plusMinus[1]) / 5],
33
+ [beginX, endY - (endNode.hGap * plusMinus[1]) / 5],
34
+ [beginX + (endNode.hGap * plusMinus[0]) / 4, endY],
35
+ [beginX + (endNode.hGap * plusMinus[0] * 3) / 5, endY],
36
+ isUnderlineShap && needDrawUnderline ? [endX + (endNode.width - endNode.hGap * 2) * plusMinus[0], endY] : [endX, endY],
37
+ isUnderlineShap && needDrawUnderline ? [endX + (endNode.width - endNode.hGap * 2) * plusMinus[0], endY] : [endX, endY],
38
+ isUnderlineShap && needDrawUnderline ? [endX + (endNode.width - endNode.hGap * 2) * plusMinus[0], endY] : [endX, endY]
39
+ ];
40
+ const stroke = defaultStroke || getLinkLineColorByMindmapElement(child.origin);
41
+ const points = pointsOnBezierCurves(curve);
42
+ return roughSVG.curve(points, { stroke, strokeWidth });
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZW50ZWQtbGluay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXcvaW5kZW50ZWQtbGluay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlELE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU1QyxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLFFBQWtCLEVBQ2xCLElBQWlCLEVBQ2pCLEtBQWtCLEVBQ2xCLGdCQUErQixJQUFJLEVBQ25DLGlCQUFpQixHQUFHLElBQUk7SUFFeEIsTUFBTSxlQUFlLEdBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBc0IsS0FBSyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7SUFDakgsSUFBSSxNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLEVBQ0osU0FBUyxHQUFHLElBQUksRUFDaEIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVqRCxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsU0FBUyxDQUFDLElB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R0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztRQUN0SCxlQUFlLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQ3RILGVBQWUsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7S0FDekgsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLGFBQWEsSUFBSSxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFL0UsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb2ludHNPbkJlemllckN1cnZlcyB9IGZyb20gJ3BvaW50cy1vbi1jdXJ2ZSc7XG5pbXBvcnQgeyBSb3VnaFNWRyB9IGZyb20gJ3JvdWdoanMvYmluL3N2Zyc7XG5pbXBvcnQgeyBNaW5kbWFwTm9kZVNoYXBlLCBTVFJPS0VfV0lEVEggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWluZG1hcE5vZGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL25vZGUnO1xuaW1wb3J0IHsgZ2V0TGlua0xpbmVDb2xvckJ5TWluZG1hcEVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9jb2xvcnMnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBnZXROb2RlU2hhcGVCeUVsZW1lbnQsIGdldFJlY3RhbmdsZUJ5Tm9kZSwgaXNDaGlsZFVwIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgTWluZG1hcExheW91dFR5cGUgfSBmcm9tICdAcGxhaXQvbGF5b3V0cyc7XG5pbXBvcnQgeyBNaW5kbWFwUXVlcmllcyB9IGZyb20gJy4uL3F1ZXJpZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZHJhd0luZGVudGVkTGluayhcbiAgICByb3VnaFNWRzogUm91Z2hTVkcsXG4gICAgbm9kZTogTWluZG1hcE5vZGUsXG4gICAgY2hpbGQ6IE1pbmRtYXBOb2RlLFxuICAgIGRlZmF1bHRTdHJva2U6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgIG5lZWREcmF3VW5kZXJsaW5lID0gdHJ1ZVxuKSB7XG4gICAgY29uc3QgaXNVbmRlcmxpbmVTaGFwID0gKGdldE5vZGVTaGFwZUJ5RWxlbWVudChjaGlsZC5vcmlnaW4pIGFzIE1pbmRtYXBOb2RlU2hhcGUpID09PSBNaW5kbWFwTm9kZVNoYXBlLnVuZGVybGluZTtcbiAgICBsZXQgYmVnaW5YLFxuICAgICAgICBiZWdpblksXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICAgIGJlZ2luTm9kZSA9IG5vZGUsXG4gICAgICAgIGVuZE5vZGUgPSBjaGlsZDtcbiAgICBjb25zdCBiZWdpblJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5Tm9kZShiZWdpbk5vZGUpO1xuICAgIGNvbnN0IGVuZFJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5Tm9kZShlbmROb2RlKTtcblxuICAgIGJlZ2luWCA9IGJlZ2luTm9kZS54ICsgYmVnaW5Ob2RlLndpZHRoIC8gMjtcbiAgICBiZWdpblkgPSBpc0NoaWxkVXAobm9kZSwgY2hpbGQpID8gYmVnaW5SZWN0YW5nbGUueSA6IGJlZ2luUmVjdGFuZ2xlLnkgKyBiZWdpblJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgZW5kWCA9IG5vZGUubGVmdCA/IGVuZE5vZGUueCArIGVuZE5vZGUuaEdhcCArIGVuZFJlY3RhbmdsZS53aWR0aCA6IGVuZE5vZGUueCArIGVuZE5vZGUuaEdhcDtcbiAgICBlbmRZID0gaXNVbmRlcmxpbmVTaGFwID8gZW5kTm9kZS55ICsgZW5kTm9kZS5oZWlnaHQgLSBlbmROb2RlLnZHYXAgOiBlbmROb2RlLnkgKyBlbmROb2RlLmhlaWdodCAvIDI7XG4gICAgLy/moLnmja7kvY3nva7vvIzorr7nva7mraPotJ/lj4LmlbBcbiAgICBsZXQgcGx1c01pbnVzID0gaXNDaGlsZFVwKG5vZGUsIGNoaWxkKSA/IChub2RlLmxlZnQgPyBbLTEsIC0xXSA6IFsxLCAtMV0pIDogbm9kZS5sZWZ0ID8gWy0xLCAxXSA6IFsxLCAxXTtcbiAgICBjb25zdCBsYXlvdXQgPSBNaW5kbWFwUXVlcmllcy5nZXRDb3JyZWN0TGF5b3V0QnlFbGVtZW50KG5vZGUub3JpZ2luKTtcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IGNoaWxkLm9yaWdpbi5saW5rTGluZVdpZHRoID8gY2hpbGQub3JpZ2luLmxpbmtMaW5lV2lkdGggOiBTVFJPS0VfV0lEVEg7XG4gICAgaWYgKGJlZ2luTm9kZS5vcmlnaW4uaXNSb290KSB7XG4gICAgICAgIGlmIChsYXlvdXQgPT09IE1pbmRtYXBMYXlvdXRUeXBlLmxlZnRCb3R0b21JbmRlbnRlZCB8fCBsYXlvdXQgPT09IE1pbmRtYXBMYXlvdXRUeXBlLnJpZ2h0Qm90dG9tSW5kZW50ZWQpIHtcbiAgICAgICAgICAgIGJlZ2luWSArPSBzdHJva2VXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF5b3V0ID09PSBNaW5kbWFwTGF5b3V0VHlwZS5sZWZ0VG9wSW5kZW50ZWQgfHwgbGF5b3V0ID09PSBNaW5kbWFwTGF5b3V0VHlwZS5yaWdodFRvcEluZGVudGVkKSB7XG4gICAgICAgICAgICBiZWdpblkgLT0gc3Ryb2tlV2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGN1cnZlOiBQb2ludFtdID0gW1xuICAgICAgICBbYmVnaW5YLCBiZWdpblldLFxuICAgICAgICBbYmVnaW5YLCBiZWdpblldLFxuICAgICAgICBbYmVnaW5YLCBiZWdpblldLFxuICAgICAgICBbYmVnaW5YLCBlbmRZIC0gKGVuZE5vZGUuaEdhcCAqIDMgKiBwbHVzTWludXNbMV0pIC8gNV0sXG4gICAgICAgIFtiZWdpblgsIGVuZFkgLSAoZW5kTm9kZS5oR2FwICogcGx1c01pbnVzWzFdKSAvIDVdLFxuICAgICAgICBbYmVnaW5YICsgKGVuZE5vZGUuaEdhcCAqIHBsdXNNaW51c1swXSkgLyA0LCBlbmRZXSxcbiAgICAgICAgW2JlZ2luWCArIChlbmROb2RlLmhHYXAgKiBwbHVzTWludXNbMF0gKiAzKSAvIDUsIGVuZFldLFxuICAgICAgICBpc1VuZGVybGluZVNoYXAgJiYgbmVlZERyYXdVbmRlcmxpbmUgPyBbZW5kWCArIChlbmROb2RlLndpZHRoIC0gZW5kTm9kZS5oR2FwICogMikgKiBwbHVzTWludXNbMF0sIGVuZFldIDogW2VuZFgsIGVuZFldLFxuICAgICAgICBpc1VuZGVybGluZVNoYXAgJiYgbmVlZERyYXdVbmRlcmxpbmUgPyBbZW5kWCArIChlbmROb2RlLndpZHRoIC0gZW5kTm9kZS5oR2FwICogMikgKiBwbHVzTWludXNbMF0sIGVuZFldIDogW2VuZFgsIGVuZFldLFxuICAgICAgICBpc1VuZGVybGluZVNoYXAgJiYgbmVlZERyYXdVbmRlcmxpbmUgPyBbZW5kWCArIChlbmROb2RlLndpZHRoIC0gZW5kTm9kZS5oR2FwICogMikgKiBwbHVzTWludXNbMF0sIGVuZFldIDogW2VuZFgsIGVuZFldXG4gICAgXTtcblxuICAgIGNvbnN0IHN0cm9rZSA9IGRlZmF1bHRTdHJva2UgfHwgZ2V0TGlua0xpbmVDb2xvckJ5TWluZG1hcEVsZW1lbnQoY2hpbGQub3JpZ2luKTtcblxuICAgIGNvbnN0IHBvaW50cyA9IHBvaW50c09uQmV6aWVyQ3VydmVzKGN1cnZlKTtcbiAgICByZXR1cm4gcm91Z2hTVkcuY3VydmUocG9pbnRzIGFzIGFueSwgeyBzdHJva2UsIHN0cm9rZVdpZHRoIH0pO1xufVxuIl19
@@ -0,0 +1,42 @@
1
+ import { PlaitBoard, getRectangleByElements } from '@plait/core';
2
+ import { getRectangleByNode } from '../../utils/graph';
3
+ import { GRAY_COLOR } from '../../constants/default';
4
+ import { HorizontalPlacement, VerticalPlacement } from '../../interfaces/types';
5
+ import { getLayoutDirection, getPointByPlacement, movePoint, transformPlacement } from '../../utils/point-placement';
6
+ export function drawAbstractLink(board, node, isHorizontal) {
7
+ const linkPadding = 15;
8
+ const parent = node.parent;
9
+ const abstractRectangle = getRectangleByNode(node);
10
+ let includedElements = parent.children.slice(node.origin.start, node.origin.end + 1).map(node => {
11
+ return node.origin;
12
+ });
13
+ const includedElementsRectangle = getRectangleByElements(board, includedElements, true);
14
+ const linkDirection = getLayoutDirection(node, isHorizontal);
15
+ const bezierBeginPlacement = [HorizontalPlacement.right, VerticalPlacement.top];
16
+ const bezierEndPlacement = [HorizontalPlacement.right, VerticalPlacement.bottom];
17
+ const abstractConnectorPlacement = [HorizontalPlacement.left, VerticalPlacement.middle];
18
+ transformPlacement(bezierBeginPlacement, linkDirection);
19
+ transformPlacement(bezierEndPlacement, linkDirection);
20
+ transformPlacement(abstractConnectorPlacement, linkDirection);
21
+ let bezierBeginPoint = getPointByPlacement(includedElementsRectangle, bezierBeginPlacement);
22
+ let bezierEndPoint = getPointByPlacement(includedElementsRectangle, bezierEndPlacement);
23
+ let abstractConnectorPoint = getPointByPlacement(abstractRectangle, abstractConnectorPlacement);
24
+ let curveDistance = 0;
25
+ if (isHorizontal) {
26
+ curveDistance = Math.abs(abstractConnectorPoint[0] - bezierBeginPoint[0]) - linkPadding * 2;
27
+ }
28
+ else {
29
+ curveDistance = Math.abs(abstractConnectorPoint[1] - bezierBeginPoint[1]) - linkPadding * 2;
30
+ }
31
+ bezierBeginPoint = movePoint(bezierBeginPoint, linkPadding, linkDirection);
32
+ let c1 = movePoint(bezierBeginPoint, curveDistance, linkDirection);
33
+ bezierEndPoint = movePoint(bezierEndPoint, linkPadding, linkDirection);
34
+ let c2 = movePoint(bezierEndPoint, curveDistance, linkDirection);
35
+ let bezierConnectorPoint = movePoint(abstractConnectorPoint, -linkPadding, linkDirection);
36
+ const link = PlaitBoard.getRoughSVG(board).path(`M${bezierBeginPoint[0]},${bezierBeginPoint[1]} Q${c1[0]},${c1[1]} ${bezierConnectorPoint[0]},${bezierConnectorPoint[1]} Q${c2[0]},${c2[1]} ${bezierEndPoint[0]},${bezierEndPoint[1]} M${abstractConnectorPoint[0]},${abstractConnectorPoint[1]} L${bezierConnectorPoint[0]},${bezierConnectorPoint[1]}`, {
37
+ stroke: GRAY_COLOR,
38
+ strokeWidth: 2
39
+ });
40
+ return link;
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbGluay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXcvbGluay9hYnN0cmFjdC1saW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBa0IsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFckgsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWlCLEVBQUUsSUFBaUIsRUFBRSxZQUFxQjtJQUN4RixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUMzQixNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzdGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0seUJBQXlCLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXhGLE1BQU0sYUFBYSxH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cmQsIGdldFJlY3RhbmdsZUJ5RWxlbWVudHMgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kbWFwTm9kZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi8uLi91dGlscy9ncmFwaCc7XG5pbXBvcnQgeyBHUkFZX0NPTE9SIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RlZmF1bHQnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbFBsYWNlbWVudCwgUG9pbnRQbGFjZW1lbnQsIFZlcnRpY2FsUGxhY2VtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90eXBlcyc7XG5pbXBvcnQgeyBnZXRMYXlvdXREaXJlY3Rpb24sIGdldFBvaW50QnlQbGFjZW1lbnQsIG1vdmVQb2ludCwgdHJhbnNmb3JtUGxhY2VtZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9pbnQtcGxhY2VtZW50JztcblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdBYnN0cmFjdExpbmsoYm9hcmQ6IFBsYWl0Qm9hcmQsIG5vZGU6IE1pbmRtYXBOb2RlLCBpc0hvcml6b250YWw6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBsaW5rUGFkZGluZyA9IDE1O1xuICAgIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuICAgIGNvbnN0IGFic3RyYWN0UmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKG5vZGUpO1xuICAgIGxldCBpbmNsdWRlZEVsZW1lbnRzID0gcGFyZW50LmNoaWxkcmVuLnNsaWNlKG5vZGUub3JpZ2luLnN0YXJ0LCBub2RlLm9yaWdpbi5lbmQhICsgMSkubWFwKG5vZGUgPT4ge1xuICAgICAgICByZXR1cm4gbm9kZS5vcmlnaW47XG4gICAgfSk7XG4gICAgY29uc3QgaW5jbHVkZWRFbGVtZW50c1JlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5RWxlbWVudHMoYm9hcmQsIGluY2x1ZGVkRWxlbWVudHMsIHRydWUpO1xuXG4gICAgY29uc3QgbGlua0RpcmVjdGlvbiA9IGdldExheW91dERpcmVjdGlvbihub2RlLCBpc0hvcml6b250YWwpO1xuICAgIGNvbnN0IGJlemllckJlZ2luUGxhY2VtZW50ID0gW0hvcml6b250YWxQbGFjZW1lbnQucmlnaHQsIFZlcnRpY2FsUGxhY2VtZW50LnRvcF0gYXMgUG9pbnRQbGFjZW1lbnQ7XG4gICAgY29uc3QgYmV6aWVyRW5kUGxhY2VtZW50ID0gW0hvcml6b250YWxQbGFjZW1lbnQucmlnaHQsIFZlcnRpY2FsUGxhY2VtZW50LmJvdHRvbV0gYXMgUG9pbnRQbGFjZW1lbnQ7XG4gICAgY29uc3QgYWJzdHJhY3RDb25uZWN0b3JQbGFjZW1lbnQgPSBbSG9yaXpvbnRhbFBsYWNlbWVudC5sZWZ0LCBWZXJ0aWNhbFBsYWNlbWVudC5taWRkbGVdIGFzIFBvaW50UGxhY2VtZW50O1xuXG4gICAgdHJhbnNmb3JtUGxhY2VtZW50KGJlemllckJlZ2luUGxhY2VtZW50LCBsaW5rRGlyZWN0aW9uKTtcbiAgICB0cmFuc2Zvcm1QbGFjZW1lbnQoYmV6aWVyRW5kUGxhY2VtZW50LCBsaW5rRGlyZWN0aW9uKTtcbiAgICB0cmFuc2Zvcm1QbGFjZW1lbnQoYWJzdHJhY3RDb25uZWN0b3JQbGFjZW1lbnQsIGxpbmtEaXJlY3Rpb24pO1xuXG4gICAgbGV0IGJlemllckJlZ2luUG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KGluY2x1ZGVkRWxlbWVudHNSZWN0YW5nbGUsIGJlemllckJlZ2luUGxhY2VtZW50KTtcbiAgICBsZXQgYmV6aWVyRW5kUG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KGluY2x1ZGVkRWxlbWVudHNSZWN0YW5nbGUsIGJlemllckVuZFBsYWNlbWVudCk7XG4gICAgbGV0IGFic3RyYWN0Q29ubmVjdG9yUG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KGFic3RyYWN0UmVjdGFuZ2xlLCBhYnN0cmFjdENvbm5lY3RvclBsYWNlbWVudCk7XG5cbiAgICBsZXQgY3VydmVEaXN0YW5jZSA9IDA7XG4gICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICBjdXJ2ZURpc3RhbmNlID0gTWF0aC5hYnMoYWJzdHJhY3RDb25uZWN0b3JQb2ludFswXSAtIGJlemllckJlZ2luUG9pbnRbMF0pIC0gbGlua1BhZGRpbmcgKiAyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnZlRGlzdGFuY2UgPSBNYXRoLmFicyhhYnN0cmFjdENvbm5lY3RvclBvaW50WzFdIC0gYmV6aWVyQmVnaW5Qb2ludFsxXSkgLSBsaW5rUGFkZGluZyAqIDI7XG4gICAgfVxuXG4gICAgYmV6aWVyQmVnaW5Qb2ludCA9IG1vdmVQb2ludChiZXppZXJCZWdpblBvaW50LCBsaW5rUGFkZGluZywgbGlua0RpcmVjdGlvbik7XG4gICAgbGV0IGMxID0gbW92ZVBvaW50KGJlemllckJlZ2luUG9pbnQsIGN1cnZlRGlzdGFuY2UsIGxpbmtEaXJlY3Rpb24pO1xuICAgIGJlemllckVuZFBvaW50ID0gbW92ZVBvaW50KGJlemllckVuZFBvaW50LCBsaW5rUGFkZGluZywgbGlua0RpcmVjdGlvbik7XG4gICAgbGV0IGMyID0gbW92ZVBvaW50KGJlemllckVuZFBvaW50LCBjdXJ2ZURpc3RhbmNlLCBsaW5rRGlyZWN0aW9uKTtcbiAgICBsZXQgYmV6aWVyQ29ubmVjdG9yUG9pbnQgPSBtb3ZlUG9pbnQoYWJzdHJhY3RDb25uZWN0b3JQb2ludCwgLWxpbmtQYWRkaW5nLCBsaW5rRGlyZWN0aW9uKTtcblxuICAgIGNvbnN0IGxpbmsgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5wYXRoKFxuICAgICAgICBgTSR7YmV6aWVyQmVnaW5Qb2ludFswXX0sJHtiZXppZXJCZWdpblBvaW50WzFdfSBRJHtjMVswXX0sJHtjMVsxXX0gJHtiZXppZXJDb25uZWN0b3JQb2ludFswXX0sJHtiZXppZXJDb25uZWN0b3JQb2ludFsxXX0gUSR7YzJbMF19LCR7YzJbMV19ICR7YmV6aWVyRW5kUG9pbnRbMF19LCR7YmV6aWVyRW5kUG9pbnRbMV19IE0ke2Fic3RyYWN0Q29ubmVjdG9yUG9pbnRbMF19LCR7YWJzdHJhY3RDb25uZWN0b3JQb2ludFsxXX0gTCR7YmV6aWVyQ29ubmVjdG9yUG9pbnRbMF19LCR7YmV6aWVyQ29ubmVjdG9yUG9pbnRbMV19YCxcbiAgICAgICAge1xuICAgICAgICAgICAgc3Ryb2tlOiBHUkFZX0NPTE9SLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDJcbiAgICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIGxpbms7XG59XG4iXX0=
@@ -0,0 +1,51 @@
1
+ import { pointsOnBezierCurves } from 'points-on-curve';
2
+ import { MindmapNodeShape, STROKE_WIDTH } from '../../constants';
3
+ import { getLinkLineColorByMindmapElement } from '../../utils/colors';
4
+ import { getRectangleByNode } from '../../utils';
5
+ import { getLayoutDirection, getPointByPlacement, movePoint, transformPlacement } from '../../utils/point-placement';
6
+ import { HorizontalPlacement, VerticalPlacement } from '../../interfaces/types';
7
+ export function drawLogicLink(roughSVG, node, parent, isHorizontal) {
8
+ const stroke = getLinkLineColorByMindmapElement(node.origin);
9
+ const strokeWidth = node.origin.linkLineWidth ? node.origin.linkLineWidth : STROKE_WIDTH;
10
+ const hasStraightLine = !parent.origin.isRoot;
11
+ const hasUnderlineShape = node.origin.shape === MindmapNodeShape.underline;
12
+ const hasUnderlineShapeOfParent = parent.origin.shape === MindmapNodeShape.underline;
13
+ const nodeClient = getRectangleByNode(node);
14
+ const parentClient = getRectangleByNode(parent);
15
+ const linkDirection = getLayoutDirection(node, isHorizontal);
16
+ // ① ensure begin placement and end placement
17
+ // begin placement represent parent connector position and end placement represent child connector
18
+ const beginPlacement = [HorizontalPlacement.right, VerticalPlacement.middle];
19
+ const endPlacement = [HorizontalPlacement.left, VerticalPlacement.middle];
20
+ transformPlacement(beginPlacement, linkDirection);
21
+ transformPlacement(endPlacement, linkDirection);
22
+ // underline shape and horizontal
23
+ if (isHorizontal && hasUnderlineShapeOfParent && !parent.origin.isRoot) {
24
+ beginPlacement[1] = VerticalPlacement.bottom;
25
+ }
26
+ if (isHorizontal && hasUnderlineShape) {
27
+ endPlacement[1] = VerticalPlacement.bottom;
28
+ }
29
+ let beginPoint = getPointByPlacement(parentClient, beginPlacement);
30
+ let endPoint = getPointByPlacement(nodeClient, endPlacement);
31
+ // ② 确定凸出直线,从起始点开始画一条直线,从直线的结束位置绘制曲线,保证收起图标可以完美覆盖起始连线,根节点不需要这条直线
32
+ // 绘制贝塞尔曲线要求,需要增加三个点,正常两个点就可以确定这条直线
33
+ const straightLineDistance = 8;
34
+ const beginPoint2 = hasStraightLine ? movePoint(beginPoint, straightLineDistance, linkDirection) : beginPoint;
35
+ let straightLine = hasStraightLine ? [beginPoint, beginPoint2, beginPoint2] : [];
36
+ // ③ 确定曲线
37
+ const beginBufferDistance = (parent.hGap + node.hGap) / 3;
38
+ const endBufferDistance = -(parent.hGap + node.hGap) / 2.4;
39
+ let curve = [
40
+ beginPoint2,
41
+ movePoint(beginPoint2, beginBufferDistance, linkDirection),
42
+ movePoint(endPoint, endBufferDistance, linkDirection),
43
+ endPoint
44
+ ];
45
+ // ④ 下划线绘制,underline shape and horizontal
46
+ const underlineEnd = movePoint(endPoint, nodeClient.width, linkDirection);
47
+ const underline = hasUnderlineShape && isHorizontal ? [underlineEnd, underlineEnd, underlineEnd] : [];
48
+ const points = pointsOnBezierCurves([...straightLine, ...curve, ...underline]);
49
+ return roughSVG.curve(points, { stroke, strokeWidth });
50
+ }
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWMtbGluay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXcvbGluay9sb2dpYy1saW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JILE9BQU8sRUFBRSxtQkFBbUIsRUFBa0IsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRyxNQUFNLFVBQVUsYUFBYSxDQUFDLFFBQWtCLEVBQUUsSUFBaUIsRUFBRSxNQUFtQixFQUFFLFlBQXFCO0lBQzNHLE1BQU0sTUFBTSxHQUFHLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUN6RixNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLENBQUMsU0FBUyxDQUFDO0lBQzNFLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLENBQUMs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cyB9IGZyb20gJ3BvaW50cy1vbi1jdXJ2ZSc7XG5pbXBvcnQgeyBSb3VnaFNWRyB9IGZyb20gJ3JvdWdoanMvYmluL3N2Zyc7XG5pbXBvcnQgeyBNaW5kbWFwTm9kZVNoYXBlLCBTVFJPS0VfV0lEVEggfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWluZG1hcE5vZGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL25vZGUnO1xuaW1wb3J0IHsgZ2V0TGlua0xpbmVDb2xvckJ5TWluZG1hcEVsZW1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9jb2xvcnMnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBnZXRMYXlvdXREaXJlY3Rpb24sIGdldFBvaW50QnlQbGFjZW1lbnQsIG1vdmVQb2ludCwgdHJhbnNmb3JtUGxhY2VtZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9pbnQtcGxhY2VtZW50JztcbmltcG9ydCB7IEhvcml6b250YWxQbGFjZW1lbnQsIFBvaW50UGxhY2VtZW50LCBWZXJ0aWNhbFBsYWNlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZHJhd0xvZ2ljTGluayhyb3VnaFNWRzogUm91Z2hTVkcsIG5vZGU6IE1pbmRtYXBOb2RlLCBwYXJlbnQ6IE1pbmRtYXBOb2RlLCBpc0hvcml6b250YWw6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdHJva2UgPSBnZXRMaW5rTGluZUNvbG9yQnlNaW5kbWFwRWxlbWVudChub2RlLm9yaWdpbik7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBub2RlLm9yaWdpbi5saW5rTGluZVdpZHRoID8gbm9kZS5vcmlnaW4ubGlua0xpbmVXaWR0aCA6IFNUUk9LRV9XSURUSDtcbiAgICBjb25zdCBoYXNTdHJhaWdodExpbmUgPSAhcGFyZW50Lm9yaWdpbi5pc1Jvb3Q7XG4gICAgY29uc3QgaGFzVW5kZXJsaW5lU2hhcGUgPSBub2RlLm9yaWdpbi5zaGFwZSA9PT0gTWluZG1hcE5vZGVTaGFwZS51bmRlcmxpbmU7XG4gICAgY29uc3QgaGFzVW5kZXJsaW5lU2hhcGVPZlBhcmVudCA9IHBhcmVudC5vcmlnaW4uc2hhcGUgPT09IE1pbmRtYXBOb2RlU2hhcGUudW5kZXJsaW5lO1xuICAgIGNvbnN0IG5vZGVDbGllbnQgPSBnZXRSZWN0YW5nbGVCeU5vZGUobm9kZSk7XG4gICAgY29uc3QgcGFyZW50Q2xpZW50ID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKHBhcmVudCk7XG4gICAgY29uc3QgbGlua0RpcmVjdGlvbiA9IGdldExheW91dERpcmVjdGlvbihub2RlLCBpc0hvcml6b250YWwpO1xuXG4gICAgLy8g4pGgIGVuc3VyZSBiZWdpbiBwbGFjZW1lbnQgYW5kIGVuZCBwbGFjZW1lbnRcbiAgICAvLyBiZWdpbiBwbGFjZW1lbnQgcmVwcmVzZW50IHBhcmVudCBjb25uZWN0b3IgcG9zaXRpb24gYW5kIGVuZCBwbGFjZW1lbnQgcmVwcmVzZW50IGNoaWxkIGNvbm5lY3RvclxuICAgIGNvbnN0IGJlZ2luUGxhY2VtZW50OiBQb2ludFBsYWNlbWVudCA9IFtIb3Jpem9udGFsUGxhY2VtZW50LnJpZ2h0LCBWZXJ0aWNhbFBsYWNlbWVudC5taWRkbGVdO1xuICAgIGNvbnN0IGVuZFBsYWNlbWVudDogUG9pbnRQbGFjZW1lbnQgPSBbSG9yaXpvbnRhbFBsYWNlbWVudC5sZWZ0LCBWZXJ0aWNhbFBsYWNlbWVudC5taWRkbGVdO1xuXG4gICAgdHJhbnNmb3JtUGxhY2VtZW50KGJlZ2luUGxhY2VtZW50LCBsaW5rRGlyZWN0aW9uKTtcbiAgICB0cmFuc2Zvcm1QbGFjZW1lbnQoZW5kUGxhY2VtZW50LCBsaW5rRGlyZWN0aW9uKTtcblxuICAgIC8vIHVuZGVybGluZSBzaGFwZSBhbmQgaG9yaXpvbnRhbFxuICAgIGlmIChpc0hvcml6b250YWwgJiYgaGFzVW5kZXJsaW5lU2hhcGVPZlBhcmVudCAmJiAhcGFyZW50Lm9yaWdpbi5pc1Jvb3QpIHtcbiAgICAgICAgYmVnaW5QbGFjZW1lbnRbMV0gPSBWZXJ0aWNhbFBsYWNlbWVudC5ib3R0b207XG4gICAgfVxuICAgIGlmIChpc0hvcml6b250YWwgJiYgaGFzVW5kZXJsaW5lU2hhcGUpIHtcbiAgICAgICAgZW5kUGxhY2VtZW50WzFdID0gVmVydGljYWxQbGFjZW1lbnQuYm90dG9tO1xuICAgIH1cblxuICAgIGxldCBiZWdpblBvaW50ID0gZ2V0UG9pbnRCeVBsYWNlbWVudChwYXJlbnRDbGllbnQsIGJlZ2luUGxhY2VtZW50KTtcbiAgICBsZXQgZW5kUG9pbnQgPSBnZXRQb2ludEJ5UGxhY2VtZW50KG5vZGVDbGllbnQsIGVuZFBsYWNlbWVudCk7XG5cbiAgICAvLyDikaEg56Gu5a6a5Ye45Ye655u057q/77yM5LuO6LW35aeL54K55byA5aeL55S75LiA5p2h55u057q/77yM5LuO55u057q/55qE57uT5p2f5L2N572u57uY5Yi25puy57q/77yM5L+d6K+B5pS26LW35Zu+5qCH5Y+v5Lul5a6M576O6KaG55uW6LW35aeL6L+e57q/77yM5qC56IqC54K55LiN6ZyA6KaB6L+Z5p2h55u057q/XG4gICAgLy8g57uY5Yi26LSd5aGe5bCU5puy57q/6KaB5rGC77yM6ZyA6KaB5aKe5Yqg5LiJ5Liq54K577yM5q2j5bi45Lik5Liq54K55bCx5Y+v5Lul56Gu5a6a6L+Z5p2h55u057q/XG4gICAgY29uc3Qgc3RyYWlnaHRMaW5lRGlzdGFuY2UgPSA4O1xuICAgIGNvbnN0IGJlZ2luUG9pbnQyID0gaGFzU3RyYWlnaHRMaW5lID8gbW92ZVBvaW50KGJlZ2luUG9pbnQsIHN0cmFpZ2h0TGluZURpc3RhbmNlLCBsaW5rRGlyZWN0aW9uKSA6IGJlZ2luUG9pbnQ7XG4gICAgbGV0IHN0cmFpZ2h0TGluZTogUG9pbnRbXSA9IGhhc1N0cmFpZ2h0TGluZSA/IFtiZWdpblBvaW50LCBiZWdpblBvaW50MiwgYmVnaW5Qb2ludDJdIDogW107XG5cbiAgICAvLyDikaIg56Gu5a6a5puy57q/XG4gICAgY29uc3QgYmVnaW5CdWZmZXJEaXN0YW5jZSA9IChwYXJlbnQuaEdhcCArIG5vZGUuaEdhcCkgLyAzO1xuICAgIGNvbnN0IGVuZEJ1ZmZlckRpc3RhbmNlID0gLShwYXJlbnQuaEdhcCArIG5vZGUuaEdhcCkgLyAyLjQ7XG4gICAgbGV0IGN1cnZlOiBQb2ludFtdID0gW1xuICAgICAgICBiZWdpblBvaW50MixcbiAgICAgICAgbW92ZVBvaW50KGJlZ2luUG9pbnQyLCBiZWdpbkJ1ZmZlckRpc3RhbmNlLCBsaW5rRGlyZWN0aW9uKSxcbiAgICAgICAgbW92ZVBvaW50KGVuZFBvaW50LCBlbmRCdWZmZXJEaXN0YW5jZSwgbGlua0RpcmVjdGlvbiksXG4gICAgICAgIGVuZFBvaW50XG4gICAgXTtcblxuICAgIC8vIOKRoyDkuIvliJLnur/nu5jliLbvvIx1bmRlcmxpbmUgc2hhcGUgYW5kIGhvcml6b250YWxcbiAgICBjb25zdCB1bmRlcmxpbmVFbmQgPSBtb3ZlUG9pbnQoZW5kUG9pbnQsIG5vZGVDbGllbnQud2lkdGgsIGxpbmtEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHVuZGVybGluZTogUG9pbnRbXSA9IGhhc1VuZGVybGluZVNoYXBlICYmIGlzSG9yaXpvbnRhbCA/IFt1bmRlcmxpbmVFbmQsIHVuZGVybGluZUVuZCwgdW5kZXJsaW5lRW5kXSA6IFtdO1xuXG4gICAgY29uc3QgcG9pbnRzID0gcG9pbnRzT25CZXppZXJDdXJ2ZXMoWy4uLnN0cmFpZ2h0TGluZSwgLi4uY3VydmUsIC4uLnVuZGVybGluZV0pO1xuICAgIHJldHVybiByb3VnaFNWRy5jdXJ2ZShwb2ludHMgYXMgYW55LCB7IHN0cm9rZSwgc3Ryb2tlV2lkdGggfSk7XG59XG4iXX0=
@@ -0,0 +1,158 @@
1
+ import { pointsOnBezierCurves } from 'points-on-curve';
2
+ import { MindmapNodeShape, STROKE_WIDTH } from '../constants';
3
+ import { getLinkLineColorByMindmapElement } from '../utils/colors';
4
+ import { getNodeShapeByElement, isChildRight } from '../utils';
5
+ import { MindmapLayoutType, isTopLayout, isIndentedLayout, isStandardLayout } from '@plait/layouts';
6
+ import { MindmapQueries } from '../queries';
7
+ export function drawLink(roughSVG, node, child, defaultStroke = null, isHorizontal = true, needDrawUnderline = true) {
8
+ let beginX, beginY, endX, endY, beginNode = node, endNode = child;
9
+ const layout = MindmapQueries.getCorrectLayoutByElement(node.origin);
10
+ if (isHorizontal) {
11
+ if (!isChildRight(node, child)) {
12
+ beginNode = child;
13
+ endNode = node;
14
+ }
15
+ beginX = beginNode.x + beginNode.width - beginNode.hGap;
16
+ beginY = beginNode.y + beginNode.height / 2;
17
+ endX = endNode.x + endNode.hGap;
18
+ endY = endNode.y + endNode.height / 2;
19
+ if (node.parent &&
20
+ isIndentedLayout(MindmapQueries.getLayoutByElement(node.parent?.origin)) &&
21
+ getNodeShapeByElement(node.origin) === MindmapNodeShape.underline) {
22
+ if (isChildRight(node, child)) {
23
+ beginY = node.y + node.height - node.vGap;
24
+ }
25
+ else {
26
+ endY = node.y + node.height - node.vGap;
27
+ }
28
+ }
29
+ }
30
+ else {
31
+ if (node.y > child.y) {
32
+ beginNode = child;
33
+ endNode = node;
34
+ }
35
+ beginX = beginNode.x + beginNode.width / 2;
36
+ beginY = beginNode.y + beginNode.height - beginNode.vGap;
37
+ endX = endNode.x + endNode.width / 2;
38
+ endY = endNode.y + endNode.vGap;
39
+ }
40
+ const stroke = defaultStroke || getLinkLineColorByMindmapElement(child.origin);
41
+ const strokeWidth = child.origin.linkLineWidth ? child.origin.linkLineWidth : STROKE_WIDTH;
42
+ if (endNode.origin.isRoot) {
43
+ if (layout === MindmapLayoutType.left || isStandardLayout(layout)) {
44
+ endX -= strokeWidth;
45
+ }
46
+ if (layout === MindmapLayoutType.upward) {
47
+ endY -= strokeWidth;
48
+ }
49
+ }
50
+ if (beginNode.origin.isRoot) {
51
+ if (layout === MindmapLayoutType.right || isStandardLayout(layout)) {
52
+ beginX += strokeWidth;
53
+ }
54
+ if (layout === MindmapLayoutType.downward) {
55
+ beginY += strokeWidth;
56
+ }
57
+ }
58
+ if (isHorizontal) {
59
+ let curve = [
60
+ [beginX, beginY],
61
+ [beginX + (beginNode.hGap + endNode.hGap) / 3, beginY],
62
+ [endX - (beginNode.hGap + endNode.hGap) / 2, endY],
63
+ [endX, endY]
64
+ ];
65
+ const shape = getNodeShapeByElement(child.origin);
66
+ if (!node.origin.isRoot) {
67
+ if (node.x > child.x) {
68
+ curve = [
69
+ [beginX, beginY],
70
+ [beginX + (beginNode.hGap + endNode.hGap) / 3, beginY],
71
+ [endX - (beginNode.hGap + endNode.hGap) / 2, endY],
72
+ [endX - 12, endY]
73
+ ];
74
+ const line = [
75
+ [endX - 12, endY],
76
+ [endX - 12, endY],
77
+ [endX, endY]
78
+ ];
79
+ curve = [...curve, ...line];
80
+ }
81
+ else {
82
+ curve = [
83
+ [beginX + 12, beginY],
84
+ [beginX + (beginNode.hGap + endNode.hGap) / 2, beginY],
85
+ [endX - (beginNode.hGap + endNode.hGap) / 3, endY],
86
+ [endX, endY]
87
+ ];
88
+ const line = [
89
+ [beginX, beginY],
90
+ [beginX + 12, beginY],
91
+ [beginX + 12, beginY]
92
+ ];
93
+ curve = [...line, ...curve];
94
+ }
95
+ }
96
+ if (needDrawUnderline && shape === MindmapNodeShape.underline) {
97
+ if (child.left) {
98
+ const underline = [
99
+ [beginX - (beginNode.width - beginNode.hGap * 2), beginY],
100
+ [beginX - (beginNode.width - beginNode.hGap * 2), beginY],
101
+ [beginX - (beginNode.width - beginNode.hGap * 2), beginY]
102
+ ];
103
+ curve = [...underline, ...curve];
104
+ }
105
+ else {
106
+ const underline = [
107
+ [endX + (endNode.width - endNode.hGap * 2), endY],
108
+ [endX + (endNode.width - endNode.hGap * 2), endY],
109
+ [endX + (endNode.width - endNode.hGap * 2), endY]
110
+ ];
111
+ curve = [...curve, ...underline];
112
+ }
113
+ }
114
+ const points = pointsOnBezierCurves(curve);
115
+ return roughSVG.curve(points, { stroke, strokeWidth });
116
+ }
117
+ else {
118
+ let curve = [
119
+ [beginX, beginY],
120
+ [beginX, beginY + (beginNode.vGap + endNode.vGap) / 2],
121
+ [endX, endY - (beginNode.vGap + endNode.vGap) / 2],
122
+ [endX, endY]
123
+ ];
124
+ if (!node.origin.isRoot) {
125
+ if (isTopLayout(layout)) {
126
+ curve = [
127
+ [beginX, beginY],
128
+ [beginX, beginY + (beginNode.vGap + endNode.vGap) / 2],
129
+ [endX, endY - (beginNode.vGap + endNode.vGap) / 2],
130
+ [endX, endY - 12]
131
+ ];
132
+ const line = [
133
+ [endX, endY - 12],
134
+ [endX, endY - 12],
135
+ [endX, endY]
136
+ ];
137
+ curve = [...curve, ...line];
138
+ }
139
+ else {
140
+ curve = [
141
+ [beginX, beginY + 12],
142
+ [beginX, beginY + (beginNode.vGap + endNode.vGap) / 2],
143
+ [endX, endY - (beginNode.vGap + endNode.vGap) / 2],
144
+ [endX, endY]
145
+ ];
146
+ const line = [
147
+ [beginX, beginY],
148
+ [beginX, beginY + 12],
149
+ [beginX, beginY + 12]
150
+ ];
151
+ curve = [...line, ...curve];
152
+ }
153
+ }
154
+ const points = pointsOnBezierCurves(curve);
155
+ return roughSVG.curve(points, { stroke, strokeWidth });
156
+ }
157
+ }
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXcvbGluay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RCxPQUFPLEVBQWMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxxQkFBcUIsRUFBc0IsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTVDLE1BQU0sVUFBVSxRQUFRLENBQ3BCLFFBQWtCLEVBQ2xCLElBQWlCLEVBQ2pCLEtBQWtCLEVBQ2xCLGdCQUErQixJQUFJLEVBQ25DLFlBQVksR0FBRyxJQUFJLEVBQ25CLGlCQUFpQixHQUFHLElBQUk7SUFFeEIsSUFBSSxNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLEVBQ0osU0FBUyxHQUFHLElBQUksRUFDaEIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBc0IsQ0FBQztJQUMxRixJQUFJLFlBQVksRUFBRTtRQUNkLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzVCLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDbEIsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUNELE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFL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RyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7S0FDakU7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcG9pbnRzT25CZXppZXJDdXJ2ZXMgfSBmcm9tICdwb2ludHMtb24tY3VydmUnO1xuaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tICdyb3VnaGpzL2Jpbi9zdmcnO1xuaW1wb3J0IHsgR1JBWV9DT0xPUiwgTWluZG1hcE5vZGVTaGFwZSwgU1RST0tFX1dJRFRIIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE1pbmRtYXBOb2RlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ub2RlJztcbmltcG9ydCB7IGdldExpbmtMaW5lQ29sb3JCeU1pbmRtYXBFbGVtZW50IH0gZnJvbSAnLi4vdXRpbHMvY29sb3JzJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFBvaW50LCBjcmVhdGVHLCBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgZ2V0Tm9kZVNoYXBlQnlFbGVtZW50LCBnZXRSZWN0YW5nbGVCeU5vZGUsIGlzQ2hpbGRSaWdodCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IE1pbmRtYXBMYXlvdXRUeXBlLCBpc1RvcExheW91dCwgaXNJbmRlbnRlZExheW91dCwgaXNTdGFuZGFyZExheW91dCB9IGZyb20gJ0BwbGFpdC9sYXlvdXRzJztcbmltcG9ydCB7IE1pbmRtYXBRdWVyaWVzIH0gZnJvbSAnLi4vcXVlcmllcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3TGluayhcbiAgICByb3VnaFNWRzogUm91Z2hTVkcsXG4gICAgbm9kZTogTWluZG1hcE5vZGUsXG4gICAgY2hpbGQ6IE1pbmRtYXBOb2RlLFxuICAgIGRlZmF1bHRTdHJva2U6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgIGlzSG9yaXpvbnRhbCA9IHRydWUsXG4gICAgbmVlZERyYXdVbmRlcmxpbmUgPSB0cnVlXG4pIHtcbiAgICBsZXQgYmVnaW5YLFxuICAgICAgICBiZWdpblksXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICAgIGJlZ2luTm9kZSA9IG5vZGUsXG4gICAgICAgIGVuZE5vZGUgPSBjaGlsZDtcbiAgICBjb25zdCBsYXlvdXQgPSBNaW5kbWFwUXVlcmllcy5nZXRDb3JyZWN0TGF5b3V0QnlFbGVtZW50KG5vZGUub3JpZ2luKSBhcyBNaW5kbWFwTGF5b3V0VHlwZTtcbiAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIGlmICghaXNDaGlsZFJpZ2h0KG5vZGUsIGNoaWxkKSkge1xuICAgICAgICAgICAgYmVnaW5Ob2RlID0gY2hpbGQ7XG4gICAgICAgICAgICBlbmROb2RlID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBiZWdpblggPSBiZWdpbk5vZGUueCArIGJlZ2luTm9kZS53aWR0aCAtIGJlZ2luTm9kZS5oR2FwO1xuICAgICAgICBiZWdpblkgPSBiZWdpbk5vZGUueSArIGJlZ2luTm9kZS5oZWlnaHQgLyAyO1xuICAgICAgICBlbmRYID0gZW5kTm9kZS54ICsgZW5kTm9kZS5oR2FwO1xuICAgICAgICBlbmRZID0gZW5kTm9kZS55ICsgZW5kTm9kZS5oZWlnaHQgLyAyO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vZGUucGFyZW50ICYmXG4gICAgICAgICAgICBpc0luZGVudGVkTGF5b3V0KE1pbmRtYXBRdWVyaWVzLmdldExheW91dEJ5RWxlbWVudChub2RlLnBhcmVudD8ub3JpZ2luKSkgJiZcbiAgICAgICAgICAgIChnZXROb2RlU2hhcGVCeUVsZW1lbnQobm9kZS5vcmlnaW4pIGFzIE1pbmRtYXBOb2RlU2hhcGUpID09PSBNaW5kbWFwTm9kZVNoYXBlLnVuZGVybGluZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpc0NoaWxkUmlnaHQobm9kZSwgY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgYmVnaW5ZID0gbm9kZS55ICsgbm9kZS5oZWlnaHQgLSBub2RlLnZHYXA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVuZFkgPSBub2RlLnkgKyBub2RlLmhlaWdodCAtIG5vZGUudkdhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChub2RlLnkgPiBjaGlsZC55KSB7XG4gICAgICAgICAgICBiZWdpbk5vZGUgPSBjaGlsZDtcbiAgICAgICAgICAgIGVuZE5vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luWCA9IGJlZ2luTm9kZS54ICsgYmVnaW5Ob2RlLndpZHRoIC8gMjtcbiAgICAgICAgYmVnaW5ZID0gYmVnaW5Ob2RlLnkgKyBiZWdpbk5vZGUuaGVpZ2h0IC0gYmVnaW5Ob2RlLnZHYXA7XG4gICAgICAgIGVuZFggPSBlbmROb2RlLnggKyBlbmROb2RlLndpZHRoIC8gMjtcbiAgICAgICAgZW5kWSA9IGVuZE5vZGUueSArIGVuZE5vZGUudkdhcDtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJva2UgPSBkZWZhdWx0U3Ryb2tlIHx8IGdldExpbmtMaW5lQ29sb3JCeU1pbmRtYXBFbGVtZW50KGNoaWxkLm9yaWdpbik7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBjaGlsZC5vcmlnaW4ubGlua0xpbmVXaWR0aCA/IGNoaWxkLm9yaWdpbi5saW5rTGluZVdpZHRoIDogU1RST0tFX1dJRFRIO1xuICAgIGlmIChlbmROb2RlLm9yaWdpbi5pc1Jvb3QpIHtcbiAgICAgICAgaWYgKGxheW91dCA9PT0gTWluZG1hcExheW91dFR5cGUubGVmdCB8fCBpc1N0YW5kYXJkTGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgICAgIGVuZFggLT0gc3Ryb2tlV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxheW91dCA9PT0gTWluZG1hcExheW91dFR5cGUudXB3YXJkKSB7XG4gICAgICAgICAgICBlbmRZIC09IHN0cm9rZVdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiZWdpbk5vZGUub3JpZ2luLmlzUm9vdCkge1xuICAgICAgICBpZiAobGF5b3V0ID09PSBNaW5kbWFwTGF5b3V0VHlwZS5yaWdodCB8fCBpc1N0YW5kYXJkTGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgICAgIGJlZ2luWCArPSBzdHJva2VXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF5b3V0ID09PSBNaW5kbWFwTGF5b3V0VHlwZS5kb3dud2FyZCkge1xuICAgICAgICAgICAgYmVnaW5ZICs9IHN0cm9rZVdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgbGV0IGN1cnZlOiBQb2ludFtdID0gW1xuICAgICAgICAgICAgW2JlZ2luWCwgYmVnaW5ZXSxcbiAgICAgICAgICAgIFtiZWdpblggKyAoYmVnaW5Ob2RlLmhHYXAgKyBlbmROb2RlLmhHYXApIC8gMywgYmVnaW5ZXSxcbiAgICAgICAgICAgIFtlbmRYIC0gKGJlZ2luTm9kZS5oR2FwICsgZW5kTm9kZS5oR2FwKSAvIDIsIGVuZFldLFxuICAgICAgICAgICAgW2VuZFgsIGVuZFldXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IHNoYXBlID0gZ2V0Tm9kZVNoYXBlQnlFbGVtZW50KGNoaWxkLm9yaWdpbikgYXMgTWluZG1hcE5vZGVTaGFwZTtcblxuICAgICAgICBpZiAoIW5vZGUub3JpZ2luLmlzUm9vdCkge1xuICAgICAgICAgICAgaWYgKG5vZGUueCA+IGNoaWxkLngpIHtcbiAgICAgICAgICAgICAgICBjdXJ2ZSA9IFtcbiAgICAgICAgICAgICAgICAgICAgW2JlZ2luWCwgYmVnaW5ZXSxcbiAgICAgICAgICAgICAgICAgICAgW2JlZ2luWCArIChiZWdpbk5vZGUuaEdhcCArIGVuZE5vZGUuaEdhcCkgLyAzLCBiZWdpblldLFxuICAgICAgICAgICAgICAgICAgICBbZW5kWCAtIChiZWdpbk5vZGUuaEdhcCArIGVuZE5vZGUuaEdhcCkgLyAyLCBlbmRZXSxcbiAgICAgICAgICAgICAgICAgICAgW2VuZFggLSAxMiwgZW5kWV1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBbXG4gICAgICAgICAgICAgICAgICAgIFtlbmRYIC0gMTIsIGVuZFldLFxuICAgICAgICAgICAgICAgICAgICBbZW5kWCAtIDEyLCBlbmRZXSxcbiAgICAgICAgICAgICAgICAgICAgW2VuZFgsIGVuZFldXG4gICAgICAgICAgICAgICAgXSBhcyBQb2ludFtdO1xuICAgICAgICAgICAgICAgIGN1cnZlID0gWy4uLmN1cnZlLCAuLi5saW5lXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VydmUgPSBbXG4gICAgICAgICAgICAgICAgICAgIFtiZWdpblggKyAxMiwgYmVnaW5ZXSxcbiAgICAgICAgICAgICAgICAgICAgW2JlZ2luWCArIChiZWdpbk5vZGUuaEdhcCArIGVuZE5vZGUuaEdhcCkgLyAyLCBiZWdpblldLFxuICAgICAgICAgICAgICAgICAgICBbZW5kWCAtIChiZWdpbk5vZGUuaEdhcCArIGVuZE5vZGUuaEdhcCkgLyAzLCBlbmRZXSxcbiAgICAgICAgICAgICAgICAgICAgW2VuZFgsIGVuZFldXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gW1xuICAgICAgICAgICAgICAgICAgICBbYmVnaW5YLCBiZWdpblldLFxuICAgICAgICAgICAgICAgICAgICBbYmVnaW5YICsgMTIsIGJlZ2luWV0sXG4gICAgICAgICAgICAgICAgICAgIFtiZWdpblggKyAxMiwgYmVnaW5ZXVxuICAgICAgICAgICAgICAgIF0gYXMgUG9pbnRbXTtcbiAgICAgICAgICAgICAgICBjdXJ2ZSA9IFsuLi5saW5lLCAuLi5jdXJ2ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmVlZERyYXdVbmRlcmxpbmUgJiYgc2hhcGUgPT09IE1pbmRtYXBOb2RlU2hhcGUudW5kZXJsaW5lKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQubGVmdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuZGVybGluZSA9IFtcbiAgICAgICAgICAgICAgICAgICAgW2JlZ2luWCAtIChiZWdpbk5vZGUud2lkdGggLSBiZWdpbk5vZGUuaEdhcCAqIDIpLCBiZWdpblldLFxuICAgICAgICAgICAgICAgICAgICBbYmVnaW5YIC0gKGJlZ2luTm9kZS53aWR0aCAtIGJlZ2luTm9kZS5oR2FwICogMiksIGJlZ2luWV0sXG4gICAgICAgICAgICAgICAgICAgIFtiZWdpblggLSAoYmVnaW5Ob2RlLndpZHRoIC0gYmVnaW5Ob2RlLmhHYXAgKiAyKSwgYmVnaW5ZXVxuICAgICAgICAgICAgICAgIF0gYXMgUG9pbnRbXTtcbiAgICAgICAgICAgICAgICBjdXJ2ZSA9IFsuLi51bmRlcmxpbmUsIC4uLmN1cnZlXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5kZXJsaW5lID0gW1xuICAgICAgICAgICAgICAgICAgICBbZW5kWCArIChlbmROb2RlLndpZHRoIC0gZW5kTm9kZS5oR2FwICogMiksIGVuZFldLFxuICAgICAgICAgICAgICAgICAgICBbZW5kWCArIChlbmROb2RlLndpZHRoIC0gZW5kTm9kZS5oR2FwICogMiksIGVuZFldLFxuICAgICAgICAgICAgICAgICAgICBbZW5kWCArIChlbmROb2RlLndpZHRoIC0gZW5kTm9kZS5oR2FwICogMiksIGVuZFldXG4gICAgICAgICAgICAgICAgXSBhcyBQb2ludFtdO1xuICAgICAgICAgICAgICAgIGN1cnZlID0gWy4uLmN1cnZlLCAuLi51bmRlcmxpbmVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9pbnRzID0gcG9pbnRzT25CZXppZXJDdXJ2ZXMoY3VydmUpO1xuICAgICAgICByZXR1cm4gcm91Z2hTVkcuY3VydmUocG9pbnRzIGFzIGFueSwgeyBzdHJva2UsIHN0cm9rZVdpZHRoIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjdXJ2ZTogUG9pbnRbXSA9IFtcbiAgICAgICAgICAgIFtiZWdpblgsIGJlZ2luWV0sXG4gICAgICAgICAgICBbYmVnaW5YLCBiZWdpblkgKyAoYmVnaW5Ob2RlLnZHYXAgKyBlbmROb2RlLnZHYXApIC8gMl0sXG4gICAgICAgICAgICBbZW5kWCwgZW5kWSAtIChiZWdpbk5vZGUudkdhcCArIGVuZE5vZGUudkdhcCkgLyAyXSxcbiAgICAgICAgICAgIFtlbmRYLCBlbmRZXVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICghbm9kZS5vcmlnaW4uaXNSb290KSB7XG4gICAgICAgICAgICBpZiAoaXNUb3BMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICAgICAgICAgIGN1cnZlID0gW1xuICAgICAgICAgICAgICAgICAgICBbYmVnaW5YLCBiZWdpblldLFxuICAgICAgICAgICAgICAgICAgICBbYmVnaW5YLCBiZWdpblkgKyAoYmVnaW5Ob2RlLnZHYXAgKyBlbmROb2RlLnZHYXApIC8gMl0sXG4gICAgICAgICAgICAgICAgICAgIFtlbmRYLCBlbmRZIC0gKGJlZ2luTm9kZS52R2FwICsgZW5kTm9kZS52R2FwKSAvIDJdLFxuICAgICAgICAgICAgICAgICAgICBbZW5kWCwgZW5kWSAtIDEyXVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gW1xuICAgICAgICAgICAgICAgICAgICBbZW5kWCwgZW5kWSAtIDEyXSxcbiAgICAgICAgICAgICAgICAgICAgW2VuZFgsIGVuZFkgLSAxMl0sXG4gICAgICAgICAgICAgICAgICAgIFtlbmRYLCBlbmRZXVxuICAgICAgICAgICAgICAgIF0gYXMgUG9pbnRbXTtcbiAgICAgICAgICAgICAgICBjdXJ2ZSA9IFsuLi5jdXJ2ZSwgLi4ubGluZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnZlID0gW1xuICAgICAgICAgICAgICAgICAgICBbYmVnaW5YLCBiZWdpblkgKyAxMl0sXG4gICAgICAgICAgICAgICAgICAgIFtiZWdpblgsIGJlZ2luWSArIChiZWdpbk5vZGUudkdhcCArIGVuZE5vZGUudkdhcCkgLyAyXSxcbiAgICAgICAgICAgICAgICAgICAgW2VuZFgsIGVuZFkgLSAoYmVnaW5Ob2RlLnZHYXAgKyBlbmROb2RlLnZHYXApIC8gMl0sXG4gICAgICAgICAgICAgICAgICAgIFtlbmRYLCBlbmRZXVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IFtcbiAgICAgICAgICAgICAgICAgICAgW2JlZ2luWCwgYmVnaW5ZXSxcbiAgICAgICAgICAgICAgICAgICAgW2JlZ2luWCwgYmVnaW5ZICsgMTJdLFxuICAgICAgICAgICAgICAgICAgICBbYmVnaW5YLCBiZWdpblkgKyAxMl1cbiAgICAgICAgICAgICAgICBdIGFzIFBvaW50W107XG5cbiAgICAgICAgICAgICAgICBjdXJ2ZSA9IFsuLi5saW5lLCAuLi5jdXJ2ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pbnRzID0gcG9pbnRzT25CZXppZXJDdXJ2ZXMoY3VydmUpO1xuICAgICAgICByZXR1cm4gcm91Z2hTVkcuY3VydmUocG9pbnRzIGFzIGFueSwgeyBzdHJva2UsIHN0cm9rZVdpZHRoIH0pO1xuICAgIH1cbn1cbiJdfQ==