@plait/draw 0.52.0 → 0.54.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 (49) hide show
  1. package/constants/geometry.d.ts +3 -1
  2. package/esm2022/constants/geometry.mjs +4 -2
  3. package/esm2022/generators/line-auto-complete.generator.mjs +1 -1
  4. package/esm2022/interfaces/index.mjs +2 -2
  5. package/esm2022/interfaces/line.mjs +20 -8
  6. package/esm2022/line.component.mjs +5 -17
  7. package/esm2022/plugins/with-draw-fragment.mjs +1 -1
  8. package/esm2022/plugins/with-draw-hotkey.mjs +9 -7
  9. package/esm2022/plugins/with-draw-resize.mjs +114 -13
  10. package/esm2022/plugins/with-draw.mjs +5 -12
  11. package/esm2022/plugins/with-geometry-resize.mjs +8 -5
  12. package/esm2022/plugins/with-line-auto-complete-reaction.mjs +7 -4
  13. package/esm2022/plugins/with-line-auto-complete.mjs +17 -16
  14. package/esm2022/plugins/with-line-bound-reaction.mjs +20 -19
  15. package/esm2022/plugins/with-line-create.mjs +4 -4
  16. package/esm2022/plugins/with-line-resize.mjs +10 -11
  17. package/esm2022/transforms/line.mjs +4 -4
  18. package/esm2022/utils/geometry.mjs +31 -22
  19. package/esm2022/utils/hit.mjs +29 -27
  20. package/esm2022/utils/line/elbow.mjs +22 -9
  21. package/esm2022/utils/line/line-basic.mjs +21 -25
  22. package/esm2022/utils/line/line-common.mjs +27 -15
  23. package/esm2022/utils/line/line-resize.mjs +7 -11
  24. package/esm2022/utils/position/geometry.mjs +52 -20
  25. package/esm2022/utils/resize-snap.mjs +361 -0
  26. package/esm2022/utils/shape.mjs +2 -2
  27. package/fesm2022/plait-draw.mjs +556 -437
  28. package/fesm2022/plait-draw.mjs.map +1 -1
  29. package/generators/line-auto-complete.generator.d.ts +3 -3
  30. package/interfaces/index.d.ts +2 -2
  31. package/package.json +1 -1
  32. package/plugins/with-draw-fragment.d.ts +2 -2
  33. package/plugins/with-draw-resize.d.ts +12 -0
  34. package/utils/geometry.d.ts +7 -4
  35. package/utils/hit.d.ts +3 -1
  36. package/utils/line/elbow.d.ts +6 -13
  37. package/utils/line/line-basic.d.ts +4 -4
  38. package/utils/line/line-common.d.ts +3 -13
  39. package/utils/position/geometry.d.ts +12 -5
  40. package/utils/resize-snap.d.ts +49 -0
  41. package/utils/shape.d.ts +2 -2
  42. package/esm2022/generators/group.generator.mjs +0 -20
  43. package/esm2022/group.component.mjs +0 -47
  44. package/esm2022/utils/resize-align-reaction.mjs +0 -316
  45. package/esm2022/utils/resize-align.mjs +0 -37
  46. package/generators/group.generator.d.ts +0 -6
  47. package/group.component.d.ts +0 -17
  48. package/utils/resize-align-reaction.d.ts +0 -42
  49. package/utils/resize-align.d.ts +0 -8
@@ -1,12 +1,12 @@
1
1
  import { PlaitBoard } from '@plait/core';
2
- import { PlaitGeometry, PlaitShape } from '../interfaces';
2
+ import { PlaitGeometry, PlaitShapeElement } from '../interfaces';
3
3
  import { ActiveGeneratorExtraData, Generator } from '@plait/common';
