@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
@@ -6,6 +6,7 @@ export interface MindElement<T = BaseData> extends PlaitElement {
6
6
  children: MindElement[];
7
7
  rightNodeCount?: number;
8
8
  width: number;
9
+ manualWidth?: number;
9
10
  height: number;
10
11
  isRoot?: boolean;
11
12
  fill?: string;
@@ -35,7 +35,6 @@ export declare class MindNodeComponent extends PlaitPluginElementComponent<MindE
35
35
  editTopic(): void;
36
36
  onContextChanged(value: PlaitPluginElementContext<MindElement, PlaitMindBoard>, previous: PlaitPluginElementContext<MindElement, PlaitMindBoard>): void;
37
37
  drawEmojis(): void;
38
- drawImage(): void;
39
38
  drawShape(): void;
40
39
  destroyShape(): void;
41
40
  drawLink(): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/mind",
3
- "version": "0.20.0",
3
+ "version": "0.22.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^15.2.2",
6
6
  "@angular/core": "^15.2.2"
@@ -1,7 +1,7 @@
1
1
  import { PlaitBoard } from '@plait/core';
2
2
  import { MindElement } from '../interfaces';
3
3
  import { PlaitMindBoard } from './with-mind.board';
4
- export declare const withMindHotkey: (board: PlaitMindBoard) => PlaitMindBoard;
4
+ export declare const withMindHotkey: (baseBoard: PlaitBoard) => PlaitBoard & PlaitMindBoard;
5
5
  export declare const getNextSelectedElement: (board: PlaitBoard, firstLevelElements: MindElement[]) => MindElement<import("../interfaces").BaseData> | undefined;
6
6
  export declare const isExpandHotkey: (event: KeyboardEvent) => boolean;
7
7
  export declare const isTabHotkey: (event: KeyboardEvent) => boolean;
@@ -0,0 +1,2 @@
1
+ import { PlaitBoard } from '@plait/core';
2
+ export declare const withNodeHoverDetect: (board: PlaitBoard) => PlaitBoard;
@@ -0,0 +1,2 @@
1
+ import { PlaitBoard } from '@plait/core';
2
+ export declare const withNodeImage: (board: PlaitBoard) => PlaitBoard;
@@ -0,0 +1,10 @@
1
+ import { PlaitBoard, Point, RectangleClient } from '@plait/core';
2
+ import { MindElement } from '../interfaces/element';
3
+ import { PlaitMindBoard } from './with-mind.board';
4
+ export declare const withNodeResize: (board: PlaitBoard) => PlaitBoard;
5
+ export declare const IS_MIND_NODE_RESIZING: WeakMap<PlaitBoard, boolean>;
6
+ export declare const isMindNodeResizing: (board: PlaitBoard) => boolean;
7
+ export declare const addResizing: (board: PlaitBoard, element: MindElement) => void;
8
+ export declare const removeResizing: (board: PlaitBoard, element: MindElement) => void;
9
+ export declare const getTargetElement: (board: PlaitMindBoard, point: Point) => MindElement<import("@plait/mind").BaseData> | null;
10
+ export declare const getResizeActiveRectangle: (board: PlaitBoard, element: MindElement) => RectangleClient;
@@ -3,11 +3,13 @@
3
3
  $primary: #4e8afa;
4
4
 
5
5
  .plait-board-container {
6
- g[plait-mindmap='true'], g[plait-mind-temporary='true'] {
6
+ g[plait-mindmap='true'],
7
+ g[plait-mind-temporary='true'] {
7
8
  // The font family under SAFARI affects the measurement of the text size,
8
9
  // so specify the default font family to avoid unexpected text breaks in different scene
9
10
  font-family: PingFangSC-Regular, 'PingFang SC';
10
- .root, &.root {
11
+ .root,
12
+ &.root {
11
13
  .text {
12
14
  font-family: PingFangSC-Medium, 'PingFang SC';
13
15
  font-weight: 400;
@@ -128,5 +130,10 @@ $primary: #4e8afa;
128
130
  }
129
131
  }
130
132
 
133
+ .mind-node-image {
134
+ margin: 6px;
135
+ display: block
136
+ }
137
+
131
138
  @include mixins.node-color();
132
139
  }
@@ -2,6 +2,7 @@ export declare const MindTransforms: {
2
2
  setLayout: (board: import("@plait/core").PlaitBoard, layout: import("@plait/layouts").MindLayoutType, path: import("@plait/core").Path) => void;
3
3
  setTopic: (board: import("@plait/mind").PlaitMindBoard, element: import("@plait/mind").MindElement<import("@plait/mind").BaseData>, topic: import("slate").BaseElement, width: number, height: number) => void;
4
4
  setTopicSize: (board: import("@plait/mind").PlaitMindBoard, element: import("@plait/mind").MindElement<import("@plait/mind").BaseData>, width: number, height: number) => void;
5
+ setNodeManualWidth: (board: import("@plait/mind").PlaitMindBoard, element: import("@plait/mind").MindElement<import("@plait/mind").BaseData>, width: number, height: number) => void;
5
6
  addEmoji: (board: import("@plait/core").PlaitBoard, element: import("@plait/mind").MindElement<import("@plait/mind").BaseData>, emojiItem: import("@plait/mind").EmojiItem) => void;
6
7
  removeEmoji: (board: import("@plait/core").PlaitBoard, element: import("@plait/mind").MindElement<import("@plait/mind").EmojiData>, emojiItem: import("@plait/mind").EmojiItem) => void;
7
8
  replaceEmoji: (board: import("@plait/core").PlaitBoard, element: import("@plait/mind").MindElement<import("@plait/mind").EmojiData>, oldEmoji: import("@plait/mind").EmojiItem, newEmoji: import("@plait/mind").EmojiItem) => void;
@@ -5,6 +5,7 @@ import { AbstractRef } from '../utils/abstract/common';
5
5
  import { RightNodeCountRef } from '../utils/node/right-node-count';
6
6
  import { PlaitMindBoard } from '../plugins/with-mind.board';
7
7
  export declare const setTopic: (board: PlaitMindBoard, element: MindElement, topic: Element, width: number, height: number) => void;
8
+ export declare const setNodeManualWidth: (board: PlaitMindBoard, element: MindElement, width: number, height: number) => void;
8
9
  export declare const setTopicSize: (board: PlaitMindBoard, element: MindElement, width: number, height: number) => void;
9
10
  export declare const removeElements: (board: PlaitBoard, elements: MindElement[]) => void;
10
11
  export declare const insertNodes: (board: PlaitBoard, elements: MindElement[], path: Path) => void;
@@ -1,2 +1,4 @@
1
+ import { PlaitOptionsBoard } from '@plait/core';
1
2
  import { MindElement } from '../../interfaces/element';
2
3
  export declare function editTopic(element: MindElement): void;
4
+ export declare const temporaryDisableSelection: (board: PlaitOptionsBoard) => void;
@@ -0,0 +1,6 @@
1
+ import { PlaitBoard } from '@plait/core';
2
+ import { MindElement } from '../../interfaces';
3
+ export declare const getSelectedImageElement: (board: PlaitBoard) => MindElement<import("../../interfaces").BaseData> | undefined;
4
+ export declare const addSelectedImageElement: (board: PlaitBoard, element: MindElement) => void;
5
+ export declare const removeSelectedImageElement: (board: PlaitBoard) => void;
6
+ export declare const setImageFocus: (board: PlaitBoard, element: MindElement, isFocus: boolean) => void;
@@ -1,3 +1,4 @@
1
1
  export * from './adjust-node';
2
2
  export * from './create-node';
3
3
  export * from './common';
4
+ export * from './image';
@@ -0,0 +1,9 @@
1
+ import { PlaitBoard } from '@plait/core';
2
+ import { MindElement } from '../../interfaces/element';
3
+ export interface NodeHoveredExtendRef {
4
+ element: MindElement;
5
+ }
6
+ export declare const mouseMoveHandle: (board: PlaitBoard, event: MouseEvent, nodeHoveredExtendRef: NodeHoveredExtendRef | null) => NodeHoveredExtendRef | null;
7
+ export declare const mouseLeaveHandle: (board: PlaitBoard, event: MouseEvent, nodeHoveredExtendRef: NodeHoveredExtendRef | null) => void;
8
+ export declare const addHovered: (element: MindElement) => void;
9
+ export declare const removeHovered: (element: MindElement) => void;
@@ -9,10 +9,10 @@ export declare const NodeSpace: {
9
9
  getNodeResizableMinWidth(board: PlaitMindBoard, element: MindElement): number;
10
10
  getNodeTopicMinWidth(board: PlaitMindBoard, element: MindElement, isRoot?: boolean): number;
11
11
  getTextLeftSpace(board: PlaitMindBoard, element: MindElement): number;
12
- getTextTopSpace(element: MindElement): number;
13
- getImageTopSpace(element: MindElement): number;
12
+ getTextTopSpace(board: PlaitMindBoard, element: MindElement): number;
13
+ getImageTopSpace(board: PlaitMindBoard, element: MindElement): number;
14
14
  getEmojiLeftSpace(board: PlaitMindBoard, element: MindElement<EmojiData>): number;
15
- getEmojiTopSpace(element: MindElement): number;
15
+ getEmojiTopSpace(board: PlaitMindBoard, element: MindElement): number;
16
16
  };
17
17
  export declare const getFontSizeBySlateElement: (text: string | Element) => number;
18
18
  export declare const getNodeDefaultFontSize: (isRoot?: boolean) => 14 | 18;
@@ -1,49 +0,0 @@
1
- import { PlaitBoard, getHitElements, isMainPointer, toPoint, transformPoint, PlaitPluginKey, PlaitElement, hotkeys, clearSelectedElement, PlaitPointerType } from '@plait/core';
2
- import { MindElement } from '../interfaces';
3
- import { MindTransforms, isHitImage } from '../public-api';
4
- export const withMindImage = (board) => {
5
- let selectedImageElement = null;
6
- const { keydown, mousedown } = board;
7
- board.mousedown = (event) => {
8
- if (PlaitBoard.isReadonly(board) || !isMainPointer(event) || !PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
9
- mousedown(event);
10
- return;
11
- }
12
- const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
13
- const range = { anchor: point, focus: point };
14
- const hitElements = getHitElements(board, { ranges: [range] });
15
- const hasImage = hitElements.length && MindElement.hasImage(hitElements[0]);
16
- const hitImage = hasImage && isHitImage(board, hitElements[0], range);
17
- if (hitImage) {
18
- const currentOptions = board.getPluginOptions(PlaitPluginKey.withSelection);
19
- board.setPluginOptions(PlaitPluginKey.withSelection, {
20
- isDisabledSelect: true
21
- });
22
- setTimeout(() => {
23
- board.setPluginOptions(PlaitPluginKey.withSelection, { ...currentOptions });
24
- }, 0);
25
- selectedImageElement = hitElements[0];
26
- const component = PlaitElement.getComponent(selectedImageElement);
27
- component.imageDrawer.drawActive(selectedImageElement);
28
- clearSelectedElement(board);
29
- }
30
- else {
31
- if (selectedImageElement) {
32
- const component = PlaitElement.getComponent(selectedImageElement);
33
- component && component.imageDrawer.destroyActive();
34
- }
35
- selectedImageElement = null;
36
- }
37
- mousedown(event);
38
- };
39
- board.keydown = (event) => {
40
- if (!PlaitBoard.isReadonly(board) && selectedImageElement && (hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event))) {
41
- MindTransforms.removeImage(board, selectedImageElement);
42
- selectedImageElement = null;
43
- return;
44
- }
45
- keydown(event);
46
- };
47
- return board;
48
- };
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1taW5kLWltYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvcGx1Z2lucy93aXRoLW1pbmQtaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFVBQVUsRUFDVixjQUFjLEVBQ2QsYUFBYSxFQUNiLE9BQU8sRUFDUCxjQUFjLEVBR2QsY0FBYyxFQUNkLFlBQVksRUFDWixPQUFPLEVBQ1Asb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBcUIsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc5RSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDL0MsSUFBSSxvQkFBb0IsR0FBa0MsSUFBSSxDQUFDO0lBRS9ELE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRXJDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7UUFDcEMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbkgsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pCLE9BQU87U0FDVjtRQUNELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixNQUFNLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzlDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0QsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQWdCLENBQUMsQ0FBQztRQUMzRixNQUFNLFFBQVEsR0FBRyxRQUFRLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWhHLElBQUksUUFBUSxFQUFFO1lBQ1YsTUFBTSxjQUFjLEdBQUksS0FBMkIsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbEcsS0FBMkIsQ0FBQyxnQkFBZ0IsQ0FBb0IsY0FBYyxDQUFDLGFBQWEsRUFBRTtnQkFDM0YsZ0JBQWdCLEVBQUUsSUFBSTthQUN6QixDQUFDLENBQUM7WUFDSCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNYLEtBQTJCLENBQUMsZ0JBQWdCLENBQW9CLGNBQWMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDMUgsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRU4sb0JBQW9CLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBMkIsQ0FBQztZQUNoRSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFzQixDQUFDO1lBQ3ZGLFNBQVMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDdkQsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDL0I7YUFBTTtZQUNILElBQUksb0JBQW9CLEVBQUU7Z0JBQ3RCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQXNCLENBQUM7Z0JBQ3ZGLFNBQVMsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3REO1lBQ0Qsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1NBQy9CO1FBRUQsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUVGLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEVBQUU7UUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksb0JBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzlILGNBQWMsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7WUFDeEQsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQzVCLE9BQU87U0FDVjtRQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBsYWl0Qm9hcmQsXG4gICAgZ2V0SGl0RWxlbWVudHMsXG4gICAgaXNNYWluUG9pbnRlcixcbiAgICB0b1BvaW50LFxuICAgIHRyYW5zZm9ybVBvaW50LFxuICAgIFBsYWl0T3B0aW9uc0JvYXJkLFxuICAgIFdpdGhQbHVnaW5PcHRpb25zLFxuICAgIFBsYWl0UGx1Z2luS2V5LFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBob3RrZXlzLFxuICAgIGNsZWFyU2VsZWN0ZWRFbGVtZW50LFxuICAgIFBsYWl0UG9pbnRlclR5cGVcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1pbmROb2RlQ29tcG9uZW50LCBNaW5kVHJhbnNmb3JtcywgaXNIaXRJbWFnZSB9IGZyb20gJy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgSW1hZ2VEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lbGVtZW50LWRhdGEnO1xuXG5leHBvcnQgY29uc3Qgd2l0aE1pbmRJbWFnZSA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGxldCBzZWxlY3RlZEltYWdlRWxlbWVudDogTWluZEVsZW1lbnQ8SW1hZ2VEYXRhPiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3QgeyBrZXlkb3duLCBtb3VzZWRvd24gfSA9IGJvYXJkO1xuXG4gICAgYm9hcmQubW91c2Vkb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChQbGFpdEJvYXJkLmlzUmVhZG9ubHkoYm9hcmQpIHx8ICFpc01haW5Qb2ludGVyKGV2ZW50KSB8fCAhUGxhaXRCb2FyZC5pc1BvaW50ZXIoYm9hcmQsIFBsYWl0UG9pbnRlclR5cGUuc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgbW91c2Vkb3duKGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludCA9IHRyYW5zZm9ybVBvaW50KGJvYXJkLCB0b1BvaW50KGV2ZW50LngsIGV2ZW50LnksIFBsYWl0Qm9hcmQuZ2V0SG9zdChib2FyZCkpKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB7IGFuY2hvcjogcG9pbnQsIGZvY3VzOiBwb2ludCB9O1xuICAgICAgICBjb25zdCBoaXRFbGVtZW50cyA9IGdldEhpdEVsZW1lbnRzKGJvYXJkLCB7IHJhbmdlczogW3JhbmdlXSB9KTtcbiAgICAgICAgY29uc3QgaGFzSW1hZ2UgPSBoaXRFbGVtZW50cy5sZW5ndGggJiYgTWluZEVsZW1lbnQuaGFzSW1hZ2UoaGl0RWxlbWVudHNbMF0gYXMgTWluZEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBoaXRJbWFnZSA9IGhhc0ltYWdlICYmIGlzSGl0SW1hZ2UoYm9hcmQsIGhpdEVsZW1lbnRzWzBdIGFzIE1pbmRFbGVtZW50PEltYWdlRGF0YT4sIHJhbmdlKTtcblxuICAgICAgICBpZiAoaGl0SW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gKGJvYXJkIGFzIFBsYWl0T3B0aW9uc0JvYXJkKS5nZXRQbHVnaW5PcHRpb25zKFBsYWl0UGx1Z2luS2V5LndpdGhTZWxlY3Rpb24pO1xuICAgICAgICAgICAgKGJvYXJkIGFzIFBsYWl0T3B0aW9uc0JvYXJkKS5zZXRQbHVnaW5PcHRpb25zPFdpdGhQbHVnaW5PcHRpb25zPihQbGFpdFBsdWdpbktleS53aXRoU2VsZWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgaXNEaXNhYmxlZFNlbGVjdDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAoYm9hcmQgYXMgUGxhaXRPcHRpb25zQm9hcmQpLnNldFBsdWdpbk9wdGlvbnM8V2l0aFBsdWdpbk9wdGlvbnM+KFBsYWl0UGx1Z2luS2V5LndpdGhTZWxlY3Rpb24sIHsgLi4uY3VycmVudE9wdGlvbnMgfSk7XG4gICAgICAgICAgICB9LCAwKTtcblxuICAgICAgICAgICAgc2VsZWN0ZWRJbWFnZUVsZW1lbnQgPSBoaXRFbGVtZW50c1swXSBhcyBNaW5kRWxlbWVudDxJbWFnZURhdGE+O1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gUGxhaXRFbGVtZW50LmdldENvbXBvbmVudChzZWxlY3RlZEltYWdlRWxlbWVudCkgYXMgTWluZE5vZGVDb21wb25lbnQ7XG4gICAgICAgICAgICBjb21wb25lbnQuaW1hZ2VEcmF3ZXIuZHJhd0FjdGl2ZShzZWxlY3RlZEltYWdlRWxlbWVudCk7XG4gICAgICAgICAgICBjbGVhclNlbGVjdGVkRWxlbWVudChib2FyZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBQbGFpdEVsZW1lbnQuZ2V0Q29tcG9uZW50KHNlbGVjdGVkSW1hZ2VFbGVtZW50KSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgJiYgY29tcG9uZW50LmltYWdlRHJhd2VyLmRlc3Ryb3lBY3RpdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGVjdGVkSW1hZ2VFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vdXNlZG93bihldmVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmtleWRvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFQbGFpdEJvYXJkLmlzUmVhZG9ubHkoYm9hcmQpICYmIHNlbGVjdGVkSW1hZ2VFbGVtZW50ICYmIChob3RrZXlzLmlzRGVsZXRlQmFja3dhcmQoZXZlbnQpIHx8IGhvdGtleXMuaXNEZWxldGVGb3J3YXJkKGV2ZW50KSkpIHtcbiAgICAgICAgICAgIE1pbmRUcmFuc2Zvcm1zLnJlbW92ZUltYWdlKGJvYXJkLCBzZWxlY3RlZEltYWdlRWxlbWVudCk7XG4gICAgICAgICAgICBzZWxlY3RlZEltYWdlRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBrZXlkb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGJvYXJkO1xufTtcbiJdfQ==
@@ -1,58 +0,0 @@
1
- import { PlaitBoard, PlaitElement, depthFirstRecursion, getIsRecursionFunc, throttleRAF, toPoint, transformPoint } from '@plait/core';
2
- import { MindElement } from '../interfaces/element';
3
- import { isHitMindElement } from '../utils/position/node';
4
- export const withNodeHover = (board) => {
5
- const { mousemove, mouseleave } = board;
6
- let hoveredMindElement = null;
7
- board.mousemove = (event) => {
8
- throttleRAF(() => {
9
- let target = null;
10
- const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
11
- depthFirstRecursion(board, element => {
12
- if (target) {
13
- return;
14
- }
15
- if (!MindElement.isMindElement(board, element)) {
16
- return;
17
- }
18
- const isHitElement = isHitMindElement(board, point, element);
19
- if (isHitElement) {
20
- target = element;
21
- }
22
- }, getIsRecursionFunc(board), true);
23
- if (hoveredMindElement && target && hoveredMindElement === target) {
24
- return;
25
- }
26
- if (hoveredMindElement) {
27
- removeHovered(hoveredMindElement);
28
- }
29
- if (target) {
30
- addHovered(target);
31
- hoveredMindElement = target;
32
- }
33
- else {
34
- hoveredMindElement = null;
35
- }
36
- });
37
- mousemove(event);
38
- };
39
- board.mouseleave = (event) => {
40
- if (hoveredMindElement) {
41
- removeHovered(hoveredMindElement);
42
- hoveredMindElement = null;
43
- }
44
- mouseleave(event);
45
- };
46
- return board;
47
- };
48
- export const addHovered = (element) => {
49
- const component = PlaitElement.getComponent(element);
50
- component.g.classList.add('hovered');
51
- };
52
- export const removeHovered = (element) => {
53
- const component = PlaitElement.getComponent(element);
54
- if (component && component.g) {
55
- component.g.classList.remove('hovered');
56
- }
57
- };
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ub2RlLWhvdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvcGx1Z2lucy93aXRoLW5vZGUtaG92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTFELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUMvQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQztJQUN4QyxJQUFJLGtCQUFrQixHQUF1QixJQUFJLENBQUM7SUFFbEQsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtRQUNwQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2IsSUFBSSxNQUFNLEdBQXVCLElBQUksQ0FBQztZQUN0QyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUYsbUJBQW1CLENBQ2QsS0FBZ0MsRUFDakMsT0FBTyxDQUFDLEVBQUU7Z0JBQ04sSUFBSSxNQUFNLEVBQUU7b0JBQ1IsT0FBTztpQkFDVjtnQkFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQzVDLE9BQU87aUJBQ1Y7Z0JBQ0QsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxZQUFZLEVBQUU7b0JBQ2QsTUFBTSxHQUFHLE9BQU8sQ0FBQztpQkFDcEI7WUFDTCxDQUFDLEVBQ0Qsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQ3pCLElBQUksQ0FDUCxDQUFDO1lBRUYsSUFBSSxrQkFBa0IsSUFBSSxNQUFNLElBQUksa0JBQWtCLEtBQUssTUFBTSxFQUFFO2dCQUMvRCxPQUFPO2FBQ1Y7WUFFRCxJQUFJLGtCQUFrQixFQUFFO2dCQUNwQixhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNyQztZQUVELElBQUksTUFBTSxFQUFFO2dCQUNSLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkIsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO2FBQy9CO2lCQUFNO2dCQUNILGtCQUFrQixHQUFHLElBQUksQ0FBQzthQUM3QjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUVGLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7UUFDckMsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNsQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7U0FDN0I7UUFDRCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFO0lBQy9DLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQW9CLEVBQUUsRUFBRTtJQUNsRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDLEVBQUU7UUFDMUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzNDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50LCBkZXB0aEZpcnN0UmVjdXJzaW9uLCBnZXRJc1JlY3Vyc2lvbkZ1bmMsIHRocm90dGxlUkFGLCB0b1BvaW50LCB0cmFuc2Zvcm1Qb2ludCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE1pbmRFbGVtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lbGVtZW50JztcbmltcG9ydCB7IGlzSGl0TWluZEVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9wb3NpdGlvbi9ub2RlJztcblxuZXhwb3J0IGNvbnN0IHdpdGhOb2RlSG92ZXIgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCB7IG1vdXNlbW92ZSwgbW91c2VsZWF2ZSB9ID0gYm9hcmQ7XG4gICAgbGV0IGhvdmVyZWRNaW5kRWxlbWVudDogTWluZEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgIGJvYXJkLm1vdXNlbW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aHJvdHRsZVJBRigoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0OiBNaW5kRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSB0cmFuc2Zvcm1Qb2ludChib2FyZCwgdG9Qb2ludChldmVudC54LCBldmVudC55LCBQbGFpdEJvYXJkLmdldEhvc3QoYm9hcmQpKSk7XG4gICAgICAgICAgICBkZXB0aEZpcnN0UmVjdXJzaW9uKFxuICAgICAgICAgICAgICAgIChib2FyZCBhcyB1bmtub3duKSBhcyBNaW5kRWxlbWVudCxcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghTWluZEVsZW1lbnQuaXNNaW5kRWxlbWVudChib2FyZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0hpdEVsZW1lbnQgPSBpc0hpdE1pbmRFbGVtZW50KGJvYXJkLCBwb2ludCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0hpdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldElzUmVjdXJzaW9uRnVuYyhib2FyZCksXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGhvdmVyZWRNaW5kRWxlbWVudCAmJiB0YXJnZXQgJiYgaG92ZXJlZE1pbmRFbGVtZW50ID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob3ZlcmVkTWluZEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVIb3ZlcmVkKGhvdmVyZWRNaW5kRWxlbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBhZGRIb3ZlcmVkKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaG92ZXJlZE1pbmRFbGVtZW50ID0gdGFyZ2V0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBob3ZlcmVkTWluZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBtb3VzZW1vdmUoZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5tb3VzZWxlYXZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChob3ZlcmVkTWluZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJlbW92ZUhvdmVyZWQoaG92ZXJlZE1pbmRFbGVtZW50KTtcbiAgICAgICAgICAgIGhvdmVyZWRNaW5kRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbW91c2VsZWF2ZShldmVudCk7XG4gICAgfTtcblxuICAgIHJldHVybiBib2FyZDtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRIb3ZlcmVkID0gKGVsZW1lbnQ6IE1pbmRFbGVtZW50KSA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gUGxhaXRFbGVtZW50LmdldENvbXBvbmVudChlbGVtZW50KTtcbiAgICBjb21wb25lbnQuZy5jbGFzc0xpc3QuYWRkKCdob3ZlcmVkJyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlSG92ZXJlZCA9IChlbGVtZW50OiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IFBsYWl0RWxlbWVudC5nZXRDb21wb25lbnQoZWxlbWVudCk7XG4gICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQuZykge1xuICAgICAgICBjb21wb25lbnQuZy5jbGFzc0xpc3QucmVtb3ZlKCdob3ZlcmVkJyk7XG4gICAgfVxufTtcbiJdfQ==
@@ -1,2 +0,0 @@
1
- import { PlaitBoard } from '@plait/core';
2
- export declare const withMindImage: (board: PlaitBoard) => PlaitBoard;
@@ -1,5 +0,0 @@
1
- import { PlaitBoard } from '@plait/core';
2
- import { MindElement } from '../interfaces/element';
3
- export declare const withNodeHover: (board: PlaitBoard) => PlaitBoard;
4
- export declare const addHovered: (element: MindElement) => void;
5
- export declare const removeHovered: (element: MindElement) => void;