@nasser-sw/fabric 7.0.1-beta3 → 7.0.1-beta4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/0 +0 -0
  2. package/dist/index.js +323 -155
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.min.js +1 -1
  5. package/dist/index.min.js.map +1 -1
  6. package/dist/index.min.mjs +1 -1
  7. package/dist/index.min.mjs.map +1 -1
  8. package/dist/index.mjs +323 -155
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/index.node.cjs +323 -155
  11. package/dist/index.node.cjs.map +1 -1
  12. package/dist/index.node.mjs +323 -155
  13. package/dist/index.node.mjs.map +1 -1
  14. package/dist/package.json.min.mjs +1 -1
  15. package/dist/package.json.mjs +1 -1
  16. package/dist/src/shapes/Line.d.ts +31 -86
  17. package/dist/src/shapes/Line.d.ts.map +1 -1
  18. package/dist/src/shapes/Line.min.mjs +1 -1
  19. package/dist/src/shapes/Line.min.mjs.map +1 -1
  20. package/dist/src/shapes/Line.mjs +323 -154
  21. package/dist/src/shapes/Line.mjs.map +1 -1
  22. package/dist-extensions/src/shapes/CustomLine.d.ts +10 -0
  23. package/dist-extensions/src/shapes/CustomLine.d.ts.map +1 -0
  24. package/dist-extensions/src/shapes/Line.d.ts +31 -86
  25. package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
  26. package/fabric-test-editor.html +157 -8
  27. package/fabric-test2.html +513 -0
  28. package/fabric.ts +182 -182
  29. package/package.json +1 -1
  30. package/src/shapes/Line.ts +372 -158
  31. package/debug/konva/CHANGELOG.md +0 -1474
  32. package/debug/konva/LICENSE +0 -22
  33. package/debug/konva/README.md +0 -205
  34. package/debug/konva/gulpfile.mjs +0 -110
  35. package/debug/konva/package.json +0 -139
  36. package/debug/konva/release.sh +0 -65
  37. package/debug/konva/resources/doc-includes/ContainerParams.txt +0 -6
  38. package/debug/konva/resources/doc-includes/NodeParams.txt +0 -20
  39. package/debug/konva/resources/doc-includes/ShapeParams.txt +0 -53
  40. package/debug/konva/resources/jsdoc.conf.json +0 -28
  41. package/debug/konva/rollup.config.mjs +0 -32
  42. package/debug/konva/src/Animation.ts +0 -237
  43. package/debug/konva/src/BezierFunctions.ts +0 -826
  44. package/debug/konva/src/Canvas.ts +0 -193
  45. package/debug/konva/src/Container.ts +0 -649
  46. package/debug/konva/src/Context.ts +0 -1017
  47. package/debug/konva/src/Core.ts +0 -5
  48. package/debug/konva/src/DragAndDrop.ts +0 -173
  49. package/debug/konva/src/Factory.ts +0 -246
  50. package/debug/konva/src/FastLayer.ts +0 -29
  51. package/debug/konva/src/Global.ts +0 -210
  52. package/debug/konva/src/Group.ts +0 -31
  53. package/debug/konva/src/Layer.ts +0 -546
  54. package/debug/konva/src/Node.ts +0 -3477
  55. package/debug/konva/src/PointerEvents.ts +0 -67
  56. package/debug/konva/src/Shape.ts +0 -2081
  57. package/debug/konva/src/Stage.ts +0 -1000
  58. package/debug/konva/src/Tween.ts +0 -811
  59. package/debug/konva/src/Util.ts +0 -1123
  60. package/debug/konva/src/Validators.ts +0 -210
  61. package/debug/konva/src/_CoreInternals.ts +0 -85
  62. package/debug/konva/src/_FullInternals.ts +0 -171
  63. package/debug/konva/src/canvas-backend.ts +0 -36
  64. package/debug/konva/src/filters/Blur.ts +0 -388
  65. package/debug/konva/src/filters/Brighten.ts +0 -48
  66. package/debug/konva/src/filters/Brightness.ts +0 -30
  67. package/debug/konva/src/filters/Contrast.ts +0 -75
  68. package/debug/konva/src/filters/Emboss.ts +0 -207
  69. package/debug/konva/src/filters/Enhance.ts +0 -154
  70. package/debug/konva/src/filters/Grayscale.ts +0 -25
  71. package/debug/konva/src/filters/HSL.ts +0 -108
  72. package/debug/konva/src/filters/HSV.ts +0 -106
  73. package/debug/konva/src/filters/Invert.ts +0 -23
  74. package/debug/konva/src/filters/Kaleidoscope.ts +0 -274
  75. package/debug/konva/src/filters/Mask.ts +0 -220
  76. package/debug/konva/src/filters/Noise.ts +0 -44
  77. package/debug/konva/src/filters/Pixelate.ts +0 -107
  78. package/debug/konva/src/filters/Posterize.ts +0 -46
  79. package/debug/konva/src/filters/RGB.ts +0 -82
  80. package/debug/konva/src/filters/RGBA.ts +0 -103
  81. package/debug/konva/src/filters/Sepia.ts +0 -27
  82. package/debug/konva/src/filters/Solarize.ts +0 -29
  83. package/debug/konva/src/filters/Threshold.ts +0 -44
  84. package/debug/konva/src/index.ts +0 -3
  85. package/debug/konva/src/shapes/Arc.ts +0 -176
  86. package/debug/konva/src/shapes/Arrow.ts +0 -231
  87. package/debug/konva/src/shapes/Circle.ts +0 -76
  88. package/debug/konva/src/shapes/Ellipse.ts +0 -121
  89. package/debug/konva/src/shapes/Image.ts +0 -319
  90. package/debug/konva/src/shapes/Label.ts +0 -386
  91. package/debug/konva/src/shapes/Line.ts +0 -364
  92. package/debug/konva/src/shapes/Path.ts +0 -1013
  93. package/debug/konva/src/shapes/Rect.ts +0 -79
  94. package/debug/konva/src/shapes/RegularPolygon.ts +0 -167
  95. package/debug/konva/src/shapes/Ring.ts +0 -94
  96. package/debug/konva/src/shapes/Sprite.ts +0 -370
  97. package/debug/konva/src/shapes/Star.ts +0 -125
  98. package/debug/konva/src/shapes/Text.ts +0 -1065
  99. package/debug/konva/src/shapes/TextPath.ts +0 -583
  100. package/debug/konva/src/shapes/Transformer.ts +0 -1889
  101. package/debug/konva/src/shapes/Wedge.ts +0 -129
  102. package/debug/konva/src/skia-backend.ts +0 -35
  103. package/debug/konva/src/types.ts +0 -84
  104. package/debug/konva/tsconfig.json +0 -31
  105. 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 const minX = Math.min(this.x1, this.x2);\n const maxX = Math.max(this.x1, this.x2);\n const minY = Math.min(this.y1, this.y2);\n const maxY = Math.max(this.y1, this.y2);\n const effectiveStrokeWidth =\n this.hitStrokeWidth === 'auto'\n ? this.strokeWidth\n : this.hitStrokeWidth;\n const hitPadding = Math.max(effectiveStrokeWidth / 2 + 5, 10);\n this.left = minX - hitPadding + (maxX - minX + hitPadding * 2) / 2;\n this.top = minY - hitPadding + (maxY - minY + hitPadding * 2) / 2;\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 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 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","minX","maxX","minY","maxY","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","_findCenterFromElement","toObject","propertiesToInclude","_getNonTransformedDimensions","dim","centerX","centerY","_x1","_x2","_y1","_y2","xMult","yMult","_toSVG","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,59 @@ 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