4
- export declare class LineAutoCompleteGenerator extends Generator<PlaitShape, ActiveGeneratorExtraData> {
4
+ export declare class LineAutoCompleteGenerator extends Generator<PlaitShapeElement, ActiveGeneratorExtraData> {
5
5
  board: PlaitBoard;
6
6
  autoCompleteG: SVGGElement;
7
7
  hoverElement: SVGGElement | null;
8
8
  constructor(board: PlaitBoard);
9
- canDraw(element: PlaitShape, data: ActiveGeneratorExtraData): boolean;
9
+ canDraw(element: PlaitShapeElement, data: ActiveGeneratorExtraData): boolean;
10
10
  draw(element: PlaitGeometry, data: ActiveGeneratorExtraData): SVGGElement;
11
11
  removeAutoCompleteG(index: number): void;
12
12
  recoverAutoCompleteG(): void;
@@ -7,14 +7,14 @@ export * from './geometry';
7
7
  export * from './text';
8
8
  export * from './element';
9
9
  export type PlaitDrawElement = PlaitGeometry | PlaitLine | PlaitImage;
10
- export type PlaitShape = PlaitGeometry | PlaitImage;
10
+ export type PlaitShapeElement = PlaitGeometry | PlaitImage;
11
11
  export declare const PlaitDrawElement: {
12
12
  isGeometry: (value: any) => value is PlaitGeometry;
13
13
  isLine: (value: any) => value is PlaitLine;
14
14
  isText: (value: any) => value is PlaitText;
15
15
  isImage: (value: any) => value is PlaitImage;
16
16
  isDrawElement: (value: any) => value is PlaitDrawElement;
17
- isShape: (value: any) => value is PlaitShape;
17
+ isShapeElement: (value: any) => value is PlaitShapeElement;
18
18
  isBasicShape: (value: any) => boolean;
19
19
  isFlowchart: (value: any) => boolean;
20
20
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/draw",
3
- "version": "0.52.0",
3
+ "version": "0.54.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^17.2.4",
6
6
  "@angular/core": "^17.2.4",
@@ -1,4 +1,4 @@
1
1
  import { PlaitBoard } from '@plait/core';
2
- import { PlaitLine, PlaitShape } from '../interfaces';
2
+ import { PlaitLine, PlaitShapeElement } from '../interfaces';
3
3
  export declare const withDrawFragment: (baseBoard: PlaitBoard) => PlaitBoard;
4
- export declare const getBoundedLineElements: (board: PlaitBoard, plaitShapes: PlaitShape[]) => PlaitLine[];
4
+ export declare const getBoundedLineElements: (board: PlaitBoard, plaitShapes: PlaitShapeElement[]) => PlaitLine[];
@@ -1,6 +1,12 @@
1
1
  import { ResizeRef, ResizeState } from '@plait/common';
2
2
  import { PlaitBoard, Point } from '@plait/core';
3
3
  import { PlaitDrawElement } from '../interfaces';
4
+ export interface BulkRotationRef {
5
+ angle: number;
6
+ offsetX: number;
7
+ offsetY: number;
8
+ newCenterPoint: Point;
9
+ }
4
10
  export declare function withDrawResize(board: PlaitBoard): PlaitBoard;
5
11
  export declare const getResizeOriginPointAndHandlePoint: (board: PlaitBoard, resizeRef: ResizeRef<PlaitDrawElement | PlaitDrawElement[]>) => {
6
12
  originPoint: Point;
@@ -11,3 +17,9 @@ export declare const getResizeZoom: (resizeState: ResizeState, resizeOriginPoint
11
17
  yZoom: number;
12
18
  };
13
19
  export declare const movePointByZoomAndOriginPoint: (p: Point, resizeOriginPoint: Point, xZoom: number, yZoom: number) => Point;
20
+ /**
21
+ * 1. Rotate 90°
22
+ * 2. Scale based on the rotated points
23
+ * 3. Reverse rotate the scaled points by 90°
24
+ */
25
+ export declare const getResizePointsByOtherwiseAxis: (board: PlaitBoard, points: Point[], resizeOriginPoint: Point, xZoom: number, yZoom: number) => Point[];
@@ -4,7 +4,7 @@ import { Alignment, CustomText } from '@plait/text';
4
4
  import { Element } from 'slate';
5
5
  import { DrawPointerType } from '../constants';
6
6
  import { Options } from 'roughjs/bin/core';
7
- import { PlaitShape } from '../interfaces';
7
+ import { PlaitShapeElement } from '../interfaces';
8
8
  export type GeometryStyleOptions = Pick<PlaitGeometry, 'fill' | 'strokeColor' | 'strokeWidth'>;
9
9
  export type TextProperties = Partial<CustomText> & {
10
10
  align?: Alignment;
@@ -17,9 +17,12 @@ export declare const getTextRectangle: (element: PlaitGeometry) => {
17
17
  x: number;
18
18
  y: number;
19
19
  };
20
- export declare const drawBoundMask: (board: PlaitBoard, element: PlaitGeometry) => SVGGElement;
20
+ export declare const drawBoundReaction: (board: PlaitBoard, element: PlaitGeometry, options?: {
21
+ hasMask: boolean;
22
+ hasConnector: boolean;
23
+ }) => SVGGElement;
21
24
  export declare const drawGeometry: (board: PlaitBoard, outerRectangle: RectangleClient, shape: GeometryShapes, options: Options) => SVGGElement;
22
- export declare const getNearestPoint: (element: PlaitShape, point: Point) => Point;
25
+ export declare const getNearestPoint: (element: PlaitShapeElement, point: Point) => Point;
23
26
  export declare const getCenterPointsOnPolygon: (points: Point[]) => Point[];
24
27
  export declare const getDefaultFlowchartProperty: (symbol: FlowchartSymbols) => {
25
28
  width: number;
@@ -41,7 +44,7 @@ export declare const getDefaultFlowchartProperty: (symbol: FlowchartSymbols) =>
41
44
  height: number;
42
45
  };
43
46
  export declare const createDefaultFlowchart: (point: Point) => (PlaitGeometry | import("../interfaces").PlaitLine)[];
44
- export declare const getAutoCompletePoints: (element: PlaitShape) => [Point, Point, Point, Point];
47
+ export declare const getAutoCompletePoints: (element: PlaitShapeElement) => [Point, Point, Point, Point];
45
48
  export declare const getHitIndexOfAutoCompletePoint: (movingPoint: Point, points: Point[]) => number;
46
49
  export declare const getDrawDefaultStrokeColor: (theme: ThemeColorMode) => string;
47
50
  export declare const getFlowchartDefaultFill: (theme: ThemeColorMode) => string;
package/utils/hit.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  import { PlaitElement, Selection, PlaitBoard, Point } from '@plait/core';
2
- import { PlaitGeometry, PlaitLine } from '../interfaces';
2
+ import { PlaitGeometry, PlaitLine, PlaitShapeElement } from '../interfaces';
3
3
  export declare const isTextExceedingBounds: (geometry: PlaitGeometry) => boolean;
4
4
  export declare const isHitLineText: (board: PlaitBoard, element: PlaitLine, point: Point) => boolean;
5
5
  export declare const isHitPolyLine: (pathPoints: Point[], point: Point) => boolean;
6
6
  export declare const isHitLine: (board: PlaitBoard, element: PlaitLine, point: Point) => boolean;
7
7
  export declare const isRectangleHitDrawElement: (board: PlaitBoard, element: PlaitElement, selection: Selection) => boolean | null;
8
8
  export declare const isHitDrawElement: (board: PlaitBoard, element: PlaitElement, point: Point) => boolean | null;
9
+ export declare const isHitEdgeOfShape: (board: PlaitBoard, element: PlaitShapeElement, point: Point, hitDistanceBuffer: number) => boolean;
10
+ export declare const isInsideOfShape: (board: PlaitBoard, element: PlaitShapeElement, point: Point, hitDistanceBuffer: number) => boolean;
9
11
  export declare const isHitElementInside: (board: PlaitBoard, element: PlaitElement, point: Point) => boolean | null;
@@ -1,19 +1,12 @@
1
- import { Point, PlaitBoard } from '@plait/core';
1
+ import { Point, PlaitBoard, RectangleClient } from '@plait/core';
2
+ import { ElbowLineRouteOptions } from '@plait/common';
2
3
  import { LineHandleRefPair, PlaitLine } from '../../interfaces';
4
+ export declare const isSelfLoop: (element: PlaitLine) => boolean | "" | undefined;
5
+ export declare const isUseDefaultOrthogonalRoute: (element: PlaitLine, options: ElbowLineRouteOptions) => boolean;
3
6
  export declare const getElbowPoints: (board: PlaitBoard, element: PlaitLine) => Point[];
4
7
  export declare const getNextSourceAndTargetPoints: (board: PlaitBoard, element: PlaitLine) => Point[];
5
8
  export declare const getSourceAndTargetRectangle: (board: PlaitBoard, element: PlaitLine, handleRefPair: LineHandleRefPair) => {
6
- sourceRectangle: {
7
- x: number;
8
- y: number;
9
- width: number;
10
- height: number;
11
- };
12
- targetRectangle: {
13
- x: number;
14
- y: number;
15
- width: number;
16
- height: number;
17
- };
9
+ sourceRectangle: RectangleClient;
10
+ targetRectangle: RectangleClient;
18
11
  };
19
12
  export declare function getNextRenderPoints(board: PlaitBoard, element: PlaitLine, renderPoints?: Point[]): Point[];
@@ -1,13 +1,13 @@
1
1
  import { Point, PlaitBoard, RectangleClient } from '@plait/core';
2
- import { LineHandle, LineShape, LineText, PlaitLine, PlaitShape } from '../../interfaces';
2
+ import { LineHandle, LineShape, LineText, PlaitLine, PlaitShapeElement } from '../../interfaces';
3
3
  export declare const createLineElement: (shape: LineShape, points: [Point, Point], source: LineHandle, target: LineHandle, texts?: LineText[], options?: Pick<PlaitLine, 'strokeColor' | 'strokeWidth'>) => PlaitLine;
4
4
  export declare const getLinePoints: (board: PlaitBoard, element: PlaitLine) => Point[];
5
5
  export declare const getCurvePoints: (board: PlaitBoard, element: PlaitLine) => Point[];
6
6
  export declare function getMiddlePoints(board: PlaitBoard, element: PlaitLine): Point[];
7
7
  export declare const drawLine: (board: PlaitBoard, element: PlaitLine) => SVGGElement;
8
- export declare const getConnectionByNearestPoint: (board: PlaitBoard, point: Point, hitElement: PlaitShape) => Point;
9
- export declare const getHitConnectorPoint: (point: Point, hitElement: PlaitShape, rectangle: RectangleClient) => Point | undefined;
8
+ export declare const getHitConnection: (board: PlaitBoard, point: Point, hitElement: PlaitShapeElement) => Point;
9
+ export declare const getHitConnectorPoint: (point: Point, hitElement: PlaitShapeElement) => Point | undefined;
10
10
  export declare const getLineTextRectangle: (board: PlaitBoard, element: PlaitLine, index: number) => RectangleClient;
11
11
  export declare const getLines: (board: PlaitBoard) => PlaitLine[];
12
12
  export declare const Q2C: (points: Point[]) => Point[];
13
- export declare const handleLineCreating: (board: PlaitBoard, lineShape: LineShape, sourcePoint: Point, movingPoint: Point, sourceElement: PlaitShape | null, lineShapeG: SVGGElement) => PlaitLine;
13
+ export declare const handleLineCreating: (board: PlaitBoard, lineShape: LineShape, sourcePoint: Point, movingPoint: Point, sourceElement: PlaitShapeElement | null, lineShapeG: SVGGElement) => PlaitLine;
@@ -1,4 +1,4 @@
1
- import { Point, PlaitBoard, PointOfRectangle, Direction, Vector } from '@plait/core';
1
+ import { Point, PlaitBoard, RectangleClient, PointOfRectangle, Direction, Vector } from '@plait/core';
2
2
  import { LineHandleRefPair, PlaitGeometry, PlaitLine } from '../../interfaces';
3
3
  export declare const getLineHandleRefPair: (board: PlaitBoard, element: PlaitLine) => LineHandleRefPair;
4
4
  export declare const getConnectionPoint: (geometry: PlaitGeometry, connection: Point, direction?: Direction, delta?: number) => Point;
@@ -6,12 +6,7 @@ export declare const getVectorByConnection: (boundElement: PlaitGeometry, connec
6
6
  export declare const getElbowLineRouteOptions: (board: PlaitBoard, element: PlaitLine, handleRefPair?: LineHandleRefPair) => {
7
7
  sourcePoint: PointOfRectangle;
8
8
  nextSourcePoint: Point;
9
- sourceRectangle: {
10
- x: number;
11
- y: number;
12
- width: number;
13
- height: number;
14
- };
9
+ sourceRectangle: RectangleClient;
15
10
  sourceOuterRectangle: {
16
11
  x: number;
17
12
  y: number;
@@ -20,12 +15,7 @@ export declare const getElbowLineRouteOptions: (board: PlaitBoard, element: Plai
20
15
  };
21
16
  targetPoint: PointOfRectangle;
22
17
  nextTargetPoint: Point;
23
- targetRectangle: {
24
- x: number;
25
- y: number;
26
- width: number;
27
- height: number;
28
- };
18
+ targetRectangle: RectangleClient;
29
19
  targetOuterRectangle: {
30
20
  x: number;
31
21
  y: number;
@@ -1,14 +1,21 @@
1
1
  import { PlaitBoard, Point, RectangleClient } from '@plait/core';
2
- import { PlaitGeometry } from '../../interfaces';
3
- import { ResizeHandle } from '@plait/common';
4
- export declare const getHitRectangleResizeHandleRef: (board: PlaitBoard, rectangle: RectangleClient, point: Point) => {
2
+ import { PlaitGeometry, PlaitShapeElement } from '../../interfaces';
3
+ export declare const getHitRectangleResizeHandleRef: (board: PlaitBoard, rectangle: RectangleClient, point: Point, angle?: number) => {
5
4
  rectangle: {
6
5
  x: number;
7
6
  y: number;
8
7
  width: number;
9
8
  height: number;
10
9
  };
11
- handle: ResizeHandle;
10
+ handle: import("@plait/common").ResizeHandle;
12
11
  cursorClass: import("@plait/core").ResizeCursorClass;
13
12
  } | undefined;
14
- export declare const getHitOutlineGeometry: (board: PlaitBoard, point: Point, offset?: number) => PlaitGeometry | null;
13
+ export declare const getSnappingGeometry: (board: PlaitBoard, point: Point) => PlaitGeometry | null;
14
+ export declare const getSnappingRef: (board: PlaitBoard, hitElement: PlaitShapeElement, point: Point) => {
15
+ isHitEdge: boolean;
16
+ isHitConnector: boolean;
17
+ connectorPoint: Point | undefined;
18
+ edgePoint: Point;
19
+ };
20
+ export declare const getHitGeometry: (board: PlaitBoard, point: Point, offset?: number) => PlaitGeometry | null;
21
+ export declare const traverseDrawShapes: (board: PlaitBoard, callback: (element: PlaitShapeElement) => void) => void;
@@ -0,0 +1,49 @@
1
+ import { ResizeRef, ResizeState } from '@plait/common';
2
+ import { DirectionFactors, PlaitBoard, PlaitElement, Point, RectangleClient } from '@plait/core';
3
+ import { PlaitDrawElement } from '../interfaces';
4
+ export declare const debugGenerator: import("@plait/core").DebugGenerator;
5
+ export interface ResizeAlignDelta {
6
+ deltaX: number;
7
+ deltaY: number;
8
+ }
9
+ export interface SnapRef extends ResizeAlignDelta {
10
+ xZoom: number;
11
+ yZoom: number;
12
+ activePoints: Point[];
13
+ }
14
+ export interface ResizeSnapRef extends SnapRef {
15
+ alignG: SVGGElement;
16
+ }
17
+ export interface ResizeSnapOptions {
18
+ resizeState: ResizeState;
19
+ resizeOriginPoints: Point[];
20
+ activeRectangle: RectangleClient;
21
+ directionFactors: DirectionFactors;
22
+ originPoint: Point;
23
+ handlePoint: Point;
24
+ isFromCorner: boolean;
25
+ isAspectRatio: boolean;
26
+ }
27
+ type TripleAlignAxis = [number, number, number];
28
+ export declare class ResizeSnapReaction {
29
+ private board;
30
+ private activeElements;
31
+ alignRectangles: RectangleClient[];
32
+ angle: number;
33
+ constructor(board: PlaitBoard, activeElements: PlaitElement[]);
34
+ getAlignRectangle(): RectangleClient[];
35
+ getSnapRef(resizeAlignDelta: ResizeAlignDelta, resizeSnapOptions: ResizeSnapOptions): SnapRef;
36
+ getEqualLineDelta(resizeSnapOptions: ResizeSnapOptions): ResizeAlignDelta;
37
+ drawEqualLines(activePoints: Point[], resizeSnapOptions: ResizeSnapOptions): SVGGElement;
38
+ getAlignLineDelta(resizeSnapOptions: ResizeSnapOptions): ResizeAlignDelta;
39
+ drawAlignLines(activePoints: Point[], resizeSnapOptions: ResizeSnapOptions): SVGGElement;
40
+ handleResizeSnap(resizeSnapOptions: ResizeSnapOptions): ResizeSnapRef;
41
+ }
42
+ export declare const getTripleAlignAxis: (rectangle: RectangleClient, isHorizontal: boolean) => TripleAlignAxis;
43
+ export declare const isAlign: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => boolean;
44
+ export declare const getClosestDelta: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => number;
45
+ export declare function getResizeSnapRef(board: PlaitBoard, resizeRef: ResizeRef<PlaitDrawElement | PlaitDrawElement[]>, resizeState: ResizeState, resizeOriginPointAndHandlePoint: {
46
+ originPoint: Point;
47
+ handlePoint: Point;
48
+ }, isAspectRatio: boolean, isFromCorner: boolean): ResizeSnapRef;
49
+ export {};
package/utils/shape.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { PlaitShape } from '../interfaces';
2
- export declare const getShape: (value: PlaitShape) => import("../interfaces").GeometryShapes;
1
+ import { PlaitShapeElement } from '../interfaces';
2
+ export declare const getElementShape: (value: PlaitShapeElement) => import("../interfaces").GeometryShapes;
@@ -1,20 +0,0 @@
1
- import { Generator } from '@plait/common';
2
- import { ACTIVE_STROKE_WIDTH, drawRectangle, getRectangleByGroup } from '@plait/core';
3
- export class GroupGenerator extends Generator {
4
- canDraw(element) {
5
- return true;
6
- }
7
- draw(element, partialSelected) {
8
- const options = {
9
- stroke: '',
10
- strokeWidth: ACTIVE_STROKE_WIDTH,
11
- strokeLineDash: [5]
12
- };
13
- if (partialSelected) {
14
- options.stroke = '#999';
15
- }
16
- const rectangle = getRectangleByGroup(this.board, element, true);
17
- return drawRectangle(this.board, rectangle, options);
18
- }
19
- }
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZHJhdy9zcmMvZ2VuZXJhdG9ycy9ncm91cC5nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQWMsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR2xHLE1BQU0sT0FBTyxjQUFlLFNBQVEsU0FBcUI7SUFDckQsT0FBTyxDQUFDLE9BQW1CO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBbUIsRUFBRSxlQUF3QjtRQUM5QyxNQUFNLE9BQU8sR0FBWTtZQUNyQixNQUFNLEVBQUUsRUFBRTtZQUNWLFdBQVcsRUFBRSxtQkFBbUI7WUFDaEMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3RCLENBQUM7UUFDRixJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQzVCLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRSxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHZW5lcmF0b3IgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IEFDVElWRV9TVFJPS0VfV0lEVEgsIFBsYWl0R3JvdXAsIGRyYXdSZWN0YW5nbGUsIGdldFJlY3RhbmdsZUJ5R3JvdXAgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBHcm91cEdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvcjxQbGFpdEdyb3VwPiB7XG4gICAgY2FuRHJhdyhlbGVtZW50OiBQbGFpdEdyb3VwKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGRyYXcoZWxlbWVudDogUGxhaXRHcm91cCwgcGFydGlhbFNlbGVjdGVkOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBzdHJva2U6ICcnLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IEFDVElWRV9TVFJPS0VfV0lEVEgsXG4gICAgICAgICAgICBzdHJva2VMaW5lRGFzaDogWzVdXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXJ0aWFsU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuc3Ryb2tlID0gJyM5OTknO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5R3JvdXAodGhpcy5ib2FyZCwgZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBkcmF3UmVjdGFuZ2xlKHRoaXMuYm9hcmQsIHJlY3RhbmdsZSwgb3B0aW9ucyk7XG4gICAgfVxufVxuIl19
@@ -1,47 +0,0 @@
1
- import { ChangeDetectionStrategy, Component } from '@angular/core';
2
- import { ActiveGenerator, CommonPluginElement } from '@plait/common';
3
- import { getElementsInGroup, getRectangleByGroup, isSelectedElementOrGroup, isSelectionMoving } from '@plait/core';
4
- import { GroupGenerator } from './generators/group.generator';
5
- import * as i0 from "@angular/core";
6
- export class GroupComponent extends CommonPluginElement {
7
- constructor(viewContainerRef, cdr) {
8
- super(cdr);
9
- this.viewContainerRef = viewContainerRef;
10
- this.cdr = cdr;
11
- }
12
- initializeGenerator() {
13
- this.activeGenerator = new ActiveGenerator(this.board, {
14
- getRectangle: (element) => {
15
- return getRectangleByGroup(this.board, element);
16
- },
17
- getStrokeWidth: () => 0,
18
- getStrokeOpacity: () => 0,
19
- hasResizeHandle: () => {
20
- return !isSelectionMoving(this.board);
21
- }
22
- });
23
- this.groupGenerator = new GroupGenerator(this.board);
24
- }
25
- ngOnInit() {
26
- super.ngOnInit();
27
- this.initializeGenerator();
28
- }
29
- onContextChanged(value, previous) {
30
- const elementsInGroup = getElementsInGroup(this.board, value.element, false, true);
31
- const isPartialSelectGroup = elementsInGroup.some(item => isSelectedElementOrGroup(this.board, item)) &&
32
- !elementsInGroup.every(item => isSelectedElementOrGroup(this.board, item));
33
- this.groupGenerator.processDrawing(value.element, this.g, isPartialSelectGroup);
34
- }
35
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: GroupComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
36
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: GroupComponent, isStandalone: true, selector: "plait-group", usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37
- }
38
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: GroupComponent, decorators: [{
39
- type: Component,
40
- args: [{
41
- selector: 'plait-group',
42
- template: ``,
43
- changeDetection: ChangeDetectionStrategy.OnPush,
44
- standalone: true
45
- }]
46
- }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }] });
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvZHJhdy9zcmMvZ3JvdXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMEQsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUtILGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLGlCQUFpQixFQUNwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7O0FBUTlELE1BQU0sT0FBTyxjQUFlLFNBQVEsbUJBQTJDO0lBRTNFLFlBQW9CLGdCQUFrQyxFQUFZLEdBQXNCO1FBQ3BGLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURLLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBWSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtJQUV4RixDQUFDO0lBTUQsbUJBQW1CO1FBQ2YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBYSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQy9ELFlBQVksRUFBRSxDQUFDLE9BQW1CLEVBQUUsRUFBRTtnQkFDbEMsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFDRCxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QixnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLGVBQWUsRUFBRSxHQUFHLEVBQUU7Z0JBQ2xCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsQ0FBQztTQUNKLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxnQkFBZ0IsQ0FDWixLQUF3RCxFQUN4RCxRQUEyRDtRQUUzRCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25GLE1BQU0sb0JBQW9CLEdBQ3RCLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hFLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUNwRixDQUFDOzhHQXRDUSxjQUFjO2tHQUFkLGNBQWMsOEZBSmIsRUFBRTs7MkZBSUgsY0FBYztrQkFOMUIsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsUUFBUSxFQUFFLEVBQUU7b0JBQ1osZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFVBQVUsRUFBRSxJQUFJO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgT25EZXN0cm95LCBWaWV3Q29udGFpbmVyUmVmLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZlR2VuZXJhdG9yLCBDb21tb25QbHVnaW5FbGVtZW50IH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQge1xuICAgIE9uQ29udGV4dENoYW5nZWQsXG4gICAgUGxhaXRCb2FyZCxcbiAgICBQbGFpdEdyb3VwLFxuICAgIFBsYWl0UGx1Z2luRWxlbWVudENvbnRleHQsXG4gICAgZ2V0RWxlbWVudHNJbkdyb3VwLFxuICAgIGdldFJlY3RhbmdsZUJ5R3JvdXAsXG4gICAgaXNTZWxlY3RlZEVsZW1lbnRPckdyb3VwLFxuICAgIGlzU2VsZWN0aW9uTW92aW5nXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IEdyb3VwR2VuZXJhdG9yIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dyb3VwLmdlbmVyYXRvcic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncGxhaXQtZ3JvdXAnLFxuICAgIHRlbXBsYXRlOiBgYCxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEdyb3VwQ29tcG9uZW50IGV4dGVuZHMgQ29tbW9uUGx1Z2luRWxlbWVudDxQbGFpdEdyb3VwLCBQbGFpdEJvYXJkPlxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ29udGV4dENoYW5nZWQ8UGxhaXRHcm91cCwgUGxhaXRCb2FyZD4ge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAgICAgc3VwZXIoY2RyKTtcbiAgICB9XG5cbiAgICBhY3RpdmVHZW5lcmF0b3IhOiBBY3RpdmVHZW5lcmF0b3I8UGxhaXRHcm91cD47XG5cbiAgICBncm91cEdlbmVyYXRvciE6IEdyb3VwR2VuZXJhdG9yO1xuXG4gICAgaW5pdGlhbGl6ZUdlbmVyYXRvcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVHZW5lcmF0b3IgPSBuZXcgQWN0aXZlR2VuZXJhdG9yPFBsYWl0R3JvdXA+KHRoaXMuYm9hcmQsIHtcbiAgICAgICAgICAgIGdldFJlY3RhbmdsZTogKGVsZW1lbnQ6IFBsYWl0R3JvdXApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVjdGFuZ2xlQnlHcm91cCh0aGlzLmJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRTdHJva2VXaWR0aDogKCkgPT4gMCxcbiAgICAgICAgICAgIGdldFN0cm9rZU9wYWNpdHk6ICgpID0+IDAsXG4gICAgICAgICAgICBoYXNSZXNpemVIYW5kbGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWlzU2VsZWN0aW9uTW92aW5nKHRoaXMuYm9hcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncm91cEdlbmVyYXRvciA9IG5ldyBHcm91cEdlbmVyYXRvcih0aGlzLmJvYXJkKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yKCk7XG4gICAgfVxuXG4gICAgb25Db250ZXh0Q2hhbmdlZChcbiAgICAgICAgdmFsdWU6IFBsYWl0UGx1Z2luRWxlbWVudENvbnRleHQ8UGxhaXRHcm91cCwgUGxhaXRCb2FyZD4sXG4gICAgICAgIHByZXZpb3VzOiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0PFBsYWl0R3JvdXAsIFBsYWl0Qm9hcmQ+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzSW5Hcm91cCA9IGdldEVsZW1lbnRzSW5Hcm91cCh0aGlzLmJvYXJkLCB2YWx1ZS5lbGVtZW50LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGlzUGFydGlhbFNlbGVjdEdyb3VwID1cbiAgICAgICAgICAgIGVsZW1lbnRzSW5Hcm91cC5zb21lKGl0ZW0gPT4gaXNTZWxlY3RlZEVsZW1lbnRPckdyb3VwKHRoaXMuYm9hcmQsIGl0ZW0pKSAmJlxuICAgICAgICAgICAgIWVsZW1lbnRzSW5Hcm91cC5ldmVyeShpdGVtID0+IGlzU2VsZWN0ZWRFbGVtZW50T3JHcm91cCh0aGlzLmJvYXJkLCBpdGVtKSk7XG4gICAgICAgIHRoaXMuZ3JvdXBHZW5lcmF0b3IucHJvY2Vzc0RyYXdpbmcodmFsdWUuZWxlbWVudCwgdGhpcy5nLCBpc1BhcnRpYWxTZWxlY3RHcm91cCk7XG4gICAgfVxufVxuIl19