fabric 6.2.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +1 -0
- package/CHANGELOG.md +12 -4
- package/README.md +1 -1
- package/dist/extensions/aligning_guidelines/constant.d.ts +3 -0
- package/dist/extensions/aligning_guidelines/constant.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/index.d.ts +5 -0
- package/dist/extensions/aligning_guidelines/index.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/typedefs.d.ts +33 -0
- package/dist/extensions/aligning_guidelines/typedefs.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/basic.d.ts +4 -0
- package/dist/extensions/aligning_guidelines/util/basic.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/collect-line.d.ts +13 -0
- package/dist/extensions/aligning_guidelines/util/collect-line.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/collect-point.d.ts +20 -0
- package/dist/extensions/aligning_guidelines/util/collect-point.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/draw.d.ts +6 -0
- package/dist/extensions/aligning_guidelines/util/draw.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/get-objects-by-target.d.ts +3 -0
- package/dist/extensions/aligning_guidelines/util/get-objects-by-target.d.ts.map +1 -0
- package/dist/extensions/index.d.ts +2 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/index.js +140 -108
- 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 +140 -108
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +140 -108
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +140 -108
- 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/ClassRegistry.min.mjs.map +1 -1
- package/dist/src/ClassRegistry.mjs.map +1 -1
- package/dist/src/Collection.min.mjs.map +1 -1
- package/dist/src/Collection.mjs.map +1 -1
- package/dist/src/Intersection.min.mjs.map +1 -1
- package/dist/src/Intersection.mjs.map +1 -1
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.min.mjs.map +1 -1
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutManager.d.ts +1 -1
- package/dist/src/LayoutManager/LayoutManager.d.ts.map +1 -1
- package/dist/src/LayoutManager/LayoutManager.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutManager.mjs +1 -1
- package/dist/src/LayoutManager/LayoutManager.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/utils.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/utils.mjs.map +1 -1
- package/dist/src/LayoutManager/types.d.ts.map +1 -1
- package/dist/src/Observable.min.mjs.map +1 -1
- package/dist/src/Observable.mjs.map +1 -1
- package/dist/src/Pattern/Pattern.d.ts +2 -2
- package/dist/src/Pattern/Pattern.d.ts.map +1 -1
- package/dist/src/Pattern/Pattern.min.mjs +1 -1
- package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
- package/dist/src/Pattern/Pattern.mjs +14 -12
- package/dist/src/Pattern/Pattern.mjs.map +1 -1
- package/dist/src/Point.min.mjs.map +1 -1
- package/dist/src/Point.mjs.map +1 -1
- package/dist/src/Shadow.min.mjs.map +1 -1
- package/dist/src/Shadow.mjs.map +1 -1
- package/dist/src/brushes/CircleBrush.min.mjs.map +1 -1
- package/dist/src/brushes/CircleBrush.mjs.map +1 -1
- package/dist/src/brushes/PatternBrush.min.mjs.map +1 -1
- package/dist/src/brushes/PatternBrush.mjs.map +1 -1
- package/dist/src/brushes/PencilBrush.min.mjs.map +1 -1
- package/dist/src/brushes/PencilBrush.mjs.map +1 -1
- package/dist/src/brushes/SprayBrush.min.mjs.map +1 -1
- package/dist/src/brushes/SprayBrush.mjs.map +1 -1
- package/dist/src/canvas/Canvas.d.ts +1 -1
- package/dist/src/canvas/Canvas.d.ts.map +1 -1
- package/dist/src/canvas/Canvas.min.mjs.map +1 -1
- package/dist/src/canvas/Canvas.mjs +2 -1
- package/dist/src/canvas/Canvas.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.min.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.min.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/util.min.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/util.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.d.ts +1 -1
- package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
- package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.mjs +1 -1
- package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
- package/dist/src/canvas/StaticCanvasOptions.min.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvasOptions.mjs.map +1 -1
- package/dist/src/canvas/TextEditingManager.min.mjs.map +1 -1
- package/dist/src/canvas/TextEditingManager.mjs.map +1 -1
- package/dist/src/color/Color.d.ts.map +1 -1
- package/dist/src/color/Color.min.mjs.map +1 -1
- package/dist/src/color/Color.mjs +1 -0
- package/dist/src/color/Color.mjs.map +1 -1
- package/dist/src/color/util.min.mjs.map +1 -1
- package/dist/src/color/util.mjs.map +1 -1
- package/dist/src/config.min.mjs.map +1 -1
- package/dist/src/config.mjs.map +1 -1
- package/dist/src/controls/Control.min.mjs.map +1 -1
- package/dist/src/controls/Control.mjs.map +1 -1
- package/dist/src/controls/changeWidth.min.mjs.map +1 -1
- package/dist/src/controls/changeWidth.mjs.map +1 -1
- package/dist/src/controls/controlRendering.min.mjs.map +1 -1
- package/dist/src/controls/controlRendering.mjs.map +1 -1
- package/dist/src/controls/drag.min.mjs.map +1 -1
- package/dist/src/controls/drag.mjs.map +1 -1
- package/dist/src/controls/fireEvent.min.mjs.map +1 -1
- package/dist/src/controls/fireEvent.mjs.map +1 -1
- package/dist/src/controls/pathControl.min.mjs.map +1 -1
- package/dist/src/controls/pathControl.mjs.map +1 -1
- package/dist/src/controls/polyControl.min.mjs.map +1 -1
- package/dist/src/controls/polyControl.mjs.map +1 -1
- package/dist/src/controls/rotate.min.mjs.map +1 -1
- package/dist/src/controls/rotate.mjs.map +1 -1
- package/dist/src/controls/scale.min.mjs.map +1 -1
- package/dist/src/controls/scale.mjs.map +1 -1
- package/dist/src/controls/scaleSkew.min.mjs.map +1 -1
- package/dist/src/controls/scaleSkew.mjs.map +1 -1
- package/dist/src/controls/skew.min.mjs.map +1 -1
- package/dist/src/controls/skew.mjs.map +1 -1
- package/dist/src/controls/util.min.mjs.map +1 -1
- package/dist/src/controls/util.mjs.map +1 -1
- package/dist/src/controls/wrapWithFireEvent.min.mjs.map +1 -1
- package/dist/src/controls/wrapWithFireEvent.mjs.map +1 -1
- package/dist/src/controls/wrapWithFixedAnchor.min.mjs.map +1 -1
- package/dist/src/controls/wrapWithFixedAnchor.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.d.ts +5 -5
- package/dist/src/filters/BaseFilter.d.ts.map +1 -1
- package/dist/src/filters/BaseFilter.min.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.mjs +5 -5
- package/dist/src/filters/BaseFilter.mjs.map +1 -1
- package/dist/src/filters/BlendColor.min.mjs.map +1 -1
- package/dist/src/filters/BlendColor.mjs.map +1 -1
- package/dist/src/filters/BlendImage.min.mjs.map +1 -1
- package/dist/src/filters/BlendImage.mjs.map +1 -1
- package/dist/src/filters/Blur.min.mjs.map +1 -1
- package/dist/src/filters/Blur.mjs.map +1 -1
- package/dist/src/filters/Brightness.min.mjs.map +1 -1
- package/dist/src/filters/Brightness.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.mjs.map +1 -1
- package/dist/src/filters/Composed.min.mjs.map +1 -1
- package/dist/src/filters/Composed.mjs.map +1 -1
- package/dist/src/filters/Contrast.min.mjs.map +1 -1
- package/dist/src/filters/Contrast.mjs.map +1 -1
- package/dist/src/filters/Convolute.min.mjs.map +1 -1
- package/dist/src/filters/Convolute.mjs.map +1 -1
- package/dist/src/filters/GLProbes/WebGLProbe.min.mjs.map +1 -1
- package/dist/src/filters/GLProbes/WebGLProbe.mjs.map +1 -1
- package/dist/src/filters/Gamma.min.mjs.map +1 -1
- package/dist/src/filters/Gamma.mjs.map +1 -1
- package/dist/src/filters/Grayscale.min.mjs.map +1 -1
- package/dist/src/filters/Grayscale.mjs.map +1 -1
- package/dist/src/filters/Invert.min.mjs.map +1 -1
- package/dist/src/filters/Invert.mjs.map +1 -1
- package/dist/src/filters/Noise.min.mjs.map +1 -1
- package/dist/src/filters/Noise.mjs.map +1 -1
- package/dist/src/filters/Pixelate.min.mjs.map +1 -1
- package/dist/src/filters/Pixelate.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.min.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.mjs.map +1 -1
- package/dist/src/filters/Resize.min.mjs.map +1 -1
- package/dist/src/filters/Resize.mjs.map +1 -1
- package/dist/src/filters/Saturation.min.mjs.map +1 -1
- package/dist/src/filters/Saturation.mjs.map +1 -1
- package/dist/src/filters/Vibrance.min.mjs.map +1 -1
- package/dist/src/filters/Vibrance.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.mjs.map +1 -1
- package/dist/src/filters/typedefs.d.ts +0 -1
- package/dist/src/filters/typedefs.d.ts.map +1 -1
- package/dist/src/filters/utils.min.mjs.map +1 -1
- package/dist/src/filters/utils.mjs.map +1 -1
- package/dist/src/gradient/Gradient.d.ts +7 -3
- package/dist/src/gradient/Gradient.d.ts.map +1 -1
- package/dist/src/gradient/Gradient.min.mjs +1 -1
- package/dist/src/gradient/Gradient.min.mjs.map +1 -1
- package/dist/src/gradient/Gradient.mjs +36 -24
- package/dist/src/gradient/Gradient.mjs.map +1 -1
- package/dist/src/gradient/parser/parseColorStops.min.mjs.map +1 -1
- package/dist/src/gradient/parser/parseColorStops.mjs.map +1 -1
- package/dist/src/gradient/parser/parseCoords.d.ts.map +1 -1
- package/dist/src/gradient/parser/parseCoords.min.mjs.map +1 -1
- package/dist/src/gradient/parser/parseCoords.mjs.map +1 -1
- package/dist/src/parser/applyViewboxTransform.min.mjs.map +1 -1
- package/dist/src/parser/applyViewboxTransform.mjs.map +1 -1
- package/dist/src/parser/constants.min.mjs.map +1 -1
- package/dist/src/parser/constants.mjs.map +1 -1
- package/dist/src/parser/elements_parser.min.mjs.map +1 -1
- package/dist/src/parser/elements_parser.mjs.map +1 -1
- package/dist/src/parser/getCSSRules.min.mjs.map +1 -1
- package/dist/src/parser/getCSSRules.mjs.map +1 -1
- package/dist/src/parser/getGlobalStylesForElement.min.mjs.map +1 -1
- package/dist/src/parser/getGlobalStylesForElement.mjs.map +1 -1
- package/dist/src/parser/getGradientDefs.min.mjs.map +1 -1
- package/dist/src/parser/getGradientDefs.mjs.map +1 -1
- package/dist/src/parser/getMultipleNodes.min.mjs.map +1 -1
- package/dist/src/parser/getMultipleNodes.mjs.map +1 -1
- package/dist/src/parser/loadSVGFromString.min.mjs.map +1 -1
- package/dist/src/parser/loadSVGFromString.mjs.map +1 -1
- package/dist/src/parser/loadSVGFromURL.min.mjs.map +1 -1
- package/dist/src/parser/loadSVGFromURL.mjs.map +1 -1
- package/dist/src/parser/normalizeAttr.min.mjs.map +1 -1
- package/dist/src/parser/normalizeAttr.mjs.map +1 -1
- package/dist/src/parser/normalizeValue.min.mjs.map +1 -1
- package/dist/src/parser/normalizeValue.mjs.map +1 -1
- package/dist/src/parser/parseAttributes.min.mjs.map +1 -1
- package/dist/src/parser/parseAttributes.mjs.map +1 -1
- package/dist/src/parser/parseFontDeclaration.min.mjs.map +1 -1
- package/dist/src/parser/parseFontDeclaration.mjs.map +1 -1
- package/dist/src/parser/parseSVGDocument.min.mjs.map +1 -1
- package/dist/src/parser/parseSVGDocument.mjs.map +1 -1
- package/dist/src/parser/parseStyleObject.min.mjs.map +1 -1
- package/dist/src/parser/parseStyleObject.mjs.map +1 -1
- package/dist/src/parser/parseStyleString.min.mjs.map +1 -1
- package/dist/src/parser/parseStyleString.mjs.map +1 -1
- package/dist/src/parser/parseTransformAttribute.min.mjs.map +1 -1
- package/dist/src/parser/parseTransformAttribute.mjs.map +1 -1
- package/dist/src/parser/parseUseDirectives.min.mjs.map +1 -1
- package/dist/src/parser/parseUseDirectives.mjs.map +1 -1
- package/dist/src/parser/percent.min.mjs.map +1 -1
- package/dist/src/parser/percent.mjs.map +1 -1
- package/dist/src/parser/recursivelyParseGradientsXlink.min.mjs.map +1 -1
- package/dist/src/parser/recursivelyParseGradientsXlink.mjs.map +1 -1
- package/dist/src/parser/setStrokeFillOpacity.min.mjs.map +1 -1
- package/dist/src/parser/setStrokeFillOpacity.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.min.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.mjs.map +1 -1
- package/dist/src/shapes/Circle.min.mjs.map +1 -1
- package/dist/src/shapes/Circle.mjs.map +1 -1
- package/dist/src/shapes/Ellipse.min.mjs.map +1 -1
- package/dist/src/shapes/Ellipse.mjs.map +1 -1
- package/dist/src/shapes/Group.d.ts +2 -2
- package/dist/src/shapes/Group.d.ts.map +1 -1
- package/dist/src/shapes/Group.min.mjs.map +1 -1
- package/dist/src/shapes/Group.mjs.map +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts.map +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs.map +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.mjs +2 -2
- package/dist/src/shapes/IText/DraggableTextDelegate.mjs.map +1 -1
- package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
- package/dist/src/shapes/IText/IText.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextBehavior.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextClickBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextClickBehavior.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextKeyBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextKeyBehavior.mjs.map +1 -1
- package/dist/src/shapes/Image.min.mjs.map +1 -1
- package/dist/src/shapes/Image.mjs.map +1 -1
- package/dist/src/shapes/Line.min.mjs.map +1 -1
- package/dist/src/shapes/Line.mjs.map +1 -1
- package/dist/src/shapes/Object/AnimatableObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/AnimatableObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/AnimatableObject.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/FabricObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObject.mjs +2 -1
- package/dist/src/shapes/Object/FabricObject.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.d.ts +13 -13
- package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs +13 -13
- package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.d.ts +4 -4
- package/dist/src/shapes/Object/Object.d.ts.map +1 -1
- package/dist/src/shapes/Object/Object.min.mjs +1 -1
- package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.mjs +10 -14
- package/dist/src/shapes/Object/Object.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.mjs +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectOrigin.min.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectOrigin.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/StackedObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.mjs.map +1 -1
- package/dist/src/shapes/Path.min.mjs.map +1 -1
- package/dist/src/shapes/Path.mjs.map +1 -1
- package/dist/src/shapes/Polyline.d.ts.map +1 -1
- package/dist/src/shapes/Polyline.min.mjs +1 -1
- package/dist/src/shapes/Polyline.min.mjs.map +1 -1
- package/dist/src/shapes/Polyline.mjs +10 -2
- package/dist/src/shapes/Polyline.mjs.map +1 -1
- package/dist/src/shapes/Rect.min.mjs.map +1 -1
- package/dist/src/shapes/Rect.mjs.map +1 -1
- package/dist/src/shapes/Text/StyledText.min.mjs.map +1 -1
- package/dist/src/shapes/Text/StyledText.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.mjs +1 -1
- package/dist/src/shapes/Text/Text.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
- package/dist/src/shapes/Textbox.min.mjs.map +1 -1
- package/dist/src/shapes/Textbox.mjs.map +1 -1
- package/dist/src/shapes/Triangle.min.mjs.map +1 -1
- package/dist/src/shapes/Triangle.mjs.map +1 -1
- package/dist/src/util/animation/AnimationBase.min.mjs.map +1 -1
- package/dist/src/util/animation/AnimationBase.mjs.map +1 -1
- package/dist/src/util/animation/AnimationRegistry.min.mjs.map +1 -1
- package/dist/src/util/animation/AnimationRegistry.mjs.map +1 -1
- package/dist/src/util/animation/ArrayAnimation.min.mjs.map +1 -1
- package/dist/src/util/animation/ArrayAnimation.mjs.map +1 -1
- package/dist/src/util/animation/ColorAnimation.min.mjs.map +1 -1
- package/dist/src/util/animation/ColorAnimation.mjs.map +1 -1
- package/dist/src/util/animation/ValueAnimation.min.mjs.map +1 -1
- package/dist/src/util/animation/ValueAnimation.mjs.map +1 -1
- package/dist/src/util/animation/animate.d.ts.map +1 -1
- package/dist/src/util/animation/animate.min.mjs.map +1 -1
- package/dist/src/util/animation/animate.mjs.map +1 -1
- package/dist/src/util/animation/easing.min.mjs.map +1 -1
- package/dist/src/util/animation/easing.mjs.map +1 -1
- package/dist/src/util/animation/types.d.ts.map +1 -1
- package/dist/src/util/applyMixins.min.mjs.map +1 -1
- package/dist/src/util/applyMixins.mjs.map +1 -1
- package/dist/src/util/dom_style.min.mjs.map +1 -1
- package/dist/src/util/dom_style.mjs.map +1 -1
- package/dist/src/util/internals/cloneDeep.d.ts +6 -0
- package/dist/src/util/internals/cloneDeep.d.ts.map +1 -1
- package/dist/src/util/internals/cloneStyles.d.ts +3 -0
- package/dist/src/util/internals/cloneStyles.d.ts.map +1 -0
- package/dist/src/util/internals/cloneStyles.min.mjs +2 -0
- package/dist/src/util/internals/cloneStyles.min.mjs.map +1 -0
- package/dist/src/util/internals/cloneStyles.mjs +15 -0
- package/dist/src/util/internals/cloneStyles.mjs.map +1 -0
- package/dist/src/util/internals/findRight.min.mjs.map +1 -1
- package/dist/src/util/internals/findRight.mjs.map +1 -1
- package/dist/src/util/misc/boundingBoxFromPoints.min.mjs.map +1 -1
- package/dist/src/util/misc/boundingBoxFromPoints.mjs.map +1 -1
- package/dist/src/util/misc/dom.min.mjs.map +1 -1
- package/dist/src/util/misc/dom.mjs.map +1 -1
- package/dist/src/util/misc/findScaleTo.min.mjs.map +1 -1
- package/dist/src/util/misc/findScaleTo.mjs.map +1 -1
- package/dist/src/util/misc/groupSVGElements.min.mjs.map +1 -1
- package/dist/src/util/misc/groupSVGElements.mjs.map +1 -1
- package/dist/src/util/misc/isTransparent.min.mjs.map +1 -1
- package/dist/src/util/misc/isTransparent.mjs.map +1 -1
- package/dist/src/util/misc/matrix.min.mjs.map +1 -1
- package/dist/src/util/misc/matrix.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
- package/dist/src/util/misc/objectTransforms.min.mjs.map +1 -1
- package/dist/src/util/misc/objectTransforms.mjs.map +1 -1
- package/dist/src/util/misc/pick.min.mjs.map +1 -1
- package/dist/src/util/misc/pick.mjs.map +1 -1
- package/dist/src/util/misc/planeChange.min.mjs.map +1 -1
- package/dist/src/util/misc/planeChange.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.min.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.min.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.min.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/index.min.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/index.mjs.map +1 -1
- package/dist/src/util/misc/resolveOrigin.min.mjs.map +1 -1
- package/dist/src/util/misc/resolveOrigin.mjs.map +1 -1
- package/dist/src/util/misc/rotatePoint.min.mjs.map +1 -1
- package/dist/src/util/misc/rotatePoint.mjs.map +1 -1
- package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
- package/dist/src/util/misc/svgParsing.mjs.map +1 -1
- package/dist/src/util/misc/textStyles.min.mjs +1 -1
- package/dist/src/util/misc/textStyles.min.mjs.map +1 -1
- package/dist/src/util/misc/textStyles.mjs +3 -3
- package/dist/src/util/misc/textStyles.mjs.map +1 -1
- package/dist/src/util/misc/vectors.min.mjs.map +1 -1
- package/dist/src/util/misc/vectors.mjs.map +1 -1
- package/dist/src/util/path/index.min.mjs.map +1 -1
- package/dist/src/util/path/index.mjs.map +1 -1
- package/dist/src/util/path/typedefs.d.ts.map +1 -1
- package/dist/src/util/transform_matrix_removal.min.mjs.map +1 -1
- package/dist/src/util/transform_matrix_removal.mjs.map +1 -1
- package/dist/src/util/typeAssertions.min.mjs.map +1 -1
- package/dist/src/util/typeAssertions.mjs.map +1 -1
- package/dist-extensions/aligning_guidelines/constant.mjs +11 -0
- package/dist-extensions/aligning_guidelines/constant.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/index.mjs +130 -0
- package/dist-extensions/aligning_guidelines/index.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/basic.mjs +11 -0
- package/dist-extensions/aligning_guidelines/util/basic.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/collect-line.mjs +193 -0
- package/dist-extensions/aligning_guidelines/util/collect-line.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/collect-point.mjs +102 -0
- package/dist-extensions/aligning_guidelines/util/collect-point.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/draw.mjs +75 -0
- package/dist-extensions/aligning_guidelines/util/draw.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/get-objects-by-target.mjs +42 -0
- package/dist-extensions/aligning_guidelines/util/get-objects-by-target.mjs.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/constant.d.ts +3 -0
- package/dist-extensions/extensions/aligning_guidelines/constant.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/index.d.ts +5 -0
- package/dist-extensions/extensions/aligning_guidelines/index.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/typedefs.d.ts +33 -0
- package/dist-extensions/extensions/aligning_guidelines/typedefs.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/basic.d.ts +4 -0
- package/dist-extensions/extensions/aligning_guidelines/util/basic.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-line.d.ts +13 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-line.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-point.d.ts +20 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-point.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/draw.d.ts +6 -0
- package/dist-extensions/extensions/aligning_guidelines/util/draw.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/get-objects-by-target.d.ts +3 -0
- package/dist-extensions/extensions/aligning_guidelines/util/get-objects-by-target.d.ts.map +1 -0
- package/dist-extensions/extensions/index.d.ts +2 -0
- package/dist-extensions/extensions/index.d.ts.map +1 -0
- package/dist-extensions/fabric-extensions.min.js +2 -0
- package/dist-extensions/fabric-extensions.min.js.map +1 -0
- package/dist-extensions/fabric.d.ts +119 -0
- package/dist-extensions/fabric.d.ts.map +1 -0
- package/dist-extensions/index.d.ts +2 -0
- package/dist-extensions/index.d.ts.map +1 -0
- package/dist-extensions/index.mjs +2 -0
- package/dist-extensions/index.mjs.map +1 -0
- package/dist-extensions/src/ClassRegistry.d.ts +14 -0
- package/dist-extensions/src/ClassRegistry.d.ts.map +1 -0
- package/dist-extensions/src/Collection.d.ts +141 -0
- package/dist-extensions/src/Collection.d.ts.map +1 -0
- package/dist-extensions/src/CommonMethods.d.ts +32 -0
- package/dist-extensions/src/CommonMethods.d.ts.map +1 -0
- package/dist-extensions/src/EventTypeDefs.d.ts +286 -0
- package/dist-extensions/src/EventTypeDefs.d.ts.map +1 -0
- package/dist-extensions/src/Intersection.d.ts +120 -0
- package/dist-extensions/src/Intersection.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/ActiveSelectionLayoutManager.d.ts +22 -0
- package/dist-extensions/src/LayoutManager/ActiveSelectionLayoutManager.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutManager.d.ts +56 -0
- package/dist-extensions/src/LayoutManager/LayoutManager.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts +13 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts +14 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts +14 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts +30 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/utils.d.ts +10 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/utils.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/constants.d.ts +7 -0
- package/dist-extensions/src/LayoutManager/constants.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/index.d.ts +7 -0
- package/dist-extensions/src/LayoutManager/index.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/types.d.ts +106 -0
- package/dist-extensions/src/LayoutManager/types.d.ts.map +1 -0
- package/dist-extensions/src/Observable.d.ts +68 -0
- package/dist-extensions/src/Observable.d.ts.map +1 -0
- package/dist-extensions/src/Pattern/Pattern.d.ts +99 -0
- package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -0
- package/dist-extensions/src/Pattern/index.d.ts +3 -0
- package/dist-extensions/src/Pattern/index.d.ts.map +1 -0
- package/dist-extensions/src/Pattern/types.d.ts +12 -0
- package/dist-extensions/src/Pattern/types.d.ts.map +1 -0
- package/dist-extensions/src/Point.d.ts +233 -0
- package/dist-extensions/src/Point.d.ts.map +1 -0
- package/dist-extensions/src/Shadow.d.ts +95 -0
- package/dist-extensions/src/Shadow.d.ts.map +1 -0
- package/dist-extensions/src/brushes/BaseBrush.d.ts +101 -0
- package/dist-extensions/src/brushes/BaseBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/CircleBrush.d.ts +44 -0
- package/dist-extensions/src/brushes/CircleBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/PatternBrush.d.ts +23 -0
- package/dist-extensions/src/brushes/PatternBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/PencilBrush.d.ts +92 -0
- package/dist-extensions/src/brushes/PencilBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/SprayBrush.d.ts +74 -0
- package/dist-extensions/src/brushes/SprayBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/typedefs.d.ts +18 -0
- package/dist-extensions/src/brushes/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/cache.d.ts +47 -0
- package/dist-extensions/src/cache.d.ts.map +1 -0
- package/dist-extensions/src/canvas/Canvas.d.ts +339 -0
- package/dist-extensions/src/canvas/Canvas.d.ts.map +1 -0
- package/dist-extensions/src/canvas/CanvasOptions.d.ts +229 -0
- package/dist-extensions/src/canvas/CanvasOptions.d.ts.map +1 -0
- package/dist-extensions/src/canvas/DOMManagers/CanvasDOMManager.d.ts +29 -0
- package/dist-extensions/src/canvas/DOMManagers/CanvasDOMManager.d.ts.map +1 -0
- package/dist-extensions/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +29 -0
- package/dist-extensions/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts.map +1 -0
- package/dist-extensions/src/canvas/DOMManagers/util.d.ts +24 -0
- package/dist-extensions/src/canvas/DOMManagers/util.d.ts.map +1 -0
- package/dist-extensions/src/canvas/SelectableCanvas.d.ts +534 -0
- package/dist-extensions/src/canvas/SelectableCanvas.d.ts.map +1 -0
- package/dist-extensions/src/canvas/StaticCanvas.d.ts +639 -0
- package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +1 -0
- package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts +153 -0
- package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts.map +1 -0
- package/dist-extensions/src/canvas/TextEditingManager.d.ts +21 -0
- package/dist-extensions/src/canvas/TextEditingManager.d.ts.map +1 -0
- package/dist-extensions/src/color/Color.d.ts +162 -0
- package/dist-extensions/src/color/Color.d.ts.map +1 -0
- package/dist-extensions/src/color/color_map.d.ts +155 -0
- package/dist-extensions/src/color/color_map.d.ts.map +1 -0
- package/dist-extensions/src/color/constants.d.ts +111 -0
- package/dist-extensions/src/color/constants.d.ts.map +1 -0
- package/dist-extensions/src/color/typedefs.d.ts +16 -0
- package/dist-extensions/src/color/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/color/util.d.ts +27 -0
- package/dist-extensions/src/color/util.d.ts.map +1 -0
- package/dist-extensions/src/config.d.ts +115 -0
- package/dist-extensions/src/config.d.ts.map +1 -0
- package/dist-extensions/src/constants.d.ts +35 -0
- package/dist-extensions/src/constants.d.ts.map +1 -0
- package/dist-extensions/src/controls/Control.d.ts +229 -0
- package/dist-extensions/src/controls/Control.d.ts.map +1 -0
- package/dist-extensions/src/controls/changeWidth.d.ts +13 -0
- package/dist-extensions/src/controls/changeWidth.d.ts.map +1 -0
- package/dist-extensions/src/controls/commonControls.d.ts +28 -0
- package/dist-extensions/src/controls/commonControls.d.ts.map +1 -0
- package/dist-extensions/src/controls/controlRendering.d.ts +29 -0
- package/dist-extensions/src/controls/controlRendering.d.ts.map +1 -0
- package/dist-extensions/src/controls/drag.d.ts +12 -0
- package/dist-extensions/src/controls/drag.d.ts.map +1 -0
- package/dist-extensions/src/controls/fireEvent.d.ts +3 -0
- package/dist-extensions/src/controls/fireEvent.d.ts.map +1 -0
- package/dist-extensions/src/controls/index.d.ts +14 -0
- package/dist-extensions/src/controls/index.d.ts.map +1 -0
- package/dist-extensions/src/controls/pathControl.d.ts +12 -0
- package/dist-extensions/src/controls/pathControl.d.ts.map +1 -0
- package/dist-extensions/src/controls/polyControl.d.ts +30 -0
- package/dist-extensions/src/controls/polyControl.d.ts.map +1 -0
- package/dist-extensions/src/controls/rotate.d.ts +12 -0
- package/dist-extensions/src/controls/rotate.d.ts.map +1 -0
- package/dist-extensions/src/controls/scale.d.ts +47 -0
- package/dist-extensions/src/controls/scale.d.ts.map +1 -0
- package/dist-extensions/src/controls/scaleSkew.d.ts +39 -0
- package/dist-extensions/src/controls/scaleSkew.d.ts.map +1 -0
- package/dist-extensions/src/controls/skew.d.ts +33 -0
- package/dist-extensions/src/controls/skew.d.ts.map +1 -0
- package/dist-extensions/src/controls/util.d.ts +41 -0
- package/dist-extensions/src/controls/util.d.ts.map +1 -0
- package/dist-extensions/src/controls/wrapWithFireEvent.d.ts +10 -0
- package/dist-extensions/src/controls/wrapWithFireEvent.d.ts.map +1 -0
- package/dist-extensions/src/controls/wrapWithFixedAnchor.d.ts +9 -0
- package/dist-extensions/src/controls/wrapWithFixedAnchor.d.ts.map +1 -0
- package/dist-extensions/src/env/browser.d.ts +3 -0
- package/dist-extensions/src/env/browser.d.ts.map +1 -0
- package/dist-extensions/src/env/index.d.ts +34 -0
- package/dist-extensions/src/env/index.d.ts.map +1 -0
- package/dist-extensions/src/env/types.d.ts +16 -0
- package/dist-extensions/src/env/types.d.ts.map +1 -0
- package/dist-extensions/src/filters/BaseFilter.d.ts +153 -0
- package/dist-extensions/src/filters/BaseFilter.d.ts.map +1 -0
- package/dist-extensions/src/filters/BlendColor.d.ts +68 -0
- package/dist-extensions/src/filters/BlendColor.d.ts.map +1 -0
- package/dist-extensions/src/filters/BlendImage.d.ts +99 -0
- package/dist-extensions/src/filters/BlendImage.d.ts.map +1 -0
- package/dist-extensions/src/filters/Blur.d.ts +50 -0
- package/dist-extensions/src/filters/Blur.d.ts.map +1 -0
- package/dist-extensions/src/filters/Brightness.d.ts +46 -0
- package/dist-extensions/src/filters/Brightness.d.ts.map +1 -0
- package/dist-extensions/src/filters/Canvas2dFilterBackend.d.ts +27 -0
- package/dist-extensions/src/filters/Canvas2dFilterBackend.d.ts.map +1 -0
- package/dist-extensions/src/filters/ColorMatrix.d.ts +66 -0
- package/dist-extensions/src/filters/ColorMatrix.d.ts.map +1 -0
- package/dist-extensions/src/filters/ColorMatrixFilters.d.ts +15 -0
- package/dist-extensions/src/filters/ColorMatrixFilters.d.ts.map +1 -0
- package/dist-extensions/src/filters/Composed.d.ts +47 -0
- package/dist-extensions/src/filters/Composed.d.ts.map +1 -0
- package/dist-extensions/src/filters/Contrast.d.ts +44 -0
- package/dist-extensions/src/filters/Contrast.d.ts.map +1 -0
- package/dist-extensions/src/filters/Convolute.d.ts +81 -0
- package/dist-extensions/src/filters/Convolute.d.ts.map +1 -0
- package/dist-extensions/src/filters/FilterBackend.d.ts +15 -0
- package/dist-extensions/src/filters/FilterBackend.d.ts.map +1 -0
- package/dist-extensions/src/filters/GLProbes/GLProbe.d.ts +7 -0
- package/dist-extensions/src/filters/GLProbes/GLProbe.d.ts.map +1 -0
- package/dist-extensions/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
- package/dist-extensions/src/filters/GLProbes/WebGLProbe.d.ts.map +1 -0
- package/dist-extensions/src/filters/Gamma.d.ts +58 -0
- package/dist-extensions/src/filters/Gamma.d.ts.map +1 -0
- package/dist-extensions/src/filters/Grayscale.d.ts +44 -0
- package/dist-extensions/src/filters/Grayscale.d.ts.map +1 -0
- package/dist-extensions/src/filters/HueRotation.d.ts +31 -0
- package/dist-extensions/src/filters/HueRotation.d.ts.map +1 -0
- package/dist-extensions/src/filters/Invert.d.ts +53 -0
- package/dist-extensions/src/filters/Invert.d.ts.map +1 -0
- package/dist-extensions/src/filters/Noise.d.ts +44 -0
- package/dist-extensions/src/filters/Noise.d.ts.map +1 -0
- package/dist-extensions/src/filters/Pixelate.d.ts +41 -0
- package/dist-extensions/src/filters/Pixelate.d.ts.map +1 -0
- package/dist-extensions/src/filters/RemoveColor.d.ts +53 -0
- package/dist-extensions/src/filters/RemoveColor.d.ts.map +1 -0
- package/dist-extensions/src/filters/Resize.d.ts +137 -0
- package/dist-extensions/src/filters/Resize.d.ts.map +1 -0
- package/dist-extensions/src/filters/Saturation.d.ts +46 -0
- package/dist-extensions/src/filters/Saturation.d.ts.map +1 -0
- package/dist-extensions/src/filters/Vibrance.d.ts +46 -0
- package/dist-extensions/src/filters/Vibrance.d.ts.map +1 -0
- package/dist-extensions/src/filters/WebGLFilterBackend.d.ts +131 -0
- package/dist-extensions/src/filters/WebGLFilterBackend.d.ts.map +1 -0
- package/dist-extensions/src/filters/filters.d.ts +23 -0
- package/dist-extensions/src/filters/filters.d.ts.map +1 -0
- package/dist-extensions/src/filters/index.d.ts +7 -0
- package/dist-extensions/src/filters/index.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/baseFilter.d.ts +4 -0
- package/dist-extensions/src/filters/shaders/baseFilter.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/blendColor.d.ts +13 -0
- package/dist-extensions/src/filters/shaders/blendColor.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/blendImage.d.ts +4 -0
- package/dist-extensions/src/filters/shaders/blendImage.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/blur.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/blur.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/brightness.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/brightness.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/colorMatrix.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/colorMatrix.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/constrast.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/constrast.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/convolute.d.ts +11 -0
- package/dist-extensions/src/filters/shaders/convolute.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/gamma.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/gamma.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/grayscale.d.ts +3 -0
- package/dist-extensions/src/filters/shaders/grayscale.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/invert.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/invert.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/noise.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/noise.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/pixelate.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/pixelate.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/removeColor.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/removeColor.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/saturation.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/saturation.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/vibrance.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/vibrance.d.ts.map +1 -0
- package/dist-extensions/src/filters/typedefs.d.ts +70 -0
- package/dist-extensions/src/filters/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/filters/utils.d.ts +10 -0
- package/dist-extensions/src/filters/utils.d.ts.map +1 -0
- package/dist-extensions/src/gradient/Gradient.d.ts +156 -0
- package/dist-extensions/src/gradient/Gradient.d.ts.map +1 -0
- package/dist-extensions/src/gradient/constants.d.ts +15 -0
- package/dist-extensions/src/gradient/constants.d.ts.map +1 -0
- package/dist-extensions/src/gradient/index.d.ts +3 -0
- package/dist-extensions/src/gradient/index.d.ts.map +1 -0
- package/dist-extensions/src/gradient/parser/misc.d.ts +4 -0
- package/dist-extensions/src/gradient/parser/misc.d.ts.map +1 -0
- package/dist-extensions/src/gradient/parser/parseColorStops.d.ts +3 -0
- package/dist-extensions/src/gradient/parser/parseColorStops.d.ts.map +1 -0
- package/dist-extensions/src/gradient/parser/parseCoords.d.ts +17 -0
- package/dist-extensions/src/gradient/parser/parseCoords.d.ts.map +1 -0
- package/dist-extensions/src/gradient/typedefs.d.ts +93 -0
- package/dist-extensions/src/gradient/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/parser/applyViewboxTransform.d.ts +13 -0
- package/dist-extensions/src/parser/applyViewboxTransform.d.ts.map +1 -0
- package/dist-extensions/src/parser/attributes.d.ts +6 -0
- package/dist-extensions/src/parser/attributes.d.ts.map +1 -0
- package/dist-extensions/src/parser/constants.d.ts +41 -0
- package/dist-extensions/src/parser/constants.d.ts.map +1 -0
- package/dist-extensions/src/parser/doesSomeParentMatch.d.ts +2 -0
- package/dist-extensions/src/parser/doesSomeParentMatch.d.ts.map +1 -0
- package/dist-extensions/src/parser/elementMatchesRule.d.ts +5 -0
- package/dist-extensions/src/parser/elementMatchesRule.d.ts.map +1 -0
- package/dist-extensions/src/parser/elements_parser.d.ts +33 -0
- package/dist-extensions/src/parser/elements_parser.d.ts.map +1 -0
- package/dist-extensions/src/parser/getCSSRules.d.ts +8 -0
- package/dist-extensions/src/parser/getCSSRules.d.ts.map +1 -0
- package/dist-extensions/src/parser/getGlobalStylesForElement.d.ts +6 -0
- package/dist-extensions/src/parser/getGlobalStylesForElement.d.ts.map +1 -0
- package/dist-extensions/src/parser/getGradientDefs.d.ts +7 -0
- package/dist-extensions/src/parser/getGradientDefs.d.ts.map +1 -0
- package/dist-extensions/src/parser/getMultipleNodes.d.ts +2 -0
- package/dist-extensions/src/parser/getMultipleNodes.d.ts.map +1 -0
- package/dist-extensions/src/parser/getSvgRegex.d.ts +2 -0
- package/dist-extensions/src/parser/getSvgRegex.d.ts.map +1 -0
- package/dist-extensions/src/parser/getTagName.d.ts +2 -0
- package/dist-extensions/src/parser/getTagName.d.ts.map +1 -0
- package/dist-extensions/src/parser/hasInvalidAncestor.d.ts +2 -0
- package/dist-extensions/src/parser/hasInvalidAncestor.d.ts.map +1 -0
- package/dist-extensions/src/parser/loadSVGFromString.d.ts +18 -0
- package/dist-extensions/src/parser/loadSVGFromString.d.ts.map +1 -0
- package/dist-extensions/src/parser/loadSVGFromURL.d.ts +19 -0
- package/dist-extensions/src/parser/loadSVGFromURL.d.ts.map +1 -0
- package/dist-extensions/src/parser/normalizeAttr.d.ts +3 -0
- package/dist-extensions/src/parser/normalizeAttr.d.ts.map +1 -0
- package/dist-extensions/src/parser/normalizeValue.d.ts +2 -0
- package/dist-extensions/src/parser/normalizeValue.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseAttributes.d.ts +10 -0
- package/dist-extensions/src/parser/parseAttributes.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseFontDeclaration.d.ts +10 -0
- package/dist-extensions/src/parser/parseFontDeclaration.d.ts.map +1 -0
- package/dist-extensions/src/parser/parsePointsAttribute.d.ts +10 -0
- package/dist-extensions/src/parser/parsePointsAttribute.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseSVGDocument.d.ts +22 -0
- package/dist-extensions/src/parser/parseSVGDocument.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseStyleAttribute.d.ts +9 -0
- package/dist-extensions/src/parser/parseStyleAttribute.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseStyleObject.d.ts +8 -0
- package/dist-extensions/src/parser/parseStyleObject.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseStyleString.d.ts +8 -0
- package/dist-extensions/src/parser/parseStyleString.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseTransformAttribute.d.ts +11 -0
- package/dist-extensions/src/parser/parseTransformAttribute.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseUseDirectives.d.ts +2 -0
- package/dist-extensions/src/parser/parseUseDirectives.d.ts.map +1 -0
- package/dist-extensions/src/parser/percent.d.ts +9 -0
- package/dist-extensions/src/parser/percent.d.ts.map +1 -0
- package/dist-extensions/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
- package/dist-extensions/src/parser/recursivelyParseGradientsXlink.d.ts.map +1 -0
- package/dist-extensions/src/parser/selectorMatches.d.ts +2 -0
- package/dist-extensions/src/parser/selectorMatches.d.ts.map +1 -0
- package/dist-extensions/src/parser/setStrokeFillOpacity.d.ts +6 -0
- package/dist-extensions/src/parser/setStrokeFillOpacity.d.ts.map +1 -0
- package/dist-extensions/src/parser/typedefs.d.ts +10 -0
- package/dist-extensions/src/parser/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/shapes/ActiveSelection.d.ts +109 -0
- package/dist-extensions/src/shapes/ActiveSelection.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Circle.d.ts +111 -0
- package/dist-extensions/src/shapes/Circle.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Ellipse.d.ts +88 -0
- package/dist-extensions/src/shapes/Ellipse.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Group.d.ts +303 -0
- package/dist-extensions/src/shapes/Group.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
- package/dist-extensions/src/shapes/IText/DraggableTextDelegate.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/IText.d.ts +314 -0
- package/dist-extensions/src/shapes/IText/IText.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/ITextBehavior.d.ts +299 -0
- package/dist-extensions/src/shapes/IText/ITextBehavior.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
- package/dist-extensions/src/shapes/IText/ITextClickBehavior.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/ITextKeyBehavior.d.ts +198 -0
- package/dist-extensions/src/shapes/IText/ITextKeyBehavior.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/constants.d.ts +13 -0
- package/dist-extensions/src/shapes/IText/constants.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Image.d.ts +312 -0
- package/dist-extensions/src/shapes/Image.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Line.d.ts +122 -0
- package/dist-extensions/src/shapes/Line.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/AnimatableObject.d.ts +33 -0
- package/dist-extensions/src/shapes/Object/AnimatableObject.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/FabricObject.d.ts +11 -0
- package/dist-extensions/src/shapes/Object/FabricObject.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +72 -0
- package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts +317 -0
- package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/Object.d.ts +614 -0
- package/dist-extensions/src/shapes/Object/Object.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/ObjectGeometry.d.ts +237 -0
- package/dist-extensions/src/shapes/Object/ObjectGeometry.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/ObjectOrigin.d.ts +96 -0
- package/dist-extensions/src/shapes/Object/ObjectOrigin.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/StackedObject.d.ts +60 -0
- package/dist-extensions/src/shapes/Object/StackedObject.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/defaultValues.d.ts +8 -0
- package/dist-extensions/src/shapes/Object/defaultValues.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/BaseProps.d.ts +88 -0
- package/dist-extensions/src/shapes/Object/types/BaseProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/BorderProps.d.ts +37 -0
- package/dist-extensions/src/shapes/Object/types/BorderProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/ControlProps.d.ts +63 -0
- package/dist-extensions/src/shapes/Object/types/ControlProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts +66 -0
- package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
- package/dist-extensions/src/shapes/Object/types/FillStrokeProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
- package/dist-extensions/src/shapes/Object/types/LockInteractionProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts +43 -0
- package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/ObjectTransformProps.d.ts +34 -0
- package/dist-extensions/src/shapes/Object/types/ObjectTransformProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
- package/dist-extensions/src/shapes/Object/types/SerializedObjectProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/index.d.ts +6 -0
- package/dist-extensions/src/shapes/Object/types/index.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Path.d.ts +215 -0
- package/dist-extensions/src/shapes/Path.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Polygon.d.ts +7 -0
- package/dist-extensions/src/shapes/Polygon.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Polyline.d.ts +156 -0
- package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Rect.d.ts +83 -0
- package/dist-extensions/src/shapes/Rect.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Text/StyledText.d.ts +128 -0
- package/dist-extensions/src/shapes/Text/StyledText.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Text/Text.d.ts +697 -0
- package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts +47 -0
- package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Text/constants.d.ts +13 -0
- package/dist-extensions/src/shapes/Text/constants.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Textbox.d.ts +226 -0
- package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Triangle.d.ts +27 -0
- package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -0
- package/dist-extensions/src/typedefs.d.ts +97 -0
- package/dist-extensions/src/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/AnimationBase.d.ts +54 -0
- package/dist-extensions/src/util/animation/AnimationBase.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/AnimationFrameProvider.d.ts +3 -0
- package/dist-extensions/src/util/animation/AnimationFrameProvider.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/AnimationRegistry.d.ts +29 -0
- package/dist-extensions/src/util/animation/AnimationRegistry.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/ArrayAnimation.d.ts +10 -0
- package/dist-extensions/src/util/animation/ArrayAnimation.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/ColorAnimation.d.ts +11 -0
- package/dist-extensions/src/util/animation/ColorAnimation.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/ValueAnimation.d.ts +10 -0
- package/dist-extensions/src/util/animation/ValueAnimation.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/animate.d.ts +37 -0
- package/dist-extensions/src/util/animation/animate.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/easing.d.ts +130 -0
- package/dist-extensions/src/util/animation/easing.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/index.d.ts +3 -0
- package/dist-extensions/src/util/animation/index.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/types.d.ts +87 -0
- package/dist-extensions/src/util/animation/types.d.ts.map +1 -0
- package/dist-extensions/src/util/applyMixins.d.ts +8 -0
- package/dist-extensions/src/util/applyMixins.d.ts.map +1 -0
- package/dist-extensions/src/util/dom_event.d.ts +6 -0
- package/dist-extensions/src/util/dom_event.d.ts.map +1 -0
- package/dist-extensions/src/util/dom_misc.d.ts +12 -0
- package/dist-extensions/src/util/dom_misc.d.ts.map +1 -0
- package/dist-extensions/src/util/dom_style.d.ts +7 -0
- package/dist-extensions/src/util/dom_style.d.ts.map +1 -0
- package/dist-extensions/src/util/index.d.ts +37 -0
- package/dist-extensions/src/util/index.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/cleanupSvgAttribute.d.ts +2 -0
- package/dist-extensions/src/util/internals/cleanupSvgAttribute.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/cloneStyles.d.ts +3 -0
- package/dist-extensions/src/util/internals/cloneStyles.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/console.d.ts +8 -0
- package/dist-extensions/src/util/internals/console.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/dom_request.d.ts +16 -0
- package/dist-extensions/src/util/internals/dom_request.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/findRight.d.ts +2 -0
- package/dist-extensions/src/util/internals/findRight.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/getRandomInt.d.ts +8 -0
- package/dist-extensions/src/util/internals/getRandomInt.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/ifNaN.d.ts +8 -0
- package/dist-extensions/src/util/internals/ifNaN.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/removeFromArray.d.ts +9 -0
- package/dist-extensions/src/util/internals/removeFromArray.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/uid.d.ts +2 -0
- package/dist-extensions/src/util/internals/uid.d.ts.map +1 -0
- package/dist-extensions/src/util/lang_string.d.ts +22 -0
- package/dist-extensions/src/util/lang_string.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
- package/dist-extensions/src/util/misc/boundingBoxFromPoints.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/capValue.d.ts +2 -0
- package/dist-extensions/src/util/misc/capValue.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/cos.d.ts +10 -0
- package/dist-extensions/src/util/misc/cos.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/dom.d.ts +28 -0
- package/dist-extensions/src/util/misc/dom.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/findScaleTo.d.ts +20 -0
- package/dist-extensions/src/util/misc/findScaleTo.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/groupSVGElements.d.ts +11 -0
- package/dist-extensions/src/util/misc/groupSVGElements.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/isTransparent.d.ts +11 -0
- package/dist-extensions/src/util/misc/isTransparent.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/matrix.d.ts +170 -0
- package/dist-extensions/src/util/misc/matrix.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/mergeClipPaths.d.ts +23 -0
- package/dist-extensions/src/util/misc/mergeClipPaths.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/objectEnlive.d.ts +45 -0
- package/dist-extensions/src/util/misc/objectEnlive.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/objectTransforms.d.ts +62 -0
- package/dist-extensions/src/util/misc/objectTransforms.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/pick.d.ts +9 -0
- package/dist-extensions/src/util/misc/pick.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/planeChange.d.ts +64 -0
- package/dist-extensions/src/util/misc/planeChange.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +52 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +90 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +27 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/index.d.ts +12 -0
- package/dist-extensions/src/util/misc/projectStroke/index.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/types.d.ts +23 -0
- package/dist-extensions/src/util/misc/projectStroke/types.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/radiansDegreesConversion.d.ts +14 -0
- package/dist-extensions/src/util/misc/radiansDegreesConversion.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/resolveOrigin.d.ts +9 -0
- package/dist-extensions/src/util/misc/resolveOrigin.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/rotatePoint.d.ts +12 -0
- package/dist-extensions/src/util/misc/rotatePoint.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/sin.d.ts +10 -0
- package/dist-extensions/src/util/misc/sin.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/svgParsing.d.ts +46 -0
- package/dist-extensions/src/util/misc/svgParsing.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/textStyles.d.ts +32 -0
- package/dist-extensions/src/util/misc/textStyles.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/toFixed.d.ts +8 -0
- package/dist-extensions/src/util/misc/toFixed.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/vectors.d.ts +72 -0
- package/dist-extensions/src/util/misc/vectors.d.ts.map +1 -0
- package/dist-extensions/src/util/path/index.d.ts +95 -0
- package/dist-extensions/src/util/path/index.d.ts.map +1 -0
- package/dist-extensions/src/util/path/regex.d.ts +2 -0
- package/dist-extensions/src/util/path/regex.d.ts.map +1 -0
- package/dist-extensions/src/util/path/typedefs.d.ts +221 -0
- package/dist-extensions/src/util/path/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/util/transform_matrix_removal.d.ts +14 -0
- package/dist-extensions/src/util/transform_matrix_removal.d.ts.map +1 -0
- package/dist-extensions/src/util/typeAssertions.d.ts +13 -0
- package/dist-extensions/src/util/typeAssertions.d.ts.map +1 -0
- package/eslint.config.mjs +108 -0
- package/extensions/README.MD +27 -0
- package/extensions/aligning_guidelines/README.MD +22 -0
- package/extensions/aligning_guidelines/constant.ts +10 -0
- package/extensions/aligning_guidelines/index.ts +166 -0
- package/extensions/aligning_guidelines/typedefs.ts +36 -0
- package/extensions/aligning_guidelines/util/basic.spec.ts +31 -0
- package/extensions/aligning_guidelines/util/basic.ts +20 -0
- package/extensions/aligning_guidelines/util/collect-line.ts +172 -0
- package/extensions/aligning_guidelines/util/collect-point.ts +83 -0
- package/extensions/aligning_guidelines/util/draw.ts +74 -0
- package/extensions/aligning_guidelines/util/get-objects-by-target.ts +45 -0
- package/extensions/index.ts +4 -0
- package/jest.config.js +1 -1
- package/jest.extend.ts +14 -15
- package/package.json +17 -12
- package/playwright.setup.ts +5 -5
- package/rollup.config.mjs +46 -4
- package/scripts/build.mjs +1 -1
- package/scripts/buildLock.mjs +5 -5
- package/scripts/buildStats.mjs +2 -2
- package/scripts/git.mjs +1 -1
- package/scripts/index.mjs +34 -32
- package/scripts/sandbox.mjs +15 -15
- package/src/ClassRegistry.spec.ts +1 -1
- package/src/ClassRegistry.ts +1 -1
- package/src/Collection.ts +9 -9
- package/src/EventTypeDefs.ts +2 -2
- package/src/Intersection.spec.ts +2 -2
- package/src/Intersection.ts +11 -11
- package/src/LayoutManager/ActiveSelectionLayoutManager.spec.ts +3 -3
- package/src/LayoutManager/ActiveSelectionLayoutManager.ts +2 -2
- package/src/LayoutManager/LayoutManager.spec.ts +17 -17
- package/src/LayoutManager/LayoutManager.ts +15 -15
- package/src/LayoutManager/LayoutStrategies/ClipPathLayout.ts +3 -3
- package/src/LayoutManager/LayoutStrategies/FixedLayout.ts +1 -1
- package/src/LayoutManager/LayoutStrategies/LayoutStrategy.ts +4 -4
- package/src/LayoutManager/LayoutStrategies/utils.ts +4 -4
- package/src/LayoutManager/types.ts +12 -13
- package/src/Observable.ts +7 -7
- package/src/Pattern/Pattern.ts +20 -10
- package/src/Point.ts +3 -3
- package/src/Shadow.ts +7 -7
- package/src/brushes/CircleBrush.ts +1 -1
- package/src/brushes/PatternBrush.ts +1 -1
- package/src/brushes/PencilBrush.ts +1 -1
- package/src/brushes/SprayBrush.ts +3 -3
- package/src/canvas/Canvas.ts +38 -35
- package/src/canvas/DOMManagers/CanvasDOMManager.ts +2 -2
- package/src/canvas/DOMManagers/StaticCanvasDOMManager.ts +1 -1
- package/src/canvas/DOMManagers/util.ts +2 -2
- package/src/canvas/SelectableCanvas.spec.ts +8 -8
- package/src/canvas/SelectableCanvas.ts +20 -20
- package/src/canvas/StaticCanvas.ts +44 -43
- package/src/canvas/StaticCanvasOptions.ts +0 -1
- package/src/canvas/TextEditingManager.ts +1 -1
- package/src/canvas/__tests__/eventData.test.ts +17 -17
- package/src/color/Color.ts +3 -2
- package/src/color/color.test.ts +2 -2
- package/src/color/typedefs.ts +1 -1
- package/src/color/util.ts +1 -1
- package/src/config.ts +1 -1
- package/src/controls/Control.spec.ts +8 -8
- package/src/controls/Control.ts +14 -14
- package/src/controls/changeWidth.test.ts +2 -2
- package/src/controls/changeWidth.ts +4 -4
- package/src/controls/controlRendering.ts +4 -4
- package/src/controls/drag.ts +1 -1
- package/src/controls/fireEvent.ts +1 -1
- package/src/controls/pathControl.spec.ts +9 -9
- package/src/controls/pathControl.ts +20 -20
- package/src/controls/polyControl.spec.ts +6 -6
- package/src/controls/polyControl.ts +11 -11
- package/src/controls/rotate.ts +4 -4
- package/src/controls/scale.test.ts +9 -9
- package/src/controls/scale.ts +13 -13
- package/src/controls/scaleSkew.ts +3 -3
- package/src/controls/skew.ts +8 -8
- package/src/controls/util.ts +6 -6
- package/src/controls/wrapWithFireEvent.ts +2 -2
- package/src/controls/wrapWithFixedAnchor.spec.ts +5 -5
- package/src/controls/wrapWithFixedAnchor.ts +2 -2
- package/src/env/node.ts +2 -2
- package/src/filters/BaseFilter.ts +27 -25
- package/src/filters/BlendColor.ts +1 -1
- package/src/filters/BlendImage.ts +4 -4
- package/src/filters/Blur.ts +1 -1
- package/src/filters/Boilerplate.ts +1 -1
- package/src/filters/Brightness.ts +1 -1
- package/src/filters/Canvas2dFilterBackend.ts +1 -1
- package/src/filters/ColorMatrix.ts +2 -2
- package/src/filters/ColorMatrixFilters.ts +7 -7
- package/src/filters/Composed.ts +5 -5
- package/src/filters/Contrast.ts +1 -1
- package/src/filters/Convolute.ts +1 -1
- package/src/filters/GLProbes/WebGLProbe.ts +2 -2
- package/src/filters/Gamma.ts +1 -1
- package/src/filters/Grayscale.ts +1 -1
- package/src/filters/Invert.ts +1 -1
- package/src/filters/Noise.ts +1 -1
- package/src/filters/Pixelate.ts +1 -1
- package/src/filters/RemoveColor.ts +1 -1
- package/src/filters/Resize.ts +9 -9
- package/src/filters/Saturation.ts +1 -1
- package/src/filters/Vibrance.ts +1 -1
- package/src/filters/WebGLFilterBackend.ts +10 -10
- package/src/filters/typedefs.ts +1 -3
- package/src/filters/utils.ts +3 -3
- package/src/gradient/Gradient.spec.ts +19 -19
- package/src/gradient/Gradient.ts +51 -50
- package/src/gradient/parser/parseColorStops.ts +3 -3
- package/src/gradient/parser/parseCoords.ts +28 -25
- package/src/mixins/eraser_brush.mixin.ts +21 -21
- package/src/parkinglot/straighten.ts +1 -1
- package/src/parser/applyViewboxTransform.ts +2 -2
- package/src/parser/constants.ts +2 -2
- package/src/parser/elements_parser.ts +13 -13
- package/src/parser/getCSSRules.ts +1 -1
- package/src/parser/getGlobalStylesForElement.ts +1 -1
- package/src/parser/getGradientDefs.ts +1 -1
- package/src/parser/getMultipleNodes.ts +2 -2
- package/src/parser/loadSVGFromString.test.ts +1 -4
- package/src/parser/loadSVGFromString.ts +1 -1
- package/src/parser/loadSVGFromURL.ts +1 -1
- package/src/parser/normalizeAttr.ts +1 -1
- package/src/parser/normalizeValue.ts +2 -2
- package/src/parser/parseAttributes.ts +3 -3
- package/src/parser/parseFontDeclaration.ts +1 -1
- package/src/parser/parseSVGDocument.ts +3 -3
- package/src/parser/parseStyleObject.ts +1 -1
- package/src/parser/parseStyleString.ts +1 -1
- package/src/parser/parseTransformAttribute.ts +1 -1
- package/src/parser/parseUseDirectives.ts +1 -1
- package/src/parser/percent.ts +4 -4
- package/src/parser/recursivelyParseGradientsXlink.ts +1 -1
- package/src/parser/setStrokeFillOpacity.ts +1 -1
- package/src/parser/typedefs.ts +1 -1
- package/src/shapes/ActiveSelection.spec.ts +1 -1
- package/src/shapes/ActiveSelection.ts +4 -4
- package/src/shapes/Circle.ts +5 -5
- package/src/shapes/Ellipse.ts +4 -4
- package/src/shapes/Group.spec.ts +5 -5
- package/src/shapes/Group.ts +19 -17
- package/src/shapes/IText/DraggableTextDelegate.ts +9 -10
- package/src/shapes/IText/IText.test.ts +1 -1
- package/src/shapes/IText/IText.ts +12 -12
- package/src/shapes/IText/ITextBehavior.test.ts +2 -2
- package/src/shapes/IText/ITextBehavior.ts +21 -21
- package/src/shapes/IText/ITextClickBehavior.ts +2 -2
- package/src/shapes/IText/ITextKeyBehavior.test.ts +2 -2
- package/src/shapes/IText/ITextKeyBehavior.ts +13 -13
- package/src/shapes/Image.ts +16 -16
- package/src/shapes/Line.ts +4 -4
- package/src/shapes/Object/AnimatableObject.ts +13 -10
- package/src/shapes/Object/FabricObject.ts +7 -3
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +9 -9
- package/src/shapes/Object/InteractiveObject.spec.ts +3 -3
- package/src/shapes/Object/InteractiveObject.ts +32 -32
- package/src/shapes/Object/Object.ts +33 -31
- package/src/shapes/Object/ObjectGeometry.ts +9 -9
- package/src/shapes/Object/ObjectOrigin.ts +11 -11
- package/src/shapes/Object/StackedObject.ts +3 -4
- package/src/shapes/Path.ts +14 -14
- package/src/shapes/Polyline.spec.ts +1 -1
- package/src/shapes/Polyline.ts +15 -16
- package/src/shapes/Rect.ts +6 -6
- package/src/shapes/Text/StyledText.spec.ts +2 -2
- package/src/shapes/Text/StyledText.ts +7 -7
- package/src/shapes/Text/Text.spec.ts +1 -1
- package/src/shapes/Text/Text.ts +33 -33
- package/src/shapes/Text/TextSVGExportMixin.spec.ts +1 -1
- package/src/shapes/Text/TextSVGExportMixin.ts +23 -23
- package/src/shapes/Textbox.ts +7 -7
- package/src/shapes/Triangle.ts +1 -1
- package/src/typedefs.ts +3 -3
- package/src/util/animation/AnimationBase.ts +2 -2
- package/src/util/animation/AnimationRegistry.ts +1 -1
- package/src/util/animation/ArrayAnimation.ts +2 -2
- package/src/util/animation/ColorAnimation.ts +5 -5
- package/src/util/animation/ValueAnimation.ts +1 -1
- package/src/util/animation/animate.ts +6 -6
- package/src/util/animation/animations.spec.ts +7 -7
- package/src/util/animation/easing.ts +1 -1
- package/src/util/animation/types.ts +5 -6
- package/src/util/applyMixins.ts +2 -2
- package/src/util/dom_style.ts +2 -2
- package/src/util/internals/cloneDeep.ts +6 -0
- package/src/util/internals/cloneStyles.spec.ts +46 -0
- package/src/util/internals/cloneStyles.ts +12 -0
- package/src/util/internals/findRight.ts +1 -1
- package/src/util/internals/getRandomInt.test.ts +1 -1
- package/src/util/misc/boundingBoxFromPoints.ts +1 -1
- package/src/util/misc/dom.ts +3 -3
- package/src/util/misc/findScaleTo.ts +2 -2
- package/src/util/misc/groupSVGElements.ts +1 -1
- package/src/util/misc/isTransparent.ts +1 -1
- package/src/util/misc/matrix.ts +6 -6
- package/src/util/misc/objectEnlive.ts +9 -9
- package/src/util/misc/objectTransforms.ts +5 -5
- package/src/util/misc/pick.ts +2 -2
- package/src/util/misc/planeChange.spec.ts +9 -9
- package/src/util/misc/planeChange.ts +5 -5
- package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +7 -7
- package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +16 -16
- package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +2 -2
- package/src/util/misc/projectStroke/index.ts +7 -7
- package/src/util/misc/resolveOrigin.ts +1 -1
- package/src/util/misc/rotatePoint.ts +1 -1
- package/src/util/misc/svgParsing.ts +5 -5
- package/src/util/misc/textStyles.ts +6 -6
- package/src/util/misc/vectors.ts +1 -1
- package/src/util/path/index.spec.ts +3 -3
- package/src/util/path/index.ts +30 -30
- package/src/util/path/typechecks.ts +22 -22
- package/src/util/path/typedefs.ts +14 -17
- package/src/util/transform_matrix_removal.ts +3 -3
- package/src/util/typeAssertions.ts +4 -4
- package/tsconfig-extensions.json +108 -0
- package/tsconfig.json +4 -3
- package/.eslintignore +0 -3
- package/.eslintrc.js +0 -60
- package/.eslintrc.json +0 -143
- package/.eslintrc_tests +0 -58
- package/dist/src/util/internals/cloneDeep.min.mjs +0 -2
- package/dist/src/util/internals/cloneDeep.min.mjs.map +0 -1
- package/dist/src/util/internals/cloneDeep.mjs +0 -4
- package/dist/src/util/internals/cloneDeep.mjs.map +0 -1
- package/dist/src/util/internals/index.d.ts +0 -5
- package/dist/src/util/internals/index.d.ts.map +0 -1
- package/src/benchmarks/README.md +0 -7
- package/src/benchmarks/calcCornerCoords.mjs +0 -117
- package/src/benchmarks/calcTransformMatrix.mjs +0 -104
- package/src/benchmarks/pathCloning.mjs +0 -111
- package/src/benchmarks/pathData.mjs +0 -5
- package/src/benchmarks/raycasting.mjs +0 -152
- package/src/benchmarks/transformMatrixKey.mjs +0 -97
- package/src/util/internals/index.ts +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ITextClickBehavior.min.mjs","sources":["../../../../src/shapes/IText/ITextClickBehavior.ts"],"sourcesContent":["import type { TPointerEvent, TPointerEventInfo } from '../../EventTypeDefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { stopEvent } from '../../util/dom_event';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\n\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents\n> extends ITextKeyBehavior<Props, SProps, EventSpec> {\n private declare __lastSelected: boolean;\n private declare __lastClickTime: number;\n private declare __lastLastClickTime: number;\n private declare __lastPointer: XY | Record<string, never>;\n private declare __newClickTime: number;\n\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('tripleclick', this.tripleClickHandler);\n\n // Initializes \"dbclick\" event handler\n this.__lastClickTime = +new Date();\n // for triple click\n this.__lastLastClickTime = +new Date();\n this.__lastPointer = {};\n this.on('mousedown', this.onMouseDown);\n\n // @ts-expect-error in reality it is an IText instance\n this.draggableTextDelegate = new DraggableTextDelegate(this);\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown(options: TPointerEventInfo) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n const newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastSelected = this.selected && !this.getActiveControl();\n }\n\n isTripleClick(newPointer: XY) {\n return (\n this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y\n );\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e }: TPointerEventInfo) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (this.selected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore({ e }: TPointerEventInfo) {\n if (!this.canvas || !this.editable || notALeftClick(e)) {\n return;\n }\n // we want to avoid that an object that was selected and then becomes unselectable,\n // may trigger editing mode in some way.\n this.selected = this === this.canvas._activeObject;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: TPointerEventInfo) {\n const didDrag = this.draggableTextDelegate.end(e);\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.__lastSelected && !this.getActiveControl()) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n } else {\n this.selected = true;\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length\n );\n }\n}\n"],"names":["notALeftClick","e","button","ITextClickBehavior","ITextKeyBehavior","constructor","super","arguments","_defineProperty","this","initBehavior","on","_mouseDownHandler","_mouseDownHandlerBefore","mouseUpHandler","doubleClickHandler","tripleClickHandler","__lastClickTime","Date","__lastLastClickTime","__lastPointer","onMouseDown","draggableTextDelegate","DraggableTextDelegate","shouldStartDragging","isActive","onDragStart","canDrop","options","canvas","__newClickTime","newPointer","pointer","isTripleClick","fire","stopEvent","__lastSelected","selected","getActiveControl","x","y","isEditing","selectWord","getSelectionStartFromPointer","selectLine","_ref","editable","start","textEditingManager","register","inCompositionMode","setCursorByClick","__selectionStartOnMouseDown","selectionStart","selectionEnd","abortCursorAnimation","renderCursorOrSelection","_ref2","_activeObject","_ref3","transform","didDrag","end","unregister","activeObject","group","interactive","actionPerformed","enterEditing","initDelayedCursor","newSelection","shiftKey","setSelectionStartEndWithShift","_fireSelectionChanged","_updateTextarea","mouseOffset","getScenePoint","invertTransform","calcTransformMatrix","add","Point","_getLeftOffset","_getTopOffset","height","charIndex","lineIndex","i","_textLines","length","getHeightOfLine","missingNewlineOffset","width","Math","abs","_getLineLeftOffset","charLength","chars","__charBounds","j","widthAfter","kernedWidth","min","flipX","_text"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ITextClickBehavior.min.mjs","sources":["../../../../src/shapes/IText/ITextClickBehavior.ts"],"sourcesContent":["import type { TPointerEvent, TPointerEventInfo } from '../../EventTypeDefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { stopEvent } from '../../util/dom_event';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\n\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior<Props, SProps, EventSpec> {\n private declare __lastSelected: boolean;\n private declare __lastClickTime: number;\n private declare __lastLastClickTime: number;\n private declare __lastPointer: XY | Record<string, never>;\n private declare __newClickTime: number;\n\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('tripleclick', this.tripleClickHandler);\n\n // Initializes \"dbclick\" event handler\n this.__lastClickTime = +new Date();\n // for triple click\n this.__lastLastClickTime = +new Date();\n this.__lastPointer = {};\n this.on('mousedown', this.onMouseDown);\n\n // @ts-expect-error in reality it is an IText instance\n this.draggableTextDelegate = new DraggableTextDelegate(this);\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown(options: TPointerEventInfo) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n const newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastSelected = this.selected && !this.getActiveControl();\n }\n\n isTripleClick(newPointer: XY) {\n return (\n this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y\n );\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e }: TPointerEventInfo) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (this.selected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore({ e }: TPointerEventInfo) {\n if (!this.canvas || !this.editable || notALeftClick(e)) {\n return;\n }\n // we want to avoid that an object that was selected and then becomes unselectable,\n // may trigger editing mode in some way.\n this.selected = this === this.canvas._activeObject;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: TPointerEventInfo) {\n const didDrag = this.draggableTextDelegate.end(e);\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.__lastSelected && !this.getActiveControl()) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n } else {\n this.selected = true;\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n"],"names":["notALeftClick","e","button","ITextClickBehavior","ITextKeyBehavior","constructor","super","arguments","_defineProperty","this","initBehavior","on","_mouseDownHandler","_mouseDownHandlerBefore","mouseUpHandler","doubleClickHandler","tripleClickHandler","__lastClickTime","Date","__lastLastClickTime","__lastPointer","onMouseDown","draggableTextDelegate","DraggableTextDelegate","shouldStartDragging","isActive","onDragStart","canDrop","options","canvas","__newClickTime","newPointer","pointer","isTripleClick","fire","stopEvent","__lastSelected","selected","getActiveControl","x","y","isEditing","selectWord","getSelectionStartFromPointer","selectLine","_ref","editable","start","textEditingManager","register","inCompositionMode","setCursorByClick","__selectionStartOnMouseDown","selectionStart","selectionEnd","abortCursorAnimation","renderCursorOrSelection","_ref2","_activeObject","_ref3","transform","didDrag","end","unregister","activeObject","group","interactive","actionPerformed","enterEditing","initDelayedCursor","newSelection","shiftKey","setSelectionStartEndWithShift","_fireSelectionChanged","_updateTextarea","mouseOffset","getScenePoint","invertTransform","calcTransformMatrix","add","Point","_getLeftOffset","_getTopOffset","height","charIndex","lineIndex","i","_textLines","length","getHeightOfLine","missingNewlineOffset","width","Math","abs","_getLineLeftOffset","charLength","chars","__charBounds","j","widthAfter","kernedWidth","min","flipX","_text"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ITextClickBehavior.mjs","sources":["../../../../src/shapes/IText/ITextClickBehavior.ts"],"sourcesContent":["import type { TPointerEvent, TPointerEventInfo } from '../../EventTypeDefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { stopEvent } from '../../util/dom_event';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\n\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents\n> extends ITextKeyBehavior<Props, SProps, EventSpec> {\n private declare __lastSelected: boolean;\n private declare __lastClickTime: number;\n private declare __lastLastClickTime: number;\n private declare __lastPointer: XY | Record<string, never>;\n private declare __newClickTime: number;\n\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('tripleclick', this.tripleClickHandler);\n\n // Initializes \"dbclick\" event handler\n this.__lastClickTime = +new Date();\n // for triple click\n this.__lastLastClickTime = +new Date();\n this.__lastPointer = {};\n this.on('mousedown', this.onMouseDown);\n\n // @ts-expect-error in reality it is an IText instance\n this.draggableTextDelegate = new DraggableTextDelegate(this);\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown(options: TPointerEventInfo) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n const newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastSelected = this.selected && !this.getActiveControl();\n }\n\n isTripleClick(newPointer: XY) {\n return (\n this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y\n );\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e }: TPointerEventInfo) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (this.selected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore({ e }: TPointerEventInfo) {\n if (!this.canvas || !this.editable || notALeftClick(e)) {\n return;\n }\n // we want to avoid that an object that was selected and then becomes unselectable,\n // may trigger editing mode in some way.\n this.selected = this === this.canvas._activeObject;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: TPointerEventInfo) {\n const didDrag = this.draggableTextDelegate.end(e);\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.__lastSelected && !this.getActiveControl()) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n } else {\n this.selected = true;\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length\n );\n }\n}\n"],"names":["notALeftClick","e","button","ITextClickBehavior","ITextKeyBehavior","constructor","arguments","_defineProperty","initBehavior","on","_mouseDownHandler","_mouseDownHandlerBefore","mouseUpHandler","doubleClickHandler","tripleClickHandler","__lastClickTime","Date","__lastLastClickTime","__lastPointer","onMouseDown","draggableTextDelegate","DraggableTextDelegate","shouldStartDragging","isActive","onDragStart","canDrop","options","canvas","__newClickTime","newPointer","pointer","isTripleClick","fire","stopEvent","__lastSelected","selected","getActiveControl","x","y","isEditing","selectWord","getSelectionStartFromPointer","selectLine","_ref","editable","start","textEditingManager","register","inCompositionMode","setCursorByClick","__selectionStartOnMouseDown","selectionStart","selectionEnd","abortCursorAnimation","renderCursorOrSelection","_ref2","_activeObject","_ref3","transform","didDrag","end","unregister","activeObject","group","interactive","actionPerformed","enterEditing","initDelayedCursor","newSelection","shiftKey","setSelectionStartEndWithShift","_fireSelectionChanged","_updateTextarea","mouseOffset","getScenePoint","invertTransform","calcTransformMatrix","add","Point","_getLeftOffset","_getTopOffset","height","charIndex","lineIndex","i","_textLines","length","getHeightOfLine","missingNewlineOffset","lineLeftOffset","Math","abs","_getLineLeftOffset","width","charLength","chars","__charBounds","j","charWidth","kernedWidth","widthAfter","min","flipX","_text"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ITextClickBehavior.mjs","sources":["../../../../src/shapes/IText/ITextClickBehavior.ts"],"sourcesContent":["import type { TPointerEvent, TPointerEventInfo } from '../../EventTypeDefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { stopEvent } from '../../util/dom_event';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\n\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior<Props, SProps, EventSpec> {\n private declare __lastSelected: boolean;\n private declare __lastClickTime: number;\n private declare __lastLastClickTime: number;\n private declare __lastPointer: XY | Record<string, never>;\n private declare __newClickTime: number;\n\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('tripleclick', this.tripleClickHandler);\n\n // Initializes \"dbclick\" event handler\n this.__lastClickTime = +new Date();\n // for triple click\n this.__lastLastClickTime = +new Date();\n this.__lastPointer = {};\n this.on('mousedown', this.onMouseDown);\n\n // @ts-expect-error in reality it is an IText instance\n this.draggableTextDelegate = new DraggableTextDelegate(this);\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown(options: TPointerEventInfo) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n const newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastSelected = this.selected && !this.getActiveControl();\n }\n\n isTripleClick(newPointer: XY) {\n return (\n this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y\n );\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e }: TPointerEventInfo) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (this.selected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore({ e }: TPointerEventInfo) {\n if (!this.canvas || !this.editable || notALeftClick(e)) {\n return;\n }\n // we want to avoid that an object that was selected and then becomes unselectable,\n // may trigger editing mode in some way.\n this.selected = this === this.canvas._activeObject;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: TPointerEventInfo) {\n const didDrag = this.draggableTextDelegate.end(e);\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.__lastSelected && !this.getActiveControl()) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n } else {\n this.selected = true;\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n"],"names":["notALeftClick","e","button","ITextClickBehavior","ITextKeyBehavior","constructor","arguments","_defineProperty","initBehavior","on","_mouseDownHandler","_mouseDownHandlerBefore","mouseUpHandler","doubleClickHandler","tripleClickHandler","__lastClickTime","Date","__lastLastClickTime","__lastPointer","onMouseDown","draggableTextDelegate","DraggableTextDelegate","shouldStartDragging","isActive","onDragStart","canDrop","options","canvas","__newClickTime","newPointer","pointer","isTripleClick","fire","stopEvent","__lastSelected","selected","getActiveControl","x","y","isEditing","selectWord","getSelectionStartFromPointer","selectLine","_ref","editable","start","textEditingManager","register","inCompositionMode","setCursorByClick","__selectionStartOnMouseDown","selectionStart","selectionEnd","abortCursorAnimation","renderCursorOrSelection","_ref2","_activeObject","_ref3","transform","didDrag","end","unregister","activeObject","group","interactive","actionPerformed","enterEditing","initDelayedCursor","newSelection","shiftKey","setSelectionStartEndWithShift","_fireSelectionChanged","_updateTextarea","mouseOffset","getScenePoint","invertTransform","calcTransformMatrix","add","Point","_getLeftOffset","_getTopOffset","height","charIndex","lineIndex","i","_textLines","length","getHeightOfLine","missingNewlineOffset","lineLeftOffset","Math","abs","_getLineLeftOffset","width","charLength","chars","__charBounds","j","charWidth","kernedWidth","widthAfter","min","flipX","_text"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ITextKeyBehavior.min.mjs","sources":["../../../../src/shapes/IText/ITextKeyBehavior.ts"],"sourcesContent":["import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents\n> extends ITextBehavior<Props, SProps, EventSpec> {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n * @default\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n private declare _clickHandlerInitialized: boolean;\n private declare _copyDone: boolean;\n private declare fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record<string, keyof this>).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as Function).bind(this)\n )\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n // @ts-expect-error legacy method calling pattern\n this[keyMap[e.keyCode]](e);\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n // @ts-expect-error legacy method calling pattern\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n // @ts-expect-error legacy method calling pattern\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(\n this.hiddenTextarea.value\n ).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n selectionStart = this.selectionStart,\n selectionEnd = this.selectionEnd,\n selection = selectionStart !== selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value\n );\n const backDelete = selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(selectionStart, selectionEnd);\n charDiff += selectionEnd - selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n } else {\n removedText = this._text.slice(\n selectionStart,\n selectionStart - charDiff\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n selectionStart,\n selectionStart + 1,\n false\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0]\n );\n }\n if (selection) {\n removeFrom = selectionStart;\n removeTo = selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = selectionEnd - removedText.length;\n removeTo = selectionEnd;\n } else {\n removeFrom = selectionEnd;\n removeTo = selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right'\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n"],"names":["ITextKeyBehavior","ITextBehavior","initHiddenTextarea","doc","this","canvas","getDocumentFromElement","getElement","getFabricDocument","textarea","createElement","Object","entries","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","map","_ref","attribute","value","setAttribute","top","left","fontSize","_calcTextareaPosition","style","cssText","concat","hiddenTextareaContainer","body","appendChild","blur","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","_ref2","eventName","handler","addEventListener","bind","hiddenTextarea","abortCursorAnimation","onKeyDown","e","isEditing","keyMap","direction","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","preventDefault","inCompositionMode","clearContextTop","renderCursorOrSelection","requestRenderAll","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","stopPropagation","updateAndFire","updateFromTextArea","fire","CHANGED","target","styles","nextText","_splitTextIntoLines","graphemeText","charCount","_text","length","nextCharCount","selectionStart","selectionEnd","selection","copiedStyle","removedText","removeFrom","removeTo","charDiff","textareaSelection","fromStringToGraphemeSelection","backDelete","slice","insertedText","getSelectionStyles","removeStyleFromTo","copyPasteData","getEnv","join","copiedText","config","disableStyleCopyPaste","copiedTextStyle","insertNewStyleBlock","onCompositionStart","onCompositionEnd","onCompositionUpdate","_ref3","compositionStart","compositionEnd","updateTextareaPosition","getSelectedText","undefined","_getWidthBeforeCursor","lineIndex","charIndex","bound","widthBeforeCursor","_getLineLeftOffset","__charBounds","width","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","cursorLocation","get2DCursorLocation","_textLines","indexOnOtherLine","_getIndexOnLine","missingNewlineOffset","shiftKey","getUpCursorOffset","textBeforeCursor","line","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","j","jlen","leftEdge","rightEdge","offsetFromLeftEdge","Math","abs","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","offset","_selectionDirection","RIGHT","moveCursorWithShift","moveCursorWithoutShift","max","text","capValue","initDelayedCursor","_fireSelectionChanged","_updateTextarea","newSelection","LEFT","setSelectionStartEndWithShift","moveCursorLeft","_moveCursorLeftOrRight","_move","prop","newValue","altKey","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","actionName","_currentCursorOpacity","moveCursorRightWithShift","moveCursorRightWithoutShift","changed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ITextKeyBehavior.min.mjs","sources":["../../../../src/shapes/IText/ITextKeyBehavior.ts"],"sourcesContent":["import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior<Props, SProps, EventSpec> {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n * @default\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n private declare _clickHandlerInitialized: boolean;\n private declare _copyDone: boolean;\n private declare fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record<string, keyof this>).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n // @ts-expect-error legacy method calling pattern\n this[keyMap[e.keyCode]](e);\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n // @ts-expect-error legacy method calling pattern\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n // @ts-expect-error legacy method calling pattern\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(\n this.hiddenTextarea.value,\n ).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n selectionStart = this.selectionStart,\n selectionEnd = this.selectionEnd,\n selection = selectionStart !== selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value,\n );\n const backDelete = selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(selectionStart, selectionEnd);\n charDiff += selectionEnd - selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n } else {\n removedText = this._text.slice(\n selectionStart,\n selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n selectionStart,\n selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = selectionStart;\n removeTo = selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = selectionEnd - removedText.length;\n removeTo = selectionEnd;\n } else {\n removeFrom = selectionEnd;\n removeTo = selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n"],"names":["ITextKeyBehavior","ITextBehavior","initHiddenTextarea","doc","this","canvas","getDocumentFromElement","getElement","getFabricDocument","textarea","createElement","Object","entries","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","map","_ref","attribute","value","setAttribute","top","left","fontSize","_calcTextareaPosition","style","cssText","concat","hiddenTextareaContainer","body","appendChild","blur","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","_ref2","eventName","handler","addEventListener","bind","hiddenTextarea","abortCursorAnimation","onKeyDown","e","isEditing","keyMap","direction","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","preventDefault","inCompositionMode","clearContextTop","renderCursorOrSelection","requestRenderAll","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","stopPropagation","updateAndFire","updateFromTextArea","fire","CHANGED","target","styles","nextText","_splitTextIntoLines","graphemeText","charCount","_text","length","nextCharCount","selectionStart","selectionEnd","selection","copiedStyle","removedText","removeFrom","removeTo","charDiff","textareaSelection","fromStringToGraphemeSelection","backDelete","slice","insertedText","getSelectionStyles","removeStyleFromTo","copyPasteData","getEnv","join","copiedText","config","disableStyleCopyPaste","copiedTextStyle","insertNewStyleBlock","onCompositionStart","onCompositionEnd","onCompositionUpdate","_ref3","compositionStart","compositionEnd","updateTextareaPosition","getSelectedText","undefined","_getWidthBeforeCursor","lineIndex","charIndex","bound","widthBeforeCursor","_getLineLeftOffset","__charBounds","width","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","cursorLocation","get2DCursorLocation","_textLines","indexOnOtherLine","_getIndexOnLine","missingNewlineOffset","shiftKey","getUpCursorOffset","textBeforeCursor","line","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","j","jlen","leftEdge","rightEdge","offsetFromLeftEdge","Math","abs","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","offset","_selectionDirection","RIGHT","moveCursorWithShift","moveCursorWithoutShift","max","text","capValue","initDelayedCursor","_fireSelectionChanged","_updateTextarea","newSelection","LEFT","setSelectionStartEndWithShift","moveCursorLeft","_moveCursorLeftOrRight","_move","prop","newValue","altKey","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","actionName","_currentCursorOpacity","moveCursorRightWithShift","moveCursorRightWithoutShift","changed"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ITextKeyBehavior.mjs","sources":["../../../../src/shapes/IText/ITextKeyBehavior.ts"],"sourcesContent":["import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents\n> extends ITextBehavior<Props, SProps, EventSpec> {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n * @default\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n private declare _clickHandlerInitialized: boolean;\n private declare _copyDone: boolean;\n private declare fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record<string, keyof this>).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as Function).bind(this)\n )\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n // @ts-expect-error legacy method calling pattern\n this[keyMap[e.keyCode]](e);\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n // @ts-expect-error legacy method calling pattern\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n // @ts-expect-error legacy method calling pattern\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(\n this.hiddenTextarea.value\n ).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n selectionStart = this.selectionStart,\n selectionEnd = this.selectionEnd,\n selection = selectionStart !== selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value\n );\n const backDelete = selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(selectionStart, selectionEnd);\n charDiff += selectionEnd - selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n } else {\n removedText = this._text.slice(\n selectionStart,\n selectionStart - charDiff\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n selectionStart,\n selectionStart + 1,\n false\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0]\n );\n }\n if (selection) {\n removeFrom = selectionStart;\n removeTo = selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = selectionEnd - removedText.length;\n removeTo = selectionEnd;\n } else {\n removeFrom = selectionEnd;\n removeTo = selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right'\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n"],"names":["ITextKeyBehavior","ITextBehavior","initHiddenTextarea","doc","canvas","getDocumentFromElement","getElement","getFabricDocument","textarea","createElement","Object","entries","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","map","_ref","attribute","value","setAttribute","top","left","fontSize","_calcTextareaPosition","style","cssText","concat","hiddenTextareaContainer","body","appendChild","blur","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","_ref2","eventName","handler","addEventListener","bind","hiddenTextarea","abortCursorAnimation","onKeyDown","e","isEditing","keyMap","direction","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","preventDefault","inCompositionMode","clearContextTop","renderCursorOrSelection","requestRenderAll","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","stopPropagation","updateAndFire","updateFromTextArea","fire","CHANGED","target","styles","nextText","_splitTextIntoLines","graphemeText","charCount","_text","length","nextCharCount","selectionStart","selectionEnd","selection","copiedStyle","removedText","charDiff","removeFrom","removeTo","textareaSelection","fromStringToGraphemeSelection","backDelete","slice","insertedText","getSelectionStyles","removeStyleFromTo","copyPasteData","getEnv","join","copiedText","config","disableStyleCopyPaste","copiedTextStyle","insertNewStyleBlock","onCompositionStart","onCompositionEnd","onCompositionUpdate","_ref3","compositionStart","compositionEnd","updateTextareaPosition","getSelectedText","undefined","_getWidthBeforeCursor","lineIndex","charIndex","widthBeforeCursor","_getLineLeftOffset","bound","__charBounds","width","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","cursorLocation","get2DCursorLocation","_textLines","indexOnOtherLine","_getIndexOnLine","textAfterCursor","missingNewlineOffset","shiftKey","getUpCursorOffset","textBeforeCursor","line","lineLeftOffset","widthOfCharsOnLine","indexOnLine","charWidth","foundMatch","j","jlen","leftEdge","rightEdge","offsetFromLeftEdge","Math","abs","offsetFromRightEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","offset","_selectionDirection","RIGHT","moveCursorWithShift","moveCursorWithoutShift","max","text","capValue","initDelayedCursor","_fireSelectionChanged","_updateTextarea","newSelection","LEFT","setSelectionStartEndWithShift","moveCursorLeft","_moveCursorLeftOrRight","_move","prop","newValue","altKey","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","actionName","_currentCursorOpacity","moveCursorRightWithShift","moveCursorRightWithoutShift","changed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ITextKeyBehavior.mjs","sources":["../../../../src/shapes/IText/ITextKeyBehavior.ts"],"sourcesContent":["import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior<Props, SProps, EventSpec> {\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behavior for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the IText or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = Object.assign({}, this.keysMap);\n * The function must be in IText.prototype.myFunction And will receive event as args[0]\n */\n declare keysMap: TKeyMapIText;\n\n declare keysMapRtl: TKeyMapIText;\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n declare ctrlKeysMapUp: TKeyMapIText;\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n declare ctrlKeysMapDown: TKeyMapIText;\n\n declare hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n * @default\n */\n declare hiddenTextareaContainer?: HTMLElement | null;\n\n private declare _clickHandlerInitialized: boolean;\n private declare _copyDone: boolean;\n private declare fromPaste: boolean;\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea() {\n const doc =\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument();\n const textarea = doc.createElement('textarea');\n Object.entries({\n autocapitalize: 'off',\n autocorrect: 'off',\n autocomplete: 'off',\n spellcheck: 'false',\n 'data-fabric': 'textarea',\n wrap: 'off',\n }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n const { top, left, fontSize } = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n Object.entries({\n blur: 'blur',\n keydown: 'onKeyDown',\n keyup: 'onKeyUp',\n input: 'onInput',\n copy: 'copy',\n cut: 'copy',\n paste: 'paste',\n compositionstart: 'onCompositionStart',\n compositionupdate: 'onCompositionUpdate',\n compositionend: 'onCompositionEnd',\n } as Record<string, keyof this>).map(([eventName, handler]) =>\n textarea.addEventListener(\n eventName,\n (this[handler] as EventListener).bind(this),\n ),\n );\n this.hiddenTextarea = textarea;\n }\n\n /**\n * Override this method to customize cursor behavior on textbox blur\n */\n blur() {\n this.abortCursorAnimation();\n }\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {KeyboardEvent} e Event object\n */\n onKeyDown(e: KeyboardEvent) {\n if (!this.isEditing) {\n return;\n }\n const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n // @ts-expect-error legacy method calling pattern\n this[keyMap[e.keyCode]](e);\n } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n // @ts-expect-error legacy method calling pattern\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n } else {\n this.canvas && this.canvas.requestRenderAll();\n }\n }\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {KeyboardEvent} e Event object\n */\n onKeyUp(e: KeyboardEvent) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n // @ts-expect-error legacy method calling pattern\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n } else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n }\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n const fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n const updateAndFire = () => {\n this.updateFromTextArea();\n this.fire(CHANGED);\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this as unknown as IText });\n this.canvas.requestRenderAll();\n }\n };\n if (this.hiddenTextarea.value === '') {\n this.styles = {};\n updateAndFire();\n return;\n }\n // decisions about style changes.\n const nextText = this._splitTextIntoLines(\n this.hiddenTextarea.value,\n ).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n selectionStart = this.selectionStart,\n selectionEnd = this.selectionEnd,\n selection = selectionStart !== selectionEnd;\n let copiedStyle: TextStyleDeclaration[] | undefined,\n removedText,\n charDiff = nextCharCount - charCount,\n removeFrom,\n removeTo;\n\n const textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value,\n );\n const backDelete = selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(selectionStart, selectionEnd);\n charDiff += selectionEnd - selectionStart;\n } else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n } else {\n removedText = this._text.slice(\n selectionStart,\n selectionStart - charDiff,\n );\n }\n }\n const insertedText = nextText.slice(\n textareaSelection.selectionEnd - charDiff,\n textareaSelection.selectionEnd,\n );\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(\n selectionStart,\n selectionStart + 1,\n false,\n );\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(\n () =>\n // this return an array of references, but that is fine since we are\n // copying the style later.\n copiedStyle![0],\n );\n }\n if (selection) {\n removeFrom = selectionStart;\n removeTo = selectionEnd;\n } else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = selectionEnd - removedText.length;\n removeTo = selectionEnd;\n } else {\n removeFrom = selectionEnd;\n removeTo = selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n const { copyPasteData } = getEnv();\n if (\n fromPaste &&\n insertedText.join('') === copyPasteData.copiedText &&\n !config.disableStyleCopyPaste\n ) {\n copiedStyle = copyPasteData.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n }\n updateAndFire();\n }\n\n /**\n * Composition start\n */\n onCompositionStart() {\n this.inCompositionMode = true;\n }\n\n /**\n * Composition end\n */\n onCompositionEnd() {\n this.inCompositionMode = false;\n }\n\n onCompositionUpdate({ target }: CompositionEvent) {\n const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n this.compositionStart = selectionStart;\n this.compositionEnd = selectionEnd;\n this.updateTextareaPosition();\n }\n\n /**\n * Copies selected text\n */\n copy() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n const { copyPasteData } = getEnv();\n copyPasteData.copiedText = this.getSelectedText();\n if (!config.disableStyleCopyPaste) {\n copyPasteData.copiedTextStyle = this.getSelectionStyles(\n this.selectionStart,\n this.selectionEnd,\n true,\n );\n } else {\n copyPasteData.copiedTextStyle = undefined;\n }\n this._copyDone = true;\n }\n\n /**\n * Pastes text\n */\n paste() {\n this.fromPaste = true;\n }\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n }\n\n /**\n * Gets start offset of a selection\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (\n lineIndex === this._textLines.length - 1 ||\n e.metaKey ||\n e.keyCode === 34\n ) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return (\n textAfterCursor.length +\n indexOnOtherLine +\n 1 +\n this.missingNewlineOffset(lineIndex)\n );\n }\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n } else {\n return this.selectionStart;\n }\n }\n\n /**\n * @param {KeyboardEvent} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n const selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n const charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return (\n -this._textLines[lineIndex - 1].length +\n indexOnOtherLine -\n textBeforeCursor.length +\n (1 - missingNewlineOffset)\n );\n }\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine(lineIndex: number, width: number) {\n const line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n let widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0,\n charWidth,\n foundMatch;\n\n for (let j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n const leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n }\n\n /**\n * Moves cursor down\n * @param {KeyboardEvent} e Event object\n */\n moveCursorDown(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n }\n\n /**\n * Moves cursor up\n * @param {KeyboardEvent} e Event object\n */\n moveCursorUp(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n }\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n const offset = this[`get${direction}CursorOffset`](\n e,\n this._selectionDirection === RIGHT,\n );\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n } else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n const max = this.text.length;\n this.selectionStart = capValue(0, this.selectionStart, max);\n this.selectionEnd = capValue(0, this.selectionEnd, max);\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift(offset: number) {\n const newSelection =\n this._selectionDirection === LEFT\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(\n this.selectionStart,\n this.selectionEnd,\n newSelection,\n );\n return offset !== 0;\n }\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift(offset: number) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n }\n\n /**\n * Moves cursor left\n * @param {KeyboardEvent} e Event object\n */\n moveCursorLeft(e: KeyboardEvent) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n }\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n *\n * @todo refactor not to use method name composition\n */\n _move(\n e: KeyboardEvent,\n prop: 'selectionStart' | 'selectionEnd',\n direction: 'Left' | 'Right',\n ): boolean {\n let newValue: number | undefined;\n if (e.altKey) {\n newValue = this[`findWordBoundary${direction}`](this[prop]);\n } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n newValue = this[`findLineBoundary${direction}`](this[prop]);\n } else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n return false;\n }\n\n /**\n * @private\n */\n _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Left');\n }\n\n /**\n * @private\n */\n _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n return this._move(e, prop, 'Right');\n }\n\n /**\n * Moves cursor left without keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithoutShift(e: KeyboardEvent) {\n let change = true;\n this._selectionDirection = LEFT;\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (\n this.selectionEnd === this.selectionStart &&\n this.selectionStart !== 0\n ) {\n change = this._moveLeft(e, 'selectionStart');\n }\n this.selectionEnd = this.selectionStart;\n return change;\n }\n\n /**\n * Moves cursor left while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorLeftWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === RIGHT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveLeft(e, 'selectionEnd');\n } else if (this.selectionStart !== 0) {\n this._selectionDirection = LEFT;\n return this._moveLeft(e, 'selectionStart');\n }\n }\n\n /**\n * Moves cursor right\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRight(e: KeyboardEvent) {\n if (\n this.selectionStart >= this._text.length &&\n this.selectionEnd >= this._text.length\n ) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n }\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {KeyboardEvent} e Event object\n */\n _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n const actionName = `moveCursor${direction}${\n e.shiftKey ? 'WithShift' : 'WithoutShift'\n }` as const;\n this._currentCursorOpacity = 1;\n if (this[actionName](e)) {\n // TODO fix: abort and init should be an alternative depending\n // on selectionStart/End being equal or different\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Moves cursor right while keeping selection\n * @param {KeyboardEvent} e\n */\n moveCursorRightWithShift(e: KeyboardEvent) {\n if (\n this._selectionDirection === LEFT &&\n this.selectionStart !== this.selectionEnd\n ) {\n return this._moveRight(e, 'selectionStart');\n } else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = RIGHT;\n return this._moveRight(e, 'selectionEnd');\n }\n }\n\n /**\n * Moves cursor right without keeping selection\n * @param {KeyboardEvent} e Event object\n */\n moveCursorRightWithoutShift(e: KeyboardEvent) {\n let changed = true;\n this._selectionDirection = RIGHT;\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n } else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n }\n}\n"],"names":["ITextKeyBehavior","ITextBehavior","initHiddenTextarea","doc","canvas","getDocumentFromElement","getElement","getFabricDocument","textarea","createElement","Object","entries","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","map","_ref","attribute","value","setAttribute","top","left","fontSize","_calcTextareaPosition","style","cssText","concat","hiddenTextareaContainer","body","appendChild","blur","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","_ref2","eventName","handler","addEventListener","bind","hiddenTextarea","abortCursorAnimation","onKeyDown","e","isEditing","keyMap","direction","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","preventDefault","inCompositionMode","clearContextTop","renderCursorOrSelection","requestRenderAll","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","stopPropagation","updateAndFire","updateFromTextArea","fire","CHANGED","target","styles","nextText","_splitTextIntoLines","graphemeText","charCount","_text","length","nextCharCount","selectionStart","selectionEnd","selection","copiedStyle","removedText","charDiff","removeFrom","removeTo","textareaSelection","fromStringToGraphemeSelection","backDelete","slice","insertedText","getSelectionStyles","removeStyleFromTo","copyPasteData","getEnv","join","copiedText","config","disableStyleCopyPaste","copiedTextStyle","insertNewStyleBlock","onCompositionStart","onCompositionEnd","onCompositionUpdate","_ref3","compositionStart","compositionEnd","updateTextareaPosition","getSelectedText","undefined","_getWidthBeforeCursor","lineIndex","charIndex","widthBeforeCursor","_getLineLeftOffset","bound","__charBounds","width","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","cursorLocation","get2DCursorLocation","_textLines","indexOnOtherLine","_getIndexOnLine","textAfterCursor","missingNewlineOffset","shiftKey","getUpCursorOffset","textBeforeCursor","line","lineLeftOffset","widthOfCharsOnLine","indexOnLine","charWidth","foundMatch","j","jlen","leftEdge","rightEdge","offsetFromLeftEdge","Math","abs","offsetFromRightEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","offset","_selectionDirection","RIGHT","moveCursorWithShift","moveCursorWithoutShift","max","text","capValue","initDelayedCursor","_fireSelectionChanged","_updateTextarea","newSelection","LEFT","setSelectionStartEndWithShift","moveCursorLeft","_moveCursorLeftOrRight","_move","prop","newValue","altKey","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","actionName","_currentCursorOpacity","moveCursorRightWithShift","moveCursorRightWithoutShift","changed"],"mappings":"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"}
|