@plait/mind 0.29.0 → 0.30.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.
@@ -1,23 +1,15 @@
1
1
  import { PlaitElement } from '@plait/core';
2
- const BOARD_TO_SELECTED_IMAGE_ELEMENT = new WeakMap();
3
- export const getSelectedImageElement = (board) => {
4
- return BOARD_TO_SELECTED_IMAGE_ELEMENT.get(board);
5
- };
6
- export const addSelectedImageElement = (board, element) => {
7
- BOARD_TO_SELECTED_IMAGE_ELEMENT.set(board, element);
8
- };
9
- export const removeSelectedImageElement = (board) => {
10
- BOARD_TO_SELECTED_IMAGE_ELEMENT.delete(board);
2
+ import { addElementOfFocusedImage, removeElementOfFocusedImage } from '@plait/common';
3
+ export const addImageFocus = (board, element) => {
4
+ addElementOfFocusedImage(board, element);
5
+ const elementComponent = PlaitElement.getComponent(element);
6
+ elementComponent.imageGenerator.componentRef.instance.isFocus = true;
7
+ elementComponent.imageGenerator.componentRef.instance.cdr.markForCheck();
11
8
  };
12
- export const setImageFocus = (board, element, isFocus) => {
13
- if (isFocus) {
14
- addSelectedImageElement(board, element);
15
- }
16
- else {
17
- removeSelectedImageElement(board);
18
- }
9
+ export const removeImageFocus = (board, element) => {
10
+ removeElementOfFocusedImage(board);
19
11
  const elementComponent = PlaitElement.getComponent(element);
20
- elementComponent.imageGenerator.componentRef.instance.isFocus = isFocus;
12
+ elementComponent.imageGenerator.componentRef.instance.isFocus = false;
21
13
  elementComponent.imageGenerator.componentRef.instance.cdr.markForCheck();
22
14
  };
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy91dGlscy9ub2RlL2ltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFLdkQsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLE9BQU8sRUFBc0MsQ0FBQztBQUUxRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUN6RCxPQUFPLCtCQUErQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0RCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBK0IsRUFBRSxFQUFFO0lBQzFGLCtCQUErQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDNUQsK0JBQStCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBK0IsRUFBRSxPQUFnQixFQUFFLEVBQUU7SUFDbEcsSUFBSSxPQUFPLEVBQUU7UUFDVCx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDM0M7U0FBTTtRQUNILDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3JDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBc0IsQ0FBQztJQUNqRixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsWUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pFLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxZQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUM5RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kTm9kZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21pbmQtbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2VsZW1lbnQnO1xuaW1wb3J0IHsgSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lbGVtZW50LWRhdGEnO1xuXG5jb25zdCBCT0FSRF9UT19TRUxFQ1RFRF9JTUFHRV9FTEVNRU5UID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgTWluZEVsZW1lbnQ8SW1hZ2VEYXRhPj4oKTtcblxuZXhwb3J0IGNvbnN0IGdldFNlbGVjdGVkSW1hZ2VFbGVtZW50ID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgcmV0dXJuIEJPQVJEX1RPX1NFTEVDVEVEX0lNQUdFX0VMRU1FTlQuZ2V0KGJvYXJkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTZWxlY3RlZEltYWdlRWxlbWVudCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogTWluZEVsZW1lbnQ8SW1hZ2VEYXRhPikgPT4ge1xuICAgIEJPQVJEX1RPX1NFTEVDVEVEX0lNQUdFX0VMRU1FTlQuc2V0KGJvYXJkLCBlbGVtZW50KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVTZWxlY3RlZEltYWdlRWxlbWVudCA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIEJPQVJEX1RPX1NFTEVDVEVEX0lNQUdFX0VMRU1FTlQuZGVsZXRlKGJvYXJkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRJbWFnZUZvY3VzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudDxJbWFnZURhdGE+LCBpc0ZvY3VzOiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGlzRm9jdXMpIHtcbiAgICAgICAgYWRkU2VsZWN0ZWRJbWFnZUVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZVNlbGVjdGVkSW1hZ2VFbGVtZW50KGJvYXJkKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50Q29tcG9uZW50ID0gUGxhaXRFbGVtZW50LmdldENvbXBvbmVudChlbGVtZW50KSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICBlbGVtZW50Q29tcG9uZW50LmltYWdlR2VuZXJhdG9yLmNvbXBvbmVudFJlZiEuaW5zdGFuY2UuaXNGb2N1cyA9IGlzRm9jdXM7XG4gICAgZWxlbWVudENvbXBvbmVudC5pbWFnZUdlbmVyYXRvci5jb21wb25lbnRSZWYhLmluc3RhbmNlLmNkci5tYXJrRm9yQ2hlY2soKTtcbn07XG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy91dGlscy9ub2RlL2ltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJdkQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBK0IsRUFBRSxFQUFFO0lBQ2hGLHdCQUF3QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFzQixDQUFDO0lBQ2pGLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxZQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDdEUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFlBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQzlFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUErQixFQUFFLEVBQUU7SUFDbkYsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBc0IsQ0FBQztJQUNqRixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsWUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZFLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxZQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUM5RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kTm9kZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21pbmQtbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2VsZW1lbnQnO1xuaW1wb3J0IHsgSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lbGVtZW50LWRhdGEnO1xuaW1wb3J0IHsgYWRkRWxlbWVudE9mRm9jdXNlZEltYWdlLCByZW1vdmVFbGVtZW50T2ZGb2N1c2VkSW1hZ2UgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcblxuZXhwb3J0IGNvbnN0IGFkZEltYWdlRm9jdXMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50PEltYWdlRGF0YT4pID0+IHtcbiAgICBhZGRFbGVtZW50T2ZGb2N1c2VkSW1hZ2UoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGVsZW1lbnRDb21wb25lbnQgPSBQbGFpdEVsZW1lbnQuZ2V0Q29tcG9uZW50KGVsZW1lbnQpIGFzIE1pbmROb2RlQ29tcG9uZW50O1xuICAgIGVsZW1lbnRDb21wb25lbnQuaW1hZ2VHZW5lcmF0b3IuY29tcG9uZW50UmVmIS5pbnN0YW5jZS5pc0ZvY3VzID0gdHJ1ZTtcbiAgICBlbGVtZW50Q29tcG9uZW50LmltYWdlR2VuZXJhdG9yLmNvbXBvbmVudFJlZiEuaW5zdGFuY2UuY2RyLm1hcmtGb3JDaGVjaygpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUltYWdlRm9jdXMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50PEltYWdlRGF0YT4pID0+IHtcbiAgICByZW1vdmVFbGVtZW50T2ZGb2N1c2VkSW1hZ2UoYm9hcmQpO1xuICAgIGNvbnN0IGVsZW1lbnRDb21wb25lbnQgPSBQbGFpdEVsZW1lbnQuZ2V0Q29tcG9uZW50KGVsZW1lbnQpIGFzIE1pbmROb2RlQ29tcG9uZW50O1xuICAgIGVsZW1lbnRDb21wb25lbnQuaW1hZ2VHZW5lcmF0b3IuY29tcG9uZW50UmVmIS5pbnN0YW5jZS5pc0ZvY3VzID0gZmFsc2U7XG4gICAgZWxlbWVudENvbXBvbmVudC5pbWFnZUdlbmVyYXRvci5jb21wb25lbnRSZWYhLmluc3RhbmNlLmNkci5tYXJrRm9yQ2hlY2soKTtcbn07XG4iXX0=
@@ -20,10 +20,10 @@ export function getImageForeignRectangle(board, element) {
20
20
  };
21
21
  return rectangle;
22
22
  }
23
- export const isHitImage = (board, element, range) => {
23
+ export const isHitImage = (board, element, point) => {
24
24
  const imageRectangle = getImageForeignRectangle(board, element);
25
25
  const imageOutlineRectangle = RectangleClient.getOutlineRectangle(imageRectangle, -RESIZE_HANDLE_DIAMETER / 2);
26
- return RectangleClient.isHit(RectangleClient.toRectangleClient([range.anchor, range.focus]), imageOutlineRectangle);
26
+ return RectangleClient.isPointInRectangle(imageOutlineRectangle, point);
27
27
  };
28
28
  export const getHitImageResizeHandleDirection = (board, element, point) => {
29
29
  const imageRectangle = getImageForeignRectangle(board, element);
@@ -33,4 +33,4 @@ export const getHitImageResizeHandleDirection = (board, element, point) => {
33
33
  });
34
34
  return result;
35
35
  };
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy91dGlscy9wb3NpdGlvbi9pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckYsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEtBQXFCLEVBQUUsT0FBK0I7SUFDM0YsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDaEUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO0lBRTFELENBQUM7UUFDRyxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztZQUNuQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUNoRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFNLENBQUM7SUFDOUMsTUFBTSxTQUFTLEdBQUc7UUFDZCxDQUFDO1FBQ0QsQ0FBQztRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1QsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQStCLEVBQUUsS0FBWSxFQUFFLEVBQUU7SUFDM0YsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUMsS0FBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsRixNQUFNLHFCQUFxQixHQUFHLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRyxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3hILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUErQixFQUFFLEtBQVksRUFBRSxFQUFFO0lBQ2pILE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDLEtBQXVCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEYsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUM5RixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDbkQsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIFBvaW50LCBSYW5nZSwgUmVjdGFuZ2xlQ2xpZW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2VsZW1lbnQnO1xuaW1wb3J0IHsgSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lbGVtZW50LWRhdGEnO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlOb2RlIH0gZnJvbSAnLi9ub2RlJztcbmltcG9ydCB7IE5vZGVTcGFjZSB9IGZyb20gJy4uL3NwYWNlL25vZGUtc3BhY2UnO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuLi8uLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5pbXBvcnQgeyBSRVNJWkVfSEFORExFX0RJQU1FVEVSLCBnZXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWZzIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZUZvcmVpZ25SZWN0YW5nbGUoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudDxJbWFnZURhdGE+KTogUmVjdGFuZ2xlQ2xpZW50IHtcbiAgICBsZXQgeyB4LCB5IH0gPSBnZXRSZWN0YW5nbGVCeU5vZGUoTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KSk7XG4gICAgY29uc3QgZWxlbWVudFdpZHRoID0gZWxlbWVudC5tYW51YWxXaWR0aCB8fCBlbGVtZW50LndpZHRoO1xuXG4gICAgeCA9XG4gICAgICAgIGVsZW1lbnRXaWR0aCA+IGVsZW1lbnQuZGF0YS5pbWFnZS53aWR0aFxuICAgICAgICAgICAgPyB4ICsgTm9kZVNwYWNlLmdldFRleHRMZWZ0U3BhY2UoYm9hcmQsIGVsZW1lbnQpICsgKGVsZW1lbnRXaWR0aCAtIGVsZW1lbnQuZGF0YS5pbWFnZS53aWR0aCkgLyAyXG4gICAgICAgICAgICA6IHggKyBOb2RlU3BhY2UuZ2V0VGV4dExlZnRTcGFjZShib2FyZCwgZWxlbWVudCk7XG4gICAgeSA9IE5vZGVTcGFjZS5nZXRJbWFnZVRvcFNwYWNlKGJvYXJkLCBlbGVtZW50KSArIHk7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtZW50LmRhdGEuaW1hZ2UhO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgIH07XG4gICAgcmV0dXJuIHJlY3RhbmdsZTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzSGl0SW1hZ2UgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50PEltYWdlRGF0YT4sIHJhbmdlOiBSYW5nZSkgPT4ge1xuICAgIGNvbnN0IGltYWdlUmVjdGFuZ2xlID0gZ2V0SW1hZ2VGb3JlaWduUmVjdGFuZ2xlKGJvYXJkIGFzIFBsYWl0TWluZEJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBpbWFnZU91dGxpbmVSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0T3V0bGluZVJlY3RhbmdsZShpbWFnZVJlY3RhbmdsZSwgLVJFU0laRV9IQU5ETEVfRElBTUVURVIgLyAyKTtcbiAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KFJlY3RhbmdsZUNsaWVudC50b1JlY3RhbmdsZUNsaWVudChbcmFuZ2UuYW5jaG9yLCByYW5nZS5mb2N1c10pLCBpbWFnZU91dGxpbmVSZWN0YW5nbGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpdEltYWdlUmVzaXplSGFuZGxlRGlyZWN0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudDxJbWFnZURhdGE+LCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBpbWFnZVJlY3RhbmdsZSA9IGdldEltYWdlRm9yZWlnblJlY3RhbmdsZShib2FyZCBhcyBQbGFpdE1pbmRCb2FyZCwgZWxlbWVudCk7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlUmVmcyA9IGdldFJlY3RhbmdsZVJlc2l6ZUhhbmRsZVJlZnMoaW1hZ2VSZWN0YW5nbGUsIFJFU0laRV9IQU5ETEVfRElBTUVURVIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc2l6ZUhhbmRsZVJlZnMuZmluZChyZXNpemVIYW5kbGVSZWYgPT4ge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KFJlY3RhbmdsZUNsaWVudC50b1JlY3RhbmdsZUNsaWVudChbcG9pbnQsIHBvaW50XSksIHJlc2l6ZUhhbmRsZVJlZi5yZWN0YW5nbGUpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIl19
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy91dGlscy9wb3NpdGlvbi9pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckYsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEtBQXFCLEVBQUUsT0FBK0I7SUFDM0YsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDaEUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO0lBRTFELENBQUM7UUFDRyxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztZQUNuQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUNoRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFNLENBQUM7SUFDOUMsTUFBTSxTQUFTLEdBQUc7UUFDZCxDQUFDO1FBQ0QsQ0FBQztRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1QsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQStCLEVBQUUsS0FBWSxFQUFFLEVBQUU7SUFDM0YsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUMsS0FBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsRixNQUFNLHFCQUFxQixHQUFHLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRyxPQUFPLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM1RSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBK0IsRUFBRSxLQUFZLEVBQUUsRUFBRTtJQUNqSCxNQUFNLGNBQWMsR0FBRyx3QkFBd0IsQ0FBQyxLQUF1QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sZ0JBQWdCLEdBQUcsNEJBQTRCLENBQUMsY0FBYyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDOUYsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ25ELE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0csQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQb2ludCwgUmVjdGFuZ2xlQ2xpZW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2VsZW1lbnQnO1xuaW1wb3J0IHsgSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lbGVtZW50LWRhdGEnO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlOb2RlIH0gZnJvbSAnLi9ub2RlJztcbmltcG9ydCB7IE5vZGVTcGFjZSB9IGZyb20gJy4uL3NwYWNlL25vZGUtc3BhY2UnO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuLi8uLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5pbXBvcnQgeyBSRVNJWkVfSEFORExFX0RJQU1FVEVSLCBnZXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWZzIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZUZvcmVpZ25SZWN0YW5nbGUoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudDxJbWFnZURhdGE+KTogUmVjdGFuZ2xlQ2xpZW50IHtcbiAgICBsZXQgeyB4LCB5IH0gPSBnZXRSZWN0YW5nbGVCeU5vZGUoTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KSk7XG4gICAgY29uc3QgZWxlbWVudFdpZHRoID0gZWxlbWVudC5tYW51YWxXaWR0aCB8fCBlbGVtZW50LndpZHRoO1xuXG4gICAgeCA9XG4gICAgICAgIGVsZW1lbnRXaWR0aCA+IGVsZW1lbnQuZGF0YS5pbWFnZS53aWR0aFxuICAgICAgICAgICAgPyB4ICsgTm9kZVNwYWNlLmdldFRleHRMZWZ0U3BhY2UoYm9hcmQsIGVsZW1lbnQpICsgKGVsZW1lbnRXaWR0aCAtIGVsZW1lbnQuZGF0YS5pbWFnZS53aWR0aCkgLyAyXG4gICAgICAgICAgICA6IHggKyBOb2RlU3BhY2UuZ2V0VGV4dExlZnRTcGFjZShib2FyZCwgZWxlbWVudCk7XG4gICAgeSA9IE5vZGVTcGFjZS5nZXRJbWFnZVRvcFNwYWNlKGJvYXJkLCBlbGVtZW50KSArIHk7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtZW50LmRhdGEuaW1hZ2UhO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgIH07XG4gICAgcmV0dXJuIHJlY3RhbmdsZTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzSGl0SW1hZ2UgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50PEltYWdlRGF0YT4sIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IGltYWdlUmVjdGFuZ2xlID0gZ2V0SW1hZ2VGb3JlaWduUmVjdGFuZ2xlKGJvYXJkIGFzIFBsYWl0TWluZEJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBpbWFnZU91dGxpbmVSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0T3V0bGluZVJlY3RhbmdsZShpbWFnZVJlY3RhbmdsZSwgLVJFU0laRV9IQU5ETEVfRElBTUVURVIgLyAyKTtcbiAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShpbWFnZU91dGxpbmVSZWN0YW5nbGUsIHBvaW50KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRJbWFnZVJlc2l6ZUhhbmRsZURpcmVjdGlvbiA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogTWluZEVsZW1lbnQ8SW1hZ2VEYXRhPiwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgaW1hZ2VSZWN0YW5nbGUgPSBnZXRJbWFnZUZvcmVpZ25SZWN0YW5nbGUoYm9hcmQgYXMgUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZVJlZnMgPSBnZXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWZzKGltYWdlUmVjdGFuZ2xlLCBSRVNJWkVfSEFORExFX0RJQU1FVEVSKTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNpemVIYW5kbGVSZWZzLmZpbmQocmVzaXplSGFuZGxlUmVmID0+IHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5pc0hpdChSZWN0YW5nbGVDbGllbnQudG9SZWN0YW5nbGVDbGllbnQoW3BvaW50LCBwb2ludF0pLCByZXNpemVIYW5kbGVSZWYucmVjdGFuZ2xlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbiJdfQ==
@@ -1,10 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, ChangeDetectionStrategy, NgZone, Directive, Input, HostListener } from '@angular/core';
3
- import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, PlaitElement, PlaitNode, Path, isNullOrUndefined, PlaitBoard, distanceBetweenPointAndRectangle, RectangleClient, PlaitPluginKey, getSelectedElements, idCreator, Transforms, clearSelectedElement, addSelectedElement, depthFirstRecursion, getIsRecursionFunc, drawRoundRectangle, drawLinearPath, drawBezierPath, createG, updateForeignObject, getRectangleByElements, NODE_TO_PARENT, createForeignObject, setStrokeLinecap, ACTIVE_STROKE_WIDTH, createText, PlaitPointerType, NODE_TO_INDEX, PlaitChildrenElementComponent, isMainPointer, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint, CoreTransforms, BOARD_TO_HOST, BoardTransforms, throttleRAF, removeSelectedElement, PlaitHistoryBoard, hotkeys, setClipboardDataByMedia, getClipboardDataByMedia, ResizeCursorClass, preventTouchMove, PRESS_AND_MOVE_BUFFER, MERGING, setClipboardData, setClipboardDataByText, getDataFromClipboard } from '@plait/core';
3
+ import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, PlaitElement, PlaitNode, Path, isNullOrUndefined, PlaitBoard, distanceBetweenPointAndRectangle, RectangleClient, PlaitPluginKey, getSelectedElements, idCreator, Transforms, clearSelectedElement, addSelectedElement, depthFirstRecursion, getIsRecursionFunc, drawRoundRectangle, drawLinearPath, drawBezierPath, createG, updateForeignObject, getRectangleByElements, NODE_TO_PARENT, createForeignObject, setStrokeLinecap, ACTIVE_STROKE_WIDTH, createText, PlaitPointerType, NODE_TO_INDEX, PlaitChildrenElementComponent, isMainPointer, transformPoint, toPoint, getHitElementByPoint, distanceBetweenPointAndPoint, CoreTransforms, BOARD_TO_HOST, BoardTransforms, throttleRAF, removeSelectedElement, PlaitHistoryBoard, hotkeys, setClipboardDataByMedia, getClipboardDataByMedia, ResizeCursorClass, preventTouchMove, PRESS_AND_MOVE_BUFFER, MERGING, setClipboardData, setClipboardDataByText, getDataFromClipboard } from '@plait/core';
4
4
  import { MindLayoutType, AbstractNode, isIndentedLayout, isHorizontalLayout, isHorizontalLogicLayout, ConnectingPosition, getNonAbstractChildren, isStandardLayout, isLeftLayout, isRightLayout, isVerticalLogicLayout, isTopLayout, isBottomLayout, getCorrectStartEnd, getAbstractLayout, GlobalLayout } from '@plait/layouts';