- interface UniqueLineProps {
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, UniqueLineProps {
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
- * Constructor
47
- * @param {Array} [points] Array of points
48
- * @param {Object} [options] Options object
49
- * @return {Line} thisArg
50
- */
51
- constructor([x1, y1, x2, y2]?: [number, number, number, number], options?: Partial<Props>);
52
- /**
53
- * @private
54
- * @param {Object} [options] Options
55
- */
56
- _setWidthHeight(): void;
57
- /**
58
- * @private
59
- * @param {String} key
60
- * @param {*} value
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
- * @private
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
- */
100
56
  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
57
  static fromElement(element: HTMLElement, options?: Abortable, cssRules?: CSSRules): Promise<Line<{
108
58
  [x: string]: /*elided*/ any;
109
59
  }, 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
60
  static fromObject<T extends TOptions<SerializedLineProps>>({ x1, y1, x2, y2, ...object }: T): Promise<Line<Partial<FabricObjectProps>, SerializedLineProps, ObjectEvents>>;
116
61
  }
117
62
  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;AAMnD,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBACf,SAAQ,qBAAqB,EAC3B,eAAe;CAAG;AAEtB;;;;;;GAMG;AACH,qBAAa,IAAI,CACb,KAAK,SAAS,QAAQ,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACtE,MAAM,SAAS,mBAAmB,GAAG,mBAAmB,EACxD,SAAS,SAAS,YAAY,GAAG,YAAY,CAE/C,SAAQ,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAC7C,YAAW,eAAe;IAE1B;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACK,EAAE,EAAE,MAAM,CAAC;IAEnB,MAAM,CAAC,IAAI,SAAU;IAErB,MAAM,CAAC,eAAe,WAAuC;IAC7D;;;;;OAKG;gBACS,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,mCAAe,EAAE,OAAO,GAAE,OAAO,CAAC,KAAK,CAAM;IAczE;;;OAGG;IACH,eAAe;IAYf;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAc5B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,wBAAwB;IAsBrC;;;;;OAKG;IACH,sBAAsB,IAAI,KAAK;IAI/B;;;;OAIG;IACH,QAAQ,CACN,CAAC,SAAS,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,EAC5D,CAAC,SAAS,MAAM,CAAC,GAAG,KAAK,EACzB,mBAAmB,GAAE,CAAC,EAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM;IAWrD,4BAA4B,IAAI,KAAK;IAarC;;;;;;OAMG;IACH,cAAc,IAAI,eAAe;IAmBjC;;;;OAIG;IACH,MAAM;IASN;;;OAGG;IACH,MAAM,CAAC,eAAe,WAAwC;IAE9D;;;;;OAKG;WACU,WAAW,CACtB,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,SAAS,EACnB,QAAQ,CAAC,EAAE,QAAQ;;;IAcrB;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EACzD,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,GAAG,MAAM,EACV,EAAE,CAAC;CAWL"}
1
+ {"version":3,"file":"Line.d.ts","sourceRoot":"","sources":["../../../src/shapes/Line.ts"],"names":[],"mappings":"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"}
@@ -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 !== 'clip')
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 !== 'clip');
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');