@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';
@@ -220,11 +220,11 @@ const BRANCH_FONT_FAMILY = 'PingFangSC-Medium, "PingFang SC"';
220
220
 
221
221
  const NodeDefaultSpace = {
222
222
  horizontal: {
223
- nodeAndText: BASE * 3,
223
+ nodeAndText: BASE * 2.5,
224
224
  emojiAndText: BASE * 1.5
225
225
  },
226
226
  vertical: {
227
- nodeAndText: BASE * 1.5,
227
+ nodeAndText: BASE,
228
228
  nodeAndImage: BASE,
229
229
  imageAndText: BASE * 1.5
230
230
  }
@@ -241,12 +241,14 @@ const RootDefaultSpace = {
241
241
  const getHorizontalSpaceBetweenNodeAndText = (board, element) => {
242
242
  const isMind = PlaitMind.isMind(element);
243
243
  const nodeAndText = isMind ? RootDefaultSpace.horizontal.nodeAndText : NodeDefaultSpace.horizontal.nodeAndText;
244
- return nodeAndText;
244
+ const strokeWidth = getStrokeWidthByElement(board, element);
245
+ return nodeAndText + strokeWidth / 2;
245
246
  };
246
- const getVerticalSpaceBetweenNodeAndText = (element) => {
247
+ const getVerticalSpaceBetweenNodeAndText = (board, element) => {
247
248
  const isMind = PlaitMind.isMind(element);
249
+ const strokeWidth = getStrokeWidthByElement(board, element);
248
250
  const nodeAndText = isMind ? RootDefaultSpace.vertical.nodeAndText : NodeDefaultSpace.vertical.nodeAndText;
249
- return nodeAndText;
251
+ return nodeAndText + strokeWidth / 2;
250
252
  };
251
253
  const getSpaceEmojiAndText = (element) => {
252
254
  const isMind = PlaitMind.isMind(element);
@@ -266,19 +268,16 @@ const NodeSpace = {
266
268
  return nodeAndText + NodeSpace.getNodeResizableWidth(board, element) + nodeAndText;
267
269
  },
268
270
  getNodeHeight(board, element) {
269
- const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
271
+ const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
270
272
  if (MindElement.hasImage(element)) {
271
- return (NodeDefaultSpace.vertical.nodeAndImage +
272
- element.data.image.height +
273
- NodeDefaultSpace.vertical.imageAndText +
274
- element.height +
275
- nodeAndText);
273
+ return NodeSpace.getTextTopSpace(board, element) + element.height + nodeAndText;
276
274
  }
277
275
  return nodeAndText + element.height + nodeAndText;
278
276
  },
279
277
  getNodeResizableWidth(board, element) {
278
+ const width = element.manualWidth || element.width;
280
279
  const imageWidth = MindElement.hasImage(element) ? element.data.image?.width : 0;
281
- return Math.max(element.width, imageWidth);
280
+ return Math.max(width, imageWidth);
282
281
  },
283
282
  getNodeResizableMinWidth(board, element) {
284
283
  const minTopicWidth = NodeSpace.getNodeTopicMinWidth(board, element);
@@ -305,25 +304,27 @@ const NodeSpace = {
305
304
  return nodeAndText;
306
305
  }
307
306
  },
308
- getTextTopSpace(element) {
309
- const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
307
+ getTextTopSpace(board, element) {
308
+ const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
310
309
  if (MindElement.hasImage(element)) {
311
- return element.data.image.height + NodeDefaultSpace.vertical.nodeAndImage + NodeDefaultSpace.vertical.imageAndText;
310
+ return NodeSpace.getImageTopSpace(board, element) + element.data.image.height + NodeDefaultSpace.vertical.imageAndText;
312
311
  }
313
312
  else {
314
313
  return nodeAndText;
315
314
  }
316
315
  },
317
- getImageTopSpace(element) {
318
- return NodeDefaultSpace.vertical.nodeAndImage;
316
+ getImageTopSpace(board, element) {
317
+ const strokeWidth = getStrokeWidthByElement(board, element);
318
+ return strokeWidth / 2 + NodeDefaultSpace.vertical.nodeAndImage;
319
319
  },
320
320
  getEmojiLeftSpace(board, element) {
321
321
  const options = board.getPluginOptions(WithMindPluginKey);
322
322
  const nodeAndText = getHorizontalSpaceBetweenNodeAndText(board, element);
323
- return nodeAndText - options.emojiPadding;
323
+ const strokeWidth = getStrokeWidthByElement(board, element);
324
+ return strokeWidth / 2 + nodeAndText - options.emojiPadding;
324
325
  },
325
- getEmojiTopSpace(element) {
326
- const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
326
+ getEmojiTopSpace(board, element) {
327
+ const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
327
328
  return nodeAndText;
328
329
  }
329
330
  };
@@ -376,23 +377,28 @@ function getTopicRectangleByNode(board, node) {
376
377
  }
377
378
  function getTopicRectangleByElement(board, nodeRectangle, element) {
378
379
  const x = nodeRectangle.x + NodeSpace.getTextLeftSpace(board, element);
379
- const y = nodeRectangle.y + NodeSpace.getTextTopSpace(element);
380
- const width = Math.ceil(element.width);
380
+ const y = nodeRectangle.y + NodeSpace.getTextTopSpace(board, element);
381
+ const width = NodeSpace.getNodeResizableWidth(board, element);
381
382
  const height = Math.ceil(element.height);
382
383
  return { height, width, x, y };
383
384
  }
384
385
 
385
386
  function getImageForeignRectangle(board, element) {
386
387
  let { x, y } = getRectangleByNode(MindElement.getNode(element));
387
- x = x + NodeSpace.getTextLeftSpace(board, element);
388
- y = NodeSpace.getImageTopSpace(element) + y;
388
+ const elementWidth = element.manualWidth || element.width;
389
+ x =
390
+ elementWidth > element.data.image.width
391
+ ? x + NodeSpace.getTextLeftSpace(board, element) + (elementWidth - element.data.image.width) / 2
392
+ : x + NodeSpace.getTextLeftSpace(board, element);
393
+ y = NodeSpace.getImageTopSpace(board, element) + y;
389
394
  const { width, height } = element.data.image;
390
- return {
395
+ const rectangle = {
391
396
  x,
392
397
  y,
393
398
  width,
394
399
  height
395
400
  };
401
+ return RectangleClient.getOutlineRectangle(rectangle, -6);
396
402
  }
397
403
  const isHitImage = (board, element, range) => {
398
404
  const client = getImageForeignRectangle(board, element);
@@ -403,6 +409,15 @@ function editTopic(element) {
403
409
  const component = PlaitElement.getComponent(element);
404
410
  component?.editTopic();
405
411
  }
412
+ const temporaryDisableSelection = (board) => {
413
+ const currentOptions = board.getPluginOptions(PlaitPluginKey.withSelection);
414
+ board.setPluginOptions(PlaitPluginKey.withSelection, {
415
+ isDisabledSelect: true
416
+ });
417
+ setTimeout(() => {
418
+ board.setPluginOptions(PlaitPluginKey.withSelection, { ...currentOptions });
419
+ }, 0);
420
+ };
406
421
 
407
422
  const createEmptyMind = (point) => {
408
423
  const element = createMindElement('思维导图', 72, ROOT_TOPIC_HEIGHT, { layout: MindLayoutType.right });
@@ -498,7 +513,7 @@ const copyNewNode = (node) => {
498
513
  const extractNodesText = (node) => {
499
514
  let str = '';
500
515
  if (node) {
501
- str += Node.string(node.data.topic) + ' ';
516
+ str += Node$1.string(node.data.topic) + ' ';
502
517
  for (const childNode of node.children) {
503
518
  str += extractNodesText(childNode);
504
519
  }
@@ -666,7 +681,7 @@ const adjustAbstractToNode = (node) => {
666
681
  };
667
682
  const adjustNodeToRoot = (board, node) => {
668
683
  const newElement = { ...node };
669
- if (!Node.string(newElement.data.topic)) {
684
+ if (!Node$1.string(newElement.data.topic)) {
670
685
  newElement.data.topic = { children: [{ text: '思维导图' }] };
671
686
  }
672
687
  delete newElement?.strokeColor;
@@ -688,6 +703,28 @@ const adjustNodeToRoot = (board, node) => {
688
703
  };
689
704
  };
690
705
 
706
+ const BOARD_TO_SELECTED_IMAGE_ELEMENT = new WeakMap();
707
+ const getSelectedImageElement = (board) => {
708
+ return BOARD_TO_SELECTED_IMAGE_ELEMENT.get(board);
709
+ };
710
+ const addSelectedImageElement = (board, element) => {
711
+ BOARD_TO_SELECTED_IMAGE_ELEMENT.set(board, element);
712
+ };
713
+ const removeSelectedImageElement = (board) => {
714
+ BOARD_TO_SELECTED_IMAGE_ELEMENT.delete(board);
715
+ };
716
+ const setImageFocus = (board, element, isFocus) => {
717
+ if (isFocus) {
718
+ addSelectedImageElement(board, element);
719
+ }
720
+ else {
721
+ removeSelectedImageElement(board);
722
+ }
723
+ const elementComponent = PlaitElement.getComponent(element);
724
+ elementComponent.imageDrawer.componentRef.instance.isFocus = isFocus;
725
+ elementComponent.imageDrawer.componentRef.instance.cdr.markForCheck();
726
+ };
727
+
691
728
  const DefaultAbstractNodeStyle = {
692
729
  branch: { color: GRAY_COLOR, width: 2 },
693
730
  shape: {
@@ -2302,11 +2339,22 @@ const setTopic = (board, element, topic, width, height) => {
2302
2339
  const path = PlaitBoard.findPath(board, element);
2303
2340
  Transforms.setNode(board, newElement, path);
2304
2341
  };
2342
+ const setNodeManualWidth = (board, element, width, height) => {
2343
+ const path = PlaitBoard.findPath(board, element);
2344
+ const { width: normalizedWidth, height: normalizedHeight } = normalizeWidthAndHeight(board, element, width, height);
2345
+ const newElement = { manualWidth: normalizedWidth, height: normalizedHeight };
2346
+ Transforms.setNode(board, newElement, path);
2347
+ };
2305
2348
  const setTopicSize = (board, element, width, height) => {
2306
2349
  const newElement = {
2307
2350
  ...normalizeWidthAndHeight(board, element, width, height)
2308
2351
  };
2309
- if (Math.floor(element.width) !== Math.floor(newElement.width) || Math.floor(element.height) !== Math.floor(newElement.height)) {
2352
+ let isEqualWidth = Math.ceil(element.width) === Math.ceil(newElement.width);
2353
+ let isEqualHeight = Math.ceil(element.height) === Math.ceil(newElement.height);
2354
+ if (element.manualWidth) {
2355
+ isEqualWidth = true;
2356
+ }
2357
+ if (!isEqualWidth || !isEqualHeight) {
2310
2358
  const path = PlaitBoard.findPath(board, element);
2311
2359
  Transforms.setNode(board, newElement, path);
2312
2360
  }
@@ -2403,6 +2451,7 @@ const MindTransforms = {
2403
2451
  setLayout,
2404
2452
  setTopic,
2405
2453
  setTopicSize,
2454
+ setNodeManualWidth,
2406
2455
  addEmoji,
2407
2456
  removeEmoji,
2408
2457
  replaceEmoji,
@@ -2777,13 +2826,15 @@ class MindImageBaseComponent {
2777
2826
  get nativeElement() {
2778
2827
  return this.elementRef.nativeElement;
2779
2828
  }
2780
- constructor(elementRef) {
2829
+ constructor(elementRef, cdr) {
2781
2830
  this.elementRef = elementRef;
2831
+ this.cdr = cdr;
2832
+ this.isFocus = false;
2782
2833
  }
2783
2834
  ngOnInit() { }
2784
2835
  }
2785
- MindImageBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
2786
- 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 });
2836
+ 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 });
2837
+ 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 });
2787
2838
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, decorators: [{
2788
2839
  type: Directive,
2789
2840
  args: [{
@@ -2791,12 +2842,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
2791
2842
  class: 'mind-node-image'
2792
2843
  }
2793
2844
  }]
2794
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { imageItem: [{
2845
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { imageItem: [{
2795
2846
  type: Input
2796
2847
  }], board: [{
2797
2848
  type: Input
2798
2849
  }], element: [{
2799
2850
  type: Input
2851
+ }], isFocus: [{
2852
+ type: Input
2800
2853
  }] } });
2801
2854
 
2802
2855
  class NodeImageDrawer {
@@ -2805,44 +2858,39 @@ class NodeImageDrawer {
2805
2858
  this.viewContainerRef = viewContainerRef;
2806
2859
  this.componentRef = null;
2807
2860
  }
2808
- drawImage(element) {
2809
- this.destroy();
2810
- if (MindElement.hasImage(element)) {
2811
- this.g = createG();
2812
- const foreignRectangle = getImageForeignRectangle(this.board, element);
2813
- const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
2814
- this.g.append(foreignObject);
2815
- if (this.componentRef) {
2816
- this.componentRef.destroy();
2817
- this.componentRef = null;
2818
- }
2819
- const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType || MindImageBaseComponent;
2820
- if (!componentType) {
2821
- throw new Error('Not implement drawEmoji method error.');
2822
- }
2823
- this.componentRef = this.viewContainerRef.createComponent(componentType);
2824
- this.componentRef.instance.board = this.board;
2825
- this.componentRef.instance.element = element;
2826
- this.componentRef.instance.imageItem = element.data.image;
2827
- foreignObject.append(this.componentRef.instance.nativeElement);
2828
- return this.g;
2861
+ drawImage(nodeG, element) {
2862
+ if (!MindElement.hasImage(element)) {
2863
+ this.destroy();
2864
+ return;
2829
2865
  }
2830
- return undefined;
2831
- }
2832
- drawActive(element) {
2833
- this.destroyActive();
2834
- const imageRectangle = getImageForeignRectangle(this.board, element);
2835
- const rectangle = RectangleClient.getOutlineRectangle(imageRectangle, -1);
2836
- const roughSVG = PlaitBoard.getRoughSVG(this.board);
2837
- this.activeG = roughSVG.rectangle(rectangle.x, rectangle.y, rectangle.width, rectangle.height, {
2838
- stroke: PRIMARY_COLOR,
2839
- fill: '',
2840
- fillStyle: 'solid'
2841
- });
2842
- this.g?.append(this.activeG);
2843
- }
2844
- destroyActive() {
2845
- this.activeG?.remove();
2866
+ this.g = createG();
2867
+ const foreignRectangle = getImageForeignRectangle(this.board, element);
2868
+ const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
2869
+ this.g.append(foreignObject);
2870
+ const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType || MindImageBaseComponent;
2871
+ if (!componentType) {
2872
+ throw new Error('Not implement drawEmoji method error.');
2873
+ }
2874
+ this.componentRef = this.viewContainerRef.createComponent(componentType);
2875
+ this.componentRef.instance.board = this.board;
2876
+ this.componentRef.instance.element = element;
2877
+ this.componentRef.instance.imageItem = element.data.image;
2878
+ this.componentRef.instance.cdr.markForCheck();
2879
+ foreignObject.append(this.componentRef.instance.nativeElement);
2880
+ nodeG.appendChild(this.g);
2881
+ }
2882
+ updateImage(nodeG, previous, current) {
2883
+ if (!MindElement.hasImage(previous) || !MindElement.hasImage(current)) {
2884
+ this.drawImage(nodeG, current);
2885
+ return;
2886
+ }
2887
+ if (previous !== current && this.componentRef) {
2888
+ this.componentRef.instance.element = current;
2889
+ this.componentRef.instance.imageItem = current.data.image;
2890
+ }
2891
+ const currentForeignObject = getImageForeignRectangle(this.board, current);
2892
+ updateForeignObject(this.g, currentForeignObject.width, currentForeignObject.height, currentForeignObject.x, currentForeignObject.y);
2893
+ this.componentRef?.instance.cdr.markForCheck();
2846
2894
  }
2847
2895
  destroy() {
2848
2896
  if (this.g) {
@@ -2905,13 +2953,17 @@ class MindNodeComponent extends PlaitPluginElementComponent {
2905
2953
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: this.textManage.isEditing });
2906
2954
  this.drawEmojis();
2907
2955
  this.drawExtend();
2908
- this.drawImage();
2956
+ this.imageDrawer.drawImage(this.g, this.element);
2909
2957
  if (PlaitMind.isMind(this.context.parent)) {
2910
2958
  this.g.classList.add('branch');
2911
2959
  }
2912
2960
  }
2913
2961
  editTopic() {
2914
2962
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: true });
2963
+ if (this.element.manualWidth) {
2964
+ const width = NodeSpace.getNodeResizableWidth(this.board, this.element);
2965
+ this.textManage.updateWidth(width);
2966
+ }
2915
2967
  this.textManage.edit((origin) => {
2916
2968
  if (origin === ExitOrigin.default) {
2917
2969
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: false });
@@ -2928,8 +2980,8 @@ class MindNodeComponent extends PlaitPluginElementComponent {
2928
2980
  this.drawShape();
2929
2981
  this.drawLink();
2930
2982
  this.drawEmojis();
2931
- this.drawImage();
2932
2983
  this.drawExtend();
2984
+ this.imageDrawer.updateImage(this.g, previous.element, value.element);
2933
2985
  this.textManage.updateText(this.element.data.topic);
2934
2986
  this.textManage.updateRectangle();
2935
2987
  }
@@ -2950,12 +3002,6 @@ class MindNodeComponent extends PlaitPluginElementComponent {
2950
3002
  this.g.append(g);
2951
3003
  }
2952
3004
  }
2953
- drawImage() {
2954
- const image = this.imageDrawer.drawImage(this.element);
2955
- if (image) {
2956
- this.g.append(image);
2957
- }
2958
- }
2959
3005
  drawShape() {
2960
3006
  this.destroyShape();
2961
3007
  const shape = getShapeByElement(this.board, this.node.origin);
@@ -3220,11 +3266,11 @@ const withNodeDnd = (board) => {
3220
3266
  activeElements = [targetElement];
3221
3267
  startPoint = point;
3222
3268
  }
3223
- event.preventDefault();
3224
3269
  }
3225
3270
  if (activeElements.length) {
3226
- correspondingElements = getOverallAbstracts(board, activeElements);
3271
+ // prevent text from being selected
3227
3272
  event.preventDefault();
3273
+ correspondingElements = getOverallAbstracts(board, activeElements);
3228
3274
  }
3229
3275
  mousedown(event);
3230
3276
  };
@@ -3499,7 +3545,6 @@ const withAbstract = (board) => {
3499
3545
  const endPoint = transformPoint(board, toPoint(event.x, event.y, host));
3500
3546
  touchedAbstract = handleTouchedAbstract(board, touchedAbstract, endPoint);
3501
3547
  if (abstractHandlePosition && activeAbstractElement) {
3502
- event.preventDefault();
3503
3548
  const abstractComponent = PlaitElement.getComponent(activeAbstractElement);
3504
3549
  const element = abstractComponent.element;
3505
3550
  const nodeLayout = MindQueries.getCorrectLayoutByElement(board, activeAbstractElement);
@@ -3677,7 +3722,8 @@ const withCreateMind = (board) => {
3677
3722
  return newBoard;
3678
3723
  };
3679
3724
 
3680
- const withMindHotkey = (board) => {
3725
+ const withMindHotkey = (baseBoard) => {
3726
+ const board = baseBoard;
3681
3727
  const { keydown } = board;
3682
3728
  board.keydown = (event) => {
3683
3729
  const selectedElements = getSelectedElements(board);
@@ -3789,49 +3835,45 @@ const isSpaceHotkey = (event) => {
3789
3835
  return event.code === 'Space';
3790
3836
  };
3791
3837
 
3792
- const withNodeHover = (board) => {
3793
- const { mousemove, mouseleave } = board;
3794
- let hoveredMindElement = null;
3795
- board.mousemove = (event) => {
3796
- throttleRAF(() => {
3797
- let target = null;
3798
- const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3799
- depthFirstRecursion(board, element => {
3800
- if (target) {
3801
- return;
3802
- }
3803
- if (!MindElement.isMindElement(board, element)) {
3804
- return;
3805
- }
3806
- const isHitElement = isHitMindElement(board, point, element);
3807
- if (isHitElement) {
3808
- target = element;
3809
- }
3810
- }, getIsRecursionFunc(board), true);
3811
- if (hoveredMindElement && target && hoveredMindElement === target) {
3812
- return;
3813
- }
3814
- if (hoveredMindElement) {
3815
- removeHovered(hoveredMindElement);
3816
- }
3817
- if (target) {
3818
- addHovered(target);
3819
- hoveredMindElement = target;
3820
- }
3821
- else {
3822
- hoveredMindElement = null;
3823
- }
3824
- });
3825
- mousemove(event);
3826
- };
3827
- board.mouseleave = (event) => {
3828
- if (hoveredMindElement) {
3829
- removeHovered(hoveredMindElement);
3830
- hoveredMindElement = null;
3838
+ const mouseMoveHandle = (board, event, nodeHoveredExtendRef) => {
3839
+ let target = null;
3840
+ const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3841
+ depthFirstRecursion(board, element => {
3842
+ if (target) {
3843
+ return;
3831
3844
  }
3832
- mouseleave(event);
3833
- };
3834
- return board;
3845
+ if (!MindElement.isMindElement(board, element)) {
3846
+ return;
3847
+ }
3848
+ const isHitElement = isHitMindElement(board, point, element);
3849
+ if (isHitElement) {
3850
+ target = element;
3851
+ }
3852
+ }, getIsRecursionFunc(board), true);
3853
+ if (nodeHoveredExtendRef && target && nodeHoveredExtendRef.element === target) {
3854
+ return nodeHoveredExtendRef;
3855
+ }
3856
+ if (nodeHoveredExtendRef) {
3857
+ removeHovered(nodeHoveredExtendRef.element);
3858
+ }
3859
+ if (target) {
3860
+ addHovered(target);
3861
+ if (nodeHoveredExtendRef) {
3862
+ nodeHoveredExtendRef.element = target;
3863
+ }
3864
+ else {
3865
+ nodeHoveredExtendRef = { element: target };
3866
+ }
3867
+ }
3868
+ else {
3869
+ nodeHoveredExtendRef = null;
3870
+ }
3871
+ return nodeHoveredExtendRef;
3872
+ };
3873
+ const mouseLeaveHandle = (board, event, nodeHoveredExtendRef) => {
3874
+ if (nodeHoveredExtendRef) {
3875
+ removeHovered(nodeHoveredExtendRef.element);
3876
+ }
3835
3877
  };
3836
3878
  const addHovered = (element) => {
3837
3879
  const component = PlaitElement.getComponent(element);
@@ -3844,11 +3886,29 @@ const removeHovered = (element) => {
3844
3886
  }
3845
3887
  };
3846
3888
 
3847
- const withMindImage = (board) => {
3848
- let selectedImageElement = null;
3849
- const { keydown, mousedown } = board;
3889
+ const withNodeHoverDetect = (board) => {
3890
+ const { mousemove, mouseleave } = board;
3891
+ let nodeHoveredExtendRef = null;
3892
+ board.mousemove = (event) => {
3893
+ nodeHoveredExtendRef = mouseMoveHandle(board, event, nodeHoveredExtendRef);
3894
+ mousemove(event);
3895
+ };
3896
+ board.mouseleave = (event) => {
3897
+ mouseLeaveHandle(board, event, nodeHoveredExtendRef);
3898
+ nodeHoveredExtendRef = null;
3899
+ mouseleave(event);
3900
+ };
3901
+ return board;
3902
+ };
3903
+
3904
+ const withNodeImage = (board) => {
3905
+ const { keydown, mousedown, globalMouseup } = board;
3850
3906
  board.mousedown = (event) => {
3907
+ const selectedImageElement = getSelectedImageElement(board);
3851
3908
  if (PlaitBoard.isReadonly(board) || !isMainPointer(event) || !PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
3909
+ if (selectedImageElement) {
3910
+ setImageFocus(board, selectedImageElement, false);
3911
+ }
3852
3912
  mousedown(event);
3853
3913
  return;
3854
3914
  }
@@ -3857,38 +3917,159 @@ const withMindImage = (board) => {
3857
3917
  const hitElements = getHitElements(board, { ranges: [range] });
3858
3918
  const hasImage = hitElements.length && MindElement.hasImage(hitElements[0]);
3859
3919
  const hitImage = hasImage && isHitImage(board, hitElements[0], range);
3920
+ if (selectedImageElement && hitImage && hitElements[0] === selectedImageElement) {
3921
+ temporaryDisableSelection(board);
3922
+ mousedown(event);
3923
+ return;
3924
+ }
3925
+ if (selectedImageElement) {
3926
+ setImageFocus(board, selectedImageElement, false);
3927
+ }
3860
3928
  if (hitImage) {
3861
- const currentOptions = board.getPluginOptions(PlaitPluginKey.withSelection);
3862
- board.setPluginOptions(PlaitPluginKey.withSelection, {
3863
- isDisabledSelect: true
3864
- });
3865
- setTimeout(() => {
3866
- board.setPluginOptions(PlaitPluginKey.withSelection, { ...currentOptions });
3867
- }, 0);
3868
- selectedImageElement = hitElements[0];
3869
- const component = PlaitElement.getComponent(selectedImageElement);
3870
- component.imageDrawer.drawActive(selectedImageElement);
3929
+ temporaryDisableSelection(board);
3930
+ setImageFocus(board, hitElements[0], true);
3871
3931
  clearSelectedElement(board);
3872
3932
  }
3873
- else {
3874
- if (selectedImageElement) {
3875
- const component = PlaitElement.getComponent(selectedImageElement);
3876
- component && component.imageDrawer.destroyActive();
3877
- }
3878
- selectedImageElement = null;
3879
- }
3880
3933
  mousedown(event);
3881
3934
  };
3882
3935
  board.keydown = (event) => {
3936
+ const selectedImageElement = getSelectedImageElement(board);
3883
3937
  if (!PlaitBoard.isReadonly(board) && selectedImageElement && (hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event))) {
3938
+ addSelectedElement(board, selectedImageElement);
3939
+ setImageFocus(board, selectedImageElement, false);
3884
3940
  MindTransforms.removeImage(board, selectedImageElement);
3885
- selectedImageElement = null;
3886
3941
  return;
3887
3942
  }
3888
3943
  keydown(event);
3889
3944
  };
3945
+ board.globalMouseup = (event) => {
3946
+ if (PlaitBoard.isFocus(board)) {
3947
+ const isInBoard = event.target instanceof Node && PlaitBoard.getBoardContainer(board).contains(event.target);
3948
+ const selectedImageElement = getSelectedImageElement(board);
3949
+ // Clear image selection when mouse board outside area
3950
+ if (selectedImageElement && !isInBoard) {
3951
+ setImageFocus(board, selectedImageElement, false);
3952
+ }
3953
+ }
3954
+ globalMouseup(event);
3955
+ };
3956
+ return board;
3957
+ };
3958
+
3959
+ const withNodeResize = (board) => {
3960
+ const { mousedown, mousemove, globalMouseup } = board;
3961
+ let targetElement = null;
3962
+ let targetElementRef = null;
3963
+ let startPoint = null;
3964
+ board.mousedown = (event) => {
3965
+ if (targetElement) {
3966
+ startPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3967
+ // prevent text from being selected
3968
+ event.preventDefault();
3969
+ return;
3970
+ }
3971
+ mousedown(event);
3972
+ };
3973
+ board.mousemove = (event) => {
3974
+ if (PlaitBoard.isReadonly(board) || PlaitBoard.hasBeenTextEditing(board)) {
3975
+ mousemove(event);
3976
+ return;
3977
+ }
3978
+ if (startPoint && targetElement && !isMindNodeResizing(board)) {
3979
+ const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3980
+ const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
3981
+ if (distance > PRESS_AND_MOVE_BUFFER) {
3982
+ startPoint = endPoint;
3983
+ addResizing(board, targetElement);
3984
+ targetElementRef = {
3985
+ minWidth: NodeSpace.getNodeResizableMinWidth(board, targetElement),
3986
+ currentWidth: NodeSpace.getNodeResizableWidth(board, targetElement),
3987
+ path: PlaitBoard.findPath(board, targetElement),
3988
+ textManage: PlaitElement.getComponent(targetElement).textManage
3989
+ };
3990
+ MERGING.set(board, true);
3991
+ }
3992
+ }
3993
+ if (isMindNodeResizing(board) && startPoint && targetElementRef) {
3994
+ throttleRAF(() => {
3995
+ const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3996
+ const offsetX = endPoint[0] - startPoint[0];
3997
+ let resizedWidth = targetElementRef.currentWidth + offsetX;
3998
+ if (resizedWidth < targetElementRef.minWidth) {
3999
+ resizedWidth = targetElementRef.minWidth;
4000
+ }
4001
+ const newTarget = PlaitNode.get(board, targetElementRef.path);
4002
+ if (newTarget && NodeSpace.getNodeTopicMinWidth(board, newTarget) !== resizedWidth) {
4003
+ targetElementRef.textManage.updateWidth(resizedWidth);
4004
+ const { width, height } = targetElementRef.textManage.getSize();
4005
+ MindTransforms.setNodeManualWidth(board, newTarget, resizedWidth, height);
4006
+ }
4007
+ });
4008
+ return;
4009
+ }
4010
+ else {
4011
+ // press and start drag when node is non selected
4012
+ if (!isDragging(board)) {
4013
+ const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
4014
+ const newTargetElement = getTargetElement(board, point);
4015
+ if (newTargetElement) {
4016
+ PlaitBoard.getBoardContainer(board).classList.add(ResizeCursorClass['ew-resize']);
4017
+ }
4018
+ else {
4019
+ PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew-resize']);
4020
+ }
4021
+ targetElement = newTargetElement;
4022
+ }
4023
+ }
4024
+ mousemove(event);
4025
+ };
4026
+ board.globalMouseup = (event) => {
4027
+ globalMouseup(event);
4028
+ if (isMindNodeResizing(board) || targetElement) {
4029
+ targetElement && removeResizing(board, targetElement);
4030
+ targetElementRef = null;
4031
+ targetElement = null;
4032
+ startPoint = null;
4033
+ MERGING.set(board, false);
4034
+ }
4035
+ };
3890
4036
  return board;
3891
4037
  };
4038
+ const IS_MIND_NODE_RESIZING = new WeakMap();
4039
+ const isMindNodeResizing = (board) => {
4040
+ return !!IS_MIND_NODE_RESIZING.get(board);
4041
+ };
4042
+ const addResizing = (board, element) => {
4043
+ PlaitBoard.getBoardContainer(board).classList.add('mind-node-resizing');
4044
+ const component = PlaitElement.getComponent(element);
4045
+ component.g.classList.add('resizing');
4046
+ IS_MIND_NODE_RESIZING.set(board, true);
4047
+ };
4048
+ const removeResizing = (board, element) => {
4049
+ PlaitBoard.getBoardContainer(board).classList.remove('mind-node-resizing');
4050
+ PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew-resize']);
4051
+ const component = PlaitElement.getComponent(element);
4052
+ if (component && component.g) {
4053
+ component.g.classList.remove('resizing');
4054
+ }
4055
+ IS_MIND_NODE_RESIZING.set(board, false);
4056
+ };
4057
+ const getTargetElement = (board, point) => {
4058
+ const selectedElements = getSelectedElements(board).filter(value => MindElement.isMindElement(board, value));
4059
+ if (selectedElements.length > 0) {
4060
+ const target = selectedElements.find(value => {
4061
+ const rectangle = getResizeActiveRectangle(board, value);
4062
+ return distanceBetweenPointAndRectangle(point[0], point[1], rectangle) <= 0;
4063
+ });
4064
+ return target ? target : null;
4065
+ }
4066
+ return null;
4067
+ };
4068
+ const getResizeActiveRectangle = (board, element) => {
4069
+ const node = MindElement.getNode(element);
4070
+ const rectangle = getRectangleByNode(node);
4071
+ return { x: rectangle.x + rectangle.width - EXTEND_OFFSET, y: rectangle.y, width: EXTEND_OFFSET * 2, height: rectangle.height };
4072
+ };
3892
4073
 
3893
4074
  const withMind = (baseBoard) => {
3894
4075
  const board = baseBoard;
@@ -3995,7 +4176,7 @@ const withMind = (baseBoard) => {
3995
4176
  MindTransforms.removeElements(board, selectedElements);
3996
4177
  deleteFragment(data);
3997
4178
  };
3998
- return withMindImage(withNodeHover(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board)))))));
4179
+ return withNodeResize(withNodeImage(withNodeHoverDetect(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board))))))));
3999
4180
  };
4000
4181
 
4001
4182
  class MindEmojiBaseComponent {
@@ -4049,5 +4230,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
4049
4230
  * Generated bundle index. Do not edit.
4050
4231
  */
4051
4232
 
4052
- 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 };
4233
+ 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 };
4053
4234
  //# sourceMappingURL=plait-mind.mjs.map