5
5
  import { PlaitMarkEditor, MarkTypes, DEFAULT_FONT_SIZE, TEXT_DEFAULT_HEIGHT, buildText, getTextSize, TextManage, ExitOrigin, getTextFromClipboard } from '@plait/text';
6
6
  import { fromEvent, Subject } from 'rxjs';
7
- import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs, Generator, CommonPluginElement, ImageGenerator, WithTextPluginKey, isDrawingMode, isDndMode, setCreationMode, BoardCreationMode, isExpandHotkey, isTabHotkey, isEnterHotkey, isVirtualKey, isDelete, isSpaceHotkey, MediaKeys, acceptImageTypes, buildImage, ResizeHandle, withResize } from '@plait/common';
7
+ import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs, addElementOfFocusedImage, removeElementOfFocusedImage, Generator, CommonPluginElement, ImageGenerator, WithTextPluginKey, isDrawingMode, isDndMode, setCreationMode, BoardCreationMode, isExpandHotkey, isTabHotkey, isEnterHotkey, isVirtualKey, isDelete, isSpaceHotkey, getElementOfFocusedImage, MediaKeys, acceptImageTypes, buildImage, ResizeHandle, withResize } from '@plait/common';
8
8
  import { Node as Node$1, Path as Path$1 } from 'slate';
