@plait/mind 0.19.0 → 0.21.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 (52) hide show
  1. package/base/base.drawer.d.ts +3 -3
  2. package/base/image-base.component.d.ts +5 -3
  3. package/constants/index.d.ts +0 -1
  4. package/drawer/node-image.drawer.d.ts +3 -5
  5. package/esm2020/base/base.drawer.mjs +1 -1
  6. package/esm2020/base/image-base.component.mjs +9 -5
  7. package/esm2020/constants/index.mjs +1 -2
  8. package/esm2020/drawer/node-image.drawer.mjs +34 -39
  9. package/esm2020/interfaces/element.mjs +1 -1
  10. package/esm2020/node.component.mjs +8 -9
  11. package/esm2020/plugins/with-abstract-resize.mjs +1 -2
  12. package/esm2020/plugins/with-mind-hotkey.mjs +3 -2
  13. package/esm2020/plugins/with-mind.mjs +9 -14
  14. package/esm2020/plugins/with-node-dnd.mjs +5 -5
  15. package/esm2020/plugins/with-node-hover.mjs +3 -10
  16. package/esm2020/plugins/with-node-image.mjs +46 -0
  17. package/esm2020/plugins/with-node-resize.mjs +119 -0
  18. package/esm2020/transforms/index.mjs +3 -2
  19. package/esm2020/transforms/node.mjs +19 -7
  20. package/esm2020/utils/clipboard.mjs +4 -4
  21. package/esm2020/utils/dnd/detector.mjs +3 -10
  22. package/esm2020/utils/mind.mjs +3 -3
  23. package/esm2020/utils/node/adjust-node.mjs +3 -3
  24. package/esm2020/utils/node/common.mjs +11 -2
  25. package/esm2020/utils/node/image.mjs +23 -0
  26. package/esm2020/utils/position/image.mjs +9 -4
  27. package/esm2020/utils/position/topic.mjs +3 -3
  28. package/esm2020/utils/space/node-space.mjs +59 -24
  29. package/fesm2015/plait-mind.mjs +312 -148
  30. package/fesm2015/plait-mind.mjs.map +1 -1
  31. package/fesm2020/plait-mind.mjs +312 -147
  32. package/fesm2020/plait-mind.mjs.map +1 -1
  33. package/interfaces/element.d.ts +1 -0
  34. package/node.component.d.ts +0 -1
  35. package/package.json +1 -1
  36. package/plugins/with-mind-hotkey.d.ts +2 -1
  37. package/plugins/with-mind.d.ts +1 -1
  38. package/plugins/with-node-image.d.ts +2 -0
  39. package/plugins/with-node-resize.d.ts +10 -0
  40. package/styles/styles.scss +9 -2
  41. package/transforms/index.d.ts +3 -2
  42. package/transforms/node.d.ts +4 -2
  43. package/utils/clipboard.d.ts +3 -2
  44. package/utils/mind.d.ts +3 -2
  45. package/utils/node/adjust-node.d.ts +2 -1
  46. package/utils/node/common.d.ts +2 -0
  47. package/utils/node/image.d.ts +6 -0
  48. package/utils/space/node-space.d.ts +9 -3
  49. package/constants/node-rule.d.ts +0 -1
  50. package/esm2020/constants/node-rule.mjs +0 -2
  51. package/esm2020/plugins/with-mind-image.mjs +0 -49
  52. package/plugins/with-mind-image.d.ts +0 -2
@@ -1,9 +1,9 @@
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, drawLinearPath, drawBezierPath, createG, updateForeignObject, drawRoundRectangle, getRectangleByElements, getSelectedElements, NODE_TO_PARENT, distanceBetweenPointAndRectangle, createForeignObject, createText, PlaitPointerType, PlaitPluginElementComponent, NODE_TO_INDEX, PlaitModule, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint, CLIP_BOARD_FORMAT_KEY, isMainPointer, 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
- import { TEXT_DEFAULT_HEIGHT, buildText, getTextSize, TextManage, ExitOrigin, TextModule, getTextFromClipboard } from '@plait/text';
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
8
  import { Node, Path as Path$1 } from 'slate';
9
9
  import { isKeyHotkey } from 'is-hotkey';
@@ -180,13 +180,21 @@ function getEmojiFontSize(element) {
180
180
  }
181
181
  }
182
182
 
