@nasser-sw/fabric 7.0.1-beta3 → 7.0.1-beta5
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.
- package/0 +0 -0
- package/dist/index.js +345 -162
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.min.mjs +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs +345 -162
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +345 -162
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +345 -162
- package/dist/index.node.mjs.map +1 -1
- package/dist/package.json.min.mjs +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/shapes/Line.d.ts +32 -86
- package/dist/src/shapes/Line.d.ts.map +1 -1
- package/dist/src/shapes/Line.min.mjs +1 -1
- package/dist/src/shapes/Line.min.mjs.map +1 -1
- package/dist/src/shapes/Line.mjs +345 -161
- package/dist/src/shapes/Line.mjs.map +1 -1
- package/dist-extensions/src/shapes/CustomLine.d.ts +10 -0
- package/dist-extensions/src/shapes/CustomLine.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Line.d.ts +32 -86
- package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
- package/fabric-test-editor.html +157 -8
- package/fabric-test2.html +513 -0
- package/fabric.ts +182 -182
- package/package.json +1 -1
- package/src/shapes/Line.ts +397 -164
- package/debug/konva/CHANGELOG.md +0 -1474
- package/debug/konva/LICENSE +0 -22
- package/debug/konva/README.md +0 -205
- package/debug/konva/gulpfile.mjs +0 -110
- package/debug/konva/package.json +0 -139
- package/debug/konva/release.sh +0 -65
- package/debug/konva/resources/doc-includes/ContainerParams.txt +0 -6
- package/debug/konva/resources/doc-includes/NodeParams.txt +0 -20
- package/debug/konva/resources/doc-includes/ShapeParams.txt +0 -53
- package/debug/konva/resources/jsdoc.conf.json +0 -28
- package/debug/konva/rollup.config.mjs +0 -32
- package/debug/konva/src/Animation.ts +0 -237
- package/debug/konva/src/BezierFunctions.ts +0 -826
- package/debug/konva/src/Canvas.ts +0 -193
- package/debug/konva/src/Container.ts +0 -649
- package/debug/konva/src/Context.ts +0 -1017
- package/debug/konva/src/Core.ts +0 -5
- package/debug/konva/src/DragAndDrop.ts +0 -173
- package/debug/konva/src/Factory.ts +0 -246
- package/debug/konva/src/FastLayer.ts +0 -29
- package/debug/konva/src/Global.ts +0 -210
- package/debug/konva/src/Group.ts +0 -31
- package/debug/konva/src/Layer.ts +0 -546
- package/debug/konva/src/Node.ts +0 -3477
- package/debug/konva/src/PointerEvents.ts +0 -67
- package/debug/konva/src/Shape.ts +0 -2081
- package/debug/konva/src/Stage.ts +0 -1000
- package/debug/konva/src/Tween.ts +0 -811
- package/debug/konva/src/Util.ts +0 -1123
- package/debug/konva/src/Validators.ts +0 -210
- package/debug/konva/src/_CoreInternals.ts +0 -85
- package/debug/konva/src/_FullInternals.ts +0 -171
- package/debug/konva/src/canvas-backend.ts +0 -36
- package/debug/konva/src/filters/Blur.ts +0 -388
- package/debug/konva/src/filters/Brighten.ts +0 -48
- package/debug/konva/src/filters/Brightness.ts +0 -30
- package/debug/konva/src/filters/Contrast.ts +0 -75
- package/debug/konva/src/filters/Emboss.ts +0 -207
- package/debug/konva/src/filters/Enhance.ts +0 -154
- package/debug/konva/src/filters/Grayscale.ts +0 -25
- package/debug/konva/src/filters/HSL.ts +0 -108
- package/debug/konva/src/filters/HSV.ts +0 -106
- package/debug/konva/src/filters/Invert.ts +0 -23
- package/debug/konva/src/filters/Kaleidoscope.ts +0 -274
- package/debug/konva/src/filters/Mask.ts +0 -220
- package/debug/konva/src/filters/Noise.ts +0 -44
- package/debug/konva/src/filters/Pixelate.ts +0 -107
- package/debug/konva/src/filters/Posterize.ts +0 -46
- package/debug/konva/src/filters/RGB.ts +0 -82
- package/debug/konva/src/filters/RGBA.ts +0 -103
- package/debug/konva/src/filters/Sepia.ts +0 -27
- package/debug/konva/src/filters/Solarize.ts +0 -29
- package/debug/konva/src/filters/Threshold.ts +0 -44
- package/debug/konva/src/index.ts +0 -3
- package/debug/konva/src/shapes/Arc.ts +0 -176
- package/debug/konva/src/shapes/Arrow.ts +0 -231
- package/debug/konva/src/shapes/Circle.ts +0 -76
- package/debug/konva/src/shapes/Ellipse.ts +0 -121
- package/debug/konva/src/shapes/Image.ts +0 -319
- package/debug/konva/src/shapes/Label.ts +0 -386
- package/debug/konva/src/shapes/Line.ts +0 -364
- package/debug/konva/src/shapes/Path.ts +0 -1013
- package/debug/konva/src/shapes/Rect.ts +0 -79
- package/debug/konva/src/shapes/RegularPolygon.ts +0 -167
- package/debug/konva/src/shapes/Ring.ts +0 -94
- package/debug/konva/src/shapes/Sprite.ts +0 -370
- package/debug/konva/src/shapes/Star.ts +0 -125
- package/debug/konva/src/shapes/Text.ts +0 -1065
- package/debug/konva/src/shapes/TextPath.ts +0 -583
- package/debug/konva/src/shapes/Transformer.ts +0 -1889
- package/debug/konva/src/shapes/Wedge.ts +0 -129
- package/debug/konva/src/skia-backend.ts +0 -35
- package/debug/konva/src/types.ts +0 -84
- package/debug/konva/tsconfig.json +0 -31
- package/debug/konva/tsconfig.test.json +0 -7
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var a="7.0.1-
|
|
1
|
+
var a="7.0.1-beta5";export{a as version};
|
|
2
2
|
//# sourceMappingURL=package.json.min.mjs.map
|
package/dist/package.json.mjs
CHANGED
|
@@ -4,114 +4,60 @@ import { Point } from '../Point';
|
|
|
4
4
|
import type { FabricObjectProps, SerializedObjectProps } from './Object/types';
|
|
5
5
|
import type { ObjectEvents } from '../EventTypeDefs';
|
|
6
6
|
import type { CSSRules } from '../parser/typedefs';
|
|
7
|
-
|
|
7
|
+
import type { TPointerEvent, Transform } from '../EventTypeDefs';
|
|
8
|
+
interface UniqueLineCoords {
|
|
8
9
|
x1: number;
|
|
9
10
|
x2: number;
|
|
10
11
|
y1: number;
|
|
11
12
|
y2: number;
|
|
12
13
|
}
|
|
13
|
-
export interface SerializedLineProps extends SerializedObjectProps,
|
|
14
|
+
export interface SerializedLineProps extends SerializedObjectProps, UniqueLineCoords {
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
-
* A Class to draw a line
|
|
17
|
-
* A bunch of methods will be added to Polyline to handle the line case
|
|
18
|
-
* The line class is very strange to work with, is all special, it hardly aligns
|
|
19
|
-
* to what a developer want everytime there is an angle
|
|
20
|
-
* @deprecated
|
|
21
|
-
*/
|
|
22
|
-
export declare class Line<Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>, SProps extends SerializedLineProps = SerializedLineProps, EventSpec extends ObjectEvents = ObjectEvents> extends FabricObject<Props, SProps, EventSpec> implements UniqueLineProps {
|
|
23
|
-
/**
|
|
24
|
-
* x value or first line edge
|
|
25
|
-
* @type number
|
|
26
|
-
*/
|
|
16
|
+
export declare class Line<Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>, SProps extends SerializedLineProps = SerializedLineProps, EventSpec extends ObjectEvents = ObjectEvents> extends FabricObject<Props, SProps, EventSpec> implements UniqueLineCoords {
|
|
27
17
|
x1: number;
|
|
28
|
-
/**
|
|
29
|
-
* y value or first line edge
|
|
30
|
-
* @type number
|
|
31
|
-
*/
|
|
32
18
|
y1: number;
|
|
33
|
-
/**
|
|
34
|
-
* x value or second line edge
|
|
35
|
-
* @type number
|
|
36
|
-
*/
|
|
37
19
|
x2: number;
|
|
38
|
-
/**
|
|
39
|
-
* y value or second line edge
|
|
40
|
-
* @type number
|
|
41
|
-
*/
|
|
42
20
|
y2: number;
|
|
21
|
+
hitStrokeWidth: number | 'auto';
|
|
22
|
+
private _updatingEndpoints;
|
|
23
|
+
private _useEndpointCoords;
|
|
43
24
|
static type: string;
|
|
44
25
|
static cacheProperties: string[];
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
26
|
+
constructor([x1, y1, x2, y2]?: [number, number, number, number], options?: Partial<Props & {
|
|
27
|
+
hitStrokeWidth?: number | 'auto';
|
|
28
|
+
}>);
|
|
29
|
+
_setupLineControls(): void;
|
|
30
|
+
_p1PositionHandler(): Point;
|
|
31
|
+
_p2PositionHandler(): Point;
|
|
32
|
+
_renderEndpointControl(ctx: CanvasRenderingContext2D, left: number, top: number): void;
|
|
33
|
+
drawBorders(ctx: CanvasRenderingContext2D, styleOverride?: any): void | this;
|
|
34
|
+
_drawLineBorders(ctx: CanvasRenderingContext2D, styleOverride?: any): void;
|
|
35
|
+
_renderControls(ctx: CanvasRenderingContext2D, styleOverride?: any): void;
|
|
36
|
+
getBoundingRect(): import("../typedefs").TBBox;
|
|
37
|
+
setCoords(): void;
|
|
38
|
+
getCoords(): [Point, Point, Point, Point];
|
|
39
|
+
containsPoint(point: Point): boolean;
|
|
40
|
+
_distanceToLineSegment(px: number, py: number): number;
|
|
41
|
+
_endpointActionHandler(eventData: TPointerEvent, transformData: Transform, x: number, y: number): boolean;
|
|
42
|
+
_snapToAngle(fromX: number, fromY: number, toX: number, toY: number): {
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
};
|
|
46
|
+
_setWidthHeight(skipReposition?: boolean): void;
|
|
62
47
|
_set(key: string, value: any): this;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
* @param {CanvasRenderingContext2D} ctx Context to render on
|
|
66
|
-
*/
|
|
48
|
+
render(ctx: CanvasRenderingContext2D): void;
|
|
49
|
+
_renderDirectly(ctx: CanvasRenderingContext2D): void;
|
|
67
50
|
_render(ctx: CanvasRenderingContext2D): void;
|
|
68
|
-
/**
|
|
69
|
-
* This function is an helper for svg import. it returns the center of the object in the svg
|
|
70
|
-
* untransformed coordinates
|
|
71
|
-
* @private
|
|
72
|
-
* @return {Point} center point from element coordinates
|
|
73
|
-
*/
|
|
74
51
|
_findCenterFromElement(): Point;
|
|
75
|
-
/**
|
|
76
|
-
* Returns object representation of an instance
|
|
77
|
-
* @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output
|
|
78
|
-
* @return {Object} object representation of an instance
|
|
79
|
-
*/
|
|
80
52
|
toObject<T extends Omit<Props & TClassProperties<this>, keyof SProps>, K extends keyof T = never>(propertiesToInclude?: K[]): Pick<T, K> & SProps;
|
|
81
53
|
_getNonTransformedDimensions(): Point;
|
|
82
|
-
|
|
83
|
-
* Recalculates line points given width and height
|
|
84
|
-
* Those points are simply placed around the center,
|
|
85
|
-
* This is not useful outside internal render functions and svg output
|
|
86
|
-
* Is not meant to be for the developer.
|
|
87
|
-
* @private
|
|
88
|
-
*/
|
|
89
|
-
calcLinePoints(): UniqueLineProps;
|
|
90
|
-
/**
|
|
91
|
-
* Returns svg representation of an instance
|
|
92
|
-
* @return {Array} an array of strings with the specific svg representation
|
|
93
|
-
* of the instance
|
|
94
|
-
*/
|
|
54
|
+
calcLinePoints(): UniqueLineCoords;
|
|
95
55
|
_toSVG(): string[];
|
|
96
|
-
|
|
97
|
-
* List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})
|
|
98
|
-
* @see http://www.w3.org/TR/SVG/shapes.html#LineElement
|
|
99
|
-
*/
|
|
56
|
+
toSVG(reviver?: (markup: string) => string): string;
|
|
100
57
|
static ATTRIBUTE_NAMES: string[];
|
|
101
|
-
/**
|
|
102
|
-
* Returns Line instance from an SVG element
|
|
103
|
-
* @param {HTMLElement} element Element to parse
|
|
104
|
-
* @param {Object} [options] Options object
|
|
105
|
-
* @param {Function} [callback] callback function invoked after parsing
|
|
106
|
-
*/
|
|
107
58
|
static fromElement(element: HTMLElement, options?: Abortable, cssRules?: CSSRules): Promise<Line<{
|
|
108
59
|
[x: string]: /*elided*/ any;
|
|
109
60
|
}, SerializedLineProps, ObjectEvents>>;
|
|
110
|
-
/**
|
|
111
|
-
* Returns Line instance from an object representation
|
|
112
|
-
* @param {Object} object Object to create an instance from
|
|
113
|
-
* @returns {Promise<Line>}
|
|
114
|
-
*/
|
|
115
61
|
static fromObject<T extends TOptions<SerializedLineProps>>({ x1, y1, x2, y2, ...object }: T): Promise<Line<Partial<FabricObjectProps>, SerializedLineProps, ObjectEvents>>;
|
|
116
62
|
}
|
|
117
63
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Line.d.ts","sourceRoot":"","sources":["../../../src/shapes/Line.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Line.d.ts","sourceRoot":"","sources":["../../../src/shapes/Line.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{SHARED_ATTRIBUTES as i}from"../parser/attributes.min.mjs";import{parseAttributes as s}from"../parser/parseAttributes.min.mjs";import{classRegistry as e}from"../ClassRegistry.min.mjs";import{FabricObject as o}from"./Object/FabricObject.min.mjs";import{Point as
|
|
1
|
+
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{SHARED_ATTRIBUTES as i}from"../parser/attributes.min.mjs";import{parseAttributes as s}from"../parser/parseAttributes.min.mjs";import{classRegistry as e}from"../ClassRegistry.min.mjs";import{FabricObject as o}from"./Object/FabricObject.min.mjs";import{Point as n}from"../Point.min.mjs";import{isFiller as r}from"../util/typeAssertions.min.mjs";import{LEFT as h,TOP as d,CENTER as a}from"../constants.min.mjs";import"../util/misc/vectors.min.mjs";import"../util/misc/projectStroke/StrokeLineJoinProjections.min.mjs";import"../config.min.mjs";import"./Group.min.mjs";import{makeBoundingBoxFromPoints as l}from"../util/misc/boundingBoxFromPoints.min.mjs";import"../cache.min.mjs";import"../parser/constants.min.mjs";import"../util/animation/AnimationRegistry.min.mjs";import{Control as p}from"../controls/Control.min.mjs";import{cacheProperties as m}from"./Object/defaultValues.min.mjs";const u=["x1","x2","y1","y2"];class c extends o{constructor(){let[i,s,e,o]=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[0,0,100,0],n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),t(this,"hitStrokeWidth","auto"),t(this,"_updatingEndpoints",!1),t(this,"_useEndpointCoords",!0),this.setOptions(n),this.x1=i,this.x2=e,this.y1=s,this.y2=o,void 0!==n.hitStrokeWidth&&(this.hitStrokeWidth=n.hitStrokeWidth),this.hasBorders=!1,this.hasControls=!0,this.selectable=!0,this.hoverCursor="move",this.perPixelTargetFind=!1,this.strokeLineCap="butt",this._setWidthHeight();const{left:r,top:a}=n;"number"==typeof r&&this.set(h,r),"number"==typeof a&&this.set(d,a),this._setupLineControls()}_setupLineControls(){this.controls={p1:new p({x:0,y:0,cursorStyle:"move",actionHandler:this._endpointActionHandler.bind(this),positionHandler:this._p1PositionHandler.bind(this),render:this._renderEndpointControl.bind(this),sizeX:12,sizeY:12}),p2:new p({x:0,y:0,cursorStyle:"move",actionHandler:this._endpointActionHandler.bind(this),positionHandler:this._p2PositionHandler.bind(this),render:this._renderEndpointControl.bind(this),sizeX:12,sizeY:12})}}_p1PositionHandler(){var t;const i=(null===(t=this.canvas)||void 0===t?void 0:t.viewportTransform)||[1,0,0,1,0,0];return new n(this.x1,this.y1).transform(i)}_p2PositionHandler(){var t;const i=(null===(t=this.canvas)||void 0===t?void 0:t.viewportTransform)||[1,0,0,1,0,0];return new n(this.x2,this.y2).transform(i)}_renderEndpointControl(t,i,s){t.save(),t.fillStyle="#007bff",t.strokeStyle="#ffffff",t.lineWidth=2,t.beginPath(),t.arc(i,s,6,0,2*Math.PI),t.fill(),t.stroke(),t.restore()}drawBorders(t){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this._useEndpointCoords?(this._drawLineBorders(t,i),this):super.drawBorders(t,i,{})}_drawLineBorders(t){var i;let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const e=(null===(i=this.canvas)||void 0===i?void 0:i.viewportTransform)||[1,0,0,1,0,0];t.save(),t.setTransform(e[0],e[1],e[2],e[3],e[4],e[5]),t.strokeStyle=s.borderColor||this.borderColor||"rgba(100, 200, 200, 0.5)",t.lineWidth=(this.strokeWidth||1)+5,t.lineCap=this.strokeLineCap||"butt",t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,t.beginPath(),t.moveTo(this.x1,this.y1),t.lineTo(this.x2,this.y2),t.stroke(),t.restore()}_renderControls(t){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,this.drawControls(t,i),t.restore()}getBoundingRect(){if(this._useEndpointCoords){const{x1:t,y1:i,x2:s,y2:e}=this,o="auto"===this.hitStrokeWidth?this.strokeWidth:this.hitStrokeWidth,n=Math.max(o/2+5,10);return{left:Math.min(t,s)-n,top:Math.min(i,e)-n,width:Math.abs(s-t)+2*n||2*n,height:Math.abs(e-i)+2*n||2*n}}return super.getBoundingRect()}setCoords(){if(this._useEndpointCoords){const t=this._findCenterFromElement();this.left=t.x,this.top=t.y;const i="auto"===this.hitStrokeWidth?this.strokeWidth:this.hitStrokeWidth,s=Math.max(i/2+5,10);this.width=Math.abs(this.x2-this.x1)+2*s,this.height=Math.abs(this.y2-this.y1)+2*s}super.setCoords()}getCoords(){if(this._useEndpointCoords){const t=this.x2-this.x1,i=this.y2-this.y1,s=Math.sqrt(t*t+i*i);if(0===s)return super.getCoords();const e="auto"===this.hitStrokeWidth?this.strokeWidth:this.hitStrokeWidth,o=Math.max(e/2+2,5),r=-i/s,h=t/s;return[new n(this.x1+r*o,this.y1+h*o),new n(this.x2+r*o,this.y2+h*o),new n(this.x2-r*o,this.y2-h*o),new n(this.x1-r*o,this.y1-h*o)]}return super.getCoords()}containsPoint(t){if(this._useEndpointCoords){var i;if((null===(i=this.canvas)||void 0===i?void 0:i.getActiveObject())===this)return super.containsPoint(t);const s=this._distanceToLineSegment(t.x,t.y),e="auto"===this.hitStrokeWidth?this.strokeWidth:this.hitStrokeWidth||1;return s<=Math.max(e/2+2,5)}return super.containsPoint(t)}_distanceToLineSegment(t,i){const s=this.x1,e=this.y1,o=this.x2,n=this.y2,r=(s-o)*(s-o)+(e-n)*(e-n);if(0===r)return Math.sqrt((t-s)*(t-s)+(i-e)*(i-e));const h=((t-s)*(o-s)+(i-e)*(n-e))/r;let d,a;return h<0?(d=s,a=e):h>1?(d=o,a=n):(d=s+h*(o-s),a=e+h*(n-e)),Math.sqrt((t-d)*(t-d)+(i-a)*(i-a))}_endpointActionHandler(t,i,s,e){var o;const r=i.corner,h=new n(s,e);let d=h.x,a=h.y;if(t.shiftKey){const t="p1"===r?"p2":"p1",i=this["p1"===t?"x1":"x2"],s=this["p1"===t?"y1":"y2"],e=this._snapToAngle(i,s,d,a);d=e.x,a=e.y}var l;return this._useEndpointCoords?("p1"===r?(this.x1=d,this.y1=a):"p2"===r&&(this.x2=d,this.y2=a),this.dirty=!0,this.setCoords(),null===(l=this.canvas)||void 0===l||l.requestRenderAll(),!0):(this._updatingEndpoints=!0,"p1"===r?(this.x1=d,this.y1=a):"p2"===r&&(this.x2=d,this.y2=a),this._setWidthHeight(),this.dirty=!0,this._updatingEndpoints=!1,null===(o=this.canvas)||void 0===o||o.requestRenderAll(),this.fire("modified",{transform:i,target:this,e:t}),!0)}_snapToAngle(t,i,s,e){const o=s-t,n=e-i,r=Math.sqrt(o*o+n*n);if(0===r)return{x:s,y:e};let h=Math.atan2(n,o)*(180/Math.PI);const d=15*Math.round(h/15)*(Math.PI/180);return{x:t+Math.cos(d)*r,y:i+Math.sin(d)*r}}_setWidthHeight(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.width=Math.abs(this.x2-this.x1)||1,this.height=Math.abs(this.y2-this.y1)||1,!t&&!this._updatingEndpoints){const{left:t,top:i,width:s,height:e}=l([{x:this.x1,y:this.y1},{x:this.x2,y:this.y2}]);this.setPositionByOrigin(new n(t+s/2,i+e/2),a,a)}}_set(t,i){const s=this.left,e=this.top;if(super._set(t,i),u.includes(t)&&(this._setWidthHeight(),this.dirty=!0),("left"===t||"top"===t)&&this.canvas&&!this._updatingEndpoints){const t=this.left-s,i=this.top-e;0===t&&0===i||(this._updatingEndpoints=!0,this.x1+=t,this.y1+=i,this.x2+=t,this.y2+=i,this._updatingEndpoints=!1)}return this}render(t){this._useEndpointCoords?this._renderDirectly(t):super.render(t)}_renderDirectly(t){var i,s;if(!this.visible)return;t.save();const e=(null===(i=this.canvas)||void 0===i?void 0:i.viewportTransform)||[1,0,0,1,0,0];t.transform(e[0],e[1],e[2],e[3],e[4],e[5]),t.globalAlpha=this.opacity,t.strokeStyle=(null===(s=this.stroke)||void 0===s?void 0:s.toString())||"#000",t.lineWidth=this.strokeWidth,t.lineCap=this.strokeLineCap||"butt",t.beginPath(),t.moveTo(this.x1,this.y1),t.lineTo(this.x2,this.y2),t.stroke(),t.restore()}_render(t){if(this._useEndpointCoords)return;t.beginPath();const i=this.calcLinePoints();t.moveTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineWidth=this.strokeWidth;const s=t.strokeStyle;r(this.stroke)&&(t.strokeStyle=this.stroke.toLive(t)),this.stroke&&this._renderStroke(t),t.strokeStyle=s}_findCenterFromElement(){return new n((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){const t=super._getNonTransformedDimensions();return"round"===this.strokeLineCap&&(t.x+=this.strokeWidth,t.y+=this.strokeWidth),t}calcLinePoints(){if(this._updatingEndpoints){const t=(this.x1+this.x2)/2,i=(this.y1+this.y2)/2;return{x1:this.x1-t,y1:this.y1-i,x2:this.x2-t,y2:this.y2-i}}const{x1:t,x2:i,y1:s,y2:e,width:o,height:n}=this,r=t<=i?-1:1,h=s<=e?-1:1;return{x1:r*o/2,y1:h*n/2,x2:r*-o/2,y2:h*-n/2}}_toSVG(){if(this._useEndpointCoords)return[`<line stroke="${this.stroke}" stroke-width="${this.strokeWidth}" stroke-linecap="${this.strokeLineCap}" `,`x1="${this.x1}" y1="${this.y1}" x2="${this.x2}" y2="${this.y2}" />\n`];{const{x1:t,x2:i,y1:s,y2:e}=this.calcLinePoints();return["<line ","COMMON_PARTS",`x1="${t}" y1="${s}" x2="${i}" y2="${e}" />\n`]}}toSVG(t){if(this._useEndpointCoords){const i=this._toSVG().join("");return t?t(i):i}return super.toSVG(t)}static async fromElement(t,i,e){const{x1:o=0,y1:n=0,x2:r=0,y2:h=0,...d}=s(t,this.ATTRIBUTE_NAMES,e);return new this([o,n,r,h],d)}static fromObject(t){let{x1:i,y1:s,x2:e,y2:o,...n}=t;return this._fromObject({...n,points:[i,s,e,o]},{extraParam:"points"})}}t(c,"type","Line"),t(c,"cacheProperties",[...m,...u]),t(c,"ATTRIBUTE_NAMES",i.concat(u)),e.setClass(c),e.setSVGClass(c);export{c as Line};
|
|
2
2
|
//# sourceMappingURL=Line.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Line.min.mjs","sources":["../../../src/shapes/Line.ts"],"sourcesContent":["import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial<Props> = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '<line ',\n 'COMMON_PARTS',\n `x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Line>}\n */\n static fromObject<T extends TOptions<SerializedLineProps>>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject<Line>(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n"],"names":["coordProps","Line","FabricObject","constructor","x1","y1","x2","y2","arguments","length","undefined","options","super","Object","assign","this","ownDefaults","setOptions","_setWidthHeight","left","top","set","LEFT","TOP","width","Math","abs","height","makeBoundingBoxFromPoints","x","y","position","Point","setPositionByOrigin","CENTER","_set","key","value","includes","_render","ctx","beginPath","p","calcLinePoints","moveTo","lineTo","lineWidth","strokeWidth","origStrokeStyle","strokeStyle","_this$stroke","isFiller","stroke","toLive","fillStyle","_renderStroke","_findCenterFromElement","toObject","propertiesToInclude","_getNonTransformedDimensions","dim","strokeLineCap","_x1","_x2","_y1","_y2","xMult","yMult","_toSVG","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","_ref","object","_fromObject","points","extraParam","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","concat","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Line.min.mjs","sources":["../../../src/shapes/Line.ts"],"sourcesContent":["import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\nimport { Control } from '../controls/Control';\nimport type { TPointerEvent, Transform } from '../EventTypeDefs';\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineCoords {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineCoords {}\n\nexport class Line< \n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueLineCoords\n{\n declare x1: number;\n declare y1: number;\n declare x2: number;\n declare y2: number;\n\n hitStrokeWidth: number | 'auto' = 'auto';\n\n private _updatingEndpoints = false;\n private _useEndpointCoords = true;\n\n static type = 'Line';\n static cacheProperties = [...cacheProperties, ...coordProps];\n\n constructor([x1, y1, x2, y2] = [0, 0, 100, 0], options: Partial<Props & {hitStrokeWidth?: number | 'auto'}> = {}) {\n super();\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n\n if (options.hitStrokeWidth !== undefined) {\n this.hitStrokeWidth = options.hitStrokeWidth;\n }\n\n this.hasBorders = false;\n this.hasControls = true;\n this.selectable = true;\n this.hoverCursor = 'move';\n this.perPixelTargetFind = false;\n this.strokeLineCap = 'butt';\n\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n this._setupLineControls();\n }\n\n _setupLineControls() {\n this.controls = {\n p1: new Control({\n x: 0,\n y: 0,\n cursorStyle: 'move',\n actionHandler: this._endpointActionHandler.bind(this),\n positionHandler: this._p1PositionHandler.bind(this),\n render: this._renderEndpointControl.bind(this),\n sizeX: 12,\n sizeY: 12,\n }),\n p2: new Control({\n x: 0,\n y: 0,\n cursorStyle: 'move',\n actionHandler: this._endpointActionHandler.bind(this),\n positionHandler: this._p2PositionHandler.bind(this),\n render: this._renderEndpointControl.bind(this),\n sizeX: 12,\n sizeY: 12,\n }),\n };\n }\n\n _p1PositionHandler() {\n const vpt = this.canvas?.viewportTransform || [1, 0, 0, 1, 0, 0];\n return new Point(this.x1, this.y1).transform(vpt);\n }\n\n _p2PositionHandler() {\n const vpt = this.canvas?.viewportTransform || [1, 0, 0, 1, 0, 0];\n return new Point(this.x2, this.y2).transform(vpt);\n }\n\n _renderEndpointControl(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number\n ) {\n const size = 12;\n ctx.save();\n ctx.fillStyle = '#007bff';\n ctx.strokeStyle = '#ffffff';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(left, top, size / 2, 0, 2 * Math.PI);\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n\n drawBorders(ctx: CanvasRenderingContext2D, styleOverride: any = {}) {\n if (this._useEndpointCoords) {\n this._drawLineBorders(ctx, styleOverride);\n return this;\n }\n return super.drawBorders(ctx, styleOverride, {});\n }\n\n _drawLineBorders(ctx: CanvasRenderingContext2D, styleOverride: any = {}) {\n const vpt = this.canvas?.viewportTransform || [1, 0, 0, 1, 0, 0];\n ctx.save();\n ctx.setTransform(vpt[0], vpt[1], vpt[2], vpt[3], vpt[4], vpt[5]);\n ctx.strokeStyle =\n styleOverride.borderColor || this.borderColor || 'rgba(100, 200, 200, 0.5)';\n ctx.lineWidth = (this.strokeWidth || 1) + 5;\n ctx.lineCap = this.strokeLineCap || 'butt';\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n ctx.beginPath();\n ctx.moveTo(this.x1, this.y1);\n ctx.lineTo(this.x2, this.y2);\n ctx.stroke();\n ctx.restore();\n }\n\n _renderControls(ctx: CanvasRenderingContext2D, styleOverride: any = {}) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n getBoundingRect() {\n if (this._useEndpointCoords) {\n const { x1, y1, x2, y2 } = this;\n const effectiveStrokeWidth =\n this.hitStrokeWidth === 'auto'\n ? this.strokeWidth\n : this.hitStrokeWidth;\n const padding = Math.max(effectiveStrokeWidth / 2 + 5, 10);\n return {\n left: Math.min(x1, x2) - padding,\n top: Math.min(y1, y2) - padding,\n width: Math.abs(x2 - x1) + padding * 2 || padding * 2,\n height: Math.abs(y2 - y1) + padding * 2 || padding * 2,\n };\n }\n return super.getBoundingRect();\n }\n\n setCoords() {\n if (this._useEndpointCoords) {\n // Set the object's center to the geometric center of the line\n const center = this._findCenterFromElement();\n this.left = center.x;\n this.top = center.y;\n \n // Set width and height for hit detection and bounding box\n const effectiveStrokeWidth =\n this.hitStrokeWidth === 'auto'\n ? this.strokeWidth\n : this.hitStrokeWidth;\n const hitPadding = Math.max(effectiveStrokeWidth / 2 + 5, 10);\n this.width = Math.abs(this.x2 - this.x1) + hitPadding * 2;\n this.height = Math.abs(this.y2 - this.y1) + hitPadding * 2;\n }\n super.setCoords();\n }\n\n getCoords(): [Point, Point, Point, Point] {\n if (this._useEndpointCoords) {\n const deltaX = this.x2 - this.x1;\n const deltaY = this.y2 - this.y1;\n const length = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n \n if (length === 0) {\n return super.getCoords() as [Point, Point, Point, Point];\n }\n \n const effectiveStrokeWidth = this.hitStrokeWidth === 'auto' \n ? this.strokeWidth \n : this.hitStrokeWidth;\n const halfWidth = Math.max(effectiveStrokeWidth / 2 + 2, 5);\n \n // Unit vector perpendicular to line\n const perpX = -deltaY / length;\n const perpY = deltaX / length;\n \n // Four corners of oriented rectangle\n return [\n new Point(this.x1 + perpX * halfWidth, this.y1 + perpY * halfWidth),\n new Point(this.x2 + perpX * halfWidth, this.y2 + perpY * halfWidth),\n new Point(this.x2 - perpX * halfWidth, this.y2 - perpY * halfWidth),\n new Point(this.x1 - perpX * halfWidth, this.y1 - perpY * halfWidth),\n ];\n }\n return super.getCoords() as [Point, Point, Point, Point];\n }\n\n containsPoint(point: Point): boolean {\n if (this._useEndpointCoords) {\n if (this.canvas?.getActiveObject() === this) {\n return super.containsPoint(point);\n }\n const distance = this._distanceToLineSegment(point.x, point.y);\n const effectiveStrokeWidth = this.hitStrokeWidth === 'auto' \n ? this.strokeWidth \n : this.hitStrokeWidth || 1;\n \n const tolerance = Math.max(effectiveStrokeWidth / 2 + 2, 5);\n return distance <= tolerance;\n }\n return super.containsPoint(point);\n }\n\n _distanceToLineSegment(px: number, py: number): number {\n const x1 = this.x1, y1 = this.y1, x2 = this.x2, y2 = this.y2;\n \n const pd2 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);\n if (pd2 === 0) {\n return Math.sqrt((px - x1) * (px - x1) + (py - y1) * (py - y1));\n }\n \n const u = ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)) / pd2;\n \n let closestX: number, closestY: number;\n if (u < 0) {\n closestX = x1;\n closestY = y1;\n } else if (u > 1) {\n closestX = x2;\n closestY = y2;\n } else {\n closestX = x1 + u * (x2 - x1);\n closestY = y1 + u * (y2 - y1);\n }\n \n return Math.sqrt((px - closestX) * (px - closestX) + (py - closestY) * (py - closestY));\n }\n\n _endpointActionHandler(\n eventData: TPointerEvent,\n transformData: Transform,\n x: number,\n y: number\n ) {\n const controlKey = transformData.corner;\n const pointer = new Point(x, y);\n let newX = pointer.x;\n let newY = pointer.y;\n\n if (eventData.shiftKey) {\n const otherControl = controlKey === 'p1' ? 'p2' : 'p1';\n const otherX = this[otherControl === 'p1' ? 'x1' : 'x2'];\n const otherY = this[otherControl === 'p1' ? 'y1' : 'y2'];\n const snapped = this._snapToAngle(otherX, otherY, newX, newY);\n newX = snapped.x;\n newY = snapped.y;\n }\n\n if (this._useEndpointCoords) {\n if (controlKey === 'p1') {\n this.x1 = newX;\n this.y1 = newY;\n } else if (controlKey === 'p2') {\n this.x2 = newX;\n this.y2 = newY;\n }\n this.dirty = true;\n this.setCoords();\n this.canvas?.requestRenderAll();\n return true;\n }\n\n // Fallback for old system\n this._updatingEndpoints = true;\n if (controlKey === 'p1') {\n this.x1 = newX;\n this.y1 = newY;\n } else if (controlKey === 'p2') {\n this.x2 = newX;\n this.y2 = newY;\n }\n this._setWidthHeight();\n this.dirty = true;\n this._updatingEndpoints = false;\n this.canvas?.requestRenderAll();\n this.fire('modified', { transform: transformData, target: this, e: eventData });\n return true;\n }\n\n _snapToAngle(\n fromX: number,\n fromY: number,\n toX: number,\n toY: number\n ): { x: number; y: number } {\n const deltaX = toX - fromX;\n const deltaY = toY - fromY;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n if (distance === 0) return { x: toX, y: toY };\n let angle = Math.atan2(deltaY, deltaX) * (180 / Math.PI);\n const snapIncrement = 15;\n const snappedAngle = Math.round(angle / snapIncrement) * snapIncrement;\n const snappedRadians = snappedAngle * (Math.PI / 180);\n return {\n x: fromX + Math.cos(snappedRadians) * distance,\n y: fromY + Math.sin(snappedRadians) * distance,\n };\n }\n\n _setWidthHeight(skipReposition = false) {\n this.width = Math.abs(this.x2 - this.x1) || 1;\n this.height = Math.abs(this.y2 - this.y1) || 1;\n if (!skipReposition && !this._updatingEndpoints) {\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: this.x1, y: this.y1 },\n { x: this.x2, y: this.y2 },\n ]);\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER\n );\n }\n }\n\n _set(key: string, value: any) {\n const oldLeft = this.left;\n const oldTop = this.top;\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineCoords)) {\n this._setWidthHeight();\n this.dirty = true;\n }\n if ((key === 'left' || key === 'top') && this.canvas && !this._updatingEndpoints) {\n const deltaX = this.left - oldLeft;\n const deltaY = this.top - oldTop;\n if (deltaX !== 0 || deltaY !== 0) {\n this._updatingEndpoints = true;\n this.x1 += deltaX;\n this.y1 += deltaY;\n this.x2 += deltaX;\n this.y2 += deltaY;\n this._updatingEndpoints = false;\n }\n }\n return this;\n }\n\n render(ctx: CanvasRenderingContext2D) {\n if (this._useEndpointCoords) {\n this._renderDirectly(ctx);\n return;\n }\n super.render(ctx);\n }\n\n _renderDirectly(ctx: CanvasRenderingContext2D) {\n if (!this.visible) return;\n ctx.save();\n const vpt = this.canvas?.viewportTransform || [1, 0, 0, 1, 0, 0];\n ctx.transform(vpt[0], vpt[1], vpt[2], vpt[3], vpt[4], vpt[5]);\n ctx.globalAlpha = this.opacity;\n ctx.strokeStyle = this.stroke?.toString() || '#000';\n ctx.lineWidth = this.strokeWidth;\n ctx.lineCap = this.strokeLineCap || 'butt';\n ctx.beginPath();\n ctx.moveTo(this.x1, this.y1);\n ctx.lineTo(this.x2, this.y2);\n ctx.stroke();\n ctx.restore();\n }\n\n _render(ctx: CanvasRenderingContext2D) {\n if (this._useEndpointCoords) return;\n ctx.beginPath();\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n ctx.lineWidth = this.strokeWidth;\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n toObject< \n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'round') {\n dim.x += this.strokeWidth;\n dim.y += this.strokeWidth;\n }\n return dim;\n }\n\n calcLinePoints(): UniqueLineCoords {\n if (this._updatingEndpoints) {\n const centerX = (this.x1 + this.x2) / 2;\n const centerY = (this.y1 + this.y2) / 2;\n return {\n x1: this.x1 - centerX,\n y1: this.y1 - centerY,\n x2: this.x2 - centerX,\n y2: this.y2 - centerY,\n };\n }\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1;\n const yMult = _y1 <= _y2 ? -1 : 1;\n return {\n x1: (xMult * width) / 2,\n y1: (yMult * height) / 2,\n x2: (xMult * -width) / 2,\n y2: (yMult * -height) / 2,\n };\n }\n\n _toSVG() {\n if (this._useEndpointCoords) {\n // Use absolute coordinates to bypass all Fabric.js transforms\n return [\n `<line stroke=\"${this.stroke}\" stroke-width=\"${this.strokeWidth}\" stroke-linecap=\"${this.strokeLineCap}\" `,\n `x1=\"${this.x1}\" y1=\"${this.y1}\" x2=\"${this.x2}\" y2=\"${this.y2}\" />\\n`,\n ];\n } else {\n // Use standard calcLinePoints for legacy mode\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '<line ',\n 'COMMON_PARTS',\n `x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />\\n`,\n ];\n }\n }\n\n toSVG(reviver?: (markup: string) => string): string {\n if (this._useEndpointCoords) {\n // Override toSVG to prevent Fabric.js from adding transform wrapper\n const markup = this._toSVG().join('');\n return reviver ? reviver(markup) : markup;\n }\n // Use default behavior for legacy mode\n return super.toSVG(reviver);\n }\n\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n static fromObject<T extends TOptions<SerializedLineProps>>({ \n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject<Line>(\n { ...object, points: [x1, y1, x2, y2] },\n { extraParam: 'points' }\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);"],"names":["coordProps","Line","FabricObject","constructor","x1","y1","x2","y2","arguments","length","undefined","options","super","_defineProperty","this","setOptions","hitStrokeWidth","hasBorders","hasControls","selectable","hoverCursor","perPixelTargetFind","strokeLineCap","_setWidthHeight","left","top","set","LEFT","TOP","_setupLineControls","controls","p1","Control","x","y","cursorStyle","actionHandler","_endpointActionHandler","bind","positionHandler","_p1PositionHandler","render","_renderEndpointControl","sizeX","sizeY","p2","_p2PositionHandler","_this$canvas","vpt","canvas","viewportTransform","Point","transform","_this$canvas2","ctx","save","fillStyle","strokeStyle","lineWidth","beginPath","arc","size","Math","PI","fill","stroke","restore","drawBorders","styleOverride","_useEndpointCoords","_drawLineBorders","_this$canvas3","setTransform","borderColor","strokeWidth","lineCap","globalAlpha","isMoving","borderOpacityWhenMoving","moveTo","lineTo","_renderControls","drawControls","getBoundingRect","effectiveStrokeWidth","padding","max","min","width","abs","height","setCoords","center","_findCenterFromElement","hitPadding","getCoords","deltaX","deltaY","sqrt","halfWidth","perpX","perpY","containsPoint","point","_this$canvas4","getActiveObject","distance","_distanceToLineSegment","px","py","pd2","u","closestX","closestY","eventData","transformData","_this$canvas6","controlKey","corner","pointer","newX","newY","shiftKey","otherControl","otherX","otherY","snapped","_snapToAngle","_this$canvas5","dirty","requestRenderAll","_updatingEndpoints","fire","target","e","fromX","fromY","toX","toY","angle","atan2","snappedRadians","round","cos","sin","skipReposition","makeBoundingBoxFromPoints","setPositionByOrigin","CENTER","_set","key","value","oldLeft","oldTop","includes","_renderDirectly","_this$canvas7","_this$stroke","visible","opacity","toString","_render","p","calcLinePoints","origStrokeStyle","isFiller","toLive","_renderStroke","toObject","propertiesToInclude","_getNonTransformedDimensions","dim","centerX","centerY","_x1","_x2","_y1","_y2","xMult","yMult","_toSVG","toSVG","reviver","markup","join","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","_ref","object","_fromObject","points","extraParam","cacheProperties","SHARED_ATTRIBUTES","concat","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|