9
9
  import { pointsOnBezierCurves } from 'points-on-curve';
10
10
  import { take, filter } from 'rxjs/operators';
@@ -712,10 +712,10 @@ function getImageForeignRectangle(board, element) {
712
712
  };
713
713
  return rectangle;
714
714
  }
715
- const isHitImage = (board, element, range) => {
715
+ const isHitImage = (board, element, point) => {
716
716
  const imageRectangle = getImageForeignRectangle(board, element);
717
717
  const imageOutlineRectangle = RectangleClient.getOutlineRectangle(imageRectangle, -RESIZE_HANDLE_DIAMETER / 2);
718
- return RectangleClient.isHit(RectangleClient.toRectangleClient([range.anchor, range.focus]), imageOutlineRectangle);
718
+ return RectangleClient.isPointInRectangle(imageOutlineRectangle, point);
719
719
  };
720
720
  const getHitImageResizeHandleDirection = (board, element, point) => {
721
721
  const imageRectangle = getImageForeignRectangle(board, element);
@@ -1095,25 +1095,16 @@ const adjustNodeToRoot = (board, node) => {
1095
1095
  };
1096
1096
  };
1097
1097
 
1098
- const BOARD_TO_SELECTED_IMAGE_ELEMENT = new WeakMap();
1099
- const getSelectedImageElement = (board) => {
1100
- return BOARD_TO_SELECTED_IMAGE_ELEMENT.get(board);
1101
- };
1102
- const addSelectedImageElement = (board, element) => {
1103
- BOARD_TO_SELECTED_IMAGE_ELEMENT.set(board, element);
1104
- };
1105
- const removeSelectedImageElement = (board) => {
1106
- BOARD_TO_SELECTED_IMAGE_ELEMENT.delete(board);
1098
+ const addImageFocus = (board, element) => {
1099
+ addElementOfFocusedImage(board, element);
1100
+ const elementComponent = PlaitElement.getComponent(element);
1101
+ elementComponent.imageGenerator.componentRef.instance.isFocus = true;
1102
+ elementComponent.imageGenerator.componentRef.instance.cdr.markForCheck();
1107
1103
  };
1108
- const setImageFocus = (board, element, isFocus) => {
1109
- if (isFocus) {
1110
- addSelectedImageElement(board, element);
1111
- }
1112
- else {
1113
- removeSelectedImageElement(board);
1114
- }
1104
+ const removeImageFocus = (board, element) => {
1105
+ removeElementOfFocusedImage(board);
1115
1106
  const elementComponent = PlaitElement.getComponent(element);
1116
- elementComponent.imageGenerator.componentRef.instance.isFocus = isFocus;
1107
+ elementComponent.imageGenerator.componentRef.instance.isFocus = false;
1117
1108
  elementComponent.imageGenerator.componentRef.instance.cdr.markForCheck();
1118
1109
  };
1119
1110
 
@@ -2531,7 +2522,7 @@ const replaceEmoji = (board, element, oldEmoji, newEmoji) => {
2531
2522
  };
2532
2523
 
2533
2524
  const removeImage = (board, element) => {
2534
- setImageFocus(board, element, false);
2525
+ removeImageFocus(board, element);
2535
2526
  const newElement = {
2536
2527
  data: { ...element.data }
2537
2528
  };
@@ -2814,16 +2805,17 @@ class NodeActiveGenerator extends Generator {
2814
2805
  }
2815
2806
  baseDraw(element, data) {
2816
2807
  const activeG = createG();
2817
- if (AbstractNode.isAbstract(element)) {
2818
- this.abstractOutlineG = drawAbstractIncludedOutline(this.board, PlaitBoard.getRoughSVG(this.board), element);
2819
- activeG.append(this.abstractOutlineG);
2820
- }
2821
2808
  const node = MindElement.getNode(element);
2822
2809
  const rectangle = getRectangleByNode(node);
2823
2810
  const strokeWidth = getStrokeWidthByElement(this.board, element);
2824
2811
  const activeStrokeWidth = ACTIVE_STROKE_WIDTH;
2825
2812
  const activeRectangle = RectangleClient.inflate(rectangle, activeStrokeWidth);
2826
2813
  const strokeG = drawRoundRectangle(PlaitBoard.getRoughSVG(this.board), activeRectangle.x, activeRectangle.y, activeRectangle.x + activeRectangle.width, activeRectangle.y + activeRectangle.height, { stroke: PRIMARY_COLOR, strokeWidth: activeStrokeWidth, fill: '' }, true, DefaultNodeStyle.shape.rectangleRadius + (activeStrokeWidth + strokeWidth) / 2);
2814
+ if (AbstractNode.isAbstract(element)) {
2815
+ this.abstractOutlineG = drawAbstractIncludedOutline(this.board, PlaitBoard.getRoughSVG(this.board), element);
2816
+ activeG.append(this.abstractOutlineG);
2817
+ strokeG.classList.add('abstract-element');
2818
+ }
2827
2819
  activeG.appendChild(strokeG);
2828
2820
  return activeG;
2829
2821
  }
@@ -3220,20 +3212,19 @@ const withNodeDnd = (board) => {
3220
3212
  }
3221
3213
  const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3222
3214
  const selectedElements = getSelectedElements(board);
3223
- const hitTarget = getHitElements(board, { ranges: [{ anchor: point, focus: point }] });
3224
- const targetElement = hitTarget && hitTarget.length === 1 && MindElement.isMindElement(board, hitTarget[0]) ? hitTarget[0] : null;
3225
- if (targetElement &&
3226
- MindElement.isMindElement(board, targetElement) &&
3227
- !targetElement.isRoot &&
3228
- !AbstractNode.isAbstract(targetElement)) {
3215
+ const hitElement = getHitElementByPoint(board, point);
3216
+ if (hitElement &&
3217
+ MindElement.isMindElement(board, hitElement) &&
3218
+ !PlaitMind.isMind(hitElement) &&
3219
+ !AbstractNode.isAbstract(hitElement)) {
3229
3220
  const targetElements = selectedElements.filter(element => MindElement.isMindElement(board, element) && !element.isRoot && !AbstractNode.isAbstract(element));
3230
- const isMultiple = selectedElements.length > 0 && selectedElements.includes(targetElement);
3221
+ const isMultiple = selectedElements.length > 0 && selectedElements.includes(hitElement);
3231
3222
  if (isMultiple) {
3232
3223
  activeElements = targetElements;
3233
3224
  startPoint = point;
3234
3225
  }
3235
3226
  else {
3236
- activeElements = [targetElement];
3227
+ activeElements = [hitElement];
3237
3228
  startPoint = point;
3238
3229
  }
3239
3230
  }
@@ -3714,35 +3705,33 @@ const withNodeHoverDetect = (board) => {
3714
3705
  const withNodeImage = (board) => {
3715
3706
  const { keydown, pointerDown, globalPointerUp, setFragment, insertFragment, deleteFragment } = board;
3716
3707
  board.pointerDown = (event) => {
3717
- const selectedImageElement = getSelectedImageElement(board);
3708
+ const elementOfFocusedImage = getElementOfFocusedImage(board);
3718
3709
  if (PlaitBoard.isReadonly(board) || !isMainPointer(event) || !PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
3719
- if (selectedImageElement) {
3720
- setImageFocus(board, selectedImageElement, false);
3710
+ if (elementOfFocusedImage && MindElement.isMindElement(board, elementOfFocusedImage)) {
3711
+ removeImageFocus(board, elementOfFocusedImage);
3721
3712
  }
3722
3713
  pointerDown(event);
3723
3714
  return;
3724
3715
  }
3725
3716
  const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
3726
- const range = { anchor: point, focus: point };
3727
- const hitImageElements = getHitElements(board, { ranges: [range] }, (value) => MindElement.isMindElement(board, value) && MindElement.hasImage(value));
3728
- const hasImage = hitImageElements.length;
3729
- const hitImage = hasImage > 0 && isHitImage(board, hitImageElements[0], range);
3730
- if (selectedImageElement && hitImage && hitImageElements[0] === selectedImageElement) {
3717
+ const hitImageElement = getHitElementByPoint(board, point, (value) => MindElement.isMindElement(board, value) && MindElement.hasImage(value));
3718
+ const hitImage = hitImageElement && isHitImage(board, hitImageElement, point);
3719
+ if (elementOfFocusedImage && hitImage && hitImageElement === elementOfFocusedImage) {
3731
3720
  temporaryDisableSelection(board);
3732
3721
  pointerDown(event);
3733
3722
  return;
3734
3723
  }
3735
- if (selectedImageElement) {
3736
- setImageFocus(board, selectedImageElement, false);
3724
+ if (elementOfFocusedImage && MindElement.isMindElement(board, elementOfFocusedImage)) {
3725
+ removeImageFocus(board, elementOfFocusedImage);
3737
3726
  }
3738
3727
  if (hitImage) {
3739
3728
  temporaryDisableSelection(board);
3740
- setImageFocus(board, hitImageElements[0], true);
3729
+ addImageFocus(board, hitImageElement);
3741
3730
  }
3742
3731
  pointerDown(event);
3743
3732
  };
3744
3733
  board.keydown = (event) => {
3745
- const selectedImageElement = getSelectedImageElement(board);
3734
+ const selectedImageElement = getElementOfFocusedImage(board);
3746
3735
  if (!PlaitBoard.isReadonly(board) && selectedImageElement && (hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event))) {
3747
3736
  addSelectedElement(board, selectedImageElement);
3748
3737
  MindTransforms.removeImage(board, selectedImageElement);
@@ -3753,16 +3742,16 @@ const withNodeImage = (board) => {
3753
3742
  board.globalPointerUp = (event) => {
3754
3743
  if (PlaitBoard.isFocus(board)) {
3755
3744
  const isInBoard = event.target instanceof Node && PlaitBoard.getBoardContainer(board).contains(event.target);
3756
- const selectedImageElement = getSelectedImageElement(board);
3745
+ const selectedImageElement = getElementOfFocusedImage(board);
3757
3746
  // Clear image selection when mouse board outside area
3758
- if (selectedImageElement && !isInBoard) {
3759
- setImageFocus(board, selectedImageElement, false);
3747
+ if (selectedImageElement && MindElement.isMindElement(board, selectedImageElement) && !isInBoard) {
3748
+ removeImageFocus(board, selectedImageElement);
3760
3749
  }
3761
3750
  }
3762
3751
  globalPointerUp(event);
3763
3752
  };
3764
3753
  board.setFragment = (data, rectangle, type) => {
3765
- const selectedImageElement = getSelectedImageElement(board);
3754
+ const selectedImageElement = getElementOfFocusedImage(board);
3766
3755
  if (selectedImageElement) {
3767
3756
  setClipboardDataByMedia(data, selectedImageElement.data.image, MediaKeys.image);
3768
3757
  return;
@@ -3770,7 +3759,7 @@ const withNodeImage = (board) => {
3770
3759
  setFragment(data, rectangle, type);
3771
3760
  };
3772
3761
  board.deleteFragment = (data) => {
3773
- const selectedImageElement = getSelectedImageElement(board);
3762
+ const selectedImageElement = getElementOfFocusedImage(board);
3774
3763
  if (selectedImageElement) {
3775
3764
  MindTransforms.removeImage(board, selectedImageElement);
3776
3765
  }
@@ -3778,11 +3767,11 @@ const withNodeImage = (board) => {
3778
3767
  };
3779
3768
  board.insertFragment = (data, targetPoint) => {
3780
3769
  const selectedElements = getSelectedElements(board);
3781
- const isSelectedImage = !!getSelectedImageElement(board);
3770
+ const isSelectedImage = !!getElementOfFocusedImage(board);
3782
3771
  const isSingleSelection = selectedElements.length === 1 && MindElement.isMindElement(board, selectedElements[0]);
3783
3772
  if (data?.files.length && (isSingleSelection || isSelectedImage)) {
3784
3773
  const acceptImageArray = acceptImageTypes.map(type => 'image/' + type);
3785
- const selectedElement = (selectedElements[0] || getSelectedImageElement(board));
3774
+ const selectedElement = (selectedElements[0] || getElementOfFocusedImage(board));
3786
3775
  if (acceptImageArray.includes(data?.files[0].type)) {
3787
3776
  const imageFile = data.files[0];
3788
3777
  buildImage(board, imageFile, DEFAULT_MIND_IMAGE_WIDTH, imageItem => {
@@ -3793,7 +3782,7 @@ const withNodeImage = (board) => {
3793
3782
  }
3794
3783
  const imageItem = getClipboardDataByMedia(data, MediaKeys.image);
3795
3784
  if (imageItem && (isSingleSelection || isSelectedImage)) {
3796
- const selectedElement = (selectedElements[0] || getSelectedImageElement(board));
3785
+ const selectedElement = (selectedElements[0] || getElementOfFocusedImage(board));
3797
3786
  MindTransforms.setImage(board, selectedElement, imageItem);
3798
3787
  return;
3799
3788
  }
@@ -3935,7 +3924,8 @@ const withNodeImageResize = (board) => {
3935
3924
  return true;
3936
3925
  },
3937
3926
  detect: (point) => {
3938
- const selectedMindElement = getSelectedImageElement(board);
3927
+ const elementOfFocusedImage = getElementOfFocusedImage(board);
3928
+ const selectedMindElement = elementOfFocusedImage && MindElement.isMindElement(board, elementOfFocusedImage) ? elementOfFocusedImage : undefined;
3939
3929
  if (selectedMindElement) {
3940
3930
  const result = getHitImageResizeHandleDirection(board, selectedMindElement, point);
3941
3931
  if (result) {
@@ -3964,7 +3954,7 @@ const withNodeImageResize = (board) => {
3964
3954
  const height = originHeight / ratio;
3965
3955
  const imageItem = { ...resizeRef.element.data.image, width, height };
3966
3956
  MindTransforms.setImage(board, PlaitNode.get(board, resizeRef.path), imageItem);
3967
- addSelectedImageElement(board, PlaitNode.get(board, resizeRef.path));
3957
+ addElementOfFocusedImage(board, PlaitNode.get(board, resizeRef.path));
3968
3958
  }
3969
3959
  };
3970
3960
  withResize(board, options);
@@ -4155,7 +4145,7 @@ const getNextSelectedElement = (board, firstLevelElements) => {
4155
4145
 
4156
4146
  const withMind = (baseBoard) => {
4157
4147
  const board = baseBoard;
4158
- const { drawElement, dblclick, isHitSelection, getRectangle, isMovable, isRecursion, isAlign } = board;
4148
+ const { drawElement, dblclick, isRectangleHit, isHit, getRectangle, isMovable, isRecursion, isAlign, isImageBindingAllowed, } = board;
4159
4149
  board.drawElement = (context) => {
4160
4150
  if (PlaitMind.isMind(context.element)) {
4161
4151
  return PlaitMindComponent;
@@ -4185,13 +4175,21 @@ const withMind = (baseBoard) => {
4185
4175
  }
4186
4176
  return isRecursion(element);
4187
4177
  };
4188
- board.isHitSelection = (element, range) => {
4178
+ board.isRectangleHit = (element, selection) => {
4179
+ if (MindElement.isMindElement(board, element)) {
4180
+ const client = getRectangleByNode(MindElement.getNode(element));
4181
+ const isHit = RectangleClient.isHit(RectangleClient.toRectangleClient([selection.anchor, selection.focus]), client);
4182
+ return isHit;
4183
+ }
4184
+ return isRectangleHit(element, selection);
4185
+ };
4186
+ board.isHit = (element, point) => {
4189
4187
  if (MindElement.isMindElement(board, element)) {
4190
4188
  const client = getRectangleByNode(MindElement.getNode(element));
4191
- const isHit = RectangleClient.isHit(RectangleClient.toRectangleClient([range.anchor, range.focus]), client);
4189
+ const isHit = RectangleClient.isHit(RectangleClient.toRectangleClient([point, point]), client);
4192
4190
  return isHit;
4193
4191
  }
4194
- return isHitSelection(element, range);
4192
+ return isHit(element, point);
4195
4193
  };
4196
4194
  board.isMovable = element => {
4197
4195
  if (PlaitMind.isMind(element) && element.isRoot) {
@@ -4199,6 +4197,12 @@ const withMind = (baseBoard) => {
4199
4197
  }
4200
4198
  return isMovable(element);
4201
4199
  };
4200
+ board.isImageBindingAllowed = element => {
4201
+ if (MindElement.isMindElement(board, element)) {
4202
+ return true;
4203
+ }
4204
+ return isImageBindingAllowed(element);
4205
+ };
4202
4206
  board.isAlign = (element) => {
4203
4207
  if (PlaitMind.isMind(element) && element.isRoot) {
4204
4208
  return true;
@@ -4279,5 +4283,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4279
4283
  * Generated bundle index. Do not edit.
4280
4284
  */
4281
4285
 
4282
- 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, DEFAULT_MIND_IMAGE_WIDTH, DefaultAbstractNodeStyle, DefaultNodeStyle, ELEMENT_TO_NODE, EXTEND_DIAMETER, EXTEND_OFFSET, GRAY_COLOR, INHERIT_ATTRIBUTE_KEYS, IS_DRAGGING, LayoutDirection, LayoutDirectionsMap, MindColorfulThemeColor, MindDarkThemeColor, MindDefaultThemeColor, MindElement, MindElementShape, MindEmojiBaseComponent, MindNode, MindNodeComponent, MindPointerType, MindQueries, MindRetroThemeColor, MindSoftThemeColor, MindStarryThemeColor, MindThemeColor, MindThemeColors, MindTransforms, NodeSpace, NodeTopicThreshold, PRIMARY_COLOR, PlaitMind, PlaitMindComponent, QUICK_INSERT_CIRCLE_COLOR, QUICK_INSERT_CIRCLE_OFFSET, QUICK_INSERT_INNER_CROSS_COLOR, ROOT_TOPIC_FONT_SIZE, ROOT_TOPIC_HEIGHT, ROOT_TOPIC_WIDTH, 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, getEmojiFontSize, getEmojiForeignRectangle, getEmojiRectangle, getEmojisWidthHeight, getFillByElement, getFirstLevelElement, getFontSizeBySlateElement, getHitAbstractHandle, getHitImageResizeHandleDirection, getImageForeignRectangle, getInCorrectLayoutDirection, getLayoutDirection$1 as getLayoutDirection, getLayoutOptions, getLayoutReverseDirection, getLocationScope, getMindThemeColor, getNewNodeHeight, getNextBranchColor, getNodeDefaultFontSize, getOverallAbstracts, getPathByDropTarget, getRectangleByElement, getRectangleByNode, getRectangleByResizingLocation, getRelativeStartEndByAbstractRef, getRootLayout, getSelectedImageElement, getSelectedMindElements, 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, removeActiveOnDragOrigin, removeSelectedImageElement, separateChildren, setImageFocus, setIsDragging, temporaryDisableSelection, withMind, withMindExtend };
4286
+ 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, DEFAULT_MIND_IMAGE_WIDTH, DefaultAbstractNodeStyle, DefaultNodeStyle, ELEMENT_TO_NODE, EXTEND_DIAMETER, EXTEND_OFFSET, GRAY_COLOR, INHERIT_ATTRIBUTE_KEYS, IS_DRAGGING, LayoutDirection, LayoutDirectionsMap, MindColorfulThemeColor, MindDarkThemeColor, MindDefaultThemeColor, MindElement, MindElementShape, MindEmojiBaseComponent, MindNode, MindNodeComponent, MindPointerType, MindQueries, MindRetroThemeColor, MindSoftThemeColor, MindStarryThemeColor, MindThemeColor, MindThemeColors, MindTransforms, NodeSpace, NodeTopicThreshold, PRIMARY_COLOR, PlaitMind, PlaitMindComponent, QUICK_INSERT_CIRCLE_COLOR, QUICK_INSERT_CIRCLE_OFFSET, QUICK_INSERT_INNER_CROSS_COLOR, ROOT_TOPIC_FONT_SIZE, ROOT_TOPIC_HEIGHT, ROOT_TOPIC_WIDTH, STROKE_WIDTH, TOPIC_COLOR, TOPIC_DEFAULT_MAX_WORD_COUNT, TOPIC_FONT_SIZE, TRANSPARENT, WithMindPluginKey, addActiveOnDragOrigin, addImageFocus, 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, getEmojiFontSize, getEmojiForeignRectangle, getEmojiRectangle, getEmojisWidthHeight, getFillByElement, getFirstLevelElement, getFontSizeBySlateElement, getHitAbstractHandle, getHitImageResizeHandleDirection, getImageForeignRectangle, getInCorrectLayoutDirection, getLayoutDirection$1 as getLayoutDirection, getLayoutOptions, getLayoutReverseDirection, getLocationScope, getMindThemeColor, getNewNodeHeight, getNextBranchColor, getNodeDefaultFontSize, getOverallAbstracts, getPathByDropTarget, getRectangleByElement, getRectangleByNode, getRectangleByResizingLocation, getRelativeStartEndByAbstractRef, getRootLayout, getSelectedMindElements, 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, removeActiveOnDragOrigin, removeImageFocus, separateChildren, setIsDragging, temporaryDisableSelection, withMind, withMindExtend };
4283
4287
  //# sourceMappingURL=plait-mind.mjs.map