@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Line.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","Object","assign","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","isFiller","stroke","toLive","_this$stroke","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.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","_defineProperty","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","size","save","fillStyle","strokeStyle","lineWidth","beginPath","arc","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","tolerance","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","snapIncrement","snappedAngle","round","snappedRadians","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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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Polyline, SerializedPolylineProps } from './Polyline';
|
|
2
|
+
import type { FabricObjectProps } from './Object/types';
|
|
3
|
+
import type { TOptions } from '../typedefs';
|
|
4
|
+
import type { ObjectEvents } from '../EventTypeDefs';
|
|
5
|
+
export declare class CustomLine<Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>, SProps extends SerializedPolylineProps = SerializedPolylineProps, EventSpec extends ObjectEvents = ObjectEvents> extends Polyline<Props, SProps, EventSpec> {
|
|
6
|
+
static type: string;
|
|
7
|
+
constructor(points?: [number, number, number, number], options?: Props);
|
|
8
|
+
static fromObject<T extends TOptions<SerializedPolylineProps>>(object: T): Promise<CustomLine<Partial<FabricObjectProps>, SerializedPolylineProps, ObjectEvents>>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=CustomLine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomLine.d.ts","sourceRoot":"","sources":["../../../src/shapes/CustomLine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,qBAAa,UAAU,CACrB,KAAK,SAAS,QAAQ,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACtE,MAAM,SAAS,uBAAuB,GAAG,uBAAuB,EAChE,SAAS,SAAS,YAAY,GAAG,YAAY,CAC7C,SAAQ,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;IAC1C,MAAM,CAAC,IAAI,SAAgB;gBAGzB,MAAM,GAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAgB,EACvD,OAAO,GAAE,KAAmB;IAU9B,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CAwBzE"}
|
|
@@ -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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"}
|
package/fabric-test-editor.html
CHANGED
|
@@ -191,6 +191,7 @@
|
|
|
191
191
|
<button onclick="addCircle()">Add Circle</button>
|
|
192
192
|
<button onclick="addTriangle()">Add Triangle</button>
|
|
193
193
|
<button onclick="addPolygon()">Add Polygon</button>
|
|
194
|
+
<button onclick="addLine()">Add Line</button>
|
|
194
195
|
</div>
|
|
195
196
|
|
|
196
197
|
<div class="control-group">
|
|
@@ -304,6 +305,19 @@
|
|
|
304
305
|
</div>
|
|
305
306
|
<button onclick="testCornerRadius()">Test All Corner Radius</button>
|
|
306
307
|
</div>
|
|
308
|
+
<div class="control-group">
|
|
309
|
+
<h3>Line Properties</h3>
|
|
310
|
+
<div style="margin-bottom: 10px;">
|
|
311
|
+
<label for="roundedEndpoints" style="display: flex; align-items: center; cursor: pointer;">
|
|
312
|
+
<input
|
|
313
|
+
type="checkbox"
|
|
314
|
+
id="roundedEndpoints"
|
|
315
|
+
style="margin-right: 8px;"
|
|
316
|
+
/>
|
|
317
|
+
Rounded Endpoints (Line Caps)
|
|
318
|
+
</label>
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
307
321
|
|
|
308
322
|
<div class="control-group">
|
|
309
323
|
<h3>Drawing Mode</h3>
|
|
@@ -350,11 +364,30 @@
|
|
|
350
364
|
<button onclick="exportJSON()" class="secondary">Export JSON</button>
|
|
351
365
|
</div>
|
|
352
366
|
|
|
367
|
+
<div class="control-group">
|
|
368
|
+
<h3>Canvas Zoom</h3>
|
|
369
|
+
<div class="slider-container">
|
|
370
|
+
<label for="canvasZoom">Zoom Level</label>
|
|
371
|
+
<input
|
|
372
|
+
type="range"
|
|
373
|
+
id="canvasZoom"
|
|
374
|
+
min="0.1"
|
|
375
|
+
max="3"
|
|
376
|
+
value="1"
|
|
377
|
+
step="0.1"
|
|
378
|
+
/>
|
|
379
|
+
<div class="slider-value" id="canvasZoomValue">100%</div>
|
|
380
|
+
</div>
|
|
381
|
+
<button onclick="resetZoom()">Reset Zoom (100%)</button>
|
|
382
|
+
<button onclick="fitToWindow()">Fit to Window</button>
|
|
383
|
+
</div>
|
|
384
|
+
|
|
353
385
|
<div class="control-group">
|
|
354
386
|
<h3>Canvas Info</h3>
|
|
355
387
|
<div id="canvasInfo" style="font-size: 12px; color: #6b7280">
|
|
356
388
|
Objects: 0<br />
|
|
357
|
-
Selected: None
|
|
389
|
+
Selected: None<br />
|
|
390
|
+
Zoom: 100%
|
|
358
391
|
</div>
|
|
359
392
|
</div>
|
|
360
393
|
</div>
|
|
@@ -371,7 +404,7 @@
|
|
|
371
404
|
preserveObjectStacking: true,
|
|
372
405
|
});
|
|
373
406
|
|
|
374
|
-
// Create workspace (like your editor)
|
|
407
|
+
// Create workspace (like your editor) - removed 'clip' name to prevent clipping issues with line dragging
|
|
375
408
|
const workspace = new fabric.Rect({
|
|
376
409
|
left: 100,
|
|
377
410
|
top: 100,
|
|
@@ -382,7 +415,7 @@
|
|
|
382
415
|
strokeWidth: 2,
|
|
383
416
|
selectable: false,
|
|
384
417
|
evented: false,
|
|
385
|
-
name: 'clip'
|
|
418
|
+
name: 'workspace', // Changed from 'clip' to prevent clipping during line endpoint dragging
|
|
386
419
|
});
|
|
387
420
|
|
|
388
421
|
canvas.add(workspace);
|
|
@@ -638,6 +671,30 @@
|
|
|
638
671
|
updateCanvasInfo();
|
|
639
672
|
}
|
|
640
673
|
|
|
674
|
+
function addLine() {
|
|
675
|
+
const strokeColor = document.getElementById('strokeColor').value;
|
|
676
|
+
const strokeWidth =
|
|
677
|
+
parseInt(document.getElementById('strokeWidth').value) || 2;
|
|
678
|
+
const roundedEndpoints = document.getElementById('roundedEndpoints').checked;
|
|
679
|
+
|
|
680
|
+
// Create line with absolute coordinates (start and end points)
|
|
681
|
+
const line = new fabric.Line([100, 100, 300, 200], {
|
|
682
|
+
stroke: strokeColor,
|
|
683
|
+
strokeWidth: Math.max(strokeWidth, 10), // Make sure stroke is thick enough to see line caps
|
|
684
|
+
selectable: true,
|
|
685
|
+
evented: true,
|
|
686
|
+
fill: '', // Lines should not have fill
|
|
687
|
+
strokeLineCap: roundedEndpoints ? 'round' : 'butt',
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
canvas.add(line);
|
|
691
|
+
canvas.setActiveObject(line);
|
|
692
|
+
canvas.renderAll();
|
|
693
|
+
updateCanvasInfo();
|
|
694
|
+
|
|
695
|
+
console.log('✏️ Line added with draggable endpoints! Drag the blue circles to adjust.');
|
|
696
|
+
}
|
|
697
|
+
|
|
641
698
|
// Text alignment function
|
|
642
699
|
function setTextAlign(alignment) {
|
|
643
700
|
const activeObject = canvas.getActiveObject();
|
|
@@ -725,7 +782,7 @@
|
|
|
725
782
|
function clearCanvas() {
|
|
726
783
|
canvas
|
|
727
784
|
.getObjects()
|
|
728
|
-
.filter((obj) => obj.name !== '
|
|
785
|
+
.filter((obj) => obj.name !== 'workspace')
|
|
729
786
|
.forEach((obj) => canvas.remove(obj));
|
|
730
787
|
canvas.discardActiveObject();
|
|
731
788
|
canvas.renderAll();
|
|
@@ -751,8 +808,9 @@
|
|
|
751
808
|
function updateCanvasInfo() {
|
|
752
809
|
const objects = canvas
|
|
753
810
|
.getObjects()
|
|
754
|
-
.filter((obj) => obj.name !== '
|
|
811
|
+
.filter((obj) => obj.name !== 'workspace');
|
|
755
812
|
const activeObject = canvas.getActiveObject();
|
|
813
|
+
const zoom = Math.round(canvas.getZoom() * 100);
|
|
756
814
|
|
|
757
815
|
let selectedInfo = 'None';
|
|
758
816
|
let directionInfo = '';
|
|
@@ -784,10 +842,72 @@
|
|
|
784
842
|
|
|
785
843
|
document.getElementById('canvasInfo').innerHTML = `
|
|
786
844
|
Objects: ${objects.length}<br>
|
|
787
|
-
Selected: ${selectedInfo}${directionInfo}
|
|
845
|
+
Selected: ${selectedInfo}${directionInfo}<br>
|
|
846
|
+
Zoom: ${zoom}%
|
|
788
847
|
`;
|
|
789
848
|
}
|
|
790
849
|
|
|
850
|
+
// Zoom functionality
|
|
851
|
+
const canvasZoomSlider = document.getElementById('canvasZoom');
|
|
852
|
+
const canvasZoomValue = document.getElementById('canvasZoomValue');
|
|
853
|
+
|
|
854
|
+
canvasZoomSlider.addEventListener('input', function() {
|
|
855
|
+
const zoomLevel = parseFloat(this.value);
|
|
856
|
+
canvas.setZoom(zoomLevel);
|
|
857
|
+
canvasZoomValue.textContent = Math.round(zoomLevel * 100) + '%';
|
|
858
|
+
canvas.renderAll();
|
|
859
|
+
updateCanvasInfo();
|
|
860
|
+
});
|
|
861
|
+
|
|
862
|
+
function resetZoom() {
|
|
863
|
+
canvas.setZoom(1);
|
|
864
|
+
canvasZoomSlider.value = 1;
|
|
865
|
+
canvasZoomValue.textContent = '100%';
|
|
866
|
+
canvas.renderAll();
|
|
867
|
+
updateCanvasInfo();
|
|
868
|
+
console.log('🔍 Canvas zoom reset to 100%');
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
function fitToWindow() {
|
|
872
|
+
const container = document.querySelector('.canvas-container');
|
|
873
|
+
const containerWidth = container.clientWidth - 40; // padding
|
|
874
|
+
const containerHeight = container.clientHeight - 40; // padding
|
|
875
|
+
|
|
876
|
+
const canvasWidth = canvas.getWidth();
|
|
877
|
+
const canvasHeight = canvas.getHeight();
|
|
878
|
+
|
|
879
|
+
const scaleX = containerWidth / canvasWidth;
|
|
880
|
+
const scaleY = containerHeight / canvasHeight;
|
|
881
|
+
const scale = Math.min(scaleX, scaleY, 3); // max zoom 300%
|
|
882
|
+
|
|
883
|
+
canvas.setZoom(scale);
|
|
884
|
+
canvasZoomSlider.value = scale;
|
|
885
|
+
canvasZoomValue.textContent = Math.round(scale * 100) + '%';
|
|
886
|
+
canvas.renderAll();
|
|
887
|
+
updateCanvasInfo();
|
|
888
|
+
console.log('🔍 Canvas zoom fit to window:', Math.round(scale * 100) + '%');
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
// Mouse wheel zoom support
|
|
892
|
+
canvas.on('mouse:wheel', function(opt) {
|
|
893
|
+
const delta = opt.e.deltaY;
|
|
894
|
+
let zoom = canvas.getZoom();
|
|
895
|
+
zoom *= 0.999 ** delta;
|
|
896
|
+
|
|
897
|
+
// Clamp zoom between 10% and 300%
|
|
898
|
+
zoom = Math.max(0.1, Math.min(3, zoom));
|
|
899
|
+
|
|
900
|
+
canvas.setZoom(zoom);
|
|
901
|
+
canvasZoomSlider.value = zoom;
|
|
902
|
+
canvasZoomValue.textContent = Math.round(zoom * 100) + '%';
|
|
903
|
+
|
|
904
|
+
opt.e.preventDefault();
|
|
905
|
+
opt.e.stopPropagation();
|
|
906
|
+
|
|
907
|
+
updateCanvasInfo();
|
|
908
|
+
console.log('🔍 Mouse wheel zoom:', Math.round(zoom * 100) + '%');
|
|
909
|
+
});
|
|
910
|
+
|
|
791
911
|
// Event listeners for canvas changes
|
|
792
912
|
canvas.on('object:added', updateCanvasInfo);
|
|
793
913
|
canvas.on('object:removed', updateCanvasInfo);
|
|
@@ -811,7 +931,7 @@
|
|
|
811
931
|
const activeObjects = canvas.getActiveObjects();
|
|
812
932
|
if (activeObjects.length > 0) {
|
|
813
933
|
activeObjects.forEach((obj) => {
|
|
814
|
-
if (obj.stroke) {
|
|
934
|
+
if (obj.stroke || obj.type === 'line') {
|
|
815
935
|
obj.set('strokeWidth', value);
|
|
816
936
|
}
|
|
817
937
|
});
|
|
@@ -1009,8 +1129,16 @@
|
|
|
1009
1129
|
cornerRadius: cornerRadius,
|
|
1010
1130
|
});
|
|
1011
1131
|
|
|
1132
|
+
// Regular Line (lines don't support corner radius)
|
|
1133
|
+
const line = new fabric.Line([50, 50, 150, 50], {
|
|
1134
|
+
left: 450,
|
|
1135
|
+
top: 300,
|
|
1136
|
+
stroke: '#374151',
|
|
1137
|
+
strokeWidth: 4,
|
|
1138
|
+
});
|
|
1139
|
+
|
|
1012
1140
|
// Add all shapes to canvas
|
|
1013
|
-
canvas.add(rect, triangle, hexagon, pentagon, star, arrow);
|
|
1141
|
+
canvas.add(rect, triangle, hexagon, pentagon, star, arrow, line);
|
|
1014
1142
|
|
|
1015
1143
|
// Add text label
|
|
1016
1144
|
const label = new fabric.Textbox('Corner Radius Demo - All shapes support rounded corners like Canva!', {
|
|
@@ -1030,6 +1158,27 @@
|
|
|
1030
1158
|
console.log('🎨 Corner radius demo created! All shapes now support corner radius like Canva.');
|
|
1031
1159
|
}
|
|
1032
1160
|
|
|
1161
|
+
// Rounded endpoints checkbox functionality
|
|
1162
|
+
const roundedEndpointsCheckbox = document.getElementById('roundedEndpoints');
|
|
1163
|
+
roundedEndpointsCheckbox.addEventListener('change', function () {
|
|
1164
|
+
const isChecked = this.checked;
|
|
1165
|
+
console.log('🔧 Rounded endpoints checkbox changed:', isChecked);
|
|
1166
|
+
// Update strokeLineCap of selected line object(s) in real-time using Fabric.js built-in property
|
|
1167
|
+
const activeObjects = canvas.getActiveObjects();
|
|
1168
|
+
console.log('🔧 Active objects:', activeObjects.length, activeObjects.map(o => o.type));
|
|
1169
|
+
if (activeObjects.length > 0) {
|
|
1170
|
+
activeObjects.forEach((obj) => {
|
|
1171
|
+
if (obj.type === 'line') {
|
|
1172
|
+
const lineCap = isChecked ? 'round' : 'butt';
|
|
1173
|
+
console.log('🔧 Setting strokeLineCap on line:', lineCap);
|
|
1174
|
+
obj.set('strokeLineCap', lineCap);
|
|
1175
|
+
console.log('🔧 Line strokeLineCap after set:', obj.strokeLineCap);
|
|
1176
|
+
}
|
|
1177
|
+
});
|
|
1178
|
+
canvas.renderAll();
|
|
1179
|
+
}
|
|
1180
|
+
});
|
|
1181
|
+
|
|
1033
1182
|
// Log Fabric.js version
|
|
1034
1183
|
console.log('Fabric.js version:', fabric.version);
|
|
1035
1184
|
console.log('Canvas initialized with useOverlayEditing support');
|