@plait/mind 0.20.0 → 0.22.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 (45) hide show
  1. package/base/image-base.component.d.ts +5 -3
  2. package/drawer/node-image.drawer.d.ts +3 -5
  3. package/esm2020/base/image-base.component.mjs +9 -5
  4. package/esm2020/drawer/node-image.drawer.mjs +34 -39
  5. package/esm2020/interfaces/element.mjs +1 -1
  6. package/esm2020/node.component.mjs +8 -9
  7. package/esm2020/plugins/with-abstract-resize.mjs +1 -2
  8. package/esm2020/plugins/with-mind-hotkey.mjs +3 -2
  9. package/esm2020/plugins/with-mind.mjs +5 -4
  10. package/esm2020/plugins/with-node-dnd.mjs +3 -3
  11. package/esm2020/plugins/with-node-hover-detect.mjs +16 -0
  12. package/esm2020/plugins/with-node-image.mjs +60 -0
  13. package/esm2020/plugins/with-node-resize.mjs +122 -0
  14. package/esm2020/transforms/index.mjs +3 -2
  15. package/esm2020/transforms/node.mjs +13 -2
  16. package/esm2020/utils/node/common.mjs +11 -2
  17. package/esm2020/utils/node/image.mjs +23 -0
  18. package/esm2020/utils/node/index.mjs +2 -1
  19. package/esm2020/utils/node-hover/extend.mjs +54 -0
  20. package/esm2020/utils/position/image.mjs +9 -4
  21. package/esm2020/utils/position/topic.mjs +3 -3
  22. package/esm2020/utils/space/node-space.mjs +23 -22
  23. package/fesm2015/plait-mind.mjs +328 -148
  24. package/fesm2015/plait-mind.mjs.map +1 -1
  25. package/fesm2020/plait-mind.mjs +329 -148
  26. package/fesm2020/plait-mind.mjs.map +1 -1
  27. package/interfaces/element.d.ts +1 -0
  28. package/node.component.d.ts +0 -1
  29. package/package.json +1 -1
  30. package/plugins/with-mind-hotkey.d.ts +1 -1
  31. package/plugins/with-node-hover-detect.d.ts +2 -0
  32. package/plugins/with-node-image.d.ts +2 -0
  33. package/plugins/with-node-resize.d.ts +10 -0
  34. package/styles/styles.scss +9 -2
  35. package/transforms/index.d.ts +1 -0
  36. package/transforms/node.d.ts +1 -0
  37. package/utils/node/common.d.ts +2 -0
  38. package/utils/node/image.d.ts +6 -0
  39. package/utils/node/index.d.ts +1 -0
  40. package/utils/node-hover/extend.d.ts +9 -0
  41. package/utils/space/node-space.d.ts +3 -3
  42. package/esm2020/plugins/with-mind-image.mjs +0 -49
  43. package/esm2020/plugins/with-node-hover.mjs +0 -58
  44. package/plugins/with-mind-image.d.ts +0 -2
  45. package/plugins/with-node-hover.d.ts +0 -5
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Directive, Input, Component, ChangeDetectionStrategy, NgModule, NgZone, HostListener } from '@angular/core';
3
3
  import * as i2 from '@plait/core';
4
- import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, RectangleClient, PlaitElement, idCreator, isNullOrUndefined, Transforms, clearSelectedElement, addSelectedElement, PlaitNode, Path, PlaitBoard, depthFirstRecursion, getIsRecursionFunc, drawLinearPath, drawBezierPath, createG, updateForeignObject, drawRoundRectangle, getRectangleByElements, getSelectedElements, NODE_TO_PARENT, distanceBetweenPointAndRectangle, createForeignObject, createText, PlaitPointerType, PlaitPluginElementComponent, NODE_TO_INDEX, PlaitModule, isMainPointer, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint, CLIP_BOARD_FORMAT_KEY, BOARD_TO_HOST, PlaitPluginKey, throttleRAF, BoardTransforms, removeSelectedElement, PlaitHistoryBoard, hotkeys } from '@plait/core';
4
+ import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, RectangleClient, PlaitElement, PlaitPluginKey, idCreator, isNullOrUndefined, Transforms, clearSelectedElement, addSelectedElement, PlaitNode, Path, PlaitBoard, depthFirstRecursion, getIsRecursionFunc, drawLinearPath, drawBezierPath, createG, updateForeignObject, drawRoundRectangle, getRectangleByElements, getSelectedElements, NODE_TO_PARENT, distanceBetweenPointAndRectangle, createForeignObject, createText, PlaitPointerType, PlaitPluginElementComponent, NODE_TO_INDEX, PlaitModule, isMainPointer, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint, CLIP_BOARD_FORMAT_KEY, BOARD_TO_HOST, throttleRAF, BoardTransforms, removeSelectedElement, PlaitHistoryBoard, hotkeys, PRESS_AND_MOVE_BUFFER, MERGING, ResizeCursorClass } from '@plait/core';
5
5
  import { MindLayoutType, isIndentedLayout, AbstractNode, getNonAbstractChildren, isStandardLayout, isLeftLayout, isRightLayout, isVerticalLogicLayout, isHorizontalLogicLayout, isTopLayout, isBottomLayout, isHorizontalLayout, getCorrectStartEnd, getAbstractLayout, ConnectingPosition, GlobalLayout } from '@plait/layouts';
6
6
  import { PlaitMarkEditor, MarkTypes, DEFAULT_FONT_SIZE, TEXT_DEFAULT_HEIGHT, buildText, getTextSize, TextManage, ExitOrigin, TextModule, getTextFromClipboard } from '@plait/text';
7
7
  import { fromEvent, Subject } from 'rxjs';
8
- import { Node, Path as Path$1 } from 'slate';
8
+ import { Node as Node$1, Path as Path$1 } from 'slate';
9
9
  import { isKeyHotkey } from 'is-hotkey';
10
10
  import { pointsOnBezierCurves } from 'points-on-curve';
11
11
  import { take, filter } from 'rxjs/operators';
@@ -190,11 +190,11 @@ const BRANCH_FONT_FAMILY = 'PingFangSC-Medium, "PingFang SC"';
190
190
 