183
+ const TOPIC_COLOR = '#333';
184
+ const TOPIC_FONT_SIZE = 14;
185
+ const ROOT_TOPIC_FONT_SIZE = 18;
186
+ const ROOT_TOPIC_HEIGHT = 25;
187
+ const TOPIC_DEFAULT_MAX_WORD_COUNT = 34;
188
+ const DEFAULT_FONT_FAMILY = 'PingFangSC-Regular, "PingFang SC"';
189
+ const BRANCH_FONT_FAMILY = 'PingFangSC-Medium, "PingFang SC"';
190
+
183
191
  const NodeDefaultSpace = {
184
192
  horizontal: {
185
- nodeAndText: BASE * 3,
193
+ nodeAndText: BASE * 2.5,
186
194
  emojiAndText: BASE * 1.5
187
195
  },
188
196
  vertical: {
189
- nodeAndText: BASE * 1.5,
197
+ nodeAndText: BASE,
190
198
  nodeAndImage: BASE,
191
199
  imageAndText: BASE * 1.5
192
200
  }
@@ -203,12 +211,14 @@ const RootDefaultSpace = {
203
211
  const getHorizontalSpaceBetweenNodeAndText = (board, element) => {
204
212
  const isMind = PlaitMind.isMind(element);
205
213
  const nodeAndText = isMind ? RootDefaultSpace.horizontal.nodeAndText : NodeDefaultSpace.horizontal.nodeAndText;
206
- return nodeAndText;
214
+ const strokeWidth = getStrokeWidthByElement(board, element);
215
+ return nodeAndText + strokeWidth / 2;
207
216
  };
208
- const getVerticalSpaceBetweenNodeAndText = (element) => {
217
+ const getVerticalSpaceBetweenNodeAndText = (board, element) => {
209
218
  const isMind = PlaitMind.isMind(element);
219
+ const strokeWidth = getStrokeWidthByElement(board, element);
210
220
  const nodeAndText = isMind ? RootDefaultSpace.vertical.nodeAndText : NodeDefaultSpace.vertical.nodeAndText;
211
- return nodeAndText;
221
+ return nodeAndText + strokeWidth / 2;
212
222
  };
213
223
  const getSpaceEmojiAndText = (element) => {
214
224
  const isMind = PlaitMind.isMind(element);
@@ -217,29 +227,45 @@ const getSpaceEmojiAndText = (element) => {
217
227
  };
218
228
  const NodeSpace = {
219
229
  getNodeWidth(board, element) {
220
- var _a;
221
230
  const nodeAndText = getHorizontalSpaceBetweenNodeAndText(board, element);
222
- const imageWidth = MindElement.hasImage(element) ? (_a = element.data.image) === null || _a === void 0 ? void 0 : _a.width : 0;
223
231
  if (MindElement.hasEmojis(element)) {
224
232
  return (NodeSpace.getEmojiLeftSpace(board, element) +
225
233
  getEmojisWidthHeight(board, element).width +
226
234
  getSpaceEmojiAndText(element) +
227
- Math.max(element.width, imageWidth) +
235
+ NodeSpace.getNodeResizableWidth(board, element) +
228
236
  nodeAndText);
229
237
  }
230
- return nodeAndText + Math.max(element.width, imageWidth) + nodeAndText;
238
+ return nodeAndText + NodeSpace.getNodeResizableWidth(board, element) + nodeAndText;
231
239
  },
232
240
  getNodeHeight(board, element) {
233
- const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
241
+ const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
234
242
  if (MindElement.hasImage(element)) {
235
- return (NodeDefaultSpace.vertical.nodeAndImage +
236
- element.data.image.height +
237
- NodeDefaultSpace.vertical.imageAndText +
238
- element.height +
239
- nodeAndText);
243
+ return NodeSpace.getTextTopSpace(board, element) + element.height + nodeAndText;
240
244
  }
241
245
  return nodeAndText + element.height + nodeAndText;
242
246
  },
247
+ getNodeResizableWidth(board, element) {
248
+ var _a;
249
+ const width = element.manualWidth || element.width;
250
+ const imageWidth = MindElement.hasImage(element) ? (_a = element.data.image) === null || _a === void 0 ? void 0 : _a.width : 0;
251
+ return Math.max(width, imageWidth);
252
+ },
253
+ getNodeResizableMinWidth(board, element) {
254
+ const minTopicWidth = NodeSpace.getNodeTopicMinWidth(board, element);
255
+ if (MindElement.hasImage(element) && element.data.image.width > minTopicWidth) {
256
+ return element.data.image.width;
257
+ }
258
+ else {
259
+ return minTopicWidth;
260
+ }
261
+ },
262
+ getNodeTopicMinWidth(board, element, isRoot = false) {
263
+ const defaultFontSize = getNodeDefaultFontSize(isRoot);
264
+ const editor = MindElement.getTextEditor(element);
265
+ const marks = PlaitMarkEditor.getMarks(editor);
266
+ const fontSize = marks[MarkTypes.fontSize] || defaultFontSize;
267
+ return fontSize;
268
+ },
243
269
  getTextLeftSpace(board, element) {
244
270
  const nodeAndText = getHorizontalSpaceBetweenNodeAndText(board, element);
245
271
  if (MindElement.hasEmojis(element)) {
@@ -249,28 +275,43 @@ const NodeSpace = {
249
275
  return nodeAndText;
250
276
  }
251
277
  },
252
- getTextTopSpace(element) {
253
- const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
278
+ getTextTopSpace(board, element) {
279
+ const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
254
280
  if (MindElement.hasImage(element)) {
255
- return element.data.image.height + NodeDefaultSpace.vertical.nodeAndImage + NodeDefaultSpace.vertical.imageAndText;
281
+ return NodeSpace.getImageTopSpace(board, element) + element.data.image.height + NodeDefaultSpace.vertical.imageAndText;
256
282
  }
257
283
  else {
258
284
  return nodeAndText;
259
285
  }
260
286
  },
261
- getImageTopSpace(element) {
262
- return NodeDefaultSpace.vertical.nodeAndImage;
287
+ getImageTopSpace(board, element) {
288
+ const strokeWidth = getStrokeWidthByElement(board, element);
289
+ return strokeWidth / 2 + NodeDefaultSpace.vertical.nodeAndImage;
263
290
  },
264
291
  getEmojiLeftSpace(board, element) {
265
292
  const options = board.getPluginOptions(WithMindPluginKey);
266
293
  const nodeAndText = getHorizontalSpaceBetweenNodeAndText(board, element);
267
- return nodeAndText - options.emojiPadding;
294
+ const strokeWidth = getStrokeWidthByElement(board, element);
295
+ return strokeWidth / 2 + nodeAndText - options.emojiPadding;
268
296
  },
269
- getEmojiTopSpace(element) {
270
- const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
297
+ getEmojiTopSpace(board, element) {
298
+ const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
271
299
  return nodeAndText;
272
300
  }
273
301
  };
302
+ const getFontSizeBySlateElement = (text) => {
303
+ const defaultFontSize = DEFAULT_FONT_SIZE;
304
+ if (typeof text === 'string') {
305
+ return defaultFontSize;
306
+ }
307
+ const marks = PlaitMarkEditor.getMarksByElement(text);
308
+ const fontSize = marks[MarkTypes.fontSize] || defaultFontSize;
309
+ return fontSize;
310
+ };
311
+ const getNodeDefaultFontSize = (isRoot = false) => {
312
+ const defaultFontSize = isRoot ? ROOT_TOPIC_FONT_SIZE : DEFAULT_FONT_SIZE;
313
+ return defaultFontSize;
314
+ };
274
315
 
275
316
  function getEmojiRectangle(board, element) {
276
317
  let { x, y } = getRectangleByNode(MindElement.getNode(element));
@@ -307,43 +348,47 @@ function getTopicRectangleByNode(board, node) {
307
348
  }
308
349
  function getTopicRectangleByElement(board, nodeRectangle, element) {
309
350
  const x = nodeRectangle.x + NodeSpace.getTextLeftSpace(board, element);
310
- const y = nodeRectangle.y + NodeSpace.getTextTopSpace(element);
311
- const width = Math.ceil(element.width);
351
+ const y = nodeRectangle.y + NodeSpace.getTextTopSpace(board, element);
352
+ const width = NodeSpace.getNodeResizableWidth(board, element);
312
353
  const height = Math.ceil(element.height);
313
354
  return { height, width, x, y };
314
355
  }
315
356
 
316
357
  function getImageForeignRectangle(board, element) {
317
358
  let { x, y } = getRectangleByNode(MindElement.getNode(element));
318
- x = x + NodeSpace.getTextLeftSpace(board, element);
319
- 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;
320
365
  const { width, height } = element.data.image;
321
- return {
366
+ const rectangle = {
322
367
  x,
323
368
  y,
324
369
  width,
325
370
  height
326
371
  };
372
+ return RectangleClient.getOutlineRectangle(rectangle, -6);
327
373
  }
328
374
  const isHitImage = (board, element, range) => {
329
375
  const client = getImageForeignRectangle(board, element);
330
376
  return RectangleClient.isHit(RectangleClient.toRectangleClient([range.anchor, range.focus]), client);
331
377
  };
332
378
 
333
- const NODE_MIN_WIDTH = 18;
334
-
335
379
  function editTopic(element) {
336
380
  const component = PlaitElement.getComponent(element);
337
381
  component === null || component === void 0 ? void 0 : component.editTopic();
338
382
  }
339
-
340
- const TOPIC_COLOR = '#333';
341
- const TOPIC_FONT_SIZE = 14;
342
- const ROOT_TOPIC_FONT_SIZE = 18;
343
- const ROOT_TOPIC_HEIGHT = 25;
344
- const TOPIC_DEFAULT_MAX_WORD_COUNT = 34;
345
- const DEFAULT_FONT_FAMILY = 'PingFangSC-Regular, "PingFang SC"';
346
- const BRANCH_FONT_FAMILY = 'PingFangSC-Medium, "PingFang SC"';
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
+ };
347
392
 
348
393
  const createEmptyMind = (point) => {
349
394
  const element = createMindElement('思维导图', 72, ROOT_TOPIC_HEIGHT, { layout: MindLayoutType.right });
@@ -454,7 +499,7 @@ const insertMindElement = (board, inheritNode, path) => {
454
499
  });
455
500
  delete newNode.layout;
456
501
  }
457
- const newElement = createMindElement('', NODE_MIN_WIDTH, TEXT_DEFAULT_HEIGHT, newNode);
502
+ const newElement = createMindElement('', getNodeDefaultFontSize(), TEXT_DEFAULT_HEIGHT, newNode);
458
503
  Transforms.insertNode(board, newElement, path);
459
504
  clearSelectedElement(board);
460
505
  addSelectedElement(board, newElement);
@@ -620,7 +665,7 @@ const adjustNodeToRoot = (board, node) => {
620
665
  fontSize: ROOT_TOPIC_FONT_SIZE,
621
666
  fontFamily: BRANCH_FONT_FAMILY
622
667
  });
623
- newElement.width = Math.max(width, NODE_MIN_WIDTH);
668
+ newElement.width = Math.max(width, getNodeDefaultFontSize(true));
624
669
  newElement.height = height;
625
670
  return Object.assign(Object.assign({}, newElement), { layout: (_a = newElement.layout) !== null && _a !== void 0 ? _a : MindLayoutType.right, isRoot: true, type: 'mindmap' });
626
671
  };
@@ -1036,14 +1081,7 @@ const detectDropTarget = (board, detectPoint, dropTarget, activeElements) => {
1036
1081
  if (detectResult && isValid) {
1037
1082
  dropTarget = { target: node.origin, detectResult: detectResult[0] };
1038
1083
  }
1039
- }, node => {
1040
- if (PlaitBoard.isBoard(node) || board.isRecursion(node)) {
1041
- return true;
1042
- }
1043
- else {
1044
- return false;
1045
- }
1046
- });
1084
+ }, getIsRecursionFunc(board));
1047
1085
  return dropTarget;
1048
1086
  };
1049
1087
  const directionDetector = (targetNode, centerPoint) => {
@@ -2212,19 +2250,31 @@ const correctLogicLayoutNode = (board, layout, path) => {
2212
2250
  }
2213
2251
  };
2214
2252
 
2215
- const normalizeWidthAndHeight = (board, width, height) => {
2216
- const newWidth = width < NODE_MIN_WIDTH * board.viewport.zoom ? NODE_MIN_WIDTH : width / board.viewport.zoom;
2253
+ const normalizeWidthAndHeight = (board, element, width, height) => {
2254
+ const minWidth = NodeSpace.getNodeTopicMinWidth(board, element, element.isRoot);
2255
+ const newWidth = width < minWidth * board.viewport.zoom ? minWidth : width / board.viewport.zoom;
2217
2256
  const newHeight = height / board.viewport.zoom;
2218
2257
  return { width: newWidth, height: newHeight };
2219
2258
  };
2220
2259
  const setTopic = (board, element, topic, width, height) => {
2221
- const newElement = Object.assign({ data: Object.assign(Object.assign({}, element.data), { topic }) }, normalizeWidthAndHeight(board, width, height));
2260
+ const newElement = Object.assign({ data: Object.assign(Object.assign({}, element.data), { topic }) }, normalizeWidthAndHeight(board, element, width, height));
2261
+ const path = PlaitBoard.findPath(board, element);
2262
+ Transforms.setNode(board, newElement, path);
2263
+ };
2264
+ const setNodeManualWidth = (board, element, width, height) => {
2222
2265
  const path = PlaitBoard.findPath(board, element);
2266
+ const { width: normalizedWidth, height: normalizedHeight } = normalizeWidthAndHeight(board, element, width, height);
2267
+ const newElement = { manualWidth: normalizedWidth, height: normalizedHeight };
2223
2268
  Transforms.setNode(board, newElement, path);
2224
2269
  };
2225
2270
  const setTopicSize = (board, element, width, height) => {
2226
- const newElement = Object.assign({}, normalizeWidthAndHeight(board, width, height));
2227
- if (element.width !== newElement.width || element.height !== newElement.height) {
2271
+ const newElement = Object.assign({}, normalizeWidthAndHeight(board, element, width, height));
2272
+ let isEqualWidth = Math.ceil(element.width) === Math.ceil(newElement.width);
2273
+ let isEqualHeight = Math.ceil(element.height) === Math.ceil(newElement.height);
2274
+ if (element.manualWidth) {
2275
+ isEqualWidth = true;
2276
+ }
2277
+ if (!isEqualWidth || !isEqualHeight) {
2228
2278
  const path = PlaitBoard.findPath(board, element);
2229
2279
  Transforms.setNode(board, newElement, path);
2230
2280
  }
@@ -2318,6 +2368,7 @@ const MindTransforms = {
2318
2368
  setLayout,
2319
2369
  setTopic,
2320
2370
  setTopicSize,
2371
+ setNodeManualWidth,
2321
2372
  addEmoji,
2322
2373
  removeEmoji,
2323
2374
  replaceEmoji,
@@ -2692,13 +2743,15 @@ class MindImageBaseComponent {
2692
2743
  get nativeElement() {
2693
2744
  return this.elementRef.nativeElement;
2694
2745
  }
2695
- constructor(elementRef) {
2746
+ constructor(elementRef, cdr) {
2696
2747
  this.elementRef = elementRef;
2748
+ this.cdr = cdr;
2749
+ this.isFocus = false;
2697
2750
  }
2698
2751
  ngOnInit() { }
2699
2752
  }
2700
- MindImageBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
2701
- 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 });
2753
+ 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 });
2754
+ 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 });
2702
2755
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, decorators: [{
2703
2756
  type: Directive,
2704
2757
  args: [{
@@ -2706,12 +2759,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
2706
2759
  class: 'mind-node-image'
2707
2760
  }
2708
2761
  }]
2709
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { imageItem: [{
2762
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { imageItem: [{
2710
2763
  type: Input
2711
2764
  }], board: [{
2712
2765
  type: Input
2713
2766
  }], element: [{
2714
2767
  type: Input
2768
+ }], isFocus: [{
2769
+ type: Input
2715
2770
  }] } });
2716
2771
 
2717
2772
  class NodeImageDrawer {
@@ -2720,46 +2775,40 @@ class NodeImageDrawer {
2720
2775
  this.viewContainerRef = viewContainerRef;
2721
2776
  this.componentRef = null;
2722
2777
  }
2723
- drawImage(element) {
2724
- this.destroy();
2725
- if (MindElement.hasImage(element)) {
2726
- this.g = createG();
2727
- const foreignRectangle = getImageForeignRectangle(this.board, element);
2728
- const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
2729
- this.g.append(foreignObject);
2730
- if (this.componentRef) {
2731
- this.componentRef.destroy();
2732
- this.componentRef = null;
2733
- }
2734
- const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType || MindImageBaseComponent;
2735
- if (!componentType) {
2736
- throw new Error('Not implement drawEmoji method error.');
2737
- }
2738
- this.componentRef = this.viewContainerRef.createComponent(componentType);
2739
- this.componentRef.instance.board = this.board;
2740
- this.componentRef.instance.element = element;
2741
- this.componentRef.instance.imageItem = element.data.image;
2742
- foreignObject.append(this.componentRef.instance.nativeElement);
2743
- return this.g;
2778
+ drawImage(nodeG, element) {
2779
+ if (!MindElement.hasImage(element)) {
2780
+ this.destroy();
2781
+ return;
2744
2782
  }
2745
- return undefined;
2746
- }
2747
- drawActive(element) {
2748
- var _a;
2749
- this.destroyActive();
2750
- const imageRectangle = getImageForeignRectangle(this.board, element);
2751
- const rectangle = RectangleClient.getOutlineRectangle(imageRectangle, -1);
2752
- const roughSVG = PlaitBoard.getRoughSVG(this.board);
2753
- this.activeG = roughSVG.rectangle(rectangle.x, rectangle.y, rectangle.width, rectangle.height, {
2754
- stroke: PRIMARY_COLOR,
2755
- fill: '',
2756
- fillStyle: 'solid'
2757
- });
2758
- (_a = this.g) === null || _a === void 0 ? void 0 : _a.append(this.activeG);
2783
+ this.g = createG();
2784
+ const foreignRectangle = getImageForeignRectangle(this.board, element);
2785
+ const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
2786
+ this.g.append(foreignObject);
2787
+ const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType || MindImageBaseComponent;
2788
+ if (!componentType) {
2789
+ throw new Error('Not implement drawEmoji method error.');
2790
+ }
2791
+ this.componentRef = this.viewContainerRef.createComponent(componentType);
2792
+ this.componentRef.instance.board = this.board;
2793
+ this.componentRef.instance.element = element;
2794
+ this.componentRef.instance.imageItem = element.data.image;
2795
+ this.componentRef.instance.cdr.markForCheck();
2796
+ foreignObject.append(this.componentRef.instance.nativeElement);
2797
+ nodeG.appendChild(this.g);
2759
2798
  }
2760
- destroyActive() {
2799
+ updateImage(nodeG, previous, current) {
2761
2800
  var _a;
2762
- (_a = this.activeG) === null || _a === void 0 ? void 0 : _a.remove();
2801
+ if (!MindElement.hasImage(previous) || !MindElement.hasImage(current)) {
2802
+ this.drawImage(nodeG, current);
2803
+ return;
2804
+ }
2805
+ if (previous !== current && this.componentRef) {
2806
+ this.componentRef.instance.element = current;
2807
+ this.componentRef.instance.imageItem = current.data.image;
2808
+ }
2809
+ const currentForeignObject = getImageForeignRectangle(this.board, current);
2810
+ updateForeignObject(this.g, currentForeignObject.width, currentForeignObject.height, currentForeignObject.x, currentForeignObject.y);
2811
+ (_a = this.componentRef) === null || _a === void 0 ? void 0 : _a.instance.cdr.markForCheck();
2763
2812
  }
2764
2813
  destroy() {
2765
2814
  if (this.g) {
@@ -2822,13 +2871,17 @@ class MindNodeComponent extends PlaitPluginElementComponent {
2822
2871
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: this.textManage.isEditing });
2823
2872
  this.drawEmojis();
2824
2873
  this.drawExtend();
2825
- this.drawImage();
2874
+ this.imageDrawer.drawImage(this.g, this.element);
2826
2875
  if (PlaitMind.isMind(this.context.parent)) {
2827
2876
  this.g.classList.add('branch');
2828
2877
  }
2829
2878
  }
2830
2879
  editTopic() {
2831
2880
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: true });
2881
+ if (this.element.manualWidth) {
2882
+ const width = NodeSpace.getNodeResizableWidth(this.board, this.element);
2883
+ this.textManage.updateWidth(width);
2884
+ }
2832
2885
  this.textManage.edit((origin) => {
2833
2886
  if (origin === ExitOrigin.default) {
2834
2887
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: false });
@@ -2845,8 +2898,8 @@ class MindNodeComponent extends PlaitPluginElementComponent {
2845
2898
  this.drawShape();
2846
2899
  this.drawLink();
2847
2900
  this.drawEmojis();
2848
- this.drawImage();
2849
2901
  this.drawExtend();
2902
+ this.imageDrawer.updateImage(this.g, previous.element, value.element);
2850
2903
  this.textManage.updateText(this.element.data.topic);
2851
2904
  this.textManage.updateRectangle();
2852
2905
  }
@@ -2867,12 +2920,6 @@ class MindNodeComponent extends PlaitPluginElementComponent {
2867
2920
  this.g.append(g);
2868
2921
  }
2869
2922
  }
2870
- drawImage() {
2871
- const image = this.imageDrawer.drawImage(this.element);
2872
- if (image) {
2873
- this.g.append(image);
2874
- }
2875
- }
2876
2923
  drawShape() {
2877
2924
  this.destroyShape();
2878
2925
  const shape = getShapeByElement(this.board, this.node.origin);
@@ -3113,7 +3160,7 @@ const withNodeDnd = (board) => {
3113
3160
  if (PlaitBoard.isReadonly(board) ||
3114
3161
  PlaitBoard.hasBeenTextEditing(board) ||
3115
3162
  !PlaitBoard.isPointer(board, PlaitPointerType.selection) ||
3116
- event.button === 2) {
3163
+ !isMainPointer(event)) {
3117
3164
  mousedown(event);
3118
3165
  return;
3119
3166
  }
@@ -3137,11 +3184,11 @@ const withNodeDnd = (board) => {
3137
3184
  activeElements = [targetElement];
3138
3185
  startPoint = point;
3139
3186
  }
3140
- event.preventDefault();
3141
3187
  }
3142
3188
  if (activeElements.length) {
3143
- correspondingElements = getOverallAbstracts(board, activeElements);
3189
+ // prevent text from being selected
3144
3190
  event.preventDefault();
3191
+ correspondingElements = getOverallAbstracts(board, activeElements);
3145
3192
  }
3146
3193
  mousedown(event);
3147
3194
  };
@@ -3340,7 +3387,7 @@ const insertClipboardData = (board, elements, targetPoint) => {
3340
3387
  newElement = adjustRootToNode(board, newElement);
3341
3388
  const styles = PlaitMind.isMind(targetParent) ? { fontFamily: BRANCH_FONT_FAMILY } : { fontFamily: DEFAULT_FONT_FAMILY };
3342
3389
  const { width, height } = getTextSize(board, newElement.data.topic, TOPIC_DEFAULT_MAX_WORD_COUNT, styles);
3343
- newElement.width = Math.max(width, NODE_MIN_WIDTH);
3390
+ newElement.width = Math.max(width, getNodeDefaultFontSize());
3344
3391
  newElement.height = height;
3345
3392
  }
3346
3393
  // handle abstract start and end
@@ -3370,7 +3417,7 @@ const insertClipboardData = (board, elements, targetPoint) => {
3370
3417
  const insertClipboardText = (board, targetParent, text) => {
3371
3418
  const styles = PlaitMind.isMind(targetParent) ? { fontFamily: BRANCH_FONT_FAMILY } : { fontFamily: DEFAULT_FONT_FAMILY };
3372
3419
  const { width, height } = getTextSize(board, text, TOPIC_DEFAULT_MAX_WORD_COUNT, styles);
3373
- const newElement = createMindElement(text, width, height, {});
3420
+ const newElement = createMindElement(text, Math.max(width, getFontSizeBySlateElement(text)), height, {});
3374
3421
  Transforms.insertNode(board, newElement, findNewChildNodePath(board, targetParent));
3375
3422
  return;
3376
3423
  };
@@ -3410,7 +3457,6 @@ const withAbstract = (board) => {
3410
3457
  const endPoint = transformPoint(board, toPoint(event.x, event.y, host));
3411
3458
  touchedAbstract = handleTouchedAbstract(board, touchedAbstract, endPoint);
3412
3459
  if (abstractHandlePosition && activeAbstractElement) {
3413
- event.preventDefault();
3414
3460
  const abstractComponent = PlaitElement.getComponent(activeAbstractElement);
3415
3461
  const element = abstractComponent.element;
3416
3462
  const nodeLayout = MindQueries.getCorrectLayoutByElement(board, activeAbstractElement);
@@ -3588,7 +3634,8 @@ const withCreateMind = (board) => {
3588
3634
  return newBoard;
3589
3635
  };
3590
3636
 
3591
- const withMindHotkey = (board) => {
3637
+ const withMindHotkey = (baseBoard) => {
3638
+ const board = baseBoard;
3592
3639
  const { keydown } = board;
3593
3640
  board.keydown = (event) => {
3594
3641
  const selectedElements = getSelectedElements(board);
@@ -3718,14 +3765,7 @@ const withNodeHover = (board) => {
3718
3765
  if (isHitElement) {
3719
3766
  target = element;
3720
3767
  }
3721
- }, node => {
3722
- if (PlaitBoard.isBoard(node) || board.isRecursion(node)) {
3723
- return true;
3724
- }
3725
- else {
3726
- return false;
3727
- }
3728
- }, true);
3768
+ }, getIsRecursionFunc(board), true);
3729
3769
  if (hoveredMindElement && target && hoveredMindElement === target) {
3730
3770
  return;
3731
3771
  }
@@ -3762,7 +3802,29 @@ const removeHovered = (element) => {
3762
3802
  }
3763
3803
  };
3764
3804
 
3765
- const withMindImage = (board) => {
3805
+ const BOARD_TO_SELECTED_IMAGE_ELEMENT = new WeakMap();
3806
+ const getSelectedImageElement = (board) => {
3807
+ return BOARD_TO_SELECTED_IMAGE_ELEMENT.get(board);
3808
+ };
3809
+ const addSelectedImageElement = (board, element) => {
3810
+ BOARD_TO_SELECTED_IMAGE_ELEMENT.set(board, element);
3811
+ };
3812
+ const removeSelectedImageElement = (board) => {
3813
+ BOARD_TO_SELECTED_IMAGE_ELEMENT.delete(board);
3814
+ };
3815
+ const setImageFocus = (board, element, isFocus) => {
3816
+ if (isFocus) {
3817
+ addSelectedImageElement(board, element);
3818
+ }
3819
+ else {
3820
+ removeSelectedImageElement(board);
3821
+ }
3822
+ const elementComponent = PlaitElement.getComponent(element);
3823
+ elementComponent.imageDrawer.componentRef.instance.isFocus = isFocus;
3824
+ elementComponent.imageDrawer.componentRef.instance.cdr.markForCheck();
3825
+ };
3826
+
3827
+ const withNodeImage = (board) => {
3766
3828
  let selectedImageElement = null;
3767
3829
  const { keydown, mousedown } = board;
3768
3830
  board.mousedown = (event) => {
@@ -3775,26 +3837,21 @@ const withMindImage = (board) => {
3775
3837
  const hitElements = getHitElements(board, { ranges: [range] });
3776
3838
  const hasImage = hitElements.length && MindElement.hasImage(hitElements[0]);
3777
3839
  const hitImage = hasImage && isHitImage(board, hitElements[0], range);
3840
+ if (selectedImageElement && hitImage && hitElements[0] === selectedImageElement) {
3841
+ temporaryDisableSelection(board);
3842
+ mousedown(event);
3843
+ return;
3844
+ }
3845
+ if (selectedImageElement) {
3846
+ setImageFocus(board, selectedImageElement, false);
3847
+ selectedImageElement = null;
3848
+ }
3778
3849
  if (hitImage) {
3779
- const currentOptions = board.getPluginOptions(PlaitPluginKey.withSelection);
3780
- board.setPluginOptions(PlaitPluginKey.withSelection, {
3781
- isDisabledSelect: true
3782
- });
3783
- setTimeout(() => {
3784
- board.setPluginOptions(PlaitPluginKey.withSelection, Object.assign({}, currentOptions));
3785
- }, 0);
3850
+ temporaryDisableSelection(board);
3786
3851
  selectedImageElement = hitElements[0];
3787
- const component = PlaitElement.getComponent(selectedImageElement);
3788
- component.imageDrawer.drawActive(selectedImageElement);
3852
+ setImageFocus(board, selectedImageElement, true);
3789
3853
  clearSelectedElement(board);
3790
3854
  }
3791
- else {
3792
- if (selectedImageElement) {
3793
- const component = PlaitElement.getComponent(selectedImageElement);
3794
- component && component.imageDrawer.destroyActive();
3795
- }
3796
- selectedImageElement = null;
3797
- }
3798
3855
  mousedown(event);
3799
3856
  };
3800
3857
  board.keydown = (event) => {
@@ -3808,8 +3865,122 @@ const withMindImage = (board) => {
3808
3865
  return board;
3809
3866
  };
3810
3867
 
3811
- const withMind = (board) => {
3812
- const { drawElement, dblclick, keydown, insertFragment, setFragment, deleteFragment, isHitSelection, getRectangle, isMovable, isRecursion } = board;
3868
+ const withNodeResize = (board) => {
3869
+ const { mousedown, mousemove, globalMouseup } = board;
3870
+ let targetElement = null;
3871
+ let targetElementRef = null;
3872
+ let startPoint = null;
3873
+ board.mousedown = (event) => {
3874
+ if (targetElement) {
3875
+ startPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3876
+ // prevent text from being selected
3877
+ event.preventDefault();
3878
+ return;
3879
+ }
3880
+ mousedown(event);
3881
+ };
3882
+ board.mousemove = (event) => {
3883
+ if (PlaitBoard.isReadonly(board) || PlaitBoard.hasBeenTextEditing(board)) {
3884
+ mousemove(event);
3885
+ return;
3886
+ }
3887
+ if (startPoint && targetElement && !isMindNodeResizing(board)) {
3888
+ const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3889
+ const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
3890
+ if (distance > PRESS_AND_MOVE_BUFFER) {
3891
+ startPoint = endPoint;
3892
+ addResizing(board, targetElement);
3893
+ targetElementRef = {
3894
+ minWidth: NodeSpace.getNodeResizableMinWidth(board, targetElement),
3895
+ currentWidth: NodeSpace.getNodeResizableWidth(board, targetElement),
3896
+ path: PlaitBoard.findPath(board, targetElement),
3897
+ textManage: PlaitElement.getComponent(targetElement).textManage
3898
+ };
3899
+ MERGING.set(board, true);
3900
+ }
3901
+ }
3902
+ if (isMindNodeResizing(board) && startPoint && targetElementRef) {
3903
+ const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3904
+ const offsetX = endPoint[0] - startPoint[0];
3905
+ let resizedWidth = targetElementRef.currentWidth + offsetX;
3906
+ if (resizedWidth < targetElementRef.minWidth) {
3907
+ resizedWidth = targetElementRef.minWidth;
3908
+ }
3909
+ const newTarget = PlaitNode.get(board, targetElementRef.path);
3910
+ if (newTarget && NodeSpace.getNodeTopicMinWidth(board, newTarget) !== resizedWidth) {
3911
+ targetElementRef.textManage.updateWidth(resizedWidth);
3912
+ const { width, height } = targetElementRef.textManage.getSize();
3913
+ MindTransforms.setNodeManualWidth(board, newTarget, resizedWidth, height);
3914
+ }
3915
+ }
3916
+ else {
3917
+ // press and start drag when node is non selected
3918
+ if (!isDragging(board)) {
3919
+ const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3920
+ const newTargetElement = getTargetElement(board, point);
3921
+ if (newTargetElement) {
3922
+ PlaitBoard.getBoardContainer(board).classList.add(ResizeCursorClass['ew-resize']);
3923
+ }
3924
+ else {
3925
+ PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew-resize']);
3926
+ }
3927
+ targetElement = newTargetElement;
3928
+ }
3929
+ }
3930
+ mousemove(event);
3931
+ };
3932
+ board.globalMouseup = (event) => {
3933
+ globalMouseup(event);
3934
+ if (isMindNodeResizing(board) && targetElement) {
3935
+ removeResizing(board, targetElement);
3936
+ targetElementRef = null;
3937
+ targetElement = null;
3938
+ startPoint = null;
3939
+ MERGING.set(board, false);
3940
+ }
3941
+ };
3942
+ return board;
3943
+ };
3944
+ const IS_MIND_NODE_RESIZING = new WeakMap();
3945
+ const isMindNodeResizing = (board) => {
3946
+ return !!IS_MIND_NODE_RESIZING.get(board);
3947
+ };
3948
+ const addResizing = (board, element) => {
3949
+ PlaitBoard.getBoardContainer(board).classList.add('mind-node-resizing');
3950
+ const component = PlaitElement.getComponent(element);
3951
+ component.g.classList.add('resizing');
3952
+ IS_MIND_NODE_RESIZING.set(board, true);
3953
+ };
3954
+ const removeResizing = (board, element) => {
3955
+ PlaitBoard.getBoardContainer(board).classList.remove('mind-node-resizing');
3956
+ PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew-resize']);
3957
+ const component = PlaitElement.getComponent(element);
3958
+ if (component && component.g) {
3959
+ component.g.classList.remove('resizing');
3960
+ }
3961
+ IS_MIND_NODE_RESIZING.set(board, false);
3962
+ };
3963
+ const getTargetElement = (board, point) => {
3964
+ const selectedElements = getSelectedElements(board).filter(value => MindElement.isMindElement(board, value));
3965
+ if (selectedElements.length > 0) {
3966
+ const target = selectedElements.find(value => {
3967
+ const rectangle = getResizeActiveRectangle(board, value);
3968
+ return distanceBetweenPointAndRectangle(point[0], point[1], rectangle) <= 0;
3969
+ });
3970
+ return target ? target : null;
3971
+ }
3972
+ return null;
3973
+ };
3974
+ const getResizeActiveRectangle = (board, element) => {
3975
+ const activeWidth = 20;
3976
+ const node = MindElement.getNode(element);
3977
+ const rectangle = getRectangleByNode(node);
3978
+ return { x: rectangle.x + rectangle.width - activeWidth / 2, y: rectangle.y, width: activeWidth, height: rectangle.height };
3979
+ };
3980
+
3981
+ const withMind = (baseBoard) => {
3982
+ const board = baseBoard;
3983
+ const { drawElement, dblclick, insertFragment, setFragment, deleteFragment, isHitSelection, getRectangle, isMovable, isRecursion } = board;
3813
3984
  board.drawElement = (context) => {
3814
3985
  if (PlaitMind.isMind(context.element)) {
3815
3986
  return PlaitMindComponent;
@@ -3866,14 +4037,7 @@ const withMind = (board) => {
3866
4037
  if (!PlaitBoard.hasBeenTextEditing(board) && isHitMindElement(board, point, node)) {
3867
4038
  editTopic(node);
3868
4039
  }
3869
- }, node => {
3870
- if (PlaitBoard.isBoard(node) || board.isRecursion(node)) {
3871
- return true;
3872
- }
3873
- else {
3874
- return false;
3875
- }
3876
- });
4040
+ }, getIsRecursionFunc(board));
3877
4041
  });
3878
4042
  if (PlaitBoard.hasBeenTextEditing(board)) {
3879
4043
  return;
@@ -3919,7 +4083,7 @@ const withMind = (board) => {
3919
4083
  MindTransforms.removeElements(board, selectedElements);
3920
4084
  deleteFragment(data);
3921
4085
  };
3922
- return withMindImage(withNodeHover(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board)))))));
4086
+ return withNodeResize(withNodeImage(withNodeHover(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board))))))));
3923
4087
  };
3924
4088
 
3925
4089
  class MindEmojiBaseComponent {
@@ -3973,5 +4137,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
3973
4137
  * Generated bundle index. Do not edit.
3974
4138
  */
3975
4139
 
3976
- 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, NODE_MIN_WIDTH, 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 };
4140
+ 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, temporaryDisableSelection, withMind, withMindExtend };
3977
4141
  //# sourceMappingURL=plait-mind.mjs.map