191
191
  const NodeDefaultSpace = {
192
192
  horizontal: {
193
- nodeAndText: BASE * 3,
193
+ nodeAndText: BASE * 2.5,
194
194
  emojiAndText: BASE * 1.5
195
195
  },
196
196
  vertical: {
197
- nodeAndText: BASE * 1.5,
197
+ nodeAndText: BASE,
198
198
  nodeAndImage: BASE,
199
199
  imageAndText: BASE * 1.5
200
200
  }
@@ -211,12 +211,14 @@ const RootDefaultSpace = {
211
211
  const getHorizontalSpaceBetweenNodeAndText = (board, element) => {
212
212
  const isMind = PlaitMind.isMind(element);
213
213
  const nodeAndText = isMind ? RootDefaultSpace.horizontal.nodeAndText : NodeDefaultSpace.horizontal.nodeAndText;
214
- return nodeAndText;
214
+ const strokeWidth = getStrokeWidthByElement(board, element);
215
+ return nodeAndText + strokeWidth / 2;
215
216
  };
216
- const getVerticalSpaceBetweenNodeAndText = (element) => {
217
+ const getVerticalSpaceBetweenNodeAndText = (board, element) => {
217
218
  const isMind = PlaitMind.isMind(element);
219
+ const strokeWidth = getStrokeWidthByElement(board, element);
218
220
  const nodeAndText = isMind ? RootDefaultSpace.vertical.nodeAndText : NodeDefaultSpace.vertical.nodeAndText;
219
- return nodeAndText;
221
+ return nodeAndText + strokeWidth / 2;
220
222
  };
221
223
  const getSpaceEmojiAndText = (element) => {
222
224
  const isMind = PlaitMind.isMind(element);
@@ -236,20 +238,17 @@ const NodeSpace = {
236
238
  return nodeAndText + NodeSpace.getNodeResizableWidth(board, element) + nodeAndText;
237
239
  },
238
240
  getNodeHeight(board, element) {
239
- const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
241
+ const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
240
242
  if (MindElement.hasImage(element)) {
241
- return (NodeDefaultSpace.vertical.nodeAndImage +
242
- element.data.image.height +
243
- NodeDefaultSpace.vertical.imageAndText +
244
- element.height +
245
- nodeAndText);
243
+ return NodeSpace.getTextTopSpace(board, element) + element.height + nodeAndText;
246
244
  }
247
245
  return nodeAndText + element.height + nodeAndText;
248
246
  },
249
247
  getNodeResizableWidth(board, element) {
250
248
  var _a;
249
+ const width = element.manualWidth || element.width;
251
250
  const imageWidth = MindElement.hasImage(element) ? (_a = element.data.image) === null || _a === void 0 ? void 0 : _a.width : 0;
252
- return Math.max(element.width, imageWidth);
251
+ return Math.max(width, imageWidth);
253
252
  },
254
253
  getNodeResizableMinWidth(board, element) {
255
254
  const minTopicWidth = NodeSpace.getNodeTopicMinWidth(board, element);
@@ -276,25 +275,27 @@ const NodeSpace = {
276
275
  return nodeAndText;
277
276
  }
278
277
  },
279
- getTextTopSpace(element) {
280
- const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
278
+ getTextTopSpace(board, element) {
279
+ const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
281
280
  if (MindElement.hasImage(element)) {
282
- return element.data.image.height + NodeDefaultSpace.vertical.nodeAndImage + NodeDefaultSpace.vertical.imageAndText;
281
+ return NodeSpace.getImageTopSpace(board, element) + element.data.image.height + NodeDefaultSpace.vertical.imageAndText;
283
282
  }
284
283
  else {
285
284
  return nodeAndText;
286
285
  }
287
286
  },
288
- getImageTopSpace(element) {
289
- return NodeDefaultSpace.vertical.nodeAndImage;
287
+ getImageTopSpace(board, element) {
288
+ const strokeWidth = getStrokeWidthByElement(board, element);
289
+ return strokeWidth / 2 + NodeDefaultSpace.vertical.nodeAndImage;
290
290
  },
291
291
  getEmojiLeftSpace(board, element) {
292
292
  const options = board.getPluginOptions(WithMindPluginKey);
293
293
  const nodeAndText = getHorizontalSpaceBetweenNodeAndText(board, element);
294
- return nodeAndText - options.emojiPadding;
294
+ const strokeWidth = getStrokeWidthByElement(board, element);
295
+ return strokeWidth / 2 + nodeAndText - options.emojiPadding;
295
296
  },
296
- getEmojiTopSpace(element) {
297
- const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
297
+ getEmojiTopSpace(board, element) {
298
+ const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
298
299
  return nodeAndText;
299
300
  }
300
301
  };
@@ -347,23 +348,28 @@ function getTopicRectangleByNode(board, node) {
347
348
  }
348
349
  function getTopicRectangleByElement(board, nodeRectangle, element) {
349
350
  const x = nodeRectangle.x + NodeSpace.getTextLeftSpace(board, element);
350
- const y = nodeRectangle.y + NodeSpace.getTextTopSpace(element);
351
- const width = Math.ceil(element.width);
351
+ const y = nodeRectangle.y + NodeSpace.getTextTopSpace(board, element);
352
+ const width = NodeSpace.getNodeResizableWidth(board, element);
352
353
  const height = Math.ceil(element.height);
353
354
  return { height, width, x, y };
354
355
  }
355
356
 
356
357
  function getImageForeignRectangle(board, element) {
357
358
  let { x, y } = getRectangleByNode(MindElement.getNode(element));
358
- x = x + NodeSpace.getTextLeftSpace(board, element);
359
- y = NodeSpace.getImageTopSpace(element) + y;
359
+ const elementWidth = element.manualWidth || element.width;
360
+ x =
361
+ elementWidth > element.data.image.width
362
+ ? x + NodeSpace.getTextLeftSpace(board, element) + (elementWidth - element.data.image.width) / 2
363
+ : x + NodeSpace.getTextLeftSpace(board, element);
364
+ y = NodeSpace.getImageTopSpace(board, element) + y;
360
365
  const { width, height } = element.data.image;
361
- return {
366
+ const rectangle = {
362
367
  x,
363
368
  y,
364
369
  width,
365
370
  height
366
371
  };
372
+ return RectangleClient.getOutlineRectangle(rectangle, -6);
367
373
  }
368
374
  const isHitImage = (board, element, range) => {
369
375
  const client = getImageForeignRectangle(board, element);
@@ -374,6 +380,15 @@ function editTopic(element) {
374
380
  const component = PlaitElement.getComponent(element);
375
381
  component === null || component === void 0 ? void 0 : component.editTopic();
376
382
  }
383
+ const temporaryDisableSelection = (board) => {
384
+ const currentOptions = board.getPluginOptions(PlaitPluginKey.withSelection);
385
+ board.setPluginOptions(PlaitPluginKey.withSelection, {
386
+ isDisabledSelect: true
387
+ });
388
+ setTimeout(() => {
389
+ board.setPluginOptions(PlaitPluginKey.withSelection, Object.assign({}, currentOptions));
390
+ }, 0);
391
+ };
377
392
 
378
393
  const createEmptyMind = (point) => {
379
394
  const element = createMindElement('思维导图', 72, ROOT_TOPIC_HEIGHT, { layout: MindLayoutType.right });
@@ -469,7 +484,7 @@ const copyNewNode = (node) => {
469
484
  const extractNodesText = (node) => {
470
485
  let str = '';
471
486
  if (node) {
472
- str += Node.string(node.data.topic) + ' ';
487
+ str += Node$1.string(node.data.topic) + ' ';
473
488
  for (const childNode of node.children) {
474
489
  str += extractNodesText(childNode);
475
490
  }
@@ -638,7 +653,7 @@ const adjustAbstractToNode = (node) => {
638
653
  const adjustNodeToRoot = (board, node) => {
639
654
  var _a;
640
655
  const newElement = Object.assign({}, node);
641
- if (!Node.string(newElement.data.topic)) {
656
+ if (!Node$1.string(newElement.data.topic)) {
642
657
  newElement.data.topic = { children: [{ text: '思维导图' }] };
643
658
  }
644
659
  newElement === null || newElement === void 0 ? true : delete newElement.strokeColor;
@@ -655,6 +670,28 @@ const adjustNodeToRoot = (board, node) => {
655
670
  return Object.assign(Object.assign({}, newElement), { layout: (_a = newElement.layout) !== null && _a !== void 0 ? _a : MindLayoutType.right, isRoot: true, type: 'mindmap' });
656
671
  };
657
672
 
673
+ const BOARD_TO_SELECTED_IMAGE_ELEMENT = new WeakMap();
674
+ const getSelectedImageElement = (board) => {
675
+ return BOARD_TO_SELECTED_IMAGE_ELEMENT.get(board);
676
+ };
677
+ const addSelectedImageElement = (board, element) => {
678
+ BOARD_TO_SELECTED_IMAGE_ELEMENT.set(board, element);
679
+ };
680
+ const removeSelectedImageElement = (board) => {
681
+ BOARD_TO_SELECTED_IMAGE_ELEMENT.delete(board);
682
+ };
683
+ const setImageFocus = (board, element, isFocus) => {
684
+ if (isFocus) {
685
+ addSelectedImageElement(board, element);
686
+ }
687
+ else {
688
+ removeSelectedImageElement(board);
689
+ }
690
+ const elementComponent = PlaitElement.getComponent(element);
691
+ elementComponent.imageDrawer.componentRef.instance.isFocus = isFocus;
692
+ elementComponent.imageDrawer.componentRef.instance.cdr.markForCheck();
693
+ };
694
+
658
695
  const DefaultAbstractNodeStyle = {
659
696
  branch: { color: GRAY_COLOR, width: 2 },
660
697
  shape: {
@@ -2246,9 +2283,20 @@ const setTopic = (board, element, topic, width, height) => {
2246
2283
  const path = PlaitBoard.findPath(board, element);
2247
2284
  Transforms.setNode(board, newElement, path);
2248
2285
  };
2286
+ const setNodeManualWidth = (board, element, width, height) => {
2287
+ const path = PlaitBoard.findPath(board, element);
2288
+ const { width: normalizedWidth, height: normalizedHeight } = normalizeWidthAndHeight(board, element, width, height);
2289
+ const newElement = { manualWidth: normalizedWidth, height: normalizedHeight };
2290
+ Transforms.setNode(board, newElement, path);
2291
+ };
2249
2292
  const setTopicSize = (board, element, width, height) => {
2250
2293
  const newElement = Object.assign({}, normalizeWidthAndHeight(board, element, width, height));
2251
- if (Math.floor(element.width) !== Math.floor(newElement.width) || Math.floor(element.height) !== Math.floor(newElement.height)) {
2294
+ let isEqualWidth = Math.ceil(element.width) === Math.ceil(newElement.width);
2295
+ let isEqualHeight = Math.ceil(element.height) === Math.ceil(newElement.height);
2296
+ if (element.manualWidth) {
2297
+ isEqualWidth = true;
2298
+ }
2299
+ if (!isEqualWidth || !isEqualHeight) {
2252
2300
  const path = PlaitBoard.findPath(board, element);
2253
2301
  Transforms.setNode(board, newElement, path);
2254
2302
  }
@@ -2342,6 +2390,7 @@ const MindTransforms = {
2342
2390
  setLayout,
2343
2391
  setTopic,
2344
2392
  setTopicSize,
2393
+ setNodeManualWidth,
2345
2394
  addEmoji,
2346
2395
  removeEmoji,
2347
2396
  replaceEmoji,
@@ -2716,13 +2765,15 @@ class MindImageBaseComponent {
2716
2765
  get nativeElement() {
2717
2766
  return this.elementRef.nativeElement;
2718
2767
  }
2719
- constructor(elementRef) {
2768
+ constructor(elementRef, cdr) {
2720
2769
  this.elementRef = elementRef;
2770
+ this.cdr = cdr;
2771
+ this.isFocus = false;
2721
2772
  }
2722
2773
  ngOnInit() { }
2723
2774
  }
2724
- MindImageBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
2725
- MindImageBaseComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.5", type: MindImageBaseComponent, inputs: { imageItem: "imageItem", board: "board", element: "element" }, host: { classAttribute: "mind-node-image" }, ngImport: i0 });
2775
+ MindImageBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
2776
+ MindImageBaseComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.5", type: MindImageBaseComponent, inputs: { imageItem: "imageItem", board: "board", element: "element", isFocus: "isFocus" }, host: { classAttribute: "mind-node-image" }, ngImport: i0 });
2726
2777
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, decorators: [{
2727
2778
  type: Directive,
2728
2779
  args: [{
@@ -2730,12 +2781,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
2730
2781
  class: 'mind-node-image'
2731
2782
  }
2732
2783
  }]
2733
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { imageItem: [{
2784
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { imageItem: [{
2734
2785
  type: Input
2735
2786
  }], board: [{
2736
2787
  type: Input
2737
2788
  }], element: [{
2738
2789
  type: Input
2790
+ }], isFocus: [{
2791
+ type: Input
2739
2792
  }] } });
2740
2793
 
2741
2794
  class NodeImageDrawer {
@@ -2744,46 +2797,40 @@ class NodeImageDrawer {
2744
2797
  this.viewContainerRef = viewContainerRef;
2745
2798
  this.componentRef = null;
2746
2799
  }
2747
- drawImage(element) {
2748
- this.destroy();
2749
- if (MindElement.hasImage(element)) {
2750
- this.g = createG();
2751
- const foreignRectangle = getImageForeignRectangle(this.board, element);
2752
- const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
2753
- this.g.append(foreignObject);
2754
- if (this.componentRef) {
2755
- this.componentRef.destroy();
2756
- this.componentRef = null;
2757
- }
2758
- const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType || MindImageBaseComponent;
2759
- if (!componentType) {
2760
- throw new Error('Not implement drawEmoji method error.');
2761
- }
2762
- this.componentRef = this.viewContainerRef.createComponent(componentType);
2763
- this.componentRef.instance.board = this.board;
2764
- this.componentRef.instance.element = element;
2765
- this.componentRef.instance.imageItem = element.data.image;
2766
- foreignObject.append(this.componentRef.instance.nativeElement);
2767
- return this.g;
2800
+ drawImage(nodeG, element) {
2801
+ if (!MindElement.hasImage(element)) {
2802
+ this.destroy();
2803
+ return;
2768
2804
  }
2769
- return undefined;
2770
- }
2771
- drawActive(element) {
2772
- var _a;
2773
- this.destroyActive();
2774
- const imageRectangle = getImageForeignRectangle(this.board, element);
2775
- const rectangle = RectangleClient.getOutlineRectangle(imageRectangle, -1);
2776
- const roughSVG = PlaitBoard.getRoughSVG(this.board);
2777
- this.activeG = roughSVG.rectangle(rectangle.x, rectangle.y, rectangle.width, rectangle.height, {
2778
- stroke: PRIMARY_COLOR,
2779
- fill: '',
2780
- fillStyle: 'solid'
2781
- });
2782
- (_a = this.g) === null || _a === void 0 ? void 0 : _a.append(this.activeG);
2805
+ this.g = createG();
2806
+ const foreignRectangle = getImageForeignRectangle(this.board, element);
2807
+ const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
2808
+ this.g.append(foreignObject);
2809
+ const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType || MindImageBaseComponent;
2810
+ if (!componentType) {
2811
+ throw new Error('Not implement drawEmoji method error.');
2812
+ }
2813
+ this.componentRef = this.viewContainerRef.createComponent(componentType);
2814
+ this.componentRef.instance.board = this.board;
2815
+ this.componentRef.instance.element = element;
2816
+ this.componentRef.instance.imageItem = element.data.image;
2817
+ this.componentRef.instance.cdr.markForCheck();
2818
+ foreignObject.append(this.componentRef.instance.nativeElement);
2819
+ nodeG.appendChild(this.g);
2783
2820
  }
2784
- destroyActive() {
2821
+ updateImage(nodeG, previous, current) {
2785
2822
  var _a;
2786
- (_a = this.activeG) === null || _a === void 0 ? void 0 : _a.remove();
2823
+ if (!MindElement.hasImage(previous) || !MindElement.hasImage(current)) {
2824
+ this.drawImage(nodeG, current);
2825
+ return;
2826
+ }
2827
+ if (previous !== current && this.componentRef) {
2828
+ this.componentRef.instance.element = current;
2829
+ this.componentRef.instance.imageItem = current.data.image;
2830
+ }
2831
+ const currentForeignObject = getImageForeignRectangle(this.board, current);
2832
+ updateForeignObject(this.g, currentForeignObject.width, currentForeignObject.height, currentForeignObject.x, currentForeignObject.y);
2833
+ (_a = this.componentRef) === null || _a === void 0 ? void 0 : _a.instance.cdr.markForCheck();
2787
2834
  }
2788
2835
  destroy() {
2789
2836
  if (this.g) {
@@ -2846,13 +2893,17 @@ class MindNodeComponent extends PlaitPluginElementComponent {
2846
2893
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: this.textManage.isEditing });
2847
2894
  this.drawEmojis();
2848
2895
  this.drawExtend();
2849
- this.drawImage();
2896
+ this.imageDrawer.drawImage(this.g, this.element);
2850
2897
  if (PlaitMind.isMind(this.context.parent)) {
2851
2898
  this.g.classList.add('branch');
2852
2899
  }
2853
2900
  }
2854
2901
  editTopic() {
2855
2902
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: true });
2903
+ if (this.element.manualWidth) {
2904
+ const width = NodeSpace.getNodeResizableWidth(this.board, this.element);
2905
+ this.textManage.updateWidth(width);
2906
+ }
2856
2907
  this.textManage.edit((origin) => {
2857
2908
  if (origin === ExitOrigin.default) {
2858
2909
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: false });
@@ -2869,8 +2920,8 @@ class MindNodeComponent extends PlaitPluginElementComponent {
2869
2920
  this.drawShape();
2870
2921
  this.drawLink();
2871
2922
  this.drawEmojis();
2872
- this.drawImage();
2873
2923
  this.drawExtend();
2924
+ this.imageDrawer.updateImage(this.g, previous.element, value.element);
2874
2925
  this.textManage.updateText(this.element.data.topic);
2875
2926
  this.textManage.updateRectangle();
2876
2927
  }
@@ -2891,12 +2942,6 @@ class MindNodeComponent extends PlaitPluginElementComponent {
2891
2942
  this.g.append(g);
2892
2943
  }
2893
2944
  }
2894
- drawImage() {
2895
- const image = this.imageDrawer.drawImage(this.element);
2896
- if (image) {
2897
- this.g.append(image);
2898
- }
2899
- }
2900
2945
  drawShape() {
2901
2946
  this.destroyShape();
2902
2947
  const shape = getShapeByElement(this.board, this.node.origin);
@@ -3161,11 +3206,11 @@ const withNodeDnd = (board) => {
3161
3206
  activeElements = [targetElement];
3162
3207
  startPoint = point;
3163
3208
  }
3164
- event.preventDefault();
3165
3209
  }
3166
3210
  if (activeElements.length) {
3167
- correspondingElements = getOverallAbstracts(board, activeElements);
3211
+ // prevent text from being selected
3168
3212
  event.preventDefault();
3213
+ correspondingElements = getOverallAbstracts(board, activeElements);
3169
3214
  }
3170
3215
  mousedown(event);
3171
3216
  };
@@ -3434,7 +3479,6 @@ const withAbstract = (board) => {
3434
3479
  const endPoint = transformPoint(board, toPoint(event.x, event.y, host));
3435
3480
  touchedAbstract = handleTouchedAbstract(board, touchedAbstract, endPoint);
3436
3481
  if (abstractHandlePosition && activeAbstractElement) {
3437
- event.preventDefault();
3438
3482
  const abstractComponent = PlaitElement.getComponent(activeAbstractElement);
3439
3483
  const element = abstractComponent.element;
3440
3484
  const nodeLayout = MindQueries.getCorrectLayoutByElement(board, activeAbstractElement);
@@ -3612,7 +3656,8 @@ const withCreateMind = (board) => {
3612
3656
  return newBoard;
3613
3657
  };
3614
3658
 
3615
- const withMindHotkey = (board) => {
3659
+ const withMindHotkey = (baseBoard) => {
3660
+ const board = baseBoard;
3616
3661
  const { keydown } = board;
3617
3662
  board.keydown = (event) => {
3618
3663
  const selectedElements = getSelectedElements(board);
@@ -3724,49 +3769,45 @@ const isSpaceHotkey = (event) => {
3724
3769
  return event.code === 'Space';
3725
3770
  };
3726
3771
 
3727
- const withNodeHover = (board) => {
3728
- const { mousemove, mouseleave } = board;
3729
- let hoveredMindElement = null;
3730
- board.mousemove = (event) => {
3731
- throttleRAF(() => {
3732
- let target = null;
3733
- const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3734
- depthFirstRecursion(board, element => {
3735
- if (target) {
3736
- return;
3737
- }
3738
- if (!MindElement.isMindElement(board, element)) {
3739
- return;
3740
- }
3741
- const isHitElement = isHitMindElement(board, point, element);
3742
- if (isHitElement) {
3743
- target = element;
3744
- }
3745
- }, getIsRecursionFunc(board), true);
3746
- if (hoveredMindElement && target && hoveredMindElement === target) {
3747
- return;
3748
- }
3749
- if (hoveredMindElement) {
3750
- removeHovered(hoveredMindElement);
3751
- }
3752
- if (target) {
3753
- addHovered(target);
3754
- hoveredMindElement = target;
3755
- }
3756
- else {
3757
- hoveredMindElement = null;
3758
- }
3759
- });
3760
- mousemove(event);
3761
- };
3762
- board.mouseleave = (event) => {
3763
- if (hoveredMindElement) {
3764
- removeHovered(hoveredMindElement);
3765
- hoveredMindElement = null;
3772
+ const mouseMoveHandle = (board, event, nodeHoveredExtendRef) => {
3773
+ let target = null;
3774
+ const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3775
+ depthFirstRecursion(board, element => {
3776
+ if (target) {
3777
+ return;
3766
3778
  }
3767
- mouseleave(event);
3768
- };
3769
- return board;
3779
+ if (!MindElement.isMindElement(board, element)) {
3780
+ return;
3781
+ }
3782
+ const isHitElement = isHitMindElement(board, point, element);
3783
+ if (isHitElement) {
3784
+ target = element;
3785
+ }
3786
+ }, getIsRecursionFunc(board), true);
3787
+ if (nodeHoveredExtendRef && target && nodeHoveredExtendRef.element === target) {
3788
+ return nodeHoveredExtendRef;
3789
+ }
3790
+ if (nodeHoveredExtendRef) {
3791
+ removeHovered(nodeHoveredExtendRef.element);
3792
+ }
3793
+ if (target) {
3794
+ addHovered(target);
3795
+ if (nodeHoveredExtendRef) {
3796
+ nodeHoveredExtendRef.element = target;
3797
+ }
3798
+ else {
3799
+ nodeHoveredExtendRef = { element: target };
3800
+ }
3801
+ }
3802
+ else {
3803
+ nodeHoveredExtendRef = null;
3804
+ }
3805
+ return nodeHoveredExtendRef;
3806
+ };
3807
+ const mouseLeaveHandle = (board, event, nodeHoveredExtendRef) => {
3808
+ if (nodeHoveredExtendRef) {
3809
+ removeHovered(nodeHoveredExtendRef.element);
3810
+ }
3770
3811
  };
3771
3812
  const addHovered = (element) => {
3772
3813
  const component = PlaitElement.getComponent(element);
@@ -3779,11 +3820,29 @@ const removeHovered = (element) => {
3779
3820
  }
3780
3821
  };
3781
3822
 
3782
- const withMindImage = (board) => {
3783
- let selectedImageElement = null;
3784
- const { keydown, mousedown } = board;
3823
+ const withNodeHoverDetect = (board) => {
3824
+ const { mousemove, mouseleave } = board;
3825
+ let nodeHoveredExtendRef = null;
3826
+ board.mousemove = (event) => {
3827
+ nodeHoveredExtendRef = mouseMoveHandle(board, event, nodeHoveredExtendRef);
3828
+ mousemove(event);
3829
+ };
3830
+ board.mouseleave = (event) => {
3831
+ mouseLeaveHandle(board, event, nodeHoveredExtendRef);
3832
+ nodeHoveredExtendRef = null;
3833
+ mouseleave(event);
3834
+ };
3835
+ return board;
3836
+ };
3837
+
3838
+ const withNodeImage = (board) => {
3839
+ const { keydown, mousedown, globalMouseup } = board;
3785
3840
  board.mousedown = (event) => {
3841
+ const selectedImageElement = getSelectedImageElement(board);
3786
3842
  if (PlaitBoard.isReadonly(board) || !isMainPointer(event) || !PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
3843
+ if (selectedImageElement) {
3844
+ setImageFocus(board, selectedImageElement, false);
3845
+ }
3787
3846
  mousedown(event);
3788
3847
  return;
3789
3848
  }
@@ -3792,38 +3851,159 @@ const withMindImage = (board) => {
3792
3851
  const hitElements = getHitElements(board, { ranges: [range] });
3793
3852
  const hasImage = hitElements.length && MindElement.hasImage(hitElements[0]);
3794
3853
  const hitImage = hasImage && isHitImage(board, hitElements[0], range);
3854
+ if (selectedImageElement && hitImage && hitElements[0] === selectedImageElement) {
3855
+ temporaryDisableSelection(board);
3856
+ mousedown(event);
3857
+ return;
3858
+ }
3859
+ if (selectedImageElement) {
3860
+ setImageFocus(board, selectedImageElement, false);
3861
+ }
3795
3862
  if (hitImage) {
3796
- const currentOptions = board.getPluginOptions(PlaitPluginKey.withSelection);
3797
- board.setPluginOptions(PlaitPluginKey.withSelection, {
3798
- isDisabledSelect: true
3799
- });
3800
- setTimeout(() => {
3801
- board.setPluginOptions(PlaitPluginKey.withSelection, Object.assign({}, currentOptions));
3802
- }, 0);
3803
- selectedImageElement = hitElements[0];
3804
- const component = PlaitElement.getComponent(selectedImageElement);
3805
- component.imageDrawer.drawActive(selectedImageElement);
3863
+ temporaryDisableSelection(board);
3864
+ setImageFocus(board, hitElements[0], true);
3806
3865
  clearSelectedElement(board);
3807
3866
  }
3808
- else {
3809
- if (selectedImageElement) {
3810
- const component = PlaitElement.getComponent(selectedImageElement);
3811
- component && component.imageDrawer.destroyActive();
3812
- }
3813
- selectedImageElement = null;
3814
- }
3815
3867
  mousedown(event);
3816
3868
  };
3817
3869
  board.keydown = (event) => {
3870
+ const selectedImageElement = getSelectedImageElement(board);
3818
3871
  if (!PlaitBoard.isReadonly(board) && selectedImageElement && (hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event))) {
3872
+ addSelectedElement(board, selectedImageElement);
3873
+ setImageFocus(board, selectedImageElement, false);
3819
3874
  MindTransforms.removeImage(board, selectedImageElement);
3820
- selectedImageElement = null;
3821
3875
  return;
3822
3876
  }
3823
3877
  keydown(event);
3824
3878
  };
3879
+ board.globalMouseup = (event) => {
3880
+ if (PlaitBoard.isFocus(board)) {
3881
+ const isInBoard = event.target instanceof Node && PlaitBoard.getBoardContainer(board).contains(event.target);
3882
+ const selectedImageElement = getSelectedImageElement(board);
3883
+ // Clear image selection when mouse board outside area
3884
+ if (selectedImageElement && !isInBoard) {
3885
+ setImageFocus(board, selectedImageElement, false);
3886
+ }
3887
+ }
3888
+ globalMouseup(event);
3889
+ };
3890
+ return board;
3891
+ };
3892
+
3893
+ const withNodeResize = (board) => {
3894
+ const { mousedown, mousemove, globalMouseup } = board;
3895
+ let targetElement = null;
3896
+ let targetElementRef = null;
3897
+ let startPoint = null;
3898
+ board.mousedown = (event) => {
3899
+ if (targetElement) {
3900
+ startPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3901
+ // prevent text from being selected
3902
+ event.preventDefault();
3903
+ return;
3904
+ }
3905
+ mousedown(event);
3906
+ };
3907
+ board.mousemove = (event) => {
3908
+ if (PlaitBoard.isReadonly(board) || PlaitBoard.hasBeenTextEditing(board)) {
3909
+ mousemove(event);
3910
+ return;
3911
+ }
3912
+ if (startPoint && targetElement && !isMindNodeResizing(board)) {
3913
+ const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3914
+ const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
3915
+ if (distance > PRESS_AND_MOVE_BUFFER) {
3916
+ startPoint = endPoint;
3917
+ addResizing(board, targetElement);
3918
+ targetElementRef = {
3919
+ minWidth: NodeSpace.getNodeResizableMinWidth(board, targetElement),
3920
+ currentWidth: NodeSpace.getNodeResizableWidth(board, targetElement),
3921
+ path: PlaitBoard.findPath(board, targetElement),
3922
+ textManage: PlaitElement.getComponent(targetElement).textManage
3923
+ };
3924
+ MERGING.set(board, true);
3925
+ }
3926
+ }
3927
+ if (isMindNodeResizing(board) && startPoint && targetElementRef) {
3928
+ throttleRAF(() => {
3929
+ const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3930
+ const offsetX = endPoint[0] - startPoint[0];
3931
+ let resizedWidth = targetElementRef.currentWidth + offsetX;
3932
+ if (resizedWidth < targetElementRef.minWidth) {
3933
+ resizedWidth = targetElementRef.minWidth;
3934
+ }
3935
+ const newTarget = PlaitNode.get(board, targetElementRef.path);
3936
+ if (newTarget && NodeSpace.getNodeTopicMinWidth(board, newTarget) !== resizedWidth) {
3937
+ targetElementRef.textManage.updateWidth(resizedWidth);
3938
+ const { width, height } = targetElementRef.textManage.getSize();
3939
+ MindTransforms.setNodeManualWidth(board, newTarget, resizedWidth, height);
3940
+ }
3941
+ });
3942
+ return;
3943
+ }
3944
+ else {
3945
+ // press and start drag when node is non selected
3946
+ if (!isDragging(board)) {
3947
+ const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3948
+ const newTargetElement = getTargetElement(board, point);
3949
+ if (newTargetElement) {
3950
+ PlaitBoard.getBoardContainer(board).classList.add(ResizeCursorClass['ew-resize']);
3951
+ }
3952
+ else {
3953
+ PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew-resize']);
3954
+ }
3955
+ targetElement = newTargetElement;
3956
+ }
3957
+ }
3958
+ mousemove(event);
3959
+ };
3960
+ board.globalMouseup = (event) => {
3961
+ globalMouseup(event);
3962
+ if (isMindNodeResizing(board) || targetElement) {
3963
+ targetElement && removeResizing(board, targetElement);
3964
+ targetElementRef = null;
3965
+ targetElement = null;
3966
+ startPoint = null;
3967
+ MERGING.set(board, false);
3968
+ }
3969
+ };
3825
3970
  return board;
3826
3971
  };
3972
+ const IS_MIND_NODE_RESIZING = new WeakMap();
3973
+ const isMindNodeResizing = (board) => {
3974
+ return !!IS_MIND_NODE_RESIZING.get(board);
3975
+ };
3976
+ const addResizing = (board, element) => {
3977
+ PlaitBoard.getBoardContainer(board).classList.add('mind-node-resizing');
3978
+ const component = PlaitElement.getComponent(element);
3979
+ component.g.classList.add('resizing');
3980
+ IS_MIND_NODE_RESIZING.set(board, true);
3981
+ };
3982
+ const removeResizing = (board, element) => {
3983
+ PlaitBoard.getBoardContainer(board).classList.remove('mind-node-resizing');
3984
+ PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew-resize']);
3985
+ const component = PlaitElement.getComponent(element);
3986
+ if (component && component.g) {
3987
+ component.g.classList.remove('resizing');
3988
+ }
3989
+ IS_MIND_NODE_RESIZING.set(board, false);
3990
+ };
3991
+ const getTargetElement = (board, point) => {
3992
+ const selectedElements = getSelectedElements(board).filter(value => MindElement.isMindElement(board, value));
3993
+ if (selectedElements.length > 0) {
3994
+ const target = selectedElements.find(value => {
3995
+ const rectangle = getResizeActiveRectangle(board, value);
3996
+ return distanceBetweenPointAndRectangle(point[0], point[1], rectangle) <= 0;
3997
+ });
3998
+ return target ? target : null;
3999
+ }
4000
+ return null;
4001
+ };
4002
+ const getResizeActiveRectangle = (board, element) => {
4003
+ const node = MindElement.getNode(element);
4004
+ const rectangle = getRectangleByNode(node);
4005
+ return { x: rectangle.x + rectangle.width - EXTEND_OFFSET, y: rectangle.y, width: EXTEND_OFFSET * 2, height: rectangle.height };
4006
+ };
3827
4007
 
3828
4008
  const withMind = (baseBoard) => {
3829
4009
  const board = baseBoard;
@@ -3930,7 +4110,7 @@ const withMind = (baseBoard) => {
3930
4110
  MindTransforms.removeElements(board, selectedElements);
3931
4111
  deleteFragment(data);
3932
4112
  };
3933
- return withMindImage(withNodeHover(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board)))))));
4113
+ return withNodeResize(withNodeImage(withNodeHoverDetect(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board))))))));
3934
4114
  };
3935
4115
 
3936
4116
  class MindEmojiBaseComponent {
@@ -3984,5 +4164,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
3984
4164
  * Generated bundle index. Do not edit.
3985
4165
  */
3986
4166
 
3987
- export { ABSTRACT_HANDLE_COLOR, ABSTRACT_HANDLE_LENGTH, ABSTRACT_HANDLE_MASK_WIDTH, ABSTRACT_INCLUDED_OUTLINE_OFFSET, AbstractHandlePosition, AbstractResizeState, BASE, BRANCH_FONT_FAMILY, BRANCH_WIDTH, BaseDrawer, BranchShape, DEFAULT_FONT_FAMILY, DefaultAbstractNodeStyle, DefaultNodeStyle, ELEMENT_TO_NODE, EXTEND_DIAMETER, EXTEND_OFFSET, GRAY_COLOR, INHERIT_ATTRIBUTE_KEYS, IS_DRAGGING, LayoutDirection, LayoutDirectionsMap, MindColorfulThemeColor, MindDarkThemeColor, MindDefaultThemeColor, MindElement, MindElementShape, MindEmojiBaseComponent, MindImageBaseComponent, MindModule, MindNode, MindNodeComponent, MindPointerType, MindQueries, MindRetroThemeColor, MindSoftThemeColor, MindStarryThemeColor, MindThemeColor, MindThemeColors, MindTransforms, PRIMARY_COLOR, PlaitMind, PlaitMindComponent, QUICK_INSERT_CIRCLE_COLOR, QUICK_INSERT_CIRCLE_OFFSET, QUICK_INSERT_INNER_CROSS_COLOR, ROOT_TOPIC_FONT_SIZE, ROOT_TOPIC_HEIGHT, STROKE_WIDTH, TOPIC_COLOR, TOPIC_DEFAULT_MAX_WORD_COUNT, TOPIC_FONT_SIZE, TRANSPARENT, WithMindPluginKey, addActiveOnDragOrigin, adjustAbstractToNode, adjustNodeToRoot, adjustRootToNode, canSetAbstract, copyNewNode, correctLayoutByDirection, createDefaultMind, createEmptyMind, createMindElement, deleteElementHandleAbstract, deleteElementsHandleRightNodeCount, detectDropTarget, directionCorrector, directionDetector, divideElementByParent, drawFakeDragNode, drawFakeDropNode, editTopic, extractNodesText, findLastChild, findLocationLeftIndex, getAbstractBranchColor, getAbstractBranchWidth, getAbstractHandleRectangle, getAllowedDirection, getAvailableSubLayoutsByLayoutDirections, getBehindAbstracts, getBranchColorByMindElement, getBranchDirectionsByLayouts, getBranchShapeByMindElement, getBranchWidthByMindElement, getChildrenCount, getCorrespondingAbstract, getDefaultBranchColor, getDefaultBranchColorByIndex, getDefaultLayout, getEmojiForeignRectangle, getEmojiRectangle, getFillByElement, getFirstLevelElement, getHitAbstractHandle, getImageForeignRectangle, getInCorrectLayoutDirection, getLayoutDirection$1 as getLayoutDirection, getLayoutReverseDirection, getLocationScope, getMindThemeColor, getNextBranchColor, getOverallAbstracts, getPathByDropTarget, getRectangleByElement, getRectangleByNode, getRectangleByResizingLocation, getRelativeStartEndByAbstractRef, getRootLayout, getShapeByElement, getStrokeByMindElement, getStrokeWidthByElement, getTopicRectangleByElement, getTopicRectangleByNode, getValidAbstractRefs, handleTouchedAbstract, hasAfterDraw, hasPreviousOrNextOfDropPath, insertElementHandleAbstract, insertElementHandleRightNodeCount, insertMindElement, isChildElement, isChildOfAbstract, isChildRight, isChildUp, isCorrectLayout, isDragging, isDropStandardRight, isHitEmojis, isHitImage, isHitMindElement, isInRightBranchOfStandardLayout, isMixedLayout, isSetAbstract, isValidTarget, isVirtualKey, removeActiveOnDragOrigin, separateChildren, setIsDragging, withMind, withMindExtend };
4167
+ export { ABSTRACT_HANDLE_COLOR, ABSTRACT_HANDLE_LENGTH, ABSTRACT_HANDLE_MASK_WIDTH, ABSTRACT_INCLUDED_OUTLINE_OFFSET, AbstractHandlePosition, AbstractResizeState, BASE, BRANCH_FONT_FAMILY, BRANCH_WIDTH, BaseDrawer, BranchShape, DEFAULT_FONT_FAMILY, DefaultAbstractNodeStyle, DefaultNodeStyle, ELEMENT_TO_NODE, EXTEND_DIAMETER, EXTEND_OFFSET, GRAY_COLOR, INHERIT_ATTRIBUTE_KEYS, IS_DRAGGING, LayoutDirection, LayoutDirectionsMap, MindColorfulThemeColor, MindDarkThemeColor, MindDefaultThemeColor, MindElement, MindElementShape, MindEmojiBaseComponent, MindImageBaseComponent, MindModule, MindNode, MindNodeComponent, MindPointerType, MindQueries, MindRetroThemeColor, MindSoftThemeColor, MindStarryThemeColor, MindThemeColor, MindThemeColors, MindTransforms, PRIMARY_COLOR, PlaitMind, PlaitMindComponent, QUICK_INSERT_CIRCLE_COLOR, QUICK_INSERT_CIRCLE_OFFSET, QUICK_INSERT_INNER_CROSS_COLOR, ROOT_TOPIC_FONT_SIZE, ROOT_TOPIC_HEIGHT, STROKE_WIDTH, TOPIC_COLOR, TOPIC_DEFAULT_MAX_WORD_COUNT, TOPIC_FONT_SIZE, TRANSPARENT, WithMindPluginKey, addActiveOnDragOrigin, addSelectedImageElement, adjustAbstractToNode, adjustNodeToRoot, adjustRootToNode, canSetAbstract, copyNewNode, correctLayoutByDirection, createDefaultMind, createEmptyMind, createMindElement, deleteElementHandleAbstract, deleteElementsHandleRightNodeCount, detectDropTarget, directionCorrector, directionDetector, divideElementByParent, drawFakeDragNode, drawFakeDropNode, editTopic, extractNodesText, findLastChild, findLocationLeftIndex, getAbstractBranchColor, getAbstractBranchWidth, getAbstractHandleRectangle, getAllowedDirection, getAvailableSubLayoutsByLayoutDirections, getBehindAbstracts, getBranchColorByMindElement, getBranchDirectionsByLayouts, getBranchShapeByMindElement, getBranchWidthByMindElement, getChildrenCount, getCorrespondingAbstract, getDefaultBranchColor, getDefaultBranchColorByIndex, getDefaultLayout, getEmojiForeignRectangle, getEmojiRectangle, getFillByElement, getFirstLevelElement, getHitAbstractHandle, getImageForeignRectangle, getInCorrectLayoutDirection, getLayoutDirection$1 as getLayoutDirection, getLayoutReverseDirection, getLocationScope, getMindThemeColor, getNextBranchColor, getOverallAbstracts, getPathByDropTarget, getRectangleByElement, getRectangleByNode, getRectangleByResizingLocation, getRelativeStartEndByAbstractRef, getRootLayout, getSelectedImageElement, getShapeByElement, getStrokeByMindElement, getStrokeWidthByElement, getTopicRectangleByElement, getTopicRectangleByNode, getValidAbstractRefs, handleTouchedAbstract, hasAfterDraw, hasPreviousOrNextOfDropPath, insertElementHandleAbstract, insertElementHandleRightNodeCount, insertMindElement, isChildElement, isChildOfAbstract, isChildRight, isChildUp, isCorrectLayout, isDragging, isDropStandardRight, isHitEmojis, isHitImage, isHitMindElement, isInRightBranchOfStandardLayout, isMixedLayout, isSetAbstract, isValidTarget, isVirtualKey, removeActiveOnDragOrigin, removeSelectedImageElement, separateChildren, setImageFocus, setIsDragging, temporaryDisableSelection, withMind, withMindExtend };
3988
4168
  //# sourceMappingURL=plait-mind.mjs.map