@nasser-sw/fabric 7.0.0-beta1 → 7.0.1-beta2
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/.babelrc +0 -0
- package/.babelrcAlt +0 -0
- package/.browserslistrc +0 -0
- package/.editorconfig +0 -0
- package/.gitattributes +0 -0
- package/.gitpod.yml +0 -0
- package/.prettierignore +0 -0
- package/.prettierrc +0 -0
- package/CHANGELOG.md +0 -0
- package/CODE_OF_CONDUCT.md +0 -0
- package/CONTRIBUTING.md +0 -0
- package/LICENSE +0 -0
- package/OVERLAY_EDITOR_MIGRATION.md +0 -0
- package/README.md +0 -0
- package/SECURITY.md +0 -0
- package/debug/konva/CHANGELOG.md +0 -0
- package/debug/konva/LICENSE +0 -0
- package/debug/konva/README.md +0 -0
- package/debug/konva/gulpfile.mjs +0 -0
- package/debug/konva/package.json +0 -0
- package/debug/konva/release.sh +0 -0
- package/debug/konva/resources/doc-includes/ContainerParams.txt +0 -0
- package/debug/konva/resources/doc-includes/NodeParams.txt +0 -0
- package/debug/konva/resources/doc-includes/ShapeParams.txt +0 -0
- package/debug/konva/resources/jsdoc.conf.json +0 -0
- package/debug/konva/rollup.config.mjs +0 -0
- package/debug/konva/src/Animation.ts +0 -0
- package/debug/konva/src/BezierFunctions.ts +0 -0
- package/debug/konva/src/Canvas.ts +0 -0
- package/debug/konva/src/Container.ts +0 -0
- package/debug/konva/src/Context.ts +0 -0
- package/debug/konva/src/Core.ts +0 -0
- package/debug/konva/src/DragAndDrop.ts +0 -0
- package/debug/konva/src/Factory.ts +0 -0
- package/debug/konva/src/FastLayer.ts +0 -0
- package/debug/konva/src/Global.ts +0 -0
- package/debug/konva/src/Group.ts +0 -0
- package/debug/konva/src/Layer.ts +0 -0
- package/debug/konva/src/Node.ts +0 -0
- package/debug/konva/src/PointerEvents.ts +0 -0
- package/debug/konva/src/Shape.ts +0 -0
- package/debug/konva/src/Stage.ts +0 -0
- package/debug/konva/src/Tween.ts +0 -0
- package/debug/konva/src/Util.ts +0 -0
- package/debug/konva/src/Validators.ts +0 -0
- package/debug/konva/src/_CoreInternals.ts +0 -0
- package/debug/konva/src/_FullInternals.ts +0 -0
- package/debug/konva/src/canvas-backend.ts +0 -0
- package/debug/konva/src/filters/Blur.ts +0 -0
- package/debug/konva/src/filters/Brighten.ts +0 -0
- package/debug/konva/src/filters/Brightness.ts +0 -0
- package/debug/konva/src/filters/Contrast.ts +0 -0
- package/debug/konva/src/filters/Emboss.ts +0 -0
- package/debug/konva/src/filters/Enhance.ts +0 -0
- package/debug/konva/src/filters/Grayscale.ts +0 -0
- package/debug/konva/src/filters/HSL.ts +0 -0
- package/debug/konva/src/filters/HSV.ts +0 -0
- package/debug/konva/src/filters/Invert.ts +0 -0
- package/debug/konva/src/filters/Kaleidoscope.ts +0 -0
- package/debug/konva/src/filters/Mask.ts +0 -0
- package/debug/konva/src/filters/Noise.ts +0 -0
- package/debug/konva/src/filters/Pixelate.ts +0 -0
- package/debug/konva/src/filters/Posterize.ts +0 -0
- package/debug/konva/src/filters/RGB.ts +0 -0
- package/debug/konva/src/filters/RGBA.ts +0 -0
- package/debug/konva/src/filters/Sepia.ts +0 -0
- package/debug/konva/src/filters/Solarize.ts +0 -0
- package/debug/konva/src/filters/Threshold.ts +0 -0
- package/debug/konva/src/index.ts +0 -0
- package/debug/konva/src/shapes/Arc.ts +0 -0
- package/debug/konva/src/shapes/Arrow.ts +0 -0
- package/debug/konva/src/shapes/Circle.ts +0 -0
- package/debug/konva/src/shapes/Ellipse.ts +0 -0
- package/debug/konva/src/shapes/Image.ts +0 -0
- package/debug/konva/src/shapes/Label.ts +0 -0
- package/debug/konva/src/shapes/Line.ts +0 -0
- package/debug/konva/src/shapes/Path.ts +0 -0
- package/debug/konva/src/shapes/Rect.ts +0 -0
- package/debug/konva/src/shapes/RegularPolygon.ts +0 -0
- package/debug/konva/src/shapes/Ring.ts +0 -0
- package/debug/konva/src/shapes/Sprite.ts +0 -0
- package/debug/konva/src/shapes/Star.ts +0 -0
- package/debug/konva/src/shapes/Text.ts +0 -0
- package/debug/konva/src/shapes/TextPath.ts +0 -0
- package/debug/konva/src/shapes/Transformer.ts +0 -0
- package/debug/konva/src/shapes/Wedge.ts +0 -0
- package/debug/konva/src/skia-backend.ts +0 -0
- package/debug/konva/src/types.ts +0 -0
- package/debug/konva/tsconfig.json +0 -0
- package/debug/konva/tsconfig.test.json +0 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.min.mjs +0 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.min.mjs.map +0 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.mjs +0 -0
- package/dist/_virtual/_rollupPluginBabelHelpers.mjs.map +0 -0
- package/dist/extensions/aligning_guidelines/constant.d.ts +0 -0
- package/dist/extensions/aligning_guidelines/constant.d.ts.map +0 -0
- package/dist/extensions/aligning_guidelines/index.d.ts +0 -0
- package/dist/extensions/aligning_guidelines/index.d.ts.map +0 -0
- package/dist/extensions/aligning_guidelines/typedefs.d.ts +0 -0
- package/dist/extensions/aligning_guidelines/typedefs.d.ts.map +0 -0
- package/dist/extensions/aligning_guidelines/util/basic.d.ts +0 -0
- package/dist/extensions/aligning_guidelines/util/basic.d.ts.map +0 -0
- package/dist/extensions/aligning_guidelines/util/collect-line.d.ts +0 -0
- package/dist/extensions/aligning_guidelines/util/collect-line.d.ts.map +0 -0
- package/dist/extensions/aligning_guidelines/util/collect-point.d.ts +0 -0
- package/dist/extensions/aligning_guidelines/util/collect-point.d.ts.map +0 -0
- package/dist/extensions/aligning_guidelines/util/draw.d.ts +0 -0
- package/dist/extensions/aligning_guidelines/util/draw.d.ts.map +0 -0
- package/dist/extensions/aligning_guidelines/util/get-objects-by-target.d.ts +0 -0
- package/dist/extensions/aligning_guidelines/util/get-objects-by-target.d.ts.map +0 -0
- package/dist/extensions/data_updaters/gradient/index.d.ts +0 -0
- package/dist/extensions/data_updaters/gradient/index.d.ts.map +0 -0
- package/dist/extensions/data_updaters/origins/index.d.ts +0 -0
- package/dist/extensions/data_updaters/origins/index.d.ts.map +0 -0
- package/dist/extensions/index.d.ts +0 -0
- package/dist/extensions/index.d.ts.map +0 -0
- package/dist/fabric.d.ts +0 -0
- package/dist/fabric.d.ts.map +0 -0
- package/dist/fabric.min.mjs +0 -0
- package/dist/fabric.min.mjs.map +0 -0
- package/dist/fabric.mjs +0 -0
- package/dist/fabric.mjs.map +0 -0
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +0 -0
- package/dist/index.js +1524 -1027
- 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 +1524 -1027
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +1524 -1027
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +0 -0
- package/dist/index.node.d.ts.map +0 -0
- package/dist/index.node.mjs +1524 -1027
- package/dist/index.node.mjs.map +1 -1
- package/dist/package.json.min.mjs +1 -1
- package/dist/package.json.min.mjs.map +0 -0
- package/dist/package.json.mjs +1 -1
- package/dist/package.json.mjs.map +0 -0
- package/dist/src/ClassRegistry.d.ts +0 -0
- package/dist/src/ClassRegistry.d.ts.map +0 -0
- package/dist/src/ClassRegistry.min.mjs +0 -0
- package/dist/src/ClassRegistry.min.mjs.map +0 -0
- package/dist/src/ClassRegistry.mjs +0 -0
- package/dist/src/ClassRegistry.mjs.map +0 -0
- package/dist/src/Collection.d.ts +0 -0
- package/dist/src/Collection.d.ts.map +0 -0
- package/dist/src/Collection.min.mjs +0 -0
- package/dist/src/Collection.min.mjs.map +0 -0
- package/dist/src/Collection.mjs +0 -0
- package/dist/src/Collection.mjs.map +0 -0
- package/dist/src/CommonMethods.d.ts +0 -0
- package/dist/src/CommonMethods.d.ts.map +0 -0
- package/dist/src/CommonMethods.min.mjs +0 -0
- package/dist/src/CommonMethods.min.mjs.map +0 -0
- package/dist/src/CommonMethods.mjs +0 -0
- package/dist/src/CommonMethods.mjs.map +0 -0
- package/dist/src/EventTypeDefs.d.ts +0 -0
- package/dist/src/EventTypeDefs.d.ts.map +0 -0
- package/dist/src/Intersection.d.ts +0 -0
- package/dist/src/Intersection.d.ts.map +0 -0
- package/dist/src/Intersection.min.mjs +0 -0
- package/dist/src/Intersection.min.mjs.map +0 -0
- package/dist/src/Intersection.mjs +0 -0
- package/dist/src/Intersection.mjs.map +0 -0
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.d.ts +0 -0
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.d.ts.map +0 -0
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.min.mjs +0 -0
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.min.mjs.map +0 -0
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.mjs +0 -0
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutManager.d.ts +0 -0
- package/dist/src/LayoutManager/LayoutManager.d.ts.map +0 -0
- package/dist/src/LayoutManager/LayoutManager.min.mjs +0 -0
- package/dist/src/LayoutManager/LayoutManager.min.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutManager.mjs +0 -0
- package/dist/src/LayoutManager/LayoutManager.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.min.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.min.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FitContentLayout.min.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FitContentLayout.min.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FitContentLayout.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FitContentLayout.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.min.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.min.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.min.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.min.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/utils.d.ts +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/utils.d.ts.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/utils.min.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/utils.min.mjs.map +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/utils.mjs +0 -0
- package/dist/src/LayoutManager/LayoutStrategies/utils.mjs.map +0 -0
- package/dist/src/LayoutManager/constants.d.ts +0 -0
- package/dist/src/LayoutManager/constants.d.ts.map +0 -0
- package/dist/src/LayoutManager/constants.min.mjs +0 -0
- package/dist/src/LayoutManager/constants.min.mjs.map +0 -0
- package/dist/src/LayoutManager/constants.mjs +0 -0
- package/dist/src/LayoutManager/constants.mjs.map +0 -0
- package/dist/src/LayoutManager/index.d.ts +0 -0
- package/dist/src/LayoutManager/index.d.ts.map +0 -0
- package/dist/src/LayoutManager/types.d.ts +0 -0
- package/dist/src/LayoutManager/types.d.ts.map +0 -0
- package/dist/src/Observable.d.ts +0 -0
- package/dist/src/Observable.d.ts.map +0 -0
- package/dist/src/Observable.min.mjs +0 -0
- package/dist/src/Observable.min.mjs.map +0 -0
- package/dist/src/Observable.mjs +0 -0
- package/dist/src/Observable.mjs.map +0 -0
- package/dist/src/Pattern/Pattern.d.ts +0 -0
- package/dist/src/Pattern/Pattern.d.ts.map +0 -0
- package/dist/src/Pattern/Pattern.min.mjs +0 -0
- package/dist/src/Pattern/Pattern.min.mjs.map +0 -0
- package/dist/src/Pattern/Pattern.mjs +0 -0
- package/dist/src/Pattern/Pattern.mjs.map +0 -0
- package/dist/src/Pattern/index.d.ts +0 -0
- package/dist/src/Pattern/index.d.ts.map +0 -0
- package/dist/src/Pattern/types.d.ts +0 -0
- package/dist/src/Pattern/types.d.ts.map +0 -0
- package/dist/src/Point.d.ts +0 -0
- package/dist/src/Point.d.ts.map +0 -0
- package/dist/src/Point.min.mjs +0 -0
- package/dist/src/Point.min.mjs.map +0 -0
- package/dist/src/Point.mjs +0 -0
- package/dist/src/Point.mjs.map +0 -0
- package/dist/src/Shadow.d.ts +0 -0
- package/dist/src/Shadow.d.ts.map +0 -0
- package/dist/src/Shadow.min.mjs +0 -0
- package/dist/src/Shadow.min.mjs.map +0 -0
- package/dist/src/Shadow.mjs +0 -0
- package/dist/src/Shadow.mjs.map +0 -0
- package/dist/src/brushes/BaseBrush.d.ts +0 -0
- package/dist/src/brushes/BaseBrush.d.ts.map +0 -0
- package/dist/src/brushes/BaseBrush.min.mjs +0 -0
- package/dist/src/brushes/BaseBrush.min.mjs.map +0 -0
- package/dist/src/brushes/BaseBrush.mjs +0 -0
- package/dist/src/brushes/BaseBrush.mjs.map +0 -0
- package/dist/src/brushes/CircleBrush.d.ts +0 -0
- package/dist/src/brushes/CircleBrush.d.ts.map +0 -0
- package/dist/src/brushes/CircleBrush.min.mjs +0 -0
- package/dist/src/brushes/CircleBrush.min.mjs.map +0 -0
- package/dist/src/brushes/CircleBrush.mjs +0 -0
- package/dist/src/brushes/CircleBrush.mjs.map +0 -0
- package/dist/src/brushes/PatternBrush.d.ts +0 -0
- package/dist/src/brushes/PatternBrush.d.ts.map +0 -0
- package/dist/src/brushes/PatternBrush.min.mjs +0 -0
- package/dist/src/brushes/PatternBrush.min.mjs.map +0 -0
- package/dist/src/brushes/PatternBrush.mjs +0 -0
- package/dist/src/brushes/PatternBrush.mjs.map +0 -0
- package/dist/src/brushes/PencilBrush.d.ts +0 -0
- package/dist/src/brushes/PencilBrush.d.ts.map +0 -0
- package/dist/src/brushes/PencilBrush.min.mjs +0 -0
- package/dist/src/brushes/PencilBrush.min.mjs.map +0 -0
- package/dist/src/brushes/PencilBrush.mjs +0 -0
- package/dist/src/brushes/PencilBrush.mjs.map +0 -0
- package/dist/src/brushes/SprayBrush.d.ts +0 -0
- package/dist/src/brushes/SprayBrush.d.ts.map +0 -0
- package/dist/src/brushes/SprayBrush.min.mjs +0 -0
- package/dist/src/brushes/SprayBrush.min.mjs.map +0 -0
- package/dist/src/brushes/SprayBrush.mjs +0 -0
- package/dist/src/brushes/SprayBrush.mjs.map +0 -0
- package/dist/src/brushes/typedefs.d.ts +0 -0
- package/dist/src/brushes/typedefs.d.ts.map +0 -0
- package/dist/src/cache.d.ts +0 -0
- package/dist/src/cache.d.ts.map +0 -0
- package/dist/src/cache.min.mjs +0 -0
- package/dist/src/cache.min.mjs.map +0 -0
- package/dist/src/cache.mjs +0 -0
- package/dist/src/cache.mjs.map +0 -0
- package/dist/src/canvas/Canvas.d.ts +0 -0
- package/dist/src/canvas/Canvas.d.ts.map +0 -0
- package/dist/src/canvas/Canvas.min.mjs +0 -0
- package/dist/src/canvas/Canvas.min.mjs.map +0 -0
- package/dist/src/canvas/Canvas.mjs +0 -0
- package/dist/src/canvas/Canvas.mjs.map +0 -0
- package/dist/src/canvas/CanvasOptions.d.ts +0 -0
- package/dist/src/canvas/CanvasOptions.d.ts.map +0 -0
- package/dist/src/canvas/CanvasOptions.min.mjs +0 -0
- package/dist/src/canvas/CanvasOptions.min.mjs.map +0 -0
- package/dist/src/canvas/CanvasOptions.mjs +0 -0
- package/dist/src/canvas/CanvasOptions.mjs.map +0 -0
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.d.ts +0 -0
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.d.ts.map +0 -0
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.min.mjs +0 -0
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.min.mjs.map +0 -0
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.mjs +0 -0
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.mjs.map +0 -0
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +0 -0
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts.map +0 -0
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.min.mjs +0 -0
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.min.mjs.map +0 -0
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.mjs +0 -0
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.mjs.map +0 -0
- package/dist/src/canvas/DOMManagers/util.d.ts +0 -0
- package/dist/src/canvas/DOMManagers/util.d.ts.map +0 -0
- package/dist/src/canvas/DOMManagers/util.min.mjs +0 -0
- package/dist/src/canvas/DOMManagers/util.min.mjs.map +0 -0
- package/dist/src/canvas/DOMManagers/util.mjs +0 -0
- package/dist/src/canvas/DOMManagers/util.mjs.map +0 -0
- package/dist/src/canvas/SelectableCanvas.d.ts +0 -0
- package/dist/src/canvas/SelectableCanvas.d.ts.map +0 -0
- package/dist/src/canvas/SelectableCanvas.min.mjs +0 -0
- package/dist/src/canvas/SelectableCanvas.min.mjs.map +0 -0
- package/dist/src/canvas/SelectableCanvas.mjs +0 -0
- package/dist/src/canvas/SelectableCanvas.mjs.map +0 -0
- package/dist/src/canvas/StaticCanvas.d.ts +0 -0
- package/dist/src/canvas/StaticCanvas.d.ts.map +0 -0
- package/dist/src/canvas/StaticCanvas.min.mjs +0 -0
- package/dist/src/canvas/StaticCanvas.min.mjs.map +0 -0
- package/dist/src/canvas/StaticCanvas.mjs +0 -0
- package/dist/src/canvas/StaticCanvas.mjs.map +0 -0
- package/dist/src/canvas/StaticCanvasOptions.d.ts +0 -0
- package/dist/src/canvas/StaticCanvasOptions.d.ts.map +0 -0
- package/dist/src/canvas/StaticCanvasOptions.min.mjs +0 -0
- package/dist/src/canvas/StaticCanvasOptions.min.mjs.map +0 -0
- package/dist/src/canvas/StaticCanvasOptions.mjs +0 -0
- package/dist/src/canvas/StaticCanvasOptions.mjs.map +0 -0
- package/dist/src/canvas/TextEditingManager.d.ts +0 -0
- package/dist/src/canvas/TextEditingManager.d.ts.map +0 -0
- package/dist/src/canvas/TextEditingManager.min.mjs +0 -0
- package/dist/src/canvas/TextEditingManager.min.mjs.map +0 -0
- package/dist/src/canvas/TextEditingManager.mjs +0 -0
- package/dist/src/canvas/TextEditingManager.mjs.map +0 -0
- package/dist/src/canvas/canvas_gestures.mixin.d.ts +0 -0
- package/dist/src/canvas/canvas_gestures.mixin.d.ts.map +0 -0
- package/dist/src/color/Color.d.ts +0 -0
- package/dist/src/color/Color.d.ts.map +0 -0
- package/dist/src/color/Color.min.mjs +0 -0
- package/dist/src/color/Color.min.mjs.map +0 -0
- package/dist/src/color/Color.mjs +0 -0
- package/dist/src/color/Color.mjs.map +0 -0
- package/dist/src/color/color_map.d.ts +0 -0
- package/dist/src/color/color_map.d.ts.map +0 -0
- package/dist/src/color/color_map.min.mjs +0 -0
- package/dist/src/color/color_map.min.mjs.map +0 -0
- package/dist/src/color/color_map.mjs +0 -0
- package/dist/src/color/color_map.mjs.map +0 -0
- package/dist/src/color/constants.d.ts +0 -0
- package/dist/src/color/constants.d.ts.map +0 -0
- package/dist/src/color/constants.min.mjs +0 -0
- package/dist/src/color/constants.min.mjs.map +0 -0
- package/dist/src/color/constants.mjs +0 -0
- package/dist/src/color/constants.mjs.map +0 -0
- package/dist/src/color/typedefs.d.ts +0 -0
- package/dist/src/color/typedefs.d.ts.map +0 -0
- package/dist/src/color/util.d.ts +0 -0
- package/dist/src/color/util.d.ts.map +0 -0
- package/dist/src/color/util.min.mjs +0 -0
- package/dist/src/color/util.min.mjs.map +0 -0
- package/dist/src/color/util.mjs +0 -0
- package/dist/src/color/util.mjs.map +0 -0
- package/dist/src/config.d.ts +0 -0
- package/dist/src/config.d.ts.map +0 -0
- package/dist/src/config.min.mjs +0 -0
- package/dist/src/config.min.mjs.map +0 -0
- package/dist/src/config.mjs +0 -0
- package/dist/src/config.mjs.map +0 -0
- package/dist/src/constants.d.ts +0 -0
- package/dist/src/constants.d.ts.map +0 -0
- package/dist/src/constants.min.mjs +0 -0
- package/dist/src/constants.min.mjs.map +0 -0
- package/dist/src/constants.mjs +0 -0
- package/dist/src/constants.mjs.map +0 -0
- package/dist/src/controls/Control.d.ts +0 -0
- package/dist/src/controls/Control.d.ts.map +0 -0
- package/dist/src/controls/Control.min.mjs +0 -0
- package/dist/src/controls/Control.min.mjs.map +0 -0
- package/dist/src/controls/Control.mjs +0 -0
- package/dist/src/controls/Control.mjs.map +0 -0
- package/dist/src/controls/changeHeight.d.ts +0 -0
- package/dist/src/controls/changeHeight.d.ts.map +0 -0
- package/dist/src/controls/changeHeight.min.mjs +2 -0
- package/dist/src/controls/changeHeight.min.mjs.map +1 -0
- package/dist/src/controls/changeHeight.mjs +36 -0
- package/dist/src/controls/changeHeight.mjs.map +1 -0
- package/dist/src/controls/changeWidth.d.ts +0 -0
- package/dist/src/controls/changeWidth.d.ts.map +0 -0
- package/dist/src/controls/changeWidth.min.mjs +0 -0
- package/dist/src/controls/changeWidth.min.mjs.map +0 -0
- package/dist/src/controls/changeWidth.mjs +0 -0
- package/dist/src/controls/changeWidth.mjs.map +0 -0
- package/dist/src/controls/commonControls.d.ts +0 -0
- package/dist/src/controls/commonControls.d.ts.map +0 -0
- package/dist/src/controls/commonControls.min.mjs +0 -0
- package/dist/src/controls/commonControls.min.mjs.map +0 -0
- package/dist/src/controls/commonControls.mjs +0 -0
- package/dist/src/controls/commonControls.mjs.map +0 -0
- package/dist/src/controls/controlRendering.d.ts +0 -0
- package/dist/src/controls/controlRendering.d.ts.map +0 -0
- package/dist/src/controls/controlRendering.min.mjs +0 -0
- package/dist/src/controls/controlRendering.min.mjs.map +0 -0
- package/dist/src/controls/controlRendering.mjs +0 -0
- package/dist/src/controls/controlRendering.mjs.map +0 -0
- package/dist/src/controls/drag.d.ts +0 -0
- package/dist/src/controls/drag.d.ts.map +0 -0
- package/dist/src/controls/drag.min.mjs +0 -0
- package/dist/src/controls/drag.min.mjs.map +0 -0
- package/dist/src/controls/drag.mjs +0 -0
- package/dist/src/controls/drag.mjs.map +0 -0
- package/dist/src/controls/fireEvent.d.ts +0 -0
- package/dist/src/controls/fireEvent.d.ts.map +0 -0
- package/dist/src/controls/fireEvent.min.mjs +0 -0
- package/dist/src/controls/fireEvent.min.mjs.map +0 -0
- package/dist/src/controls/fireEvent.mjs +0 -0
- package/dist/src/controls/fireEvent.mjs.map +0 -0
- package/dist/src/controls/index.d.ts +0 -0
- package/dist/src/controls/index.d.ts.map +0 -0
- package/dist/src/controls/index.min.mjs +0 -0
- package/dist/src/controls/index.min.mjs.map +0 -0
- package/dist/src/controls/index.mjs +0 -0
- package/dist/src/controls/index.mjs.map +0 -0
- package/dist/src/controls/pathControl.d.ts +0 -0
- package/dist/src/controls/pathControl.d.ts.map +0 -0
- package/dist/src/controls/pathControl.min.mjs +0 -0
- package/dist/src/controls/pathControl.min.mjs.map +0 -0
- package/dist/src/controls/pathControl.mjs +0 -0
- package/dist/src/controls/pathControl.mjs.map +0 -0
- package/dist/src/controls/polyControl.d.ts +0 -0
- package/dist/src/controls/polyControl.d.ts.map +0 -0
- package/dist/src/controls/polyControl.min.mjs +0 -0
- package/dist/src/controls/polyControl.min.mjs.map +0 -0
- package/dist/src/controls/polyControl.mjs +0 -0
- package/dist/src/controls/polyControl.mjs.map +0 -0
- package/dist/src/controls/rotate.d.ts +0 -0
- package/dist/src/controls/rotate.d.ts.map +0 -0
- package/dist/src/controls/rotate.min.mjs +0 -0
- package/dist/src/controls/rotate.min.mjs.map +0 -0
- package/dist/src/controls/rotate.mjs +0 -0
- package/dist/src/controls/rotate.mjs.map +0 -0
- package/dist/src/controls/scale.d.ts +0 -0
- package/dist/src/controls/scale.d.ts.map +0 -0
- package/dist/src/controls/scale.min.mjs +0 -0
- package/dist/src/controls/scale.min.mjs.map +0 -0
- package/dist/src/controls/scale.mjs +0 -0
- package/dist/src/controls/scale.mjs.map +0 -0
- package/dist/src/controls/scaleSkew.d.ts +0 -0
- package/dist/src/controls/scaleSkew.d.ts.map +0 -0
- package/dist/src/controls/scaleSkew.min.mjs +0 -0
- package/dist/src/controls/scaleSkew.min.mjs.map +0 -0
- package/dist/src/controls/scaleSkew.mjs +0 -0
- package/dist/src/controls/scaleSkew.mjs.map +0 -0
- package/dist/src/controls/skew.d.ts +0 -0
- package/dist/src/controls/skew.d.ts.map +0 -0
- package/dist/src/controls/skew.min.mjs +0 -0
- package/dist/src/controls/skew.min.mjs.map +0 -0
- package/dist/src/controls/skew.mjs +0 -0
- package/dist/src/controls/skew.mjs.map +0 -0
- package/dist/src/controls/util.d.ts +0 -0
- package/dist/src/controls/util.d.ts.map +0 -0
- package/dist/src/controls/util.min.mjs +0 -0
- package/dist/src/controls/util.min.mjs.map +0 -0
- package/dist/src/controls/util.mjs +0 -0
- package/dist/src/controls/util.mjs.map +0 -0
- package/dist/src/controls/wrapWithFireEvent.d.ts +0 -0
- package/dist/src/controls/wrapWithFireEvent.d.ts.map +0 -0
- package/dist/src/controls/wrapWithFireEvent.min.mjs +0 -0
- package/dist/src/controls/wrapWithFireEvent.min.mjs.map +0 -0
- package/dist/src/controls/wrapWithFireEvent.mjs +0 -0
- package/dist/src/controls/wrapWithFireEvent.mjs.map +0 -0
- package/dist/src/controls/wrapWithFixedAnchor.d.ts +0 -0
- package/dist/src/controls/wrapWithFixedAnchor.d.ts.map +0 -0
- package/dist/src/controls/wrapWithFixedAnchor.min.mjs +0 -0
- package/dist/src/controls/wrapWithFixedAnchor.min.mjs.map +0 -0
- package/dist/src/controls/wrapWithFixedAnchor.mjs +0 -0
- package/dist/src/controls/wrapWithFixedAnchor.mjs.map +0 -0
- package/dist/src/env/browser.d.ts +0 -0
- package/dist/src/env/browser.d.ts.map +0 -0
- package/dist/src/env/browser.min.mjs +0 -0
- package/dist/src/env/browser.min.mjs.map +0 -0
- package/dist/src/env/browser.mjs +0 -0
- package/dist/src/env/browser.mjs.map +0 -0
- package/dist/src/env/index.d.ts +0 -0
- package/dist/src/env/index.d.ts.map +0 -0
- package/dist/src/env/index.min.mjs +0 -0
- package/dist/src/env/index.min.mjs.map +0 -0
- package/dist/src/env/index.mjs +0 -0
- package/dist/src/env/index.mjs.map +0 -0
- package/dist/src/env/node.d.ts +0 -0
- package/dist/src/env/node.d.ts.map +0 -0
- package/dist/src/env/types.d.ts +0 -0
- package/dist/src/env/types.d.ts.map +0 -0
- package/dist/src/filters/BaseFilter.d.ts +0 -0
- package/dist/src/filters/BaseFilter.d.ts.map +0 -0
- package/dist/src/filters/BaseFilter.min.mjs +0 -0
- package/dist/src/filters/BaseFilter.min.mjs.map +0 -0
- package/dist/src/filters/BaseFilter.mjs +0 -0
- package/dist/src/filters/BaseFilter.mjs.map +0 -0
- package/dist/src/filters/BlendColor.d.ts +0 -0
- package/dist/src/filters/BlendColor.d.ts.map +0 -0
- package/dist/src/filters/BlendColor.min.mjs +0 -0
- package/dist/src/filters/BlendColor.min.mjs.map +0 -0
- package/dist/src/filters/BlendColor.mjs +0 -0
- package/dist/src/filters/BlendColor.mjs.map +0 -0
- package/dist/src/filters/BlendImage.d.ts +0 -0
- package/dist/src/filters/BlendImage.d.ts.map +0 -0
- package/dist/src/filters/BlendImage.min.mjs +0 -0
- package/dist/src/filters/BlendImage.min.mjs.map +0 -0
- package/dist/src/filters/BlendImage.mjs +0 -0
- package/dist/src/filters/BlendImage.mjs.map +0 -0
- package/dist/src/filters/Blur.d.ts +0 -0
- package/dist/src/filters/Blur.d.ts.map +0 -0
- package/dist/src/filters/Blur.min.mjs +0 -0
- package/dist/src/filters/Blur.min.mjs.map +0 -0
- package/dist/src/filters/Blur.mjs +0 -0
- package/dist/src/filters/Blur.mjs.map +0 -0
- package/dist/src/filters/Boilerplate.d.ts +0 -0
- package/dist/src/filters/Boilerplate.d.ts.map +0 -0
- package/dist/src/filters/Brightness.d.ts +0 -0
- package/dist/src/filters/Brightness.d.ts.map +0 -0
- package/dist/src/filters/Brightness.min.mjs +0 -0
- package/dist/src/filters/Brightness.min.mjs.map +0 -0
- package/dist/src/filters/Brightness.mjs +0 -0
- package/dist/src/filters/Brightness.mjs.map +0 -0
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +0 -0
- package/dist/src/filters/Canvas2dFilterBackend.d.ts.map +0 -0
- package/dist/src/filters/Canvas2dFilterBackend.min.mjs +0 -0
- package/dist/src/filters/Canvas2dFilterBackend.min.mjs.map +0 -0
- package/dist/src/filters/Canvas2dFilterBackend.mjs +0 -0
- package/dist/src/filters/Canvas2dFilterBackend.mjs.map +0 -0
- package/dist/src/filters/ColorMatrix.d.ts +0 -0
- package/dist/src/filters/ColorMatrix.d.ts.map +0 -0
- package/dist/src/filters/ColorMatrix.min.mjs +0 -0
- package/dist/src/filters/ColorMatrix.min.mjs.map +0 -0
- package/dist/src/filters/ColorMatrix.mjs +0 -0
- package/dist/src/filters/ColorMatrix.mjs.map +0 -0
- package/dist/src/filters/ColorMatrixFilters.d.ts +0 -0
- package/dist/src/filters/ColorMatrixFilters.d.ts.map +0 -0
- package/dist/src/filters/ColorMatrixFilters.min.mjs +0 -0
- package/dist/src/filters/ColorMatrixFilters.min.mjs.map +0 -0
- package/dist/src/filters/ColorMatrixFilters.mjs +0 -0
- package/dist/src/filters/ColorMatrixFilters.mjs.map +0 -0
- package/dist/src/filters/Composed.d.ts +0 -0
- package/dist/src/filters/Composed.d.ts.map +0 -0
- package/dist/src/filters/Composed.min.mjs +0 -0
- package/dist/src/filters/Composed.min.mjs.map +0 -0
- package/dist/src/filters/Composed.mjs +0 -0
- package/dist/src/filters/Composed.mjs.map +0 -0
- package/dist/src/filters/Contrast.d.ts +0 -0
- package/dist/src/filters/Contrast.d.ts.map +0 -0
- package/dist/src/filters/Contrast.min.mjs +0 -0
- package/dist/src/filters/Contrast.min.mjs.map +0 -0
- package/dist/src/filters/Contrast.mjs +0 -0
- package/dist/src/filters/Contrast.mjs.map +0 -0
- package/dist/src/filters/Convolute.d.ts +0 -0
- package/dist/src/filters/Convolute.d.ts.map +0 -0
- package/dist/src/filters/Convolute.min.mjs +0 -0
- package/dist/src/filters/Convolute.min.mjs.map +0 -0
- package/dist/src/filters/Convolute.mjs +0 -0
- package/dist/src/filters/Convolute.mjs.map +0 -0
- package/dist/src/filters/FilterBackend.d.ts +0 -0
- package/dist/src/filters/FilterBackend.d.ts.map +0 -0
- package/dist/src/filters/FilterBackend.min.mjs +0 -0
- package/dist/src/filters/FilterBackend.min.mjs.map +0 -0
- package/dist/src/filters/FilterBackend.mjs +0 -0
- package/dist/src/filters/FilterBackend.mjs.map +0 -0
- package/dist/src/filters/GLProbes/GLProbe.d.ts +0 -0
- package/dist/src/filters/GLProbes/GLProbe.d.ts.map +0 -0
- package/dist/src/filters/GLProbes/GLProbe.min.mjs +0 -0
- package/dist/src/filters/GLProbes/GLProbe.min.mjs.map +0 -0
- package/dist/src/filters/GLProbes/GLProbe.mjs +0 -0
- package/dist/src/filters/GLProbes/GLProbe.mjs.map +0 -0
- package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +0 -0
- package/dist/src/filters/GLProbes/NodeGLProbe.d.ts.map +0 -0
- package/dist/src/filters/GLProbes/WebGLProbe.d.ts +0 -0
- package/dist/src/filters/GLProbes/WebGLProbe.d.ts.map +0 -0
- package/dist/src/filters/GLProbes/WebGLProbe.min.mjs +0 -0
- package/dist/src/filters/GLProbes/WebGLProbe.min.mjs.map +0 -0
- package/dist/src/filters/GLProbes/WebGLProbe.mjs +0 -0
- package/dist/src/filters/GLProbes/WebGLProbe.mjs.map +0 -0
- package/dist/src/filters/Gamma.d.ts +0 -0
- package/dist/src/filters/Gamma.d.ts.map +0 -0
- package/dist/src/filters/Gamma.min.mjs +0 -0
- package/dist/src/filters/Gamma.min.mjs.map +0 -0
- package/dist/src/filters/Gamma.mjs +0 -0
- package/dist/src/filters/Gamma.mjs.map +0 -0
- package/dist/src/filters/Grayscale.d.ts +0 -0
- package/dist/src/filters/Grayscale.d.ts.map +0 -0
- package/dist/src/filters/Grayscale.min.mjs +0 -0
- package/dist/src/filters/Grayscale.min.mjs.map +0 -0
- package/dist/src/filters/Grayscale.mjs +0 -0
- package/dist/src/filters/Grayscale.mjs.map +0 -0
- package/dist/src/filters/HueRotation.d.ts +0 -0
- package/dist/src/filters/HueRotation.d.ts.map +0 -0
- package/dist/src/filters/HueRotation.min.mjs +0 -0
- package/dist/src/filters/HueRotation.min.mjs.map +0 -0
- package/dist/src/filters/HueRotation.mjs +0 -0
- package/dist/src/filters/HueRotation.mjs.map +0 -0
- package/dist/src/filters/Invert.d.ts +0 -0
- package/dist/src/filters/Invert.d.ts.map +0 -0
- package/dist/src/filters/Invert.min.mjs +0 -0
- package/dist/src/filters/Invert.min.mjs.map +0 -0
- package/dist/src/filters/Invert.mjs +0 -0
- package/dist/src/filters/Invert.mjs.map +0 -0
- package/dist/src/filters/Noise.d.ts +0 -0
- package/dist/src/filters/Noise.d.ts.map +0 -0
- package/dist/src/filters/Noise.min.mjs +0 -0
- package/dist/src/filters/Noise.min.mjs.map +0 -0
- package/dist/src/filters/Noise.mjs +0 -0
- package/dist/src/filters/Noise.mjs.map +0 -0
- package/dist/src/filters/Pixelate.d.ts +0 -0
- package/dist/src/filters/Pixelate.d.ts.map +0 -0
- package/dist/src/filters/Pixelate.min.mjs +0 -0
- package/dist/src/filters/Pixelate.min.mjs.map +0 -0
- package/dist/src/filters/Pixelate.mjs +0 -0
- package/dist/src/filters/Pixelate.mjs.map +0 -0
- package/dist/src/filters/RemoveColor.d.ts +0 -0
- package/dist/src/filters/RemoveColor.d.ts.map +0 -0
- package/dist/src/filters/RemoveColor.min.mjs +0 -0
- package/dist/src/filters/RemoveColor.min.mjs.map +0 -0
- package/dist/src/filters/RemoveColor.mjs +0 -0
- package/dist/src/filters/RemoveColor.mjs.map +0 -0
- package/dist/src/filters/Resize.d.ts +0 -0
- package/dist/src/filters/Resize.d.ts.map +0 -0
- package/dist/src/filters/Resize.min.mjs +0 -0
- package/dist/src/filters/Resize.min.mjs.map +0 -0
- package/dist/src/filters/Resize.mjs +0 -0
- package/dist/src/filters/Resize.mjs.map +0 -0
- package/dist/src/filters/Saturation.d.ts +0 -0
- package/dist/src/filters/Saturation.d.ts.map +0 -0
- package/dist/src/filters/Saturation.min.mjs +0 -0
- package/dist/src/filters/Saturation.min.mjs.map +0 -0
- package/dist/src/filters/Saturation.mjs +0 -0
- package/dist/src/filters/Saturation.mjs.map +0 -0
- package/dist/src/filters/Vibrance.d.ts +0 -0
- package/dist/src/filters/Vibrance.d.ts.map +0 -0
- package/dist/src/filters/Vibrance.min.mjs +0 -0
- package/dist/src/filters/Vibrance.min.mjs.map +0 -0
- package/dist/src/filters/Vibrance.mjs +0 -0
- package/dist/src/filters/Vibrance.mjs.map +0 -0
- package/dist/src/filters/WebGLFilterBackend.d.ts +0 -0
- package/dist/src/filters/WebGLFilterBackend.d.ts.map +0 -0
- package/dist/src/filters/WebGLFilterBackend.min.mjs +0 -0
- package/dist/src/filters/WebGLFilterBackend.min.mjs.map +0 -0
- package/dist/src/filters/WebGLFilterBackend.mjs +0 -0
- package/dist/src/filters/WebGLFilterBackend.mjs.map +0 -0
- package/dist/src/filters/filters.d.ts +0 -0
- package/dist/src/filters/filters.d.ts.map +0 -0
- package/dist/src/filters/filters.min.mjs +0 -0
- package/dist/src/filters/filters.min.mjs.map +0 -0
- package/dist/src/filters/filters.mjs +0 -0
- package/dist/src/filters/filters.mjs.map +0 -0
- package/dist/src/filters/index.d.ts +0 -0
- package/dist/src/filters/index.d.ts.map +0 -0
- package/dist/src/filters/shaders/baseFilter.d.ts +0 -0
- package/dist/src/filters/shaders/baseFilter.d.ts.map +0 -0
- package/dist/src/filters/shaders/baseFilter.min.mjs +0 -0
- package/dist/src/filters/shaders/baseFilter.min.mjs.map +0 -0
- package/dist/src/filters/shaders/baseFilter.mjs +0 -0
- package/dist/src/filters/shaders/baseFilter.mjs.map +0 -0
- package/dist/src/filters/shaders/blendColor.d.ts +0 -0
- package/dist/src/filters/shaders/blendColor.d.ts.map +0 -0
- package/dist/src/filters/shaders/blendColor.min.mjs +0 -0
- package/dist/src/filters/shaders/blendColor.min.mjs.map +0 -0
- package/dist/src/filters/shaders/blendColor.mjs +0 -0
- package/dist/src/filters/shaders/blendColor.mjs.map +0 -0
- package/dist/src/filters/shaders/blendImage.d.ts +0 -0
- package/dist/src/filters/shaders/blendImage.d.ts.map +0 -0
- package/dist/src/filters/shaders/blendImage.min.mjs +0 -0
- package/dist/src/filters/shaders/blendImage.min.mjs.map +0 -0
- package/dist/src/filters/shaders/blendImage.mjs +0 -0
- package/dist/src/filters/shaders/blendImage.mjs.map +0 -0
- package/dist/src/filters/shaders/blur.d.ts +0 -0
- package/dist/src/filters/shaders/blur.d.ts.map +0 -0
- package/dist/src/filters/shaders/blur.min.mjs +0 -0
- package/dist/src/filters/shaders/blur.min.mjs.map +0 -0
- package/dist/src/filters/shaders/blur.mjs +0 -0
- package/dist/src/filters/shaders/blur.mjs.map +0 -0
- package/dist/src/filters/shaders/brightness.d.ts +0 -0
- package/dist/src/filters/shaders/brightness.d.ts.map +0 -0
- package/dist/src/filters/shaders/brightness.min.mjs +0 -0
- package/dist/src/filters/shaders/brightness.min.mjs.map +0 -0
- package/dist/src/filters/shaders/brightness.mjs +0 -0
- package/dist/src/filters/shaders/brightness.mjs.map +0 -0
- package/dist/src/filters/shaders/colorMatrix.d.ts +0 -0
- package/dist/src/filters/shaders/colorMatrix.d.ts.map +0 -0
- package/dist/src/filters/shaders/colorMatrix.min.mjs +0 -0
- package/dist/src/filters/shaders/colorMatrix.min.mjs.map +0 -0
- package/dist/src/filters/shaders/colorMatrix.mjs +0 -0
- package/dist/src/filters/shaders/colorMatrix.mjs.map +0 -0
- package/dist/src/filters/shaders/constrast.d.ts +0 -0
- package/dist/src/filters/shaders/constrast.d.ts.map +0 -0
- package/dist/src/filters/shaders/constrast.min.mjs +0 -0
- package/dist/src/filters/shaders/constrast.min.mjs.map +0 -0
- package/dist/src/filters/shaders/constrast.mjs +0 -0
- package/dist/src/filters/shaders/constrast.mjs.map +0 -0
- package/dist/src/filters/shaders/convolute.d.ts +0 -0
- package/dist/src/filters/shaders/convolute.d.ts.map +0 -0
- package/dist/src/filters/shaders/convolute.min.mjs +0 -0
- package/dist/src/filters/shaders/convolute.min.mjs.map +0 -0
- package/dist/src/filters/shaders/convolute.mjs +0 -0
- package/dist/src/filters/shaders/convolute.mjs.map +0 -0
- package/dist/src/filters/shaders/gamma.d.ts +0 -0
- package/dist/src/filters/shaders/gamma.d.ts.map +0 -0
- package/dist/src/filters/shaders/gamma.min.mjs +0 -0
- package/dist/src/filters/shaders/gamma.min.mjs.map +0 -0
- package/dist/src/filters/shaders/gamma.mjs +0 -0
- package/dist/src/filters/shaders/gamma.mjs.map +0 -0
- package/dist/src/filters/shaders/grayscale.d.ts +0 -0
- package/dist/src/filters/shaders/grayscale.d.ts.map +0 -0
- package/dist/src/filters/shaders/grayscale.min.mjs +0 -0
- package/dist/src/filters/shaders/grayscale.min.mjs.map +0 -0
- package/dist/src/filters/shaders/grayscale.mjs +0 -0
- package/dist/src/filters/shaders/grayscale.mjs.map +0 -0
- package/dist/src/filters/shaders/invert.d.ts +0 -0
- package/dist/src/filters/shaders/invert.d.ts.map +0 -0
- package/dist/src/filters/shaders/invert.min.mjs +0 -0
- package/dist/src/filters/shaders/invert.min.mjs.map +0 -0
- package/dist/src/filters/shaders/invert.mjs +0 -0
- package/dist/src/filters/shaders/invert.mjs.map +0 -0
- package/dist/src/filters/shaders/noise.d.ts +0 -0
- package/dist/src/filters/shaders/noise.d.ts.map +0 -0
- package/dist/src/filters/shaders/noise.min.mjs +0 -0
- package/dist/src/filters/shaders/noise.min.mjs.map +0 -0
- package/dist/src/filters/shaders/noise.mjs +0 -0
- package/dist/src/filters/shaders/noise.mjs.map +0 -0
- package/dist/src/filters/shaders/pixelate.d.ts +0 -0
- package/dist/src/filters/shaders/pixelate.d.ts.map +0 -0
- package/dist/src/filters/shaders/pixelate.min.mjs +0 -0
- package/dist/src/filters/shaders/pixelate.min.mjs.map +0 -0
- package/dist/src/filters/shaders/pixelate.mjs +0 -0
- package/dist/src/filters/shaders/pixelate.mjs.map +0 -0
- package/dist/src/filters/shaders/removeColor.d.ts +0 -0
- package/dist/src/filters/shaders/removeColor.d.ts.map +0 -0
- package/dist/src/filters/shaders/removeColor.min.mjs +0 -0
- package/dist/src/filters/shaders/removeColor.min.mjs.map +0 -0
- package/dist/src/filters/shaders/removeColor.mjs +0 -0
- package/dist/src/filters/shaders/removeColor.mjs.map +0 -0
- package/dist/src/filters/shaders/saturation.d.ts +0 -0
- package/dist/src/filters/shaders/saturation.d.ts.map +0 -0
- package/dist/src/filters/shaders/saturation.min.mjs +0 -0
- package/dist/src/filters/shaders/saturation.min.mjs.map +0 -0
- package/dist/src/filters/shaders/saturation.mjs +0 -0
- package/dist/src/filters/shaders/saturation.mjs.map +0 -0
- package/dist/src/filters/shaders/vibrance.d.ts +0 -0
- package/dist/src/filters/shaders/vibrance.d.ts.map +0 -0
- package/dist/src/filters/shaders/vibrance.min.mjs +0 -0
- package/dist/src/filters/shaders/vibrance.min.mjs.map +0 -0
- package/dist/src/filters/shaders/vibrance.mjs +0 -0
- package/dist/src/filters/shaders/vibrance.mjs.map +0 -0
- package/dist/src/filters/typedefs.d.ts +0 -0
- package/dist/src/filters/typedefs.d.ts.map +0 -0
- package/dist/src/filters/utils.d.ts +0 -0
- package/dist/src/filters/utils.d.ts.map +0 -0
- package/dist/src/filters/utils.min.mjs +0 -0
- package/dist/src/filters/utils.min.mjs.map +0 -0
- package/dist/src/filters/utils.mjs +0 -0
- package/dist/src/filters/utils.mjs.map +0 -0
- package/dist/src/gradient/Gradient.d.ts +0 -0
- package/dist/src/gradient/Gradient.d.ts.map +0 -0
- package/dist/src/gradient/Gradient.min.mjs +0 -0
- package/dist/src/gradient/Gradient.min.mjs.map +0 -0
- package/dist/src/gradient/Gradient.mjs +0 -0
- package/dist/src/gradient/Gradient.mjs.map +0 -0
- package/dist/src/gradient/constants.d.ts +0 -0
- package/dist/src/gradient/constants.d.ts.map +0 -0
- package/dist/src/gradient/constants.min.mjs +0 -0
- package/dist/src/gradient/constants.min.mjs.map +0 -0
- package/dist/src/gradient/constants.mjs +0 -0
- package/dist/src/gradient/constants.mjs.map +0 -0
- package/dist/src/gradient/index.d.ts +0 -0
- package/dist/src/gradient/index.d.ts.map +0 -0
- package/dist/src/gradient/parser/misc.d.ts +0 -0
- package/dist/src/gradient/parser/misc.d.ts.map +0 -0
- package/dist/src/gradient/parser/misc.min.mjs +0 -0
- package/dist/src/gradient/parser/misc.min.mjs.map +0 -0
- package/dist/src/gradient/parser/misc.mjs +0 -0
- package/dist/src/gradient/parser/misc.mjs.map +0 -0
- package/dist/src/gradient/parser/parseColorStops.d.ts +0 -0
- package/dist/src/gradient/parser/parseColorStops.d.ts.map +0 -0
- package/dist/src/gradient/parser/parseColorStops.min.mjs +0 -0
- package/dist/src/gradient/parser/parseColorStops.min.mjs.map +0 -0
- package/dist/src/gradient/parser/parseColorStops.mjs +0 -0
- package/dist/src/gradient/parser/parseColorStops.mjs.map +0 -0
- package/dist/src/gradient/parser/parseCoords.d.ts +0 -0
- package/dist/src/gradient/parser/parseCoords.d.ts.map +0 -0
- package/dist/src/gradient/parser/parseCoords.min.mjs +0 -0
- package/dist/src/gradient/parser/parseCoords.min.mjs.map +0 -0
- package/dist/src/gradient/parser/parseCoords.mjs +0 -0
- package/dist/src/gradient/parser/parseCoords.mjs.map +0 -0
- package/dist/src/gradient/typedefs.d.ts +0 -0
- package/dist/src/gradient/typedefs.d.ts.map +0 -0
- package/dist/src/mixins/eraser_brush.mixin.d.ts +0 -0
- package/dist/src/mixins/eraser_brush.mixin.d.ts.map +0 -0
- package/dist/src/parkinglot/canvas_animation.mixin.d.ts +0 -0
- package/dist/src/parkinglot/canvas_animation.mixin.d.ts.map +0 -0
- package/dist/src/parkinglot/straighten.d.ts +0 -0
- package/dist/src/parkinglot/straighten.d.ts.map +0 -0
- package/dist/src/parser/applyViewboxTransform.d.ts +0 -0
- package/dist/src/parser/applyViewboxTransform.d.ts.map +0 -0
- package/dist/src/parser/applyViewboxTransform.min.mjs +0 -0
- package/dist/src/parser/applyViewboxTransform.min.mjs.map +0 -0
- package/dist/src/parser/applyViewboxTransform.mjs +0 -0
- package/dist/src/parser/applyViewboxTransform.mjs.map +0 -0
- package/dist/src/parser/attributes.d.ts +0 -0
- package/dist/src/parser/attributes.d.ts.map +0 -0
- package/dist/src/parser/attributes.min.mjs +0 -0
- package/dist/src/parser/attributes.min.mjs.map +0 -0
- package/dist/src/parser/attributes.mjs +0 -0
- package/dist/src/parser/attributes.mjs.map +0 -0
- package/dist/src/parser/constants.d.ts +0 -0
- package/dist/src/parser/constants.d.ts.map +0 -0
- package/dist/src/parser/constants.min.mjs +0 -0
- package/dist/src/parser/constants.min.mjs.map +0 -0
- package/dist/src/parser/constants.mjs +0 -0
- package/dist/src/parser/constants.mjs.map +0 -0
- package/dist/src/parser/doesSomeParentMatch.d.ts +0 -0
- package/dist/src/parser/doesSomeParentMatch.d.ts.map +0 -0
- package/dist/src/parser/doesSomeParentMatch.min.mjs +0 -0
- package/dist/src/parser/doesSomeParentMatch.min.mjs.map +0 -0
- package/dist/src/parser/doesSomeParentMatch.mjs +0 -0
- package/dist/src/parser/doesSomeParentMatch.mjs.map +0 -0
- package/dist/src/parser/elementMatchesRule.d.ts +0 -0
- package/dist/src/parser/elementMatchesRule.d.ts.map +0 -0
- package/dist/src/parser/elementMatchesRule.min.mjs +0 -0
- package/dist/src/parser/elementMatchesRule.min.mjs.map +0 -0
- package/dist/src/parser/elementMatchesRule.mjs +0 -0
- package/dist/src/parser/elementMatchesRule.mjs.map +0 -0
- package/dist/src/parser/elements_parser.d.ts +0 -0
- package/dist/src/parser/elements_parser.d.ts.map +0 -0
- package/dist/src/parser/elements_parser.min.mjs +0 -0
- package/dist/src/parser/elements_parser.min.mjs.map +0 -0
- package/dist/src/parser/elements_parser.mjs +0 -0
- package/dist/src/parser/elements_parser.mjs.map +0 -0
- package/dist/src/parser/getCSSRules.d.ts +0 -0
- package/dist/src/parser/getCSSRules.d.ts.map +0 -0
- package/dist/src/parser/getCSSRules.min.mjs +0 -0
- package/dist/src/parser/getCSSRules.min.mjs.map +0 -0
- package/dist/src/parser/getCSSRules.mjs +0 -0
- package/dist/src/parser/getCSSRules.mjs.map +0 -0
- package/dist/src/parser/getGlobalStylesForElement.d.ts +0 -0
- package/dist/src/parser/getGlobalStylesForElement.d.ts.map +0 -0
- package/dist/src/parser/getGlobalStylesForElement.min.mjs +0 -0
- package/dist/src/parser/getGlobalStylesForElement.min.mjs.map +0 -0
- package/dist/src/parser/getGlobalStylesForElement.mjs +0 -0
- package/dist/src/parser/getGlobalStylesForElement.mjs.map +0 -0
- package/dist/src/parser/getGradientDefs.d.ts +0 -0
- package/dist/src/parser/getGradientDefs.d.ts.map +0 -0
- package/dist/src/parser/getGradientDefs.min.mjs +0 -0
- package/dist/src/parser/getGradientDefs.min.mjs.map +0 -0
- package/dist/src/parser/getGradientDefs.mjs +0 -0
- package/dist/src/parser/getGradientDefs.mjs.map +0 -0
- package/dist/src/parser/getMultipleNodes.d.ts +0 -0
- package/dist/src/parser/getMultipleNodes.d.ts.map +0 -0
- package/dist/src/parser/getMultipleNodes.min.mjs +0 -0
- package/dist/src/parser/getMultipleNodes.min.mjs.map +0 -0
- package/dist/src/parser/getMultipleNodes.mjs +0 -0
- package/dist/src/parser/getMultipleNodes.mjs.map +0 -0
- package/dist/src/parser/getSvgRegex.d.ts +0 -0
- package/dist/src/parser/getSvgRegex.d.ts.map +0 -0
- package/dist/src/parser/getSvgRegex.min.mjs +0 -0
- package/dist/src/parser/getSvgRegex.min.mjs.map +0 -0
- package/dist/src/parser/getSvgRegex.mjs +0 -0
- package/dist/src/parser/getSvgRegex.mjs.map +0 -0
- package/dist/src/parser/getTagName.d.ts +0 -0
- package/dist/src/parser/getTagName.d.ts.map +0 -0
- package/dist/src/parser/getTagName.min.mjs +0 -0
- package/dist/src/parser/getTagName.min.mjs.map +0 -0
- package/dist/src/parser/getTagName.mjs +0 -0
- package/dist/src/parser/getTagName.mjs.map +0 -0
- package/dist/src/parser/hasInvalidAncestor.d.ts +0 -0
- package/dist/src/parser/hasInvalidAncestor.d.ts.map +0 -0
- package/dist/src/parser/hasInvalidAncestor.min.mjs +0 -0
- package/dist/src/parser/hasInvalidAncestor.min.mjs.map +0 -0
- package/dist/src/parser/hasInvalidAncestor.mjs +0 -0
- package/dist/src/parser/hasInvalidAncestor.mjs.map +0 -0
- package/dist/src/parser/loadSVGFromString.d.ts +0 -0
- package/dist/src/parser/loadSVGFromString.d.ts.map +0 -0
- package/dist/src/parser/loadSVGFromString.min.mjs +0 -0
- package/dist/src/parser/loadSVGFromString.min.mjs.map +0 -0
- package/dist/src/parser/loadSVGFromString.mjs +0 -0
- package/dist/src/parser/loadSVGFromString.mjs.map +0 -0
- package/dist/src/parser/loadSVGFromURL.d.ts +0 -0
- package/dist/src/parser/loadSVGFromURL.d.ts.map +0 -0
- package/dist/src/parser/loadSVGFromURL.min.mjs +0 -0
- package/dist/src/parser/loadSVGFromURL.min.mjs.map +0 -0
- package/dist/src/parser/loadSVGFromURL.mjs +0 -0
- package/dist/src/parser/loadSVGFromURL.mjs.map +0 -0
- package/dist/src/parser/normalizeAttr.d.ts +0 -0
- package/dist/src/parser/normalizeAttr.d.ts.map +0 -0
- package/dist/src/parser/normalizeAttr.min.mjs +0 -0
- package/dist/src/parser/normalizeAttr.min.mjs.map +0 -0
- package/dist/src/parser/normalizeAttr.mjs +0 -0
- package/dist/src/parser/normalizeAttr.mjs.map +0 -0
- package/dist/src/parser/normalizeValue.d.ts +0 -0
- package/dist/src/parser/normalizeValue.d.ts.map +0 -0
- package/dist/src/parser/normalizeValue.min.mjs +0 -0
- package/dist/src/parser/normalizeValue.min.mjs.map +0 -0
- package/dist/src/parser/normalizeValue.mjs +0 -0
- package/dist/src/parser/normalizeValue.mjs.map +0 -0
- package/dist/src/parser/parseAttributes.d.ts +0 -0
- package/dist/src/parser/parseAttributes.d.ts.map +0 -0
- package/dist/src/parser/parseAttributes.min.mjs +0 -0
- package/dist/src/parser/parseAttributes.min.mjs.map +0 -0
- package/dist/src/parser/parseAttributes.mjs +0 -0
- package/dist/src/parser/parseAttributes.mjs.map +0 -0
- package/dist/src/parser/parseFontDeclaration.d.ts +0 -0
- package/dist/src/parser/parseFontDeclaration.d.ts.map +0 -0
- package/dist/src/parser/parseFontDeclaration.min.mjs +0 -0
- package/dist/src/parser/parseFontDeclaration.min.mjs.map +0 -0
- package/dist/src/parser/parseFontDeclaration.mjs +0 -0
- package/dist/src/parser/parseFontDeclaration.mjs.map +0 -0
- package/dist/src/parser/parsePointsAttribute.d.ts +0 -0
- package/dist/src/parser/parsePointsAttribute.d.ts.map +0 -0
- package/dist/src/parser/parsePointsAttribute.min.mjs +0 -0
- package/dist/src/parser/parsePointsAttribute.min.mjs.map +0 -0
- package/dist/src/parser/parsePointsAttribute.mjs +0 -0
- package/dist/src/parser/parsePointsAttribute.mjs.map +0 -0
- package/dist/src/parser/parseSVGDocument.d.ts +0 -0
- package/dist/src/parser/parseSVGDocument.d.ts.map +0 -0
- package/dist/src/parser/parseSVGDocument.min.mjs +0 -0
- package/dist/src/parser/parseSVGDocument.min.mjs.map +0 -0
- package/dist/src/parser/parseSVGDocument.mjs +0 -0
- package/dist/src/parser/parseSVGDocument.mjs.map +0 -0
- package/dist/src/parser/parseStyleAttribute.d.ts +0 -0
- package/dist/src/parser/parseStyleAttribute.d.ts.map +0 -0
- package/dist/src/parser/parseStyleAttribute.min.mjs +0 -0
- package/dist/src/parser/parseStyleAttribute.min.mjs.map +0 -0
- package/dist/src/parser/parseStyleAttribute.mjs +0 -0
- package/dist/src/parser/parseStyleAttribute.mjs.map +0 -0
- package/dist/src/parser/parseStyleObject.d.ts +0 -0
- package/dist/src/parser/parseStyleObject.d.ts.map +0 -0
- package/dist/src/parser/parseStyleObject.min.mjs +0 -0
- package/dist/src/parser/parseStyleObject.min.mjs.map +0 -0
- package/dist/src/parser/parseStyleObject.mjs +0 -0
- package/dist/src/parser/parseStyleObject.mjs.map +0 -0
- package/dist/src/parser/parseStyleString.d.ts +0 -0
- package/dist/src/parser/parseStyleString.d.ts.map +0 -0
- package/dist/src/parser/parseStyleString.min.mjs +0 -0
- package/dist/src/parser/parseStyleString.min.mjs.map +0 -0
- package/dist/src/parser/parseStyleString.mjs +0 -0
- package/dist/src/parser/parseStyleString.mjs.map +0 -0
- package/dist/src/parser/parseTransformAttribute.d.ts +0 -0
- package/dist/src/parser/parseTransformAttribute.d.ts.map +0 -0
- package/dist/src/parser/parseTransformAttribute.min.mjs +0 -0
- package/dist/src/parser/parseTransformAttribute.min.mjs.map +0 -0
- package/dist/src/parser/parseTransformAttribute.mjs +0 -0
- package/dist/src/parser/parseTransformAttribute.mjs.map +0 -0
- package/dist/src/parser/parseUseDirectives.d.ts +0 -0
- package/dist/src/parser/parseUseDirectives.d.ts.map +0 -0
- package/dist/src/parser/parseUseDirectives.min.mjs +0 -0
- package/dist/src/parser/parseUseDirectives.min.mjs.map +0 -0
- package/dist/src/parser/parseUseDirectives.mjs +0 -0
- package/dist/src/parser/parseUseDirectives.mjs.map +0 -0
- package/dist/src/parser/percent.d.ts +0 -0
- package/dist/src/parser/percent.d.ts.map +0 -0
- package/dist/src/parser/percent.min.mjs +0 -0
- package/dist/src/parser/percent.min.mjs.map +0 -0
- package/dist/src/parser/percent.mjs +0 -0
- package/dist/src/parser/percent.mjs.map +0 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +0 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.d.ts.map +0 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.min.mjs +0 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.min.mjs.map +0 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.mjs +0 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.mjs.map +0 -0
- package/dist/src/parser/selectorMatches.d.ts +0 -0
- package/dist/src/parser/selectorMatches.d.ts.map +0 -0
- package/dist/src/parser/selectorMatches.min.mjs +0 -0
- package/dist/src/parser/selectorMatches.min.mjs.map +0 -0
- package/dist/src/parser/selectorMatches.mjs +0 -0
- package/dist/src/parser/selectorMatches.mjs.map +0 -0
- package/dist/src/parser/setStrokeFillOpacity.d.ts +0 -0
- package/dist/src/parser/setStrokeFillOpacity.d.ts.map +0 -0
- package/dist/src/parser/setStrokeFillOpacity.min.mjs +0 -0
- package/dist/src/parser/setStrokeFillOpacity.min.mjs.map +0 -0
- package/dist/src/parser/setStrokeFillOpacity.mjs +0 -0
- package/dist/src/parser/setStrokeFillOpacity.mjs.map +0 -0
- package/dist/src/parser/typedefs.d.ts +0 -0
- package/dist/src/parser/typedefs.d.ts.map +0 -0
- package/dist/src/shapes/ActiveSelection.d.ts +0 -0
- package/dist/src/shapes/ActiveSelection.d.ts.map +0 -0
- package/dist/src/shapes/ActiveSelection.min.mjs +0 -0
- package/dist/src/shapes/ActiveSelection.min.mjs.map +0 -0
- package/dist/src/shapes/ActiveSelection.mjs +0 -0
- package/dist/src/shapes/ActiveSelection.mjs.map +0 -0
- package/dist/src/shapes/Circle.d.ts +0 -0
- package/dist/src/shapes/Circle.d.ts.map +0 -0
- package/dist/src/shapes/Circle.min.mjs +0 -0
- package/dist/src/shapes/Circle.min.mjs.map +0 -0
- package/dist/src/shapes/Circle.mjs +0 -0
- package/dist/src/shapes/Circle.mjs.map +0 -0
- package/dist/src/shapes/Ellipse.d.ts +0 -0
- package/dist/src/shapes/Ellipse.d.ts.map +0 -0
- package/dist/src/shapes/Ellipse.min.mjs +0 -0
- package/dist/src/shapes/Ellipse.min.mjs.map +0 -0
- package/dist/src/shapes/Ellipse.mjs +0 -0
- package/dist/src/shapes/Ellipse.mjs.map +0 -0
- package/dist/src/shapes/Group.d.ts +0 -0
- package/dist/src/shapes/Group.d.ts.map +0 -0
- package/dist/src/shapes/Group.min.mjs +0 -0
- package/dist/src/shapes/Group.min.mjs.map +0 -0
- package/dist/src/shapes/Group.mjs +0 -0
- package/dist/src/shapes/Group.mjs.map +0 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +0 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts.map +0 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs +0 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs.map +0 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.mjs +0 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.mjs.map +0 -0
- package/dist/src/shapes/IText/IText.d.ts +0 -0
- package/dist/src/shapes/IText/IText.d.ts.map +0 -0
- package/dist/src/shapes/IText/IText.min.mjs +0 -0
- package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
- package/dist/src/shapes/IText/IText.mjs +206 -206
- package/dist/src/shapes/IText/IText.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextBehavior.d.ts +0 -0
- package/dist/src/shapes/IText/ITextBehavior.d.ts.map +0 -0
- package/dist/src/shapes/IText/ITextBehavior.min.mjs +0 -0
- package/dist/src/shapes/IText/ITextBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextBehavior.mjs +152 -152
- package/dist/src/shapes/IText/ITextBehavior.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextClickBehavior.d.ts +0 -0
- package/dist/src/shapes/IText/ITextClickBehavior.d.ts.map +0 -0
- package/dist/src/shapes/IText/ITextClickBehavior.min.mjs +0 -0
- package/dist/src/shapes/IText/ITextClickBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextClickBehavior.mjs +36 -36
- package/dist/src/shapes/IText/ITextClickBehavior.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +0 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.d.ts.map +0 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.min.mjs +0 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.min.mjs.map +0 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.mjs +0 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.mjs.map +0 -0
- package/dist/src/shapes/IText/constants.d.ts +0 -0
- package/dist/src/shapes/IText/constants.d.ts.map +0 -0
- package/dist/src/shapes/IText/constants.min.mjs +0 -0
- package/dist/src/shapes/IText/constants.min.mjs.map +0 -0
- package/dist/src/shapes/IText/constants.mjs +0 -0
- package/dist/src/shapes/IText/constants.mjs.map +0 -0
- package/dist/src/shapes/Image.d.ts +0 -0
- package/dist/src/shapes/Image.d.ts.map +0 -0
- package/dist/src/shapes/Image.min.mjs +0 -0
- package/dist/src/shapes/Image.min.mjs.map +0 -0
- package/dist/src/shapes/Image.mjs +0 -0
- package/dist/src/shapes/Image.mjs.map +0 -0
- package/dist/src/shapes/Line.d.ts +0 -0
- package/dist/src/shapes/Line.d.ts.map +0 -0
- package/dist/src/shapes/Line.min.mjs +0 -0
- package/dist/src/shapes/Line.min.mjs.map +0 -0
- package/dist/src/shapes/Line.mjs +0 -0
- package/dist/src/shapes/Line.mjs.map +0 -0
- package/dist/src/shapes/Object/FabricObject.d.ts +0 -0
- package/dist/src/shapes/Object/FabricObject.d.ts.map +0 -0
- package/dist/src/shapes/Object/FabricObject.min.mjs +0 -0
- package/dist/src/shapes/Object/FabricObject.min.mjs.map +0 -0
- package/dist/src/shapes/Object/FabricObject.mjs +0 -0
- package/dist/src/shapes/Object/FabricObject.mjs.map +0 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +0 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +0 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs +0 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +0 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +0 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +0 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts +0 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts.map +0 -0
- package/dist/src/shapes/Object/InteractiveObject.min.mjs +0 -0
- package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +0 -0
- package/dist/src/shapes/Object/InteractiveObject.mjs +0 -0
- package/dist/src/shapes/Object/InteractiveObject.mjs.map +0 -0
- package/dist/src/shapes/Object/Object.d.ts +0 -0
- package/dist/src/shapes/Object/Object.d.ts.map +0 -0
- package/dist/src/shapes/Object/Object.min.mjs +0 -0
- package/dist/src/shapes/Object/Object.min.mjs.map +0 -0
- package/dist/src/shapes/Object/Object.mjs +0 -0
- package/dist/src/shapes/Object/Object.mjs.map +0 -0
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +0 -0
- package/dist/src/shapes/Object/ObjectGeometry.d.ts.map +0 -0
- package/dist/src/shapes/Object/ObjectGeometry.min.mjs +0 -0
- package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +0 -0
- package/dist/src/shapes/Object/ObjectGeometry.mjs +0 -0
- package/dist/src/shapes/Object/ObjectGeometry.mjs.map +0 -0
- package/dist/src/shapes/Object/defaultValues.d.ts +0 -0
- package/dist/src/shapes/Object/defaultValues.d.ts.map +0 -0
- package/dist/src/shapes/Object/defaultValues.min.mjs +0 -0
- package/dist/src/shapes/Object/defaultValues.min.mjs.map +0 -0
- package/dist/src/shapes/Object/defaultValues.mjs +0 -0
- package/dist/src/shapes/Object/defaultValues.mjs.map +0 -0
- package/dist/src/shapes/Object/types/BaseProps.d.ts +0 -0
- package/dist/src/shapes/Object/types/BaseProps.d.ts.map +0 -0
- package/dist/src/shapes/Object/types/BorderProps.d.ts +0 -0
- package/dist/src/shapes/Object/types/BorderProps.d.ts.map +0 -0
- package/dist/src/shapes/Object/types/ControlProps.d.ts +0 -0
- package/dist/src/shapes/Object/types/ControlProps.d.ts.map +0 -0
- package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +0 -0
- package/dist/src/shapes/Object/types/FabricObjectProps.d.ts.map +0 -0
- package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +0 -0
- package/dist/src/shapes/Object/types/FillStrokeProps.d.ts.map +0 -0
- package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +0 -0
- package/dist/src/shapes/Object/types/LockInteractionProps.d.ts.map +0 -0
- package/dist/src/shapes/Object/types/ObjectProps.d.ts +0 -0
- package/dist/src/shapes/Object/types/ObjectProps.d.ts.map +0 -0
- package/dist/src/shapes/Object/types/ObjectTransformProps.d.ts +0 -0
- package/dist/src/shapes/Object/types/ObjectTransformProps.d.ts.map +0 -0
- package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +0 -0
- package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts.map +0 -0
- package/dist/src/shapes/Object/types/index.d.ts +0 -0
- package/dist/src/shapes/Object/types/index.d.ts.map +0 -0
- package/dist/src/shapes/Path.d.ts +0 -0
- package/dist/src/shapes/Path.d.ts.map +0 -0
- package/dist/src/shapes/Path.min.mjs +0 -0
- package/dist/src/shapes/Path.min.mjs.map +0 -0
- package/dist/src/shapes/Path.mjs +0 -0
- package/dist/src/shapes/Path.mjs.map +0 -0
- package/dist/src/shapes/Polygon.d.ts +0 -0
- package/dist/src/shapes/Polygon.d.ts.map +0 -0
- package/dist/src/shapes/Polygon.min.mjs +0 -0
- package/dist/src/shapes/Polygon.min.mjs.map +0 -0
- package/dist/src/shapes/Polygon.mjs +0 -0
- package/dist/src/shapes/Polygon.mjs.map +0 -0
- package/dist/src/shapes/Polyline.d.ts +0 -0
- package/dist/src/shapes/Polyline.d.ts.map +0 -0
- package/dist/src/shapes/Polyline.min.mjs +0 -0
- package/dist/src/shapes/Polyline.min.mjs.map +0 -0
- package/dist/src/shapes/Polyline.mjs +0 -0
- package/dist/src/shapes/Polyline.mjs.map +0 -0
- package/dist/src/shapes/Rect.d.ts +0 -0
- package/dist/src/shapes/Rect.d.ts.map +0 -0
- package/dist/src/shapes/Rect.min.mjs +0 -0
- package/dist/src/shapes/Rect.min.mjs.map +0 -0
- package/dist/src/shapes/Rect.mjs +0 -0
- package/dist/src/shapes/Rect.mjs.map +0 -0
- package/dist/src/shapes/Text/StyledText.d.ts +0 -0
- package/dist/src/shapes/Text/StyledText.d.ts.map +0 -0
- package/dist/src/shapes/Text/StyledText.min.mjs +0 -0
- package/dist/src/shapes/Text/StyledText.min.mjs.map +0 -0
- package/dist/src/shapes/Text/StyledText.mjs +0 -0
- package/dist/src/shapes/Text/StyledText.mjs.map +0 -0
- package/dist/src/shapes/Text/Text.d.ts +0 -0
- package/dist/src/shapes/Text/Text.d.ts.map +1 -1
- package/dist/src/shapes/Text/Text.min.mjs +1 -1
- package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.mjs +347 -295
- package/dist/src/shapes/Text/Text.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +0 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +0 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs +0 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +0 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs +0 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +0 -0
- package/dist/src/shapes/Text/constants.d.ts +0 -0
- package/dist/src/shapes/Text/constants.d.ts.map +0 -0
- package/dist/src/shapes/Text/constants.min.mjs +0 -0
- package/dist/src/shapes/Text/constants.min.mjs.map +1 -1
- package/dist/src/shapes/Text/constants.mjs +0 -0
- package/dist/src/shapes/Text/constants.mjs.map +1 -1
- package/dist/src/shapes/Textbox.d.ts +13 -0
- package/dist/src/shapes/Textbox.d.ts.map +1 -1
- package/dist/src/shapes/Textbox.min.mjs +1 -1
- package/dist/src/shapes/Textbox.min.mjs.map +1 -1
- package/dist/src/shapes/Textbox.mjs +256 -138
- package/dist/src/shapes/Textbox.mjs.map +1 -1
- package/dist/src/shapes/Triangle.d.ts +0 -0
- package/dist/src/shapes/Triangle.d.ts.map +0 -0
- package/dist/src/shapes/Triangle.min.mjs +0 -0
- package/dist/src/shapes/Triangle.min.mjs.map +0 -0
- package/dist/src/shapes/Triangle.mjs +0 -0
- package/dist/src/shapes/Triangle.mjs.map +0 -0
- package/dist/src/text/browserLines.d.ts +0 -0
- package/dist/src/text/browserLines.d.ts.map +0 -0
- package/dist/src/text/browserLines.min.mjs +0 -0
- package/dist/src/text/browserLines.min.mjs.map +1 -1
- package/dist/src/text/browserLines.mjs +20 -20
- package/dist/src/text/browserLines.mjs.map +1 -1
- package/dist/src/text/ellipsis.d.ts +0 -0
- package/dist/src/text/ellipsis.d.ts.map +0 -0
- package/dist/src/text/ellipsis.min.mjs +0 -0
- package/dist/src/text/ellipsis.min.mjs.map +1 -1
- package/dist/src/text/ellipsis.mjs +11 -11
- package/dist/src/text/ellipsis.mjs.map +1 -1
- package/dist/src/text/hitTest.d.ts +0 -0
- package/dist/src/text/hitTest.d.ts.map +0 -0
- package/dist/src/text/hitTest.min.mjs +0 -0
- package/dist/src/text/hitTest.min.mjs.map +1 -1
- package/dist/src/text/hitTest.mjs +19 -19
- package/dist/src/text/hitTest.mjs.map +1 -1
- package/dist/src/text/layout.d.ts +0 -0
- package/dist/src/text/layout.d.ts.map +0 -0
- package/dist/src/text/layout.min.mjs +0 -0
- package/dist/src/text/layout.min.mjs.map +1 -1
- package/dist/src/text/layout.mjs +33 -33
- package/dist/src/text/layout.mjs.map +1 -1
- package/dist/src/text/measure.d.ts +0 -0
- package/dist/src/text/measure.d.ts.map +0 -0
- package/dist/src/text/measure.min.mjs +0 -0
- package/dist/src/text/measure.min.mjs.map +1 -1
- package/dist/src/text/measure.mjs +20 -20
- package/dist/src/text/measure.mjs.map +1 -1
- package/dist/src/text/overlayEditor.d.ts +8 -0
- package/dist/src/text/overlayEditor.d.ts.map +1 -1
- package/dist/src/text/overlayEditor.min.mjs +1 -1
- package/dist/src/text/overlayEditor.min.mjs.map +1 -1
- package/dist/src/text/overlayEditor.mjs +412 -85
- package/dist/src/text/overlayEditor.mjs.map +1 -1
- package/dist/src/text/unicode.d.ts +0 -0
- package/dist/src/text/unicode.d.ts.map +0 -0
- package/dist/src/text/unicode.min.mjs +0 -0
- package/dist/src/text/unicode.min.mjs.map +1 -1
- package/dist/src/text/unicode.mjs +8 -8
- package/dist/src/text/unicode.mjs.map +1 -1
- package/dist/src/typedefs.d.ts +0 -0
- package/dist/src/typedefs.d.ts.map +0 -0
- package/dist/src/util/animation/AnimationBase.d.ts +0 -0
- package/dist/src/util/animation/AnimationBase.d.ts.map +0 -0
- package/dist/src/util/animation/AnimationBase.min.mjs +0 -0
- package/dist/src/util/animation/AnimationBase.min.mjs.map +0 -0
- package/dist/src/util/animation/AnimationBase.mjs +0 -0
- package/dist/src/util/animation/AnimationBase.mjs.map +0 -0
- package/dist/src/util/animation/AnimationFrameProvider.d.ts +0 -0
- package/dist/src/util/animation/AnimationFrameProvider.d.ts.map +0 -0
- package/dist/src/util/animation/AnimationFrameProvider.min.mjs +0 -0
- package/dist/src/util/animation/AnimationFrameProvider.min.mjs.map +0 -0
- package/dist/src/util/animation/AnimationFrameProvider.mjs +0 -0
- package/dist/src/util/animation/AnimationFrameProvider.mjs.map +0 -0
- package/dist/src/util/animation/AnimationRegistry.d.ts +0 -0
- package/dist/src/util/animation/AnimationRegistry.d.ts.map +0 -0
- package/dist/src/util/animation/AnimationRegistry.min.mjs +0 -0
- package/dist/src/util/animation/AnimationRegistry.min.mjs.map +0 -0
- package/dist/src/util/animation/AnimationRegistry.mjs +0 -0
- package/dist/src/util/animation/AnimationRegistry.mjs.map +0 -0
- package/dist/src/util/animation/ArrayAnimation.d.ts +0 -0
- package/dist/src/util/animation/ArrayAnimation.d.ts.map +0 -0
- package/dist/src/util/animation/ArrayAnimation.min.mjs +0 -0
- package/dist/src/util/animation/ArrayAnimation.min.mjs.map +0 -0
- package/dist/src/util/animation/ArrayAnimation.mjs +0 -0
- package/dist/src/util/animation/ArrayAnimation.mjs.map +0 -0
- package/dist/src/util/animation/ColorAnimation.d.ts +0 -0
- package/dist/src/util/animation/ColorAnimation.d.ts.map +0 -0
- package/dist/src/util/animation/ColorAnimation.min.mjs +0 -0
- package/dist/src/util/animation/ColorAnimation.min.mjs.map +0 -0
- package/dist/src/util/animation/ColorAnimation.mjs +0 -0
- package/dist/src/util/animation/ColorAnimation.mjs.map +0 -0
- package/dist/src/util/animation/ValueAnimation.d.ts +0 -0
- package/dist/src/util/animation/ValueAnimation.d.ts.map +0 -0
- package/dist/src/util/animation/ValueAnimation.min.mjs +0 -0
- package/dist/src/util/animation/ValueAnimation.min.mjs.map +0 -0
- package/dist/src/util/animation/ValueAnimation.mjs +0 -0
- package/dist/src/util/animation/ValueAnimation.mjs.map +0 -0
- package/dist/src/util/animation/animate.d.ts +0 -0
- package/dist/src/util/animation/animate.d.ts.map +0 -0
- package/dist/src/util/animation/animate.min.mjs +0 -0
- package/dist/src/util/animation/animate.min.mjs.map +0 -0
- package/dist/src/util/animation/animate.mjs +0 -0
- package/dist/src/util/animation/animate.mjs.map +0 -0
- package/dist/src/util/animation/easing.d.ts +0 -0
- package/dist/src/util/animation/easing.d.ts.map +0 -0
- package/dist/src/util/animation/easing.min.mjs +0 -0
- package/dist/src/util/animation/easing.min.mjs.map +0 -0
- package/dist/src/util/animation/easing.mjs +0 -0
- package/dist/src/util/animation/easing.mjs.map +0 -0
- package/dist/src/util/animation/index.d.ts +0 -0
- package/dist/src/util/animation/index.d.ts.map +0 -0
- package/dist/src/util/animation/types.d.ts +0 -0
- package/dist/src/util/animation/types.d.ts.map +0 -0
- package/dist/src/util/applyMixins.d.ts +0 -0
- package/dist/src/util/applyMixins.d.ts.map +0 -0
- package/dist/src/util/applyMixins.min.mjs +0 -0
- package/dist/src/util/applyMixins.min.mjs.map +0 -0
- package/dist/src/util/applyMixins.mjs +0 -0
- package/dist/src/util/applyMixins.mjs.map +0 -0
- package/dist/src/util/dom_event.d.ts +0 -0
- package/dist/src/util/dom_event.d.ts.map +0 -0
- package/dist/src/util/dom_event.min.mjs +0 -0
- package/dist/src/util/dom_event.min.mjs.map +0 -0
- package/dist/src/util/dom_event.mjs +0 -0
- package/dist/src/util/dom_event.mjs.map +0 -0
- package/dist/src/util/dom_misc.d.ts +0 -0
- package/dist/src/util/dom_misc.d.ts.map +0 -0
- package/dist/src/util/dom_misc.min.mjs +0 -0
- package/dist/src/util/dom_misc.min.mjs.map +0 -0
- package/dist/src/util/dom_misc.mjs +0 -0
- package/dist/src/util/dom_misc.mjs.map +0 -0
- package/dist/src/util/index.d.ts +0 -0
- package/dist/src/util/index.d.ts.map +0 -0
- package/dist/src/util/index.min.mjs +0 -0
- package/dist/src/util/index.min.mjs.map +0 -0
- package/dist/src/util/index.mjs +0 -0
- package/dist/src/util/index.mjs.map +0 -0
- package/dist/src/util/internals/applyCanvasTransform.d.ts +0 -0
- package/dist/src/util/internals/applyCanvasTransform.d.ts.map +0 -0
- package/dist/src/util/internals/applyCanvasTransform.min.mjs +0 -0
- package/dist/src/util/internals/applyCanvasTransform.min.mjs.map +0 -0
- package/dist/src/util/internals/applyCanvasTransform.mjs +0 -0
- package/dist/src/util/internals/applyCanvasTransform.mjs.map +0 -0
- package/dist/src/util/internals/cleanupSvgAttribute.d.ts +0 -0
- package/dist/src/util/internals/cleanupSvgAttribute.d.ts.map +0 -0
- package/dist/src/util/internals/cleanupSvgAttribute.min.mjs +0 -0
- package/dist/src/util/internals/cleanupSvgAttribute.min.mjs.map +0 -0
- package/dist/src/util/internals/cleanupSvgAttribute.mjs +0 -0
- package/dist/src/util/internals/cleanupSvgAttribute.mjs.map +0 -0
- package/dist/src/util/internals/cloneStyles.d.ts +0 -0
- package/dist/src/util/internals/cloneStyles.d.ts.map +0 -0
- package/dist/src/util/internals/cloneStyles.min.mjs +0 -0
- package/dist/src/util/internals/cloneStyles.min.mjs.map +0 -0
- package/dist/src/util/internals/cloneStyles.mjs +0 -0
- package/dist/src/util/internals/cloneStyles.mjs.map +0 -0
- package/dist/src/util/internals/console.d.ts +0 -0
- package/dist/src/util/internals/console.d.ts.map +0 -0
- package/dist/src/util/internals/console.min.mjs +0 -0
- package/dist/src/util/internals/console.min.mjs.map +0 -0
- package/dist/src/util/internals/console.mjs +0 -0
- package/dist/src/util/internals/console.mjs.map +0 -0
- package/dist/src/util/internals/dom_style.d.ts +0 -0
- package/dist/src/util/internals/dom_style.d.ts.map +0 -0
- package/dist/src/util/internals/dom_style.min.mjs +0 -0
- package/dist/src/util/internals/dom_style.min.mjs.map +0 -0
- package/dist/src/util/internals/dom_style.mjs +0 -0
- package/dist/src/util/internals/dom_style.mjs.map +0 -0
- package/dist/src/util/internals/findRight.d.ts +0 -0
- package/dist/src/util/internals/findRight.d.ts.map +0 -0
- package/dist/src/util/internals/findRight.min.mjs +0 -0
- package/dist/src/util/internals/findRight.min.mjs.map +0 -0
- package/dist/src/util/internals/findRight.mjs +0 -0
- package/dist/src/util/internals/findRight.mjs.map +0 -0
- package/dist/src/util/internals/getRandomInt.d.ts +0 -0
- package/dist/src/util/internals/getRandomInt.d.ts.map +0 -0
- package/dist/src/util/internals/getRandomInt.min.mjs +0 -0
- package/dist/src/util/internals/getRandomInt.min.mjs.map +0 -0
- package/dist/src/util/internals/getRandomInt.mjs +0 -0
- package/dist/src/util/internals/getRandomInt.mjs.map +0 -0
- package/dist/src/util/internals/ifNaN.d.ts +0 -0
- package/dist/src/util/internals/ifNaN.d.ts.map +0 -0
- package/dist/src/util/internals/ifNaN.min.mjs +0 -0
- package/dist/src/util/internals/ifNaN.min.mjs.map +0 -0
- package/dist/src/util/internals/ifNaN.mjs +0 -0
- package/dist/src/util/internals/ifNaN.mjs.map +0 -0
- package/dist/src/util/internals/removeFromArray.d.ts +0 -0
- package/dist/src/util/internals/removeFromArray.d.ts.map +0 -0
- package/dist/src/util/internals/removeFromArray.min.mjs +0 -0
- package/dist/src/util/internals/removeFromArray.min.mjs.map +0 -0
- package/dist/src/util/internals/removeFromArray.mjs +0 -0
- package/dist/src/util/internals/removeFromArray.mjs.map +0 -0
- package/dist/src/util/internals/uid.d.ts +0 -0
- package/dist/src/util/internals/uid.d.ts.map +0 -0
- package/dist/src/util/internals/uid.min.mjs +0 -0
- package/dist/src/util/internals/uid.min.mjs.map +0 -0
- package/dist/src/util/internals/uid.mjs +0 -0
- package/dist/src/util/internals/uid.mjs.map +0 -0
- package/dist/src/util/lang_string.d.ts +0 -0
- package/dist/src/util/lang_string.d.ts.map +0 -0
- package/dist/src/util/lang_string.min.mjs +0 -0
- package/dist/src/util/lang_string.min.mjs.map +0 -0
- package/dist/src/util/lang_string.mjs +0 -0
- package/dist/src/util/lang_string.mjs.map +0 -0
- package/dist/src/util/misc/boundingBoxFromPoints.d.ts +0 -0
- package/dist/src/util/misc/boundingBoxFromPoints.d.ts.map +0 -0
- package/dist/src/util/misc/boundingBoxFromPoints.min.mjs +0 -0
- package/dist/src/util/misc/boundingBoxFromPoints.min.mjs.map +0 -0
- package/dist/src/util/misc/boundingBoxFromPoints.mjs +0 -0
- package/dist/src/util/misc/boundingBoxFromPoints.mjs.map +0 -0
- package/dist/src/util/misc/capValue.d.ts +0 -0
- package/dist/src/util/misc/capValue.d.ts.map +0 -0
- package/dist/src/util/misc/capValue.min.mjs +0 -0
- package/dist/src/util/misc/capValue.min.mjs.map +0 -0
- package/dist/src/util/misc/capValue.mjs +0 -0
- package/dist/src/util/misc/capValue.mjs.map +0 -0
- package/dist/src/util/misc/cos.d.ts +0 -0
- package/dist/src/util/misc/cos.d.ts.map +0 -0
- package/dist/src/util/misc/cos.min.mjs +0 -0
- package/dist/src/util/misc/cos.min.mjs.map +0 -0
- package/dist/src/util/misc/cos.mjs +0 -0
- package/dist/src/util/misc/cos.mjs.map +0 -0
- package/dist/src/util/misc/dom.d.ts +0 -0
- package/dist/src/util/misc/dom.d.ts.map +0 -0
- package/dist/src/util/misc/dom.min.mjs +0 -0
- package/dist/src/util/misc/dom.min.mjs.map +0 -0
- package/dist/src/util/misc/dom.mjs +0 -0
- package/dist/src/util/misc/dom.mjs.map +0 -0
- package/dist/src/util/misc/findScaleTo.d.ts +0 -0
- package/dist/src/util/misc/findScaleTo.d.ts.map +0 -0
- package/dist/src/util/misc/findScaleTo.min.mjs +0 -0
- package/dist/src/util/misc/findScaleTo.min.mjs.map +0 -0
- package/dist/src/util/misc/findScaleTo.mjs +0 -0
- package/dist/src/util/misc/findScaleTo.mjs.map +0 -0
- package/dist/src/util/misc/groupSVGElements.d.ts +0 -0
- package/dist/src/util/misc/groupSVGElements.d.ts.map +0 -0
- package/dist/src/util/misc/groupSVGElements.min.mjs +0 -0
- package/dist/src/util/misc/groupSVGElements.min.mjs.map +0 -0
- package/dist/src/util/misc/groupSVGElements.mjs +0 -0
- package/dist/src/util/misc/groupSVGElements.mjs.map +0 -0
- package/dist/src/util/misc/isTransparent.d.ts +0 -0
- package/dist/src/util/misc/isTransparent.d.ts.map +0 -0
- package/dist/src/util/misc/isTransparent.min.mjs +0 -0
- package/dist/src/util/misc/isTransparent.min.mjs.map +0 -0
- package/dist/src/util/misc/isTransparent.mjs +0 -0
- package/dist/src/util/misc/isTransparent.mjs.map +0 -0
- package/dist/src/util/misc/matrix.d.ts +0 -0
- package/dist/src/util/misc/matrix.d.ts.map +0 -0
- package/dist/src/util/misc/matrix.min.mjs +0 -0
- package/dist/src/util/misc/matrix.min.mjs.map +0 -0
- package/dist/src/util/misc/matrix.mjs +0 -0
- package/dist/src/util/misc/matrix.mjs.map +0 -0
- package/dist/src/util/misc/mergeClipPaths.d.ts +0 -0
- package/dist/src/util/misc/mergeClipPaths.d.ts.map +0 -0
- package/dist/src/util/misc/mergeClipPaths.min.mjs +0 -0
- package/dist/src/util/misc/mergeClipPaths.min.mjs.map +0 -0
- package/dist/src/util/misc/mergeClipPaths.mjs +0 -0
- package/dist/src/util/misc/mergeClipPaths.mjs.map +0 -0
- package/dist/src/util/misc/objectEnlive.d.ts +0 -0
- package/dist/src/util/misc/objectEnlive.d.ts.map +0 -0
- package/dist/src/util/misc/objectEnlive.min.mjs +0 -0
- package/dist/src/util/misc/objectEnlive.min.mjs.map +0 -0
- package/dist/src/util/misc/objectEnlive.mjs +0 -0
- package/dist/src/util/misc/objectEnlive.mjs.map +0 -0
- package/dist/src/util/misc/objectTransforms.d.ts +0 -0
- package/dist/src/util/misc/objectTransforms.d.ts.map +0 -0
- package/dist/src/util/misc/objectTransforms.min.mjs +0 -0
- package/dist/src/util/misc/objectTransforms.min.mjs.map +0 -0
- package/dist/src/util/misc/objectTransforms.mjs +0 -0
- package/dist/src/util/misc/objectTransforms.mjs.map +0 -0
- package/dist/src/util/misc/pick.d.ts +0 -0
- package/dist/src/util/misc/pick.d.ts.map +0 -0
- package/dist/src/util/misc/pick.min.mjs +0 -0
- package/dist/src/util/misc/pick.min.mjs.map +0 -0
- package/dist/src/util/misc/pick.mjs +0 -0
- package/dist/src/util/misc/pick.mjs.map +0 -0
- package/dist/src/util/misc/planeChange.d.ts +0 -0
- package/dist/src/util/misc/planeChange.d.ts.map +0 -0
- package/dist/src/util/misc/planeChange.min.mjs +0 -0
- package/dist/src/util/misc/planeChange.min.mjs.map +0 -0
- package/dist/src/util/misc/planeChange.mjs +0 -0
- package/dist/src/util/misc/planeChange.mjs.map +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts.map +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.min.mjs +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.min.mjs.map +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.mjs +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.mjs.map +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts.map +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.min.mjs +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.min.mjs.map +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.mjs +0 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.mjs.map +0 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +0 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts.map +0 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.min.mjs +0 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.min.mjs.map +0 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.mjs +0 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.mjs.map +0 -0
- package/dist/src/util/misc/projectStroke/index.d.ts +0 -0
- package/dist/src/util/misc/projectStroke/index.d.ts.map +0 -0
- package/dist/src/util/misc/projectStroke/index.min.mjs +0 -0
- package/dist/src/util/misc/projectStroke/index.min.mjs.map +0 -0
- package/dist/src/util/misc/projectStroke/index.mjs +0 -0
- package/dist/src/util/misc/projectStroke/index.mjs.map +0 -0
- package/dist/src/util/misc/projectStroke/types.d.ts +0 -0
- package/dist/src/util/misc/projectStroke/types.d.ts.map +0 -0
- package/dist/src/util/misc/radiansDegreesConversion.d.ts +0 -0
- package/dist/src/util/misc/radiansDegreesConversion.d.ts.map +0 -0
- package/dist/src/util/misc/radiansDegreesConversion.min.mjs +0 -0
- package/dist/src/util/misc/radiansDegreesConversion.min.mjs.map +0 -0
- package/dist/src/util/misc/radiansDegreesConversion.mjs +0 -0
- package/dist/src/util/misc/radiansDegreesConversion.mjs.map +0 -0
- package/dist/src/util/misc/resolveOrigin.d.ts +0 -0
- package/dist/src/util/misc/resolveOrigin.d.ts.map +0 -0
- package/dist/src/util/misc/resolveOrigin.min.mjs +0 -0
- package/dist/src/util/misc/resolveOrigin.min.mjs.map +0 -0
- package/dist/src/util/misc/resolveOrigin.mjs +0 -0
- package/dist/src/util/misc/resolveOrigin.mjs.map +0 -0
- package/dist/src/util/misc/sin.d.ts +0 -0
- package/dist/src/util/misc/sin.d.ts.map +0 -0
- package/dist/src/util/misc/sin.min.mjs +0 -0
- package/dist/src/util/misc/sin.min.mjs.map +0 -0
- package/dist/src/util/misc/sin.mjs +0 -0
- package/dist/src/util/misc/sin.mjs.map +0 -0
- package/dist/src/util/misc/svgExport.d.ts +0 -0
- package/dist/src/util/misc/svgExport.d.ts.map +0 -0
- package/dist/src/util/misc/svgExport.min.mjs +0 -0
- package/dist/src/util/misc/svgExport.min.mjs.map +0 -0
- package/dist/src/util/misc/svgExport.mjs +0 -0
- package/dist/src/util/misc/svgExport.mjs.map +0 -0
- package/dist/src/util/misc/svgParsing.d.ts +0 -0
- package/dist/src/util/misc/svgParsing.d.ts.map +0 -0
- package/dist/src/util/misc/svgParsing.min.mjs +0 -0
- package/dist/src/util/misc/svgParsing.min.mjs.map +0 -0
- package/dist/src/util/misc/svgParsing.mjs +0 -0
- package/dist/src/util/misc/svgParsing.mjs.map +0 -0
- package/dist/src/util/misc/textStyles.d.ts +0 -0
- package/dist/src/util/misc/textStyles.d.ts.map +0 -0
- package/dist/src/util/misc/textStyles.min.mjs +0 -0
- package/dist/src/util/misc/textStyles.min.mjs.map +0 -0
- package/dist/src/util/misc/textStyles.mjs +0 -0
- package/dist/src/util/misc/textStyles.mjs.map +0 -0
- package/dist/src/util/misc/toFixed.d.ts +0 -0
- package/dist/src/util/misc/toFixed.d.ts.map +0 -0
- package/dist/src/util/misc/toFixed.min.mjs +0 -0
- package/dist/src/util/misc/toFixed.min.mjs.map +0 -0
- package/dist/src/util/misc/toFixed.mjs +0 -0
- package/dist/src/util/misc/toFixed.mjs.map +0 -0
- package/dist/src/util/misc/vectors.d.ts +0 -0
- package/dist/src/util/misc/vectors.d.ts.map +0 -0
- package/dist/src/util/misc/vectors.min.mjs +0 -0
- package/dist/src/util/misc/vectors.min.mjs.map +0 -0
- package/dist/src/util/misc/vectors.mjs +0 -0
- package/dist/src/util/misc/vectors.mjs.map +0 -0
- package/dist/src/util/path/index.d.ts +0 -0
- package/dist/src/util/path/index.d.ts.map +0 -0
- package/dist/src/util/path/index.min.mjs +0 -0
- package/dist/src/util/path/index.min.mjs.map +0 -0
- package/dist/src/util/path/index.mjs +0 -0
- package/dist/src/util/path/index.mjs.map +0 -0
- package/dist/src/util/path/regex.d.ts +0 -0
- package/dist/src/util/path/regex.d.ts.map +0 -0
- package/dist/src/util/path/regex.min.mjs +0 -0
- package/dist/src/util/path/regex.min.mjs.map +0 -0
- package/dist/src/util/path/regex.mjs +0 -0
- package/dist/src/util/path/regex.mjs.map +0 -0
- package/dist/src/util/path/typechecks.d.ts +0 -0
- package/dist/src/util/path/typechecks.d.ts.map +0 -0
- package/dist/src/util/path/typedefs.d.ts +0 -0
- package/dist/src/util/path/typedefs.d.ts.map +0 -0
- package/dist/src/util/transform_matrix_removal.d.ts +0 -0
- package/dist/src/util/transform_matrix_removal.d.ts.map +0 -0
- package/dist/src/util/transform_matrix_removal.min.mjs +0 -0
- package/dist/src/util/transform_matrix_removal.min.mjs.map +0 -0
- package/dist/src/util/transform_matrix_removal.mjs +0 -0
- package/dist/src/util/transform_matrix_removal.mjs.map +0 -0
- package/dist/src/util/typeAssertions.d.ts +0 -0
- package/dist/src/util/typeAssertions.d.ts.map +0 -0
- package/dist/src/util/typeAssertions.min.mjs +0 -0
- package/dist/src/util/typeAssertions.min.mjs.map +0 -0
- package/dist/src/util/typeAssertions.mjs +0 -0
- package/dist/src/util/typeAssertions.mjs.map +0 -0
- package/dist-extensions/aligning_guidelines/constant.mjs +0 -0
- package/dist-extensions/aligning_guidelines/constant.mjs.map +0 -0
- package/dist-extensions/aligning_guidelines/index.mjs +0 -0
- package/dist-extensions/aligning_guidelines/index.mjs.map +0 -0
- package/dist-extensions/aligning_guidelines/util/basic.mjs +0 -0
- package/dist-extensions/aligning_guidelines/util/basic.mjs.map +0 -0
- package/dist-extensions/aligning_guidelines/util/collect-line.mjs +0 -0
- package/dist-extensions/aligning_guidelines/util/collect-line.mjs.map +0 -0
- package/dist-extensions/aligning_guidelines/util/collect-point.mjs +0 -0
- package/dist-extensions/aligning_guidelines/util/collect-point.mjs.map +0 -0
- package/dist-extensions/aligning_guidelines/util/draw.mjs +0 -0
- package/dist-extensions/aligning_guidelines/util/draw.mjs.map +0 -0
- package/dist-extensions/aligning_guidelines/util/get-objects-by-target.mjs +0 -0
- package/dist-extensions/aligning_guidelines/util/get-objects-by-target.mjs.map +0 -0
- package/dist-extensions/data_updaters/gradient/index.mjs +0 -0
- package/dist-extensions/data_updaters/gradient/index.mjs.map +0 -0
- package/dist-extensions/data_updaters/origins/index.mjs +0 -0
- package/dist-extensions/data_updaters/origins/index.mjs.map +0 -0
- package/dist-extensions/extensions/aligning_guidelines/constant.d.ts +0 -0
- package/dist-extensions/extensions/aligning_guidelines/constant.d.ts.map +0 -0
- package/dist-extensions/extensions/aligning_guidelines/index.d.ts +0 -0
- package/dist-extensions/extensions/aligning_guidelines/index.d.ts.map +0 -0
- package/dist-extensions/extensions/aligning_guidelines/typedefs.d.ts +0 -0
- package/dist-extensions/extensions/aligning_guidelines/typedefs.d.ts.map +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/basic.d.ts +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/basic.d.ts.map +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-line.d.ts +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-line.d.ts.map +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-point.d.ts +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-point.d.ts.map +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/draw.d.ts +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/draw.d.ts.map +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/get-objects-by-target.d.ts +0 -0
- package/dist-extensions/extensions/aligning_guidelines/util/get-objects-by-target.d.ts.map +0 -0
- package/dist-extensions/extensions/data_updaters/gradient/index.d.ts +0 -0
- package/dist-extensions/extensions/data_updaters/gradient/index.d.ts.map +0 -0
- package/dist-extensions/extensions/data_updaters/origins/index.d.ts +0 -0
- package/dist-extensions/extensions/data_updaters/origins/index.d.ts.map +0 -0
- package/dist-extensions/extensions/index.d.ts +0 -0
- package/dist-extensions/extensions/index.d.ts.map +0 -0
- package/dist-extensions/fabric-extensions.min.js +0 -0
- package/dist-extensions/fabric-extensions.min.js.map +0 -0
- package/dist-extensions/fabric.d.ts +0 -0
- package/dist-extensions/fabric.d.ts.map +0 -0
- package/dist-extensions/index.d.ts +0 -0
- package/dist-extensions/index.d.ts.map +0 -0
- package/dist-extensions/index.mjs +0 -0
- package/dist-extensions/index.mjs.map +0 -0
- package/dist-extensions/src/ClassRegistry.d.ts +0 -0
- package/dist-extensions/src/ClassRegistry.d.ts.map +0 -0
- package/dist-extensions/src/Collection.d.ts +0 -0
- package/dist-extensions/src/Collection.d.ts.map +0 -0
- package/dist-extensions/src/CommonMethods.d.ts +0 -0
- package/dist-extensions/src/CommonMethods.d.ts.map +0 -0
- package/dist-extensions/src/EventTypeDefs.d.ts +0 -0
- package/dist-extensions/src/EventTypeDefs.d.ts.map +0 -0
- package/dist-extensions/src/Intersection.d.ts +0 -0
- package/dist-extensions/src/Intersection.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/ActiveSelectionLayoutManager.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/ActiveSelectionLayoutManager.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/LayoutManager.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/LayoutManager.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/utils.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/utils.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/constants.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/constants.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/index.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/index.d.ts.map +0 -0
- package/dist-extensions/src/LayoutManager/types.d.ts +0 -0
- package/dist-extensions/src/LayoutManager/types.d.ts.map +0 -0
- package/dist-extensions/src/Observable.d.ts +0 -0
- package/dist-extensions/src/Observable.d.ts.map +0 -0
- package/dist-extensions/src/Pattern/Pattern.d.ts +0 -0
- package/dist-extensions/src/Pattern/Pattern.d.ts.map +0 -0
- package/dist-extensions/src/Pattern/index.d.ts +0 -0
- package/dist-extensions/src/Pattern/index.d.ts.map +0 -0
- package/dist-extensions/src/Pattern/types.d.ts +0 -0
- package/dist-extensions/src/Pattern/types.d.ts.map +0 -0
- package/dist-extensions/src/Point.d.ts +0 -0
- package/dist-extensions/src/Point.d.ts.map +0 -0
- package/dist-extensions/src/Shadow.d.ts +0 -0
- package/dist-extensions/src/Shadow.d.ts.map +0 -0
- package/dist-extensions/src/brushes/BaseBrush.d.ts +0 -0
- package/dist-extensions/src/brushes/BaseBrush.d.ts.map +0 -0
- package/dist-extensions/src/brushes/CircleBrush.d.ts +0 -0
- package/dist-extensions/src/brushes/CircleBrush.d.ts.map +0 -0
- package/dist-extensions/src/brushes/PatternBrush.d.ts +0 -0
- package/dist-extensions/src/brushes/PatternBrush.d.ts.map +0 -0
- package/dist-extensions/src/brushes/PencilBrush.d.ts +0 -0
- package/dist-extensions/src/brushes/PencilBrush.d.ts.map +0 -0
- package/dist-extensions/src/brushes/SprayBrush.d.ts +0 -0
- package/dist-extensions/src/brushes/SprayBrush.d.ts.map +0 -0
- package/dist-extensions/src/brushes/typedefs.d.ts +0 -0
- package/dist-extensions/src/brushes/typedefs.d.ts.map +0 -0
- package/dist-extensions/src/cache.d.ts +0 -0
- package/dist-extensions/src/cache.d.ts.map +0 -0
- package/dist-extensions/src/canvas/Canvas.d.ts +0 -0
- package/dist-extensions/src/canvas/Canvas.d.ts.map +0 -0
- package/dist-extensions/src/canvas/CanvasOptions.d.ts +0 -0
- package/dist-extensions/src/canvas/CanvasOptions.d.ts.map +0 -0
- package/dist-extensions/src/canvas/DOMManagers/CanvasDOMManager.d.ts +0 -0
- package/dist-extensions/src/canvas/DOMManagers/CanvasDOMManager.d.ts.map +0 -0
- package/dist-extensions/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +0 -0
- package/dist-extensions/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts.map +0 -0
- package/dist-extensions/src/canvas/DOMManagers/util.d.ts +0 -0
- package/dist-extensions/src/canvas/DOMManagers/util.d.ts.map +0 -0
- package/dist-extensions/src/canvas/SelectableCanvas.d.ts +0 -0
- package/dist-extensions/src/canvas/SelectableCanvas.d.ts.map +0 -0
- package/dist-extensions/src/canvas/StaticCanvas.d.ts +0 -0
- package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +0 -0
- package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts +0 -0
- package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts.map +0 -0
- package/dist-extensions/src/canvas/TextEditingManager.d.ts +0 -0
- package/dist-extensions/src/canvas/TextEditingManager.d.ts.map +0 -0
- package/dist-extensions/src/color/Color.d.ts +0 -0
- package/dist-extensions/src/color/Color.d.ts.map +0 -0
- package/dist-extensions/src/color/color_map.d.ts +0 -0
- package/dist-extensions/src/color/color_map.d.ts.map +0 -0
- package/dist-extensions/src/color/constants.d.ts +0 -0
- package/dist-extensions/src/color/constants.d.ts.map +0 -0
- package/dist-extensions/src/color/typedefs.d.ts +0 -0
- package/dist-extensions/src/color/typedefs.d.ts.map +0 -0
- package/dist-extensions/src/color/util.d.ts +0 -0
- package/dist-extensions/src/color/util.d.ts.map +0 -0
- package/dist-extensions/src/config.d.ts +0 -0
- package/dist-extensions/src/config.d.ts.map +0 -0
- package/dist-extensions/src/constants.d.ts +0 -0
- package/dist-extensions/src/constants.d.ts.map +0 -0
- package/dist-extensions/src/controls/Control.d.ts +0 -0
- package/dist-extensions/src/controls/Control.d.ts.map +0 -0
- package/dist-extensions/src/controls/changeHeight.d.ts +0 -0
- package/dist-extensions/src/controls/changeHeight.d.ts.map +0 -0
- package/dist-extensions/src/controls/changeWidth.d.ts +0 -0
- package/dist-extensions/src/controls/changeWidth.d.ts.map +0 -0
- package/dist-extensions/src/controls/commonControls.d.ts +0 -0
- package/dist-extensions/src/controls/commonControls.d.ts.map +0 -0
- package/dist-extensions/src/controls/controlRendering.d.ts +0 -0
- package/dist-extensions/src/controls/controlRendering.d.ts.map +0 -0
- package/dist-extensions/src/controls/drag.d.ts +0 -0
- package/dist-extensions/src/controls/drag.d.ts.map +0 -0
- package/dist-extensions/src/controls/fireEvent.d.ts +0 -0
- package/dist-extensions/src/controls/fireEvent.d.ts.map +0 -0
- package/dist-extensions/src/controls/index.d.ts +0 -0
- package/dist-extensions/src/controls/index.d.ts.map +0 -0
- package/dist-extensions/src/controls/pathControl.d.ts +0 -0
- package/dist-extensions/src/controls/pathControl.d.ts.map +0 -0
- package/dist-extensions/src/controls/polyControl.d.ts +0 -0
- package/dist-extensions/src/controls/polyControl.d.ts.map +0 -0
- package/dist-extensions/src/controls/rotate.d.ts +0 -0
- package/dist-extensions/src/controls/rotate.d.ts.map +0 -0
- package/dist-extensions/src/controls/scale.d.ts +0 -0
- package/dist-extensions/src/controls/scale.d.ts.map +0 -0
- package/dist-extensions/src/controls/scaleSkew.d.ts +0 -0
- package/dist-extensions/src/controls/scaleSkew.d.ts.map +0 -0
- package/dist-extensions/src/controls/skew.d.ts +0 -0
- package/dist-extensions/src/controls/skew.d.ts.map +0 -0
- package/dist-extensions/src/controls/util.d.ts +0 -0
- package/dist-extensions/src/controls/util.d.ts.map +0 -0
- package/dist-extensions/src/controls/wrapWithFireEvent.d.ts +0 -0
- package/dist-extensions/src/controls/wrapWithFireEvent.d.ts.map +0 -0
- package/dist-extensions/src/controls/wrapWithFixedAnchor.d.ts +0 -0
- package/dist-extensions/src/controls/wrapWithFixedAnchor.d.ts.map +0 -0
- package/dist-extensions/src/env/browser.d.ts +0 -0
- package/dist-extensions/src/env/browser.d.ts.map +0 -0
- package/dist-extensions/src/env/index.d.ts +0 -0
- package/dist-extensions/src/env/index.d.ts.map +0 -0
- package/dist-extensions/src/env/types.d.ts +0 -0
- package/dist-extensions/src/env/types.d.ts.map +0 -0
- package/dist-extensions/src/filters/BaseFilter.d.ts +0 -0
- package/dist-extensions/src/filters/BaseFilter.d.ts.map +0 -0
- package/dist-extensions/src/filters/BlendColor.d.ts +0 -0
- package/dist-extensions/src/filters/BlendColor.d.ts.map +0 -0
- package/dist-extensions/src/filters/BlendImage.d.ts +0 -0
- package/dist-extensions/src/filters/BlendImage.d.ts.map +0 -0
- package/dist-extensions/src/filters/Blur.d.ts +0 -0
- package/dist-extensions/src/filters/Blur.d.ts.map +0 -0
- package/dist-extensions/src/filters/Brightness.d.ts +0 -0
- package/dist-extensions/src/filters/Brightness.d.ts.map +0 -0
- package/dist-extensions/src/filters/Canvas2dFilterBackend.d.ts +0 -0
- package/dist-extensions/src/filters/Canvas2dFilterBackend.d.ts.map +0 -0
- package/dist-extensions/src/filters/ColorMatrix.d.ts +0 -0
- package/dist-extensions/src/filters/ColorMatrix.d.ts.map +0 -0
- package/dist-extensions/src/filters/ColorMatrixFilters.d.ts +0 -0
- package/dist-extensions/src/filters/ColorMatrixFilters.d.ts.map +0 -0
- package/dist-extensions/src/filters/Composed.d.ts +0 -0
- package/dist-extensions/src/filters/Composed.d.ts.map +0 -0
- package/dist-extensions/src/filters/Contrast.d.ts +0 -0
- package/dist-extensions/src/filters/Contrast.d.ts.map +0 -0
- package/dist-extensions/src/filters/Convolute.d.ts +0 -0
- package/dist-extensions/src/filters/Convolute.d.ts.map +0 -0
- package/dist-extensions/src/filters/FilterBackend.d.ts +0 -0
- package/dist-extensions/src/filters/FilterBackend.d.ts.map +0 -0
- package/dist-extensions/src/filters/GLProbes/GLProbe.d.ts +0 -0
- package/dist-extensions/src/filters/GLProbes/GLProbe.d.ts.map +0 -0
- package/dist-extensions/src/filters/GLProbes/WebGLProbe.d.ts +0 -0
- package/dist-extensions/src/filters/GLProbes/WebGLProbe.d.ts.map +0 -0
- package/dist-extensions/src/filters/Gamma.d.ts +0 -0
- package/dist-extensions/src/filters/Gamma.d.ts.map +0 -0
- package/dist-extensions/src/filters/Grayscale.d.ts +0 -0
- package/dist-extensions/src/filters/Grayscale.d.ts.map +0 -0
- package/dist-extensions/src/filters/HueRotation.d.ts +0 -0
- package/dist-extensions/src/filters/HueRotation.d.ts.map +0 -0
- package/dist-extensions/src/filters/Invert.d.ts +0 -0
- package/dist-extensions/src/filters/Invert.d.ts.map +0 -0
- package/dist-extensions/src/filters/Noise.d.ts +0 -0
- package/dist-extensions/src/filters/Noise.d.ts.map +0 -0
- package/dist-extensions/src/filters/Pixelate.d.ts +0 -0
- package/dist-extensions/src/filters/Pixelate.d.ts.map +0 -0
- package/dist-extensions/src/filters/RemoveColor.d.ts +0 -0
- package/dist-extensions/src/filters/RemoveColor.d.ts.map +0 -0
- package/dist-extensions/src/filters/Resize.d.ts +0 -0
- package/dist-extensions/src/filters/Resize.d.ts.map +0 -0
- package/dist-extensions/src/filters/Saturation.d.ts +0 -0
- package/dist-extensions/src/filters/Saturation.d.ts.map +0 -0
- package/dist-extensions/src/filters/Vibrance.d.ts +0 -0
- package/dist-extensions/src/filters/Vibrance.d.ts.map +0 -0
- package/dist-extensions/src/filters/WebGLFilterBackend.d.ts +0 -0
- package/dist-extensions/src/filters/WebGLFilterBackend.d.ts.map +0 -0
- package/dist-extensions/src/filters/filters.d.ts +0 -0
- package/dist-extensions/src/filters/filters.d.ts.map +0 -0
- package/dist-extensions/src/filters/index.d.ts +0 -0
- package/dist-extensions/src/filters/index.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/baseFilter.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/baseFilter.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/blendColor.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/blendColor.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/blendImage.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/blendImage.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/blur.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/blur.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/brightness.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/brightness.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/colorMatrix.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/colorMatrix.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/constrast.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/constrast.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/convolute.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/convolute.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/gamma.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/gamma.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/grayscale.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/grayscale.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/invert.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/invert.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/noise.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/noise.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/pixelate.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/pixelate.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/removeColor.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/removeColor.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/saturation.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/saturation.d.ts.map +0 -0
- package/dist-extensions/src/filters/shaders/vibrance.d.ts +0 -0
- package/dist-extensions/src/filters/shaders/vibrance.d.ts.map +0 -0
- package/dist-extensions/src/filters/typedefs.d.ts +0 -0
- package/dist-extensions/src/filters/typedefs.d.ts.map +0 -0
- package/dist-extensions/src/filters/utils.d.ts +0 -0
- package/dist-extensions/src/filters/utils.d.ts.map +0 -0
- package/dist-extensions/src/gradient/Gradient.d.ts +0 -0
- package/dist-extensions/src/gradient/Gradient.d.ts.map +0 -0
- package/dist-extensions/src/gradient/constants.d.ts +0 -0
- package/dist-extensions/src/gradient/constants.d.ts.map +0 -0
- package/dist-extensions/src/gradient/index.d.ts +0 -0
- package/dist-extensions/src/gradient/index.d.ts.map +0 -0
- package/dist-extensions/src/gradient/parser/misc.d.ts +0 -0
- package/dist-extensions/src/gradient/parser/misc.d.ts.map +0 -0
- package/dist-extensions/src/gradient/parser/parseColorStops.d.ts +0 -0
- package/dist-extensions/src/gradient/parser/parseColorStops.d.ts.map +0 -0
- package/dist-extensions/src/gradient/parser/parseCoords.d.ts +0 -0
- package/dist-extensions/src/gradient/parser/parseCoords.d.ts.map +0 -0
- package/dist-extensions/src/gradient/typedefs.d.ts +0 -0
- package/dist-extensions/src/gradient/typedefs.d.ts.map +0 -0
- package/dist-extensions/src/parser/applyViewboxTransform.d.ts +0 -0
- package/dist-extensions/src/parser/applyViewboxTransform.d.ts.map +0 -0
- package/dist-extensions/src/parser/attributes.d.ts +0 -0
- package/dist-extensions/src/parser/attributes.d.ts.map +0 -0
- package/dist-extensions/src/parser/constants.d.ts +0 -0
- package/dist-extensions/src/parser/constants.d.ts.map +0 -0
- package/dist-extensions/src/parser/doesSomeParentMatch.d.ts +0 -0
- package/dist-extensions/src/parser/doesSomeParentMatch.d.ts.map +0 -0
- package/dist-extensions/src/parser/elementMatchesRule.d.ts +0 -0
- package/dist-extensions/src/parser/elementMatchesRule.d.ts.map +0 -0
- package/dist-extensions/src/parser/elements_parser.d.ts +0 -0
- package/dist-extensions/src/parser/elements_parser.d.ts.map +0 -0
- package/dist-extensions/src/parser/getCSSRules.d.ts +0 -0
- package/dist-extensions/src/parser/getCSSRules.d.ts.map +0 -0
- package/dist-extensions/src/parser/getGlobalStylesForElement.d.ts +0 -0
- package/dist-extensions/src/parser/getGlobalStylesForElement.d.ts.map +0 -0
- package/dist-extensions/src/parser/getGradientDefs.d.ts +0 -0
- package/dist-extensions/src/parser/getGradientDefs.d.ts.map +0 -0
- package/dist-extensions/src/parser/getMultipleNodes.d.ts +0 -0
- package/dist-extensions/src/parser/getMultipleNodes.d.ts.map +0 -0
- package/dist-extensions/src/parser/getSvgRegex.d.ts +0 -0
- package/dist-extensions/src/parser/getSvgRegex.d.ts.map +0 -0
- package/dist-extensions/src/parser/getTagName.d.ts +0 -0
- package/dist-extensions/src/parser/getTagName.d.ts.map +0 -0
- package/dist-extensions/src/parser/hasInvalidAncestor.d.ts +0 -0
- package/dist-extensions/src/parser/hasInvalidAncestor.d.ts.map +0 -0
- package/dist-extensions/src/parser/loadSVGFromString.d.ts +0 -0
- package/dist-extensions/src/parser/loadSVGFromString.d.ts.map +0 -0
- package/dist-extensions/src/parser/loadSVGFromURL.d.ts +0 -0
- package/dist-extensions/src/parser/loadSVGFromURL.d.ts.map +0 -0
- package/dist-extensions/src/parser/normalizeAttr.d.ts +0 -0
- package/dist-extensions/src/parser/normalizeAttr.d.ts.map +0 -0
- package/dist-extensions/src/parser/normalizeValue.d.ts +0 -0
- package/dist-extensions/src/parser/normalizeValue.d.ts.map +0 -0
- package/dist-extensions/src/parser/parseAttributes.d.ts +0 -0
- package/dist-extensions/src/parser/parseAttributes.d.ts.map +0 -0
- package/dist-extensions/src/parser/parseFontDeclaration.d.ts +0 -0
- package/dist-extensions/src/parser/parseFontDeclaration.d.ts.map +0 -0
- package/dist-extensions/src/parser/parsePointsAttribute.d.ts +0 -0
- package/dist-extensions/src/parser/parsePointsAttribute.d.ts.map +0 -0
- package/dist-extensions/src/parser/parseSVGDocument.d.ts +0 -0
- package/dist-extensions/src/parser/parseSVGDocument.d.ts.map +0 -0
- package/dist-extensions/src/parser/parseStyleAttribute.d.ts +0 -0
- package/dist-extensions/src/parser/parseStyleAttribute.d.ts.map +0 -0
- package/dist-extensions/src/parser/parseStyleObject.d.ts +0 -0
- package/dist-extensions/src/parser/parseStyleObject.d.ts.map +0 -0
- package/dist-extensions/src/parser/parseStyleString.d.ts +0 -0
- package/dist-extensions/src/parser/parseStyleString.d.ts.map +0 -0
- package/dist-extensions/src/parser/parseTransformAttribute.d.ts +0 -0
- package/dist-extensions/src/parser/parseTransformAttribute.d.ts.map +0 -0
- package/dist-extensions/src/parser/parseUseDirectives.d.ts +0 -0
- package/dist-extensions/src/parser/parseUseDirectives.d.ts.map +0 -0
- package/dist-extensions/src/parser/percent.d.ts +0 -0
- package/dist-extensions/src/parser/percent.d.ts.map +0 -0
- package/dist-extensions/src/parser/recursivelyParseGradientsXlink.d.ts +0 -0
- package/dist-extensions/src/parser/recursivelyParseGradientsXlink.d.ts.map +0 -0
- package/dist-extensions/src/parser/selectorMatches.d.ts +0 -0
- package/dist-extensions/src/parser/selectorMatches.d.ts.map +0 -0
- package/dist-extensions/src/parser/setStrokeFillOpacity.d.ts +0 -0
- package/dist-extensions/src/parser/setStrokeFillOpacity.d.ts.map +0 -0
- package/dist-extensions/src/parser/typedefs.d.ts +0 -0
- package/dist-extensions/src/parser/typedefs.d.ts.map +0 -0
- package/dist-extensions/src/shapes/ActiveSelection.d.ts +0 -0
- package/dist-extensions/src/shapes/ActiveSelection.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Circle.d.ts +0 -0
- package/dist-extensions/src/shapes/Circle.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Ellipse.d.ts +0 -0
- package/dist-extensions/src/shapes/Ellipse.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Group.d.ts +0 -0
- package/dist-extensions/src/shapes/Group.d.ts.map +0 -0
- package/dist-extensions/src/shapes/IText/DraggableTextDelegate.d.ts +0 -0
- package/dist-extensions/src/shapes/IText/DraggableTextDelegate.d.ts.map +0 -0
- package/dist-extensions/src/shapes/IText/IText.d.ts +0 -0
- package/dist-extensions/src/shapes/IText/IText.d.ts.map +0 -0
- package/dist-extensions/src/shapes/IText/ITextBehavior.d.ts +0 -0
- package/dist-extensions/src/shapes/IText/ITextBehavior.d.ts.map +0 -0
- package/dist-extensions/src/shapes/IText/ITextClickBehavior.d.ts +0 -0
- package/dist-extensions/src/shapes/IText/ITextClickBehavior.d.ts.map +0 -0
- package/dist-extensions/src/shapes/IText/ITextKeyBehavior.d.ts +0 -0
- package/dist-extensions/src/shapes/IText/ITextKeyBehavior.d.ts.map +0 -0
- package/dist-extensions/src/shapes/IText/constants.d.ts +0 -0
- package/dist-extensions/src/shapes/IText/constants.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Image.d.ts +0 -0
- package/dist-extensions/src/shapes/Image.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Line.d.ts +0 -0
- package/dist-extensions/src/shapes/Line.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/FabricObject.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/FabricObject.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/Object.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/Object.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/ObjectGeometry.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/ObjectGeometry.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/defaultValues.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/defaultValues.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/BaseProps.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/BaseProps.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/BorderProps.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/BorderProps.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/ControlProps.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/ControlProps.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/FillStrokeProps.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/FillStrokeProps.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/LockInteractionProps.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/LockInteractionProps.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/ObjectTransformProps.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/ObjectTransformProps.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/SerializedObjectProps.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/SerializedObjectProps.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Object/types/index.d.ts +0 -0
- package/dist-extensions/src/shapes/Object/types/index.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Path.d.ts +0 -0
- package/dist-extensions/src/shapes/Path.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Polygon.d.ts +0 -0
- package/dist-extensions/src/shapes/Polygon.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Polyline.d.ts +0 -0
- package/dist-extensions/src/shapes/Polyline.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Rect.d.ts +0 -0
- package/dist-extensions/src/shapes/Rect.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Text/StyledText.d.ts +0 -0
- package/dist-extensions/src/shapes/Text/StyledText.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Text/Text.d.ts +0 -0
- package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts +0 -0
- package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Text/constants.d.ts +0 -0
- package/dist-extensions/src/shapes/Text/constants.d.ts.map +0 -0
- package/dist-extensions/src/shapes/Textbox.d.ts +13 -0
- package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Triangle.d.ts +0 -0
- package/dist-extensions/src/shapes/Triangle.d.ts.map +0 -0
- package/dist-extensions/src/text/browserLines.d.ts +0 -0
- package/dist-extensions/src/text/browserLines.d.ts.map +0 -0
- package/dist-extensions/src/text/ellipsis.d.ts +0 -0
- package/dist-extensions/src/text/ellipsis.d.ts.map +0 -0
- package/dist-extensions/src/text/hitTest.d.ts +0 -0
- package/dist-extensions/src/text/hitTest.d.ts.map +0 -0
- package/dist-extensions/src/text/layout.d.ts +0 -0
- package/dist-extensions/src/text/layout.d.ts.map +0 -0
- package/dist-extensions/src/text/measure.d.ts +0 -0
- package/dist-extensions/src/text/measure.d.ts.map +0 -0
- package/dist-extensions/src/text/overlayEditor.d.ts +8 -0
- package/dist-extensions/src/text/overlayEditor.d.ts.map +1 -1
- package/dist-extensions/src/text/unicode.d.ts +0 -0
- package/dist-extensions/src/text/unicode.d.ts.map +0 -0
- package/dist-extensions/src/typedefs.d.ts +0 -0
- package/dist-extensions/src/typedefs.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/AnimationBase.d.ts +0 -0
- package/dist-extensions/src/util/animation/AnimationBase.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/AnimationFrameProvider.d.ts +0 -0
- package/dist-extensions/src/util/animation/AnimationFrameProvider.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/AnimationRegistry.d.ts +0 -0
- package/dist-extensions/src/util/animation/AnimationRegistry.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/ArrayAnimation.d.ts +0 -0
- package/dist-extensions/src/util/animation/ArrayAnimation.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/ColorAnimation.d.ts +0 -0
- package/dist-extensions/src/util/animation/ColorAnimation.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/ValueAnimation.d.ts +0 -0
- package/dist-extensions/src/util/animation/ValueAnimation.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/animate.d.ts +0 -0
- package/dist-extensions/src/util/animation/animate.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/easing.d.ts +0 -0
- package/dist-extensions/src/util/animation/easing.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/index.d.ts +0 -0
- package/dist-extensions/src/util/animation/index.d.ts.map +0 -0
- package/dist-extensions/src/util/animation/types.d.ts +0 -0
- package/dist-extensions/src/util/animation/types.d.ts.map +0 -0
- package/dist-extensions/src/util/applyMixins.d.ts +0 -0
- package/dist-extensions/src/util/applyMixins.d.ts.map +0 -0
- package/dist-extensions/src/util/dom_event.d.ts +0 -0
- package/dist-extensions/src/util/dom_event.d.ts.map +0 -0
- package/dist-extensions/src/util/dom_misc.d.ts +0 -0
- package/dist-extensions/src/util/dom_misc.d.ts.map +0 -0
- package/dist-extensions/src/util/index.d.ts +0 -0
- package/dist-extensions/src/util/index.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/applyCanvasTransform.d.ts +0 -0
- package/dist-extensions/src/util/internals/applyCanvasTransform.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/cleanupSvgAttribute.d.ts +0 -0
- package/dist-extensions/src/util/internals/cleanupSvgAttribute.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/cloneStyles.d.ts +0 -0
- package/dist-extensions/src/util/internals/cloneStyles.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/console.d.ts +0 -0
- package/dist-extensions/src/util/internals/console.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/dom_style.d.ts +0 -0
- package/dist-extensions/src/util/internals/dom_style.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/findRight.d.ts +0 -0
- package/dist-extensions/src/util/internals/findRight.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/getRandomInt.d.ts +0 -0
- package/dist-extensions/src/util/internals/getRandomInt.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/ifNaN.d.ts +0 -0
- package/dist-extensions/src/util/internals/ifNaN.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/removeFromArray.d.ts +0 -0
- package/dist-extensions/src/util/internals/removeFromArray.d.ts.map +0 -0
- package/dist-extensions/src/util/internals/uid.d.ts +0 -0
- package/dist-extensions/src/util/internals/uid.d.ts.map +0 -0
- package/dist-extensions/src/util/lang_string.d.ts +0 -0
- package/dist-extensions/src/util/lang_string.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/boundingBoxFromPoints.d.ts +0 -0
- package/dist-extensions/src/util/misc/boundingBoxFromPoints.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/capValue.d.ts +0 -0
- package/dist-extensions/src/util/misc/capValue.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/cos.d.ts +0 -0
- package/dist-extensions/src/util/misc/cos.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/dom.d.ts +0 -0
- package/dist-extensions/src/util/misc/dom.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/findScaleTo.d.ts +0 -0
- package/dist-extensions/src/util/misc/findScaleTo.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/groupSVGElements.d.ts +0 -0
- package/dist-extensions/src/util/misc/groupSVGElements.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/isTransparent.d.ts +0 -0
- package/dist-extensions/src/util/misc/isTransparent.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/matrix.d.ts +0 -0
- package/dist-extensions/src/util/misc/matrix.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/mergeClipPaths.d.ts +0 -0
- package/dist-extensions/src/util/misc/mergeClipPaths.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/objectEnlive.d.ts +0 -0
- package/dist-extensions/src/util/misc/objectEnlive.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/objectTransforms.d.ts +0 -0
- package/dist-extensions/src/util/misc/objectTransforms.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/pick.d.ts +0 -0
- package/dist-extensions/src/util/misc/pick.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/planeChange.d.ts +0 -0
- package/dist-extensions/src/util/misc/planeChange.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +0 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +0 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +0 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/projectStroke/index.d.ts +0 -0
- package/dist-extensions/src/util/misc/projectStroke/index.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/projectStroke/types.d.ts +0 -0
- package/dist-extensions/src/util/misc/projectStroke/types.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/radiansDegreesConversion.d.ts +0 -0
- package/dist-extensions/src/util/misc/radiansDegreesConversion.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/resolveOrigin.d.ts +0 -0
- package/dist-extensions/src/util/misc/resolveOrigin.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/sin.d.ts +0 -0
- package/dist-extensions/src/util/misc/sin.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/svgExport.d.ts +0 -0
- package/dist-extensions/src/util/misc/svgExport.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/svgParsing.d.ts +0 -0
- package/dist-extensions/src/util/misc/svgParsing.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/textStyles.d.ts +0 -0
- package/dist-extensions/src/util/misc/textStyles.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/toFixed.d.ts +0 -0
- package/dist-extensions/src/util/misc/toFixed.d.ts.map +0 -0
- package/dist-extensions/src/util/misc/vectors.d.ts +0 -0
- package/dist-extensions/src/util/misc/vectors.d.ts.map +0 -0
- package/dist-extensions/src/util/path/index.d.ts +0 -0
- package/dist-extensions/src/util/path/index.d.ts.map +0 -0
- package/dist-extensions/src/util/path/regex.d.ts +0 -0
- package/dist-extensions/src/util/path/regex.d.ts.map +0 -0
- package/dist-extensions/src/util/path/typedefs.d.ts +0 -0
- package/dist-extensions/src/util/path/typedefs.d.ts.map +0 -0
- package/dist-extensions/src/util/transform_matrix_removal.d.ts +0 -0
- package/dist-extensions/src/util/transform_matrix_removal.d.ts.map +0 -0
- package/dist-extensions/src/util/typeAssertions.d.ts +0 -0
- package/dist-extensions/src/util/typeAssertions.d.ts.map +0 -0
- package/eslint.config.mjs +0 -0
- package/examples/overlay-edit.html +416 -416
- package/extensions/README.MD +0 -0
- package/extensions/aligning_guidelines/README.MD +0 -0
- package/extensions/aligning_guidelines/constant.ts +0 -0
- package/extensions/aligning_guidelines/index.ts +0 -0
- package/extensions/aligning_guidelines/typedefs.ts +0 -0
- package/extensions/aligning_guidelines/util/basic.spec.ts +0 -0
- package/extensions/aligning_guidelines/util/basic.ts +0 -0
- package/extensions/aligning_guidelines/util/collect-line.ts +0 -0
- package/extensions/aligning_guidelines/util/collect-point.ts +0 -0
- package/extensions/aligning_guidelines/util/draw.ts +0 -0
- package/extensions/aligning_guidelines/util/get-objects-by-target.ts +0 -0
- package/extensions/data_updaters/README.md +0 -0
- package/extensions/data_updaters/gradient/__snapshots__/index.spec.ts.snap +0 -0
- package/extensions/data_updaters/gradient/index.spec.ts +0 -0
- package/extensions/data_updaters/gradient/index.ts +0 -0
- package/extensions/data_updaters/origins/README.md +0 -0
- package/extensions/data_updaters/origins/index.spec.ts +0 -0
- package/extensions/data_updaters/origins/index.ts +0 -0
- package/extensions/index.ts +0 -0
- package/fabric-test-editor.html +591 -0
- package/fabric.ts +0 -0
- package/index.node.ts +0 -0
- package/index.ts +0 -0
- package/lib/aligning_guidelines.js +0 -0
- package/lib/centering_guidelines.js +0 -0
- package/lib/event.js +0 -0
- package/package.json +1 -1
- package/playwright.config.ts +0 -0
- package/playwright.setup.ts +0 -0
- package/publish-next.js +0 -0
- package/publish.js +0 -0
- package/rollup.config.mjs +0 -0
- package/scripts/bench-text.js +591 -591
- package/scripts/build.mjs +0 -0
- package/scripts/buildLock.mjs +0 -0
- package/scripts/buildReporter.mjs +0 -0
- package/scripts/buildStats.mjs +0 -0
- package/scripts/dirname.mjs +0 -0
- package/scripts/git.mjs +0 -0
- package/scripts/index.mjs +0 -0
- package/scripts/sandbox.mjs +0 -0
- package/src/ClassRegistry.spec.ts +0 -0
- package/src/ClassRegistry.ts +0 -0
- package/src/Collection.spec.ts +0 -0
- package/src/Collection.ts +0 -0
- package/src/CommonMethods.ts +0 -0
- package/src/EventTypeDefs.ts +0 -0
- package/src/Intersection.spec.ts +0 -0
- package/src/Intersection.ts +0 -0
- package/src/LayoutManager/ActiveSelectionLayoutManager.spec.ts +0 -0
- package/src/LayoutManager/ActiveSelectionLayoutManager.ts +0 -0
- package/src/LayoutManager/LayoutManager.spec.ts +0 -0
- package/src/LayoutManager/LayoutManager.ts +0 -0
- package/src/LayoutManager/LayoutStrategies/ClipPathLayout.ts +0 -0
- package/src/LayoutManager/LayoutStrategies/FitContentLayout.ts +0 -0
- package/src/LayoutManager/LayoutStrategies/FixedLayout.ts +0 -0
- package/src/LayoutManager/LayoutStrategies/LayoutStrategy.ts +0 -0
- package/src/LayoutManager/LayoutStrategies/utils.ts +0 -0
- package/src/LayoutManager/README.md +0 -0
- package/src/LayoutManager/__snapshots__/LayoutManager.spec.ts.snap +0 -0
- package/src/LayoutManager/constants.ts +0 -0
- package/src/LayoutManager/index.ts +0 -0
- package/src/LayoutManager/types.ts +0 -0
- package/src/Observable.spec.ts +0 -0
- package/src/Observable.ts +0 -0
- package/src/Pattern/Pattern.spec.ts +0 -0
- package/src/Pattern/Pattern.ts +0 -0
- package/src/Pattern/index.ts +0 -0
- package/src/Pattern/types.ts +0 -0
- package/src/Point.spec.ts +0 -0
- package/src/Point.ts +0 -0
- package/src/Shadow.spec.ts +0 -0
- package/src/Shadow.ts +0 -0
- package/src/__snapshots__/Shadow.spec.ts.snap +0 -0
- package/src/brushes/BaseBrush.spec.ts +0 -0
- package/src/brushes/BaseBrush.ts +0 -0
- package/src/brushes/CircleBrush.test.ts +0 -0
- package/src/brushes/CircleBrush.ts +0 -0
- package/src/brushes/PatternBrush.ts +0 -0
- package/src/brushes/PencilBrush.spec.ts +0 -0
- package/src/brushes/PencilBrush.ts +0 -0
- package/src/brushes/SprayBrush.ts +0 -0
- package/src/brushes/__snapshots__/PencilBrush.spec.ts.snap +0 -0
- package/src/brushes/typedefs.ts +0 -0
- package/src/cache.spec.ts +0 -0
- package/src/cache.ts +0 -0
- package/src/canvas/Canvas-dispose.spec.ts +0 -0
- package/src/canvas/Canvas-events.spec.ts +0 -0
- package/src/canvas/Canvas.spec.ts +0 -0
- package/src/canvas/Canvas.ts +0 -0
- package/src/canvas/CanvasOptions.ts +0 -0
- package/src/canvas/DOMManagers/CanvasDOMManager.ts +0 -0
- package/src/canvas/DOMManagers/StaticCanvasDOMManager.ts +0 -0
- package/src/canvas/DOMManagers/util.spec.ts +0 -0
- package/src/canvas/DOMManagers/util.ts +0 -0
- package/src/canvas/SelectableCanvas.spec.ts +0 -0
- package/src/canvas/SelectableCanvas.ts +0 -0
- package/src/canvas/StaticCanvas.spec.ts +0 -0
- package/src/canvas/StaticCanvas.ts +0 -0
- package/src/canvas/StaticCanvasOptions.ts +0 -0
- package/src/canvas/TextEditingManager.ts +0 -0
- package/src/canvas/__tests__/SelectableCanvas.spec.ts +0 -0
- package/src/canvas/__tests__/__snapshots__/eventData.test.ts.snap +0 -0
- package/src/canvas/__tests__/eventData.test.ts +0 -0
- package/src/canvas/canvas_gestures.mixin.ts +0 -0
- package/src/color/Color.ts +0 -0
- package/src/color/color.test.ts +0 -0
- package/src/color/color_map.ts +0 -0
- package/src/color/constants.ts +0 -0
- package/src/color/typedefs.ts +0 -0
- package/src/color/util.ts +0 -0
- package/src/config.ts +0 -0
- package/src/constants.ts +0 -0
- package/src/controls/Control-cursor.spec.ts +0 -0
- package/src/controls/Control-handlers.spec.ts +0 -0
- package/src/controls/Control.spec.ts +0 -0
- package/src/controls/Control.ts +0 -0
- package/src/controls/changeHeight.ts +0 -0
- package/src/controls/changeWidth.test.ts +0 -0
- package/src/controls/changeWidth.ts +0 -0
- package/src/controls/commonControls.ts +0 -0
- package/src/controls/controlRendering.ts +0 -0
- package/src/controls/drag.ts +0 -0
- package/src/controls/fireEvent.ts +0 -0
- package/src/controls/index.ts +0 -0
- package/src/controls/pathControl.spec.ts +0 -0
- package/src/controls/pathControl.ts +0 -0
- package/src/controls/polyControl.spec.ts +0 -0
- package/src/controls/polyControl.ts +0 -0
- package/src/controls/rotate.ts +0 -0
- package/src/controls/scale.test.ts +0 -0
- package/src/controls/scale.ts +0 -0
- package/src/controls/scaleSkew.ts +0 -0
- package/src/controls/skew.ts +0 -0
- package/src/controls/util.ts +0 -0
- package/src/controls/wrapWithFireEvent.ts +0 -0
- package/src/controls/wrapWithFixedAnchor.spec.ts +0 -0
- package/src/controls/wrapWithFixedAnchor.ts +0 -0
- package/src/env/browser.ts +0 -0
- package/src/env/env.spec.ts +0 -0
- package/src/env/index.ts +0 -0
- package/src/env/node.ts +0 -0
- package/src/env/types.ts +0 -0
- package/src/filters/BaseFilter.spec.ts +0 -0
- package/src/filters/BaseFilter.ts +0 -0
- package/src/filters/BlendColor.ts +0 -0
- package/src/filters/BlendImage.ts +0 -0
- package/src/filters/Blur.ts +0 -0
- package/src/filters/Boilerplate.ts +0 -0
- package/src/filters/Brightness.ts +0 -0
- package/src/filters/Canvas2dFilterBackend.ts +0 -0
- package/src/filters/ColorMatrix.spec.ts +0 -0
- package/src/filters/ColorMatrix.ts +0 -0
- package/src/filters/ColorMatrixFilters.ts +0 -0
- package/src/filters/Composed.ts +0 -0
- package/src/filters/Contrast.ts +0 -0
- package/src/filters/Convolute.ts +0 -0
- package/src/filters/FilterBackend.ts +0 -0
- package/src/filters/GLProbes/GLProbe.ts +0 -0
- package/src/filters/GLProbes/NodeGLProbe.ts +0 -0
- package/src/filters/GLProbes/WebGLProbe.ts +0 -0
- package/src/filters/Gamma.ts +0 -0
- package/src/filters/Grayscale.ts +0 -0
- package/src/filters/HueRotation.ts +0 -0
- package/src/filters/Invert.ts +0 -0
- package/src/filters/Noise.ts +0 -0
- package/src/filters/Pixelate.ts +0 -0
- package/src/filters/RemoveColor.ts +0 -0
- package/src/filters/Resize.ts +0 -0
- package/src/filters/Saturation.ts +0 -0
- package/src/filters/Vibrance.ts +0 -0
- package/src/filters/WebGLFilterBackend.spec.ts +0 -0
- package/src/filters/WebGLFilterBackend.ts +0 -0
- package/src/filters/filters.ts +0 -0
- package/src/filters/index.ts +0 -0
- package/src/filters/shaders/baseFilter.ts +0 -0
- package/src/filters/shaders/blendColor.ts +0 -0
- package/src/filters/shaders/blendImage.ts +0 -0
- package/src/filters/shaders/blur.ts +0 -0
- package/src/filters/shaders/brightness.ts +0 -0
- package/src/filters/shaders/colorMatrix.ts +0 -0
- package/src/filters/shaders/constrast.ts +0 -0
- package/src/filters/shaders/convolute.ts +0 -0
- package/src/filters/shaders/gamma.ts +0 -0
- package/src/filters/shaders/grayscale.ts +0 -0
- package/src/filters/shaders/invert.ts +0 -0
- package/src/filters/shaders/noise.ts +0 -0
- package/src/filters/shaders/pixelate.ts +0 -0
- package/src/filters/shaders/removeColor.ts +0 -0
- package/src/filters/shaders/saturation.ts +0 -0
- package/src/filters/shaders/vibrance.ts +0 -0
- package/src/filters/typedefs.ts +0 -0
- package/src/filters/utils.ts +0 -0
- package/src/gradient/Gradient.spec.ts +0 -0
- package/src/gradient/Gradient.ts +0 -0
- package/src/gradient/constants.ts +0 -0
- package/src/gradient/index.ts +0 -0
- package/src/gradient/parser/misc.ts +0 -0
- package/src/gradient/parser/parseColorStops.ts +0 -0
- package/src/gradient/parser/parseCoords.ts +0 -0
- package/src/gradient/typedefs.ts +0 -0
- package/src/mixins/eraser_brush.mixin.ts +0 -0
- package/src/parkinglot/canvas_animation.mixin.ts +0 -0
- package/src/parkinglot/straighten.ts +0 -0
- package/src/parser/applyViewboxTransform.spec.ts +0 -0
- package/src/parser/applyViewboxTransform.ts +0 -0
- package/src/parser/attributes.ts +0 -0
- package/src/parser/constants.spec.ts +0 -0
- package/src/parser/constants.ts +0 -0
- package/src/parser/doesSomeParentMatch.ts +0 -0
- package/src/parser/elementMatchesRule.ts +0 -0
- package/src/parser/elements_parser.ts +0 -0
- package/src/parser/getCSSRules.spec.ts +0 -0
- package/src/parser/getCSSRules.ts +0 -0
- package/src/parser/getGlobalStylesForElement.ts +0 -0
- package/src/parser/getGradientDefs.ts +0 -0
- package/src/parser/getMultipleNodes.ts +0 -0
- package/src/parser/getSvgRegex.ts +0 -0
- package/src/parser/getTagName.ts +0 -0
- package/src/parser/hasInvalidAncestor.ts +0 -0
- package/src/parser/loadSVGFromString.test.ts +0 -0
- package/src/parser/loadSVGFromString.ts +0 -0
- package/src/parser/loadSVGFromURL.ts +0 -0
- package/src/parser/normalizeAttr.ts +0 -0
- package/src/parser/normalizeValue.ts +0 -0
- package/src/parser/parseAttributes.ts +0 -0
- package/src/parser/parseFontDeclaration.ts +0 -0
- package/src/parser/parsePointsAttribute.ts +0 -0
- package/src/parser/parseSVGDocument.ts +0 -0
- package/src/parser/parseStyleAttribute.ts +0 -0
- package/src/parser/parseStyleObject.ts +0 -0
- package/src/parser/parseStyleString.ts +0 -0
- package/src/parser/parseTransformAttribute.ts +0 -0
- package/src/parser/parseUseDirectives.test.ts +0 -0
- package/src/parser/parseUseDirectives.ts +0 -0
- package/src/parser/parser.spec.ts +0 -0
- package/src/parser/percent.ts +0 -0
- package/src/parser/recursivelyParseGradientsXlink.ts +0 -0
- package/src/parser/selectorMatches.ts +0 -0
- package/src/parser/setStrokeFillOpacity.ts +0 -0
- package/src/parser/typedefs.ts +0 -0
- package/src/shapes/ActiveSelection.spec.ts +0 -0
- package/src/shapes/ActiveSelection.ts +0 -0
- package/src/shapes/Circle.spec.ts +0 -0
- package/src/shapes/Circle.ts +0 -0
- package/src/shapes/Ellipse.spec.ts +0 -0
- package/src/shapes/Ellipse.ts +0 -0
- package/src/shapes/Group.spec.ts +0 -0
- package/src/shapes/Group.ts +0 -0
- package/src/shapes/IText/DraggableTextDelegate.ts +0 -0
- package/src/shapes/IText/IText-click-behavior.spec.ts +0 -0
- package/src/shapes/IText/IText.test.ts +0 -0
- package/src/shapes/IText/IText.ts +846 -846
- package/src/shapes/IText/ITextBehavior.test.ts +0 -0
- package/src/shapes/IText/ITextBehavior.ts +1176 -1176
- package/src/shapes/IText/ITextClickBehavior.ts +254 -254
- package/src/shapes/IText/ITextKeyBehavior.test.ts +0 -0
- package/src/shapes/IText/ITextKeyBehavior.ts +0 -0
- package/src/shapes/IText/__snapshots__/IText.test.ts.snap +0 -0
- package/src/shapes/IText/__snapshots__/ITextBehavior.test.ts.snap +0 -0
- package/src/shapes/IText/constants.ts +0 -0
- package/src/shapes/Image-filters.spec.ts +0 -0
- package/src/shapes/Image.spec.ts +0 -0
- package/src/shapes/Image.ts +0 -0
- package/src/shapes/Line.spec.ts +0 -0
- package/src/shapes/Line.ts +0 -0
- package/src/shapes/Object/FabricObject.spec.ts +0 -0
- package/src/shapes/Object/FabricObject.ts +0 -0
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +0 -0
- package/src/shapes/Object/InteractiveObject.spec.ts +0 -0
- package/src/shapes/Object/InteractiveObject.ts +0 -0
- package/src/shapes/Object/Object-clip-path.spec.ts +0 -0
- package/src/shapes/Object/Object-interactivity.spec.ts +0 -0
- package/src/shapes/Object/Object.spec.ts +0 -0
- package/src/shapes/Object/Object.ts +0 -0
- package/src/shapes/Object/ObjectGeometry.spec.ts +0 -0
- package/src/shapes/Object/ObjectGeometry.ts +0 -0
- package/src/shapes/Object/ObjectOrigin.spec.ts +0 -0
- package/src/shapes/Object/ObjectSerialization.spec.ts +0 -0
- package/src/shapes/Object/StackedObject.spec.ts +0 -0
- package/src/shapes/Object/__snapshots__/InteractiveObject.spec.ts.snap +0 -0
- package/src/shapes/Object/defaultValues.ts +0 -0
- package/src/shapes/Object/types/BaseProps.ts +0 -0
- package/src/shapes/Object/types/BorderProps.ts +0 -0
- package/src/shapes/Object/types/ControlProps.ts +0 -0
- package/src/shapes/Object/types/FabricObjectProps.ts +0 -0
- package/src/shapes/Object/types/FillStrokeProps.ts +0 -0
- package/src/shapes/Object/types/LockInteractionProps.ts +0 -0
- package/src/shapes/Object/types/ObjectProps.ts +0 -0
- package/src/shapes/Object/types/ObjectTransformProps.ts +0 -0
- package/src/shapes/Object/types/SerializedObjectProps.ts +0 -0
- package/src/shapes/Object/types/index.ts +0 -0
- package/src/shapes/Path.spec.ts +0 -0
- package/src/shapes/Path.ts +0 -0
- package/src/shapes/Polygon.spec.ts +0 -0
- package/src/shapes/Polygon.ts +0 -0
- package/src/shapes/Polyline.spec.ts +0 -0
- package/src/shapes/Polyline.ts +0 -0
- package/src/shapes/Rect.spec.ts +0 -0
- package/src/shapes/Rect.ts +0 -0
- package/src/shapes/Text/StyledText.spec.ts +0 -0
- package/src/shapes/Text/StyledText.ts +0 -0
- package/src/shapes/Text/Text.spec.ts +0 -0
- package/src/shapes/Text/Text.ts +2226 -2161
- package/src/shapes/Text/TextSVGExportMixin.spec.ts +0 -0
- package/src/shapes/Text/TextSVGExportMixin.ts +0 -0
- package/src/shapes/Text/__snapshots__/Text.spec.ts.snap +0 -0
- package/src/shapes/Text/__snapshots__/TextSVGExportMixin.spec.ts.snap +0 -0
- package/src/shapes/Text/constants.ts +134 -134
- package/src/shapes/Textbox.spec.ts +0 -0
- package/src/shapes/Textbox.ts +788 -669
- package/src/shapes/Triangle.ts +0 -0
- package/src/shapes/__snapshots__/Image.spec.ts.snap +0 -0
- package/src/shapes/__snapshots__/Textbox.spec.ts.snap +0 -0
- package/src/text/browserLines.ts +233 -233
- package/src/text/ellipsis.ts +516 -516
- package/src/text/hitTest.ts +623 -623
- package/src/text/layout.ts +586 -586
- package/src/text/measure.ts +475 -475
- package/src/text/overlayEditor.ts +1035 -637
- package/src/text/unicode.ts +454 -454
- package/src/typedefs.ts +0 -0
- package/src/util/__snapshots__/index.spec.ts.snap +0 -0
- package/src/util/animation/AnimationBase.ts +0 -0
- package/src/util/animation/AnimationFrameProvider.ts +0 -0
- package/src/util/animation/AnimationRegistry.ts +0 -0
- package/src/util/animation/ArrayAnimation.ts +0 -0
- package/src/util/animation/ColorAnimation.ts +0 -0
- package/src/util/animation/ValueAnimation.ts +0 -0
- package/src/util/animation/__snapshots__/animations.spec.ts.snap +0 -0
- package/src/util/animation/animate.ts +0 -0
- package/src/util/animation/animations.spec.ts +0 -0
- package/src/util/animation/easing.ts +0 -0
- package/src/util/animation/index.ts +0 -0
- package/src/util/animation/types.ts +0 -0
- package/src/util/applyMixins.ts +0 -0
- package/src/util/dom_event.spec.ts +0 -0
- package/src/util/dom_event.ts +0 -0
- package/src/util/dom_misc.ts +0 -0
- package/src/util/index.spec.ts +0 -0
- package/src/util/index.ts +0 -0
- package/src/util/internals/applyCanvasTransform.ts +0 -0
- package/src/util/internals/cleanupSvgAttribute.test.ts +0 -0
- package/src/util/internals/cleanupSvgAttribute.ts +0 -0
- package/src/util/internals/cloneStyles.spec.ts +0 -0
- package/src/util/internals/cloneStyles.ts +0 -0
- package/src/util/internals/console.ts +0 -0
- package/src/util/internals/dom_style.spec.ts +0 -0
- package/src/util/internals/dom_style.ts +0 -0
- package/src/util/internals/findRight.ts +0 -0
- package/src/util/internals/getRandomInt.test.ts +0 -0
- package/src/util/internals/getRandomInt.ts +0 -0
- package/src/util/internals/ifNaN.ts +0 -0
- package/src/util/internals/removeFromArray.spec.ts +0 -0
- package/src/util/internals/removeFromArray.ts +0 -0
- package/src/util/internals/uid.ts +0 -0
- package/src/util/lang_string.spec.ts +0 -0
- package/src/util/lang_string.ts +0 -0
- package/src/util/misc/boundingBoxFromPoints.spec.ts +0 -0
- package/src/util/misc/boundingBoxFromPoints.ts +0 -0
- package/src/util/misc/capValue.spec.ts +0 -0
- package/src/util/misc/capValue.ts +0 -0
- package/src/util/misc/cos.spec.ts +0 -0
- package/src/util/misc/cos.ts +0 -0
- package/src/util/misc/dom.spec.ts +0 -0
- package/src/util/misc/dom.ts +0 -0
- package/src/util/misc/findScaleTo.spec.ts +0 -0
- package/src/util/misc/findScaleTo.ts +0 -0
- package/src/util/misc/groupSVGElements.spec.ts +0 -0
- package/src/util/misc/groupSVGElements.ts +0 -0
- package/src/util/misc/isTransparent.ts +0 -0
- package/src/util/misc/matrix.spec.ts +0 -0
- package/src/util/misc/matrix.ts +0 -0
- package/src/util/misc/mergeClipPaths.spec.ts +0 -0
- package/src/util/misc/mergeClipPaths.ts +0 -0
- package/src/util/misc/objectEnlive.spec.ts +0 -0
- package/src/util/misc/objectEnlive.ts +0 -0
- package/src/util/misc/objectTransforms.spec.ts +0 -0
- package/src/util/misc/objectTransforms.ts +0 -0
- package/src/util/misc/pick.spec.ts +0 -0
- package/src/util/misc/pick.ts +0 -0
- package/src/util/misc/planeChange.spec.ts +0 -0
- package/src/util/misc/planeChange.ts +0 -0
- package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +0 -0
- package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +0 -0
- package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +0 -0
- package/src/util/misc/projectStroke/index.ts +0 -0
- package/src/util/misc/projectStroke/types.ts +0 -0
- package/src/util/misc/radiansDegreesConversion.spec.ts +0 -0
- package/src/util/misc/radiansDegreesConversion.ts +0 -0
- package/src/util/misc/resolveOrigin.ts +0 -0
- package/src/util/misc/sin.ts +0 -0
- package/src/util/misc/svgExport.ts +0 -0
- package/src/util/misc/svgParsing.spec.ts +0 -0
- package/src/util/misc/svgParsing.ts +0 -0
- package/src/util/misc/textStyles.ts +0 -0
- package/src/util/misc/toFixed.spec.ts +0 -0
- package/src/util/misc/toFixed.ts +0 -0
- package/src/util/misc/vectors.spec.ts +0 -0
- package/src/util/misc/vectors.ts +0 -0
- package/src/util/path/__snapshots__/index.spec.ts.snap +0 -0
- package/src/util/path/index.spec.ts +0 -0
- package/src/util/path/index.ts +0 -0
- package/src/util/path/regex.ts +0 -0
- package/src/util/path/typechecks.ts +0 -0
- package/src/util/path/typedefs.ts +0 -0
- package/src/util/transform_matrix_removal.ts +0 -0
- package/src/util/typeAssertions.spec.ts +0 -0
- package/src/util/typeAssertions.ts +0 -0
- package/tsconfig-extensions.json +0 -0
- package/tsconfig.json +0 -0
- package/tsconfig.spec.json +0 -0
- package/typedoc.config.json +0 -0
- package/vitest.config.ts +0 -0
- package/vitest.d.ts +0 -0
- package/vitest.env.d.ts +0 -0
- package/vitest.extend.ts +0 -0
- package/vitest.setup.ts +0 -0
- package/docs/fabric-konva-gap-analysis.md +0 -274
- package/docs/konva-text-behavior-spec.md +0 -265
- package/docs/text-engine-design.md +0 -698
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ellipsis.mjs","sources":["../../../src/text/ellipsis.ts"],"sourcesContent":["/**\r\n * Ellipsis Text Truncation System\r\n * \r\n * Implements text truncation with ellipsis when content exceeds bounds,\r\n * using binary search for optimal truncation points.\r\n */\r\n\r\nimport { segmentGraphemes } from './unicode';\r\n\r\nexport interface EllipsisOptions {\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n ellipsisChar: string; // Default: \"…\"\r\n measureFn: (text: string) => number | { width: number; height: number };\r\n}\r\n\r\nexport interface EllipsisResult {\r\n truncatedText: string;\r\n isTruncated: boolean;\r\n truncationIndex: number; // Grapheme index where truncation occurred\r\n ellipsisWidth: number;\r\n originalLength: number;\r\n}\r\n\r\n/**\r\n * Apply ellipsis truncation to text based on width/height constraints\r\n */\r\nexport function applyEllipsis(\r\n text: string,\r\n options: EllipsisOptions\r\n): EllipsisResult {\r\n const { maxWidth, maxHeight, ellipsisChar, measureFn } = options;\r\n \r\n if (!text) {\r\n return {\r\n truncatedText: '',\r\n isTruncated: false,\r\n truncationIndex: 0,\r\n ellipsisWidth: 0,\r\n originalLength: 0,\r\n };\r\n }\r\n\r\n // Measure ellipsis width\r\n const ellipsisWidth = typeof measureFn(ellipsisChar) === 'number' \r\n ? measureFn(ellipsisChar) as number\r\n : (measureFn(ellipsisChar) as { width: number }).width;\r\n\r\n // Check if truncation is needed\r\n const originalMeasurement = measureFn(text);\r\n const originalWidth = typeof originalMeasurement === 'number' \r\n ? originalMeasurement \r\n : originalMeasurement.width;\r\n const originalHeight = typeof originalMeasurement === 'number'\r\n ? 0 // Height constraint not applicable for single dimension measure\r\n : originalMeasurement.height;\r\n\r\n let needsTruncation = false;\r\n if (maxWidth && originalWidth > maxWidth) needsTruncation = true;\r\n if (maxHeight && originalHeight > maxHeight) needsTruncation = true;\r\n\r\n if (!needsTruncation) {\r\n return {\r\n truncatedText: text,\r\n isTruncated: false,\r\n truncationIndex: segmentGraphemes(text).length,\r\n ellipsisWidth,\r\n originalLength: segmentGraphemes(text).length,\r\n };\r\n }\r\n\r\n // Apply width-based truncation\r\n if (maxWidth) {\r\n const widthTruncated = truncateByWidth(text, maxWidth, ellipsisChar, ellipsisWidth, measureFn);\r\n return {\r\n ...widthTruncated,\r\n ellipsisWidth,\r\n originalLength: segmentGraphemes(text).length,\r\n };\r\n }\r\n\r\n // Apply height-based truncation (for multi-line text)\r\n if (maxHeight) {\r\n const heightTruncated = truncateByHeight(text, maxHeight, ellipsisChar, measureFn);\r\n return {\r\n ...heightTruncated,\r\n ellipsisWidth,\r\n originalLength: segmentGraphemes(text).length,\r\n };\r\n }\r\n\r\n // Fallback - should not reach here\r\n return {\r\n truncatedText: text,\r\n isTruncated: false,\r\n truncationIndex: segmentGraphemes(text).length,\r\n ellipsisWidth,\r\n originalLength: segmentGraphemes(text).length,\r\n };\r\n}\r\n\r\n/**\r\n * Truncate text based on width constraint using binary search\r\n */\r\nfunction truncateByWidth(\r\n text: string,\r\n maxWidth: number,\r\n ellipsisChar: string,\r\n ellipsisWidth: number,\r\n measureFn: (text: string) => number | { width: number; height: number }\r\n): Omit<EllipsisResult, 'ellipsisWidth' | 'originalLength'> {\r\n const graphemes = segmentGraphemes(text);\r\n const availableWidth = maxWidth - ellipsisWidth;\r\n\r\n // Binary search for optimal truncation point\r\n let low = 0;\r\n let high = graphemes.length;\r\n let bestFit = 0;\r\n\r\n while (low <= high) {\r\n const mid = Math.floor((low + high) / 2);\r\n const candidate = graphemes.slice(0, mid).join('');\r\n \r\n const measurement = measureFn(candidate);\r\n const candidateWidth = typeof measurement === 'number' \r\n ? measurement \r\n : measurement.width;\r\n\r\n if (candidateWidth <= availableWidth) {\r\n bestFit = mid;\r\n low = mid + 1;\r\n } else {\r\n high = mid - 1;\r\n }\r\n }\r\n\r\n // Handle edge cases\r\n if (bestFit === 0) {\r\n // Even single character doesn't fit - return ellipsis only\r\n return {\r\n truncatedText: ellipsisChar,\r\n isTruncated: true,\r\n truncationIndex: 0,\r\n };\r\n }\r\n\r\n if (bestFit === graphemes.length) {\r\n // Everything fits even with ellipsis space reserved\r\n return {\r\n truncatedText: text,\r\n isTruncated: false,\r\n truncationIndex: graphemes.length,\r\n };\r\n }\r\n\r\n // Create truncated text with ellipsis\r\n const truncatedText = graphemes.slice(0, bestFit).join('') + ellipsisChar;\r\n\r\n return {\r\n truncatedText,\r\n isTruncated: true,\r\n truncationIndex: bestFit,\r\n };\r\n}\r\n\r\n/**\r\n * Truncate text based on height constraint\r\n */\r\nfunction truncateByHeight(\r\n text: string,\r\n maxHeight: number,\r\n ellipsisChar: string,\r\n measureFn: (text: string) => number | { width: number; height: number }\r\n): Omit<EllipsisResult, 'ellipsisWidth' | 'originalLength'> {\r\n const lines = text.split('\\n');\r\n let accumulatedText = '';\r\n let lineIndex = 0;\r\n\r\n // Add lines until height exceeded\r\n for (lineIndex = 0; lineIndex < lines.length; lineIndex++) {\r\n const testText = lineIndex === 0 \r\n ? lines[lineIndex] \r\n : accumulatedText + '\\n' + lines[lineIndex];\r\n \r\n const measurement = measureFn(testText);\r\n const height = typeof measurement === 'number' \r\n ? 0 // Single dimension measure doesn't provide height\r\n : measurement.height;\r\n\r\n if (height > maxHeight && accumulatedText) {\r\n // Previous text fits, current doesn't - truncate at previous\r\n break;\r\n }\r\n\r\n accumulatedText = testText;\r\n\r\n // If this is the last line and it fits, no truncation needed\r\n if (lineIndex === lines.length - 1) {\r\n return {\r\n truncatedText: text,\r\n isTruncated: false,\r\n truncationIndex: segmentGraphemes(text).length,\r\n };\r\n }\r\n }\r\n\r\n // If we need to truncate the last fitting line to add ellipsis\r\n if (lineIndex > 0) {\r\n const lastFittingLine = lines[lineIndex - 1];\r\n const withEllipsis = lastFittingLine + ellipsisChar;\r\n const graphemes = segmentGraphemes(accumulatedText);\r\n\r\n return {\r\n truncatedText: accumulatedText.replace(/[^\\n]*$/, withEllipsis),\r\n isTruncated: true,\r\n truncationIndex: graphemes.length - segmentGraphemes(lastFittingLine).length + segmentGraphemes(withEllipsis).length - 1,\r\n };\r\n }\r\n\r\n // First line doesn't fit - try width-based truncation on first line\r\n const firstLineWidth = typeof measureFn === 'function' \r\n ? (measureFn(lines[0]) as any)?.width || 1000\r\n : 1000; // Fallback width\r\n\r\n return truncateByWidth(lines[0], firstLineWidth, ellipsisChar, 0, measureFn);\r\n}\r\n\r\n/**\r\n * Find optimal truncation point using binary search\r\n */\r\nexport function findTruncationPoint(\r\n text: string,\r\n maxWidth: number,\r\n ellipsisWidth: number,\r\n measureFn: (text: string) => number\r\n): number {\r\n const graphemes = segmentGraphemes(text);\r\n const availableWidth = maxWidth - ellipsisWidth;\r\n\r\n let low = 0;\r\n let high = graphemes.length;\r\n\r\n while (low < high) {\r\n const mid = Math.floor((low + high + 1) / 2);\r\n const candidate = graphemes.slice(0, mid).join('');\r\n const width = measureFn(candidate);\r\n\r\n if (width <= availableWidth) {\r\n low = mid;\r\n } else {\r\n high = mid - 1;\r\n }\r\n }\r\n\r\n return low;\r\n}\r\n\r\n/**\r\n * Smart truncation that tries to break at word boundaries\r\n */\r\nexport function smartTruncate(\r\n text: string,\r\n maxWidth: number,\r\n ellipsisChar: string,\r\n measureFn: (text: string) => number\r\n): EllipsisResult {\r\n const ellipsisWidth = measureFn(ellipsisChar);\r\n const availableWidth = maxWidth - ellipsisWidth;\r\n \r\n // First try exact truncation\r\n const exactPoint = findTruncationPoint(text, maxWidth, ellipsisWidth, measureFn);\r\n const graphemes = segmentGraphemes(text);\r\n \r\n if (exactPoint === 0) {\r\n return {\r\n truncatedText: ellipsisChar,\r\n isTruncated: true,\r\n truncationIndex: 0,\r\n ellipsisWidth,\r\n originalLength: graphemes.length,\r\n };\r\n }\r\n\r\n if (exactPoint >= graphemes.length) {\r\n return {\r\n truncatedText: text,\r\n isTruncated: false,\r\n truncationIndex: graphemes.length,\r\n ellipsisWidth,\r\n originalLength: graphemes.length,\r\n };\r\n }\r\n\r\n // Try to find a word boundary before the exact point\r\n const textUpToPoint = graphemes.slice(0, exactPoint).join('');\r\n const words = textUpToPoint.split(/(\\s+)/);\r\n \r\n if (words.length > 1) {\r\n // Try truncating at last complete word\r\n const wordsWithoutLast = words.slice(0, -2); // Remove last word and space\r\n const wordBoundaryText = wordsWithoutLast.join('');\r\n const wordBoundaryWidth = measureFn(wordBoundaryText);\r\n \r\n if (wordBoundaryWidth + ellipsisWidth <= maxWidth && wordBoundaryText.trim()) {\r\n const wordBoundaryGraphemes = segmentGraphemes(wordBoundaryText);\r\n return {\r\n truncatedText: wordBoundaryText.trim() + ellipsisChar,\r\n isTruncated: true,\r\n truncationIndex: wordBoundaryGraphemes.length,\r\n ellipsisWidth,\r\n originalLength: graphemes.length,\r\n };\r\n }\r\n }\r\n\r\n // Fall back to character truncation\r\n return {\r\n truncatedText: graphemes.slice(0, exactPoint).join('') + ellipsisChar,\r\n isTruncated: true,\r\n truncationIndex: exactPoint,\r\n ellipsisWidth,\r\n originalLength: graphemes.length,\r\n };\r\n}\r\n\r\n/**\r\n * Truncate multi-line text with ellipsis on the last visible line\r\n */\r\nexport function truncateMultiline(\r\n lines: string[],\r\n maxLines: number,\r\n ellipsisChar: string,\r\n maxWidth?: number,\r\n measureFn?: (text: string) => number\r\n): {\r\n truncatedLines: string[];\r\n isTruncated: boolean;\r\n lastLineIndex: number;\r\n} {\r\n if (lines.length <= maxLines) {\r\n return {\r\n truncatedLines: lines,\r\n isTruncated: false,\r\n lastLineIndex: lines.length - 1,\r\n };\r\n }\r\n\r\n // Take lines up to limit\r\n const visibleLines = lines.slice(0, maxLines);\r\n \r\n // Add ellipsis to last line if needed\r\n if (maxWidth && measureFn) {\r\n const lastLineIndex = visibleLines.length - 1;\r\n const lastLine = visibleLines[lastLineIndex];\r\n const lastLineWithEllipsis = lastLine + ellipsisChar;\r\n \r\n if (measureFn(lastLineWithEllipsis) > maxWidth) {\r\n // Last line + ellipsis doesn't fit, truncate it\r\n const ellipsisWidth = measureFn(ellipsisChar);\r\n const truncationPoint = findTruncationPoint(lastLine, maxWidth, ellipsisWidth, measureFn);\r\n const graphemes = segmentGraphemes(lastLine);\r\n visibleLines[lastLineIndex] = graphemes.slice(0, truncationPoint).join('') + ellipsisChar;\r\n } else {\r\n visibleLines[lastLineIndex] = lastLineWithEllipsis;\r\n }\r\n } else {\r\n // Just add ellipsis to last line\r\n const lastLineIndex = visibleLines.length - 1;\r\n visibleLines[lastLineIndex] = visibleLines[lastLineIndex] + ellipsisChar;\r\n }\r\n\r\n return {\r\n truncatedLines: visibleLines,\r\n isTruncated: true,\r\n lastLineIndex: maxLines - 1,\r\n };\r\n}\r\n\r\n/**\r\n * Calculate ellipsis positioning for different alignments\r\n */\r\nexport function getEllipsisPosition(\r\n text: string,\r\n position: 'end' | 'middle' | 'start',\r\n maxWidth: number,\r\n ellipsisChar: string,\r\n measureFn: (text: string) => number\r\n): EllipsisResult {\r\n const ellipsisWidth = measureFn(ellipsisChar);\r\n const graphemes = segmentGraphemes(text);\r\n const totalWidth = measureFn(text);\r\n \r\n if (totalWidth <= maxWidth) {\r\n return {\r\n truncatedText: text,\r\n isTruncated: false,\r\n truncationIndex: graphemes.length,\r\n ellipsisWidth,\r\n originalLength: graphemes.length,\r\n };\r\n }\r\n\r\n switch (position) {\r\n case 'start':\r\n return truncateFromStart(text, maxWidth, ellipsisChar, measureFn);\r\n case 'middle':\r\n return truncateFromMiddle(text, maxWidth, ellipsisChar, measureFn);\r\n case 'end':\r\n default:\r\n return smartTruncate(text, maxWidth, ellipsisChar, measureFn);\r\n }\r\n}\r\n\r\n/**\r\n * Truncate from start with ellipsis at beginning\r\n */\r\nfunction truncateFromStart(\r\n text: string,\r\n maxWidth: number,\r\n ellipsisChar: string,\r\n measureFn: (text: string) => number\r\n): EllipsisResult {\r\n const ellipsisWidth = measureFn(ellipsisChar);\r\n const graphemes = segmentGraphemes(text);\r\n const availableWidth = maxWidth - ellipsisWidth;\r\n\r\n let low = 0;\r\n let high = graphemes.length;\r\n\r\n while (low < high) {\r\n const mid = Math.floor((low + high) / 2);\r\n const candidate = graphemes.slice(mid).join('');\r\n const width = measureFn(candidate);\r\n\r\n if (width <= availableWidth) {\r\n high = mid;\r\n } else {\r\n low = mid + 1;\r\n }\r\n }\r\n\r\n if (low >= graphemes.length) {\r\n return {\r\n truncatedText: ellipsisChar,\r\n isTruncated: true,\r\n truncationIndex: 0,\r\n ellipsisWidth,\r\n originalLength: graphemes.length,\r\n };\r\n }\r\n\r\n return {\r\n truncatedText: ellipsisChar + graphemes.slice(low).join(''),\r\n isTruncated: true,\r\n truncationIndex: low,\r\n ellipsisWidth,\r\n originalLength: graphemes.length,\r\n };\r\n}\r\n\r\n/**\r\n * Truncate from middle with ellipsis in center\r\n */\r\nfunction truncateFromMiddle(\r\n text: string,\r\n maxWidth: number,\r\n ellipsisChar: string,\r\n measureFn: (text: string) => number\r\n): EllipsisResult {\r\n const ellipsisWidth = measureFn(ellipsisChar);\r\n const graphemes = segmentGraphemes(text);\r\n const availableWidth = maxWidth - ellipsisWidth;\r\n\r\n // Binary search for optimal split\r\n let low = 0;\r\n let high = Math.floor(graphemes.length / 2);\r\n\r\n while (low < high) {\r\n const startChars = Math.floor((low + high + 1) / 2);\r\n const endChars = startChars;\r\n \r\n const candidate = graphemes.slice(0, startChars).join('') + \r\n graphemes.slice(-endChars).join('');\r\n const width = measureFn(candidate);\r\n\r\n if (width <= availableWidth) {\r\n low = startChars;\r\n } else {\r\n high = startChars - 1;\r\n }\r\n }\r\n\r\n const startChars = low;\r\n const endChars = low;\r\n\r\n if (startChars + endChars >= graphemes.length) {\r\n return {\r\n truncatedText: text,\r\n isTruncated: false,\r\n truncationIndex: graphemes.length,\r\n ellipsisWidth,\r\n originalLength: graphemes.length,\r\n };\r\n }\r\n\r\n const truncatedText = graphemes.slice(0, startChars).join('') + \r\n ellipsisChar + \r\n graphemes.slice(-endChars).join('');\r\n\r\n return {\r\n truncatedText,\r\n isTruncated: true,\r\n truncationIndex: startChars,\r\n ellipsisWidth,\r\n originalLength: graphemes.length,\r\n };\r\n}"],"names":["applyEllipsis","text","options","maxWidth","maxHeight","ellipsisChar","measureFn","truncatedText","isTruncated","truncationIndex","ellipsisWidth","originalLength","width","originalMeasurement","originalWidth","originalHeight","height","needsTruncation","segmentGraphemes","length","widthTruncated","truncateByWidth","heightTruncated","truncateByHeight","graphemes","availableWidth","low","high","bestFit","mid","Math","floor","candidate","slice","join","measurement","candidateWidth","_measureFn","lines","split","accumulatedText","lineIndex","testText","lastFittingLine","withEllipsis","replace","firstLineWidth"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ellipsis.mjs","sources":["../../../src/text/ellipsis.ts"],"sourcesContent":["/**\n * Ellipsis Text Truncation System\n * \n * Implements text truncation with ellipsis when content exceeds bounds,\n * using binary search for optimal truncation points.\n */\n\nimport { segmentGraphemes } from './unicode';\n\nexport interface EllipsisOptions {\n maxWidth?: number;\n maxHeight?: number;\n ellipsisChar: string; // Default: \"…\"\n measureFn: (text: string) => number | { width: number; height: number };\n}\n\nexport interface EllipsisResult {\n truncatedText: string;\n isTruncated: boolean;\n truncationIndex: number; // Grapheme index where truncation occurred\n ellipsisWidth: number;\n originalLength: number;\n}\n\n/**\n * Apply ellipsis truncation to text based on width/height constraints\n */\nexport function applyEllipsis(\n text: string,\n options: EllipsisOptions\n): EllipsisResult {\n const { maxWidth, maxHeight, ellipsisChar, measureFn } = options;\n \n if (!text) {\n return {\n truncatedText: '',\n isTruncated: false,\n truncationIndex: 0,\n ellipsisWidth: 0,\n originalLength: 0,\n };\n }\n\n // Measure ellipsis width\n const ellipsisWidth = typeof measureFn(ellipsisChar) === 'number' \n ? measureFn(ellipsisChar) as number\n : (measureFn(ellipsisChar) as { width: number }).width;\n\n // Check if truncation is needed\n const originalMeasurement = measureFn(text);\n const originalWidth = typeof originalMeasurement === 'number' \n ? originalMeasurement \n : originalMeasurement.width;\n const originalHeight = typeof originalMeasurement === 'number'\n ? 0 // Height constraint not applicable for single dimension measure\n : originalMeasurement.height;\n\n let needsTruncation = false;\n if (maxWidth && originalWidth > maxWidth) needsTruncation = true;\n if (maxHeight && originalHeight > maxHeight) needsTruncation = true;\n\n if (!needsTruncation) {\n return {\n truncatedText: text,\n isTruncated: false,\n truncationIndex: segmentGraphemes(text).length,\n ellipsisWidth,\n originalLength: segmentGraphemes(text).length,\n };\n }\n\n // Apply width-based truncation\n if (maxWidth) {\n const widthTruncated = truncateByWidth(text, maxWidth, ellipsisChar, ellipsisWidth, measureFn);\n return {\n ...widthTruncated,\n ellipsisWidth,\n originalLength: segmentGraphemes(text).length,\n };\n }\n\n // Apply height-based truncation (for multi-line text)\n if (maxHeight) {\n const heightTruncated = truncateByHeight(text, maxHeight, ellipsisChar, measureFn);\n return {\n ...heightTruncated,\n ellipsisWidth,\n originalLength: segmentGraphemes(text).length,\n };\n }\n\n // Fallback - should not reach here\n return {\n truncatedText: text,\n isTruncated: false,\n truncationIndex: segmentGraphemes(text).length,\n ellipsisWidth,\n originalLength: segmentGraphemes(text).length,\n };\n}\n\n/**\n * Truncate text based on width constraint using binary search\n */\nfunction truncateByWidth(\n text: string,\n maxWidth: number,\n ellipsisChar: string,\n ellipsisWidth: number,\n measureFn: (text: string) => number | { width: number; height: number }\n): Omit<EllipsisResult, 'ellipsisWidth' | 'originalLength'> {\n const graphemes = segmentGraphemes(text);\n const availableWidth = maxWidth - ellipsisWidth;\n\n // Binary search for optimal truncation point\n let low = 0;\n let high = graphemes.length;\n let bestFit = 0;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const candidate = graphemes.slice(0, mid).join('');\n \n const measurement = measureFn(candidate);\n const candidateWidth = typeof measurement === 'number' \n ? measurement \n : measurement.width;\n\n if (candidateWidth <= availableWidth) {\n bestFit = mid;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n // Handle edge cases\n if (bestFit === 0) {\n // Even single character doesn't fit - return ellipsis only\n return {\n truncatedText: ellipsisChar,\n isTruncated: true,\n truncationIndex: 0,\n };\n }\n\n if (bestFit === graphemes.length) {\n // Everything fits even with ellipsis space reserved\n return {\n truncatedText: text,\n isTruncated: false,\n truncationIndex: graphemes.length,\n };\n }\n\n // Create truncated text with ellipsis\n const truncatedText = graphemes.slice(0, bestFit).join('') + ellipsisChar;\n\n return {\n truncatedText,\n isTruncated: true,\n truncationIndex: bestFit,\n };\n}\n\n/**\n * Truncate text based on height constraint\n */\nfunction truncateByHeight(\n text: string,\n maxHeight: number,\n ellipsisChar: string,\n measureFn: (text: string) => number | { width: number; height: number }\n): Omit<EllipsisResult, 'ellipsisWidth' | 'originalLength'> {\n const lines = text.split('\\n');\n let accumulatedText = '';\n let lineIndex = 0;\n\n // Add lines until height exceeded\n for (lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const testText = lineIndex === 0 \n ? lines[lineIndex] \n : accumulatedText + '\\n' + lines[lineIndex];\n \n const measurement = measureFn(testText);\n const height = typeof measurement === 'number' \n ? 0 // Single dimension measure doesn't provide height\n : measurement.height;\n\n if (height > maxHeight && accumulatedText) {\n // Previous text fits, current doesn't - truncate at previous\n break;\n }\n\n accumulatedText = testText;\n\n // If this is the last line and it fits, no truncation needed\n if (lineIndex === lines.length - 1) {\n return {\n truncatedText: text,\n isTruncated: false,\n truncationIndex: segmentGraphemes(text).length,\n };\n }\n }\n\n // If we need to truncate the last fitting line to add ellipsis\n if (lineIndex > 0) {\n const lastFittingLine = lines[lineIndex - 1];\n const withEllipsis = lastFittingLine + ellipsisChar;\n const graphemes = segmentGraphemes(accumulatedText);\n\n return {\n truncatedText: accumulatedText.replace(/[^\\n]*$/, withEllipsis),\n isTruncated: true,\n truncationIndex: graphemes.length - segmentGraphemes(lastFittingLine).length + segmentGraphemes(withEllipsis).length - 1,\n };\n }\n\n // First line doesn't fit - try width-based truncation on first line\n const firstLineWidth = typeof measureFn === 'function' \n ? (measureFn(lines[0]) as any)?.width || 1000\n : 1000; // Fallback width\n\n return truncateByWidth(lines[0], firstLineWidth, ellipsisChar, 0, measureFn);\n}\n\n/**\n * Find optimal truncation point using binary search\n */\nexport function findTruncationPoint(\n text: string,\n maxWidth: number,\n ellipsisWidth: number,\n measureFn: (text: string) => number\n): number {\n const graphemes = segmentGraphemes(text);\n const availableWidth = maxWidth - ellipsisWidth;\n\n let low = 0;\n let high = graphemes.length;\n\n while (low < high) {\n const mid = Math.floor((low + high + 1) / 2);\n const candidate = graphemes.slice(0, mid).join('');\n const width = measureFn(candidate);\n\n if (width <= availableWidth) {\n low = mid;\n } else {\n high = mid - 1;\n }\n }\n\n return low;\n}\n\n/**\n * Smart truncation that tries to break at word boundaries\n */\nexport function smartTruncate(\n text: string,\n maxWidth: number,\n ellipsisChar: string,\n measureFn: (text: string) => number\n): EllipsisResult {\n const ellipsisWidth = measureFn(ellipsisChar);\n const availableWidth = maxWidth - ellipsisWidth;\n \n // First try exact truncation\n const exactPoint = findTruncationPoint(text, maxWidth, ellipsisWidth, measureFn);\n const graphemes = segmentGraphemes(text);\n \n if (exactPoint === 0) {\n return {\n truncatedText: ellipsisChar,\n isTruncated: true,\n truncationIndex: 0,\n ellipsisWidth,\n originalLength: graphemes.length,\n };\n }\n\n if (exactPoint >= graphemes.length) {\n return {\n truncatedText: text,\n isTruncated: false,\n truncationIndex: graphemes.length,\n ellipsisWidth,\n originalLength: graphemes.length,\n };\n }\n\n // Try to find a word boundary before the exact point\n const textUpToPoint = graphemes.slice(0, exactPoint).join('');\n const words = textUpToPoint.split(/(\\s+)/);\n \n if (words.length > 1) {\n // Try truncating at last complete word\n const wordsWithoutLast = words.slice(0, -2); // Remove last word and space\n const wordBoundaryText = wordsWithoutLast.join('');\n const wordBoundaryWidth = measureFn(wordBoundaryText);\n \n if (wordBoundaryWidth + ellipsisWidth <= maxWidth && wordBoundaryText.trim()) {\n const wordBoundaryGraphemes = segmentGraphemes(wordBoundaryText);\n return {\n truncatedText: wordBoundaryText.trim() + ellipsisChar,\n isTruncated: true,\n truncationIndex: wordBoundaryGraphemes.length,\n ellipsisWidth,\n originalLength: graphemes.length,\n };\n }\n }\n\n // Fall back to character truncation\n return {\n truncatedText: graphemes.slice(0, exactPoint).join('') + ellipsisChar,\n isTruncated: true,\n truncationIndex: exactPoint,\n ellipsisWidth,\n originalLength: graphemes.length,\n };\n}\n\n/**\n * Truncate multi-line text with ellipsis on the last visible line\n */\nexport function truncateMultiline(\n lines: string[],\n maxLines: number,\n ellipsisChar: string,\n maxWidth?: number,\n measureFn?: (text: string) => number\n): {\n truncatedLines: string[];\n isTruncated: boolean;\n lastLineIndex: number;\n} {\n if (lines.length <= maxLines) {\n return {\n truncatedLines: lines,\n isTruncated: false,\n lastLineIndex: lines.length - 1,\n };\n }\n\n // Take lines up to limit\n const visibleLines = lines.slice(0, maxLines);\n \n // Add ellipsis to last line if needed\n if (maxWidth && measureFn) {\n const lastLineIndex = visibleLines.length - 1;\n const lastLine = visibleLines[lastLineIndex];\n const lastLineWithEllipsis = lastLine + ellipsisChar;\n \n if (measureFn(lastLineWithEllipsis) > maxWidth) {\n // Last line + ellipsis doesn't fit, truncate it\n const ellipsisWidth = measureFn(ellipsisChar);\n const truncationPoint = findTruncationPoint(lastLine, maxWidth, ellipsisWidth, measureFn);\n const graphemes = segmentGraphemes(lastLine);\n visibleLines[lastLineIndex] = graphemes.slice(0, truncationPoint).join('') + ellipsisChar;\n } else {\n visibleLines[lastLineIndex] = lastLineWithEllipsis;\n }\n } else {\n // Just add ellipsis to last line\n const lastLineIndex = visibleLines.length - 1;\n visibleLines[lastLineIndex] = visibleLines[lastLineIndex] + ellipsisChar;\n }\n\n return {\n truncatedLines: visibleLines,\n isTruncated: true,\n lastLineIndex: maxLines - 1,\n };\n}\n\n/**\n * Calculate ellipsis positioning for different alignments\n */\nexport function getEllipsisPosition(\n text: string,\n position: 'end' | 'middle' | 'start',\n maxWidth: number,\n ellipsisChar: string,\n measureFn: (text: string) => number\n): EllipsisResult {\n const ellipsisWidth = measureFn(ellipsisChar);\n const graphemes = segmentGraphemes(text);\n const totalWidth = measureFn(text);\n \n if (totalWidth <= maxWidth) {\n return {\n truncatedText: text,\n isTruncated: false,\n truncationIndex: graphemes.length,\n ellipsisWidth,\n originalLength: graphemes.length,\n };\n }\n\n switch (position) {\n case 'start':\n return truncateFromStart(text, maxWidth, ellipsisChar, measureFn);\n case 'middle':\n return truncateFromMiddle(text, maxWidth, ellipsisChar, measureFn);\n case 'end':\n default:\n return smartTruncate(text, maxWidth, ellipsisChar, measureFn);\n }\n}\n\n/**\n * Truncate from start with ellipsis at beginning\n */\nfunction truncateFromStart(\n text: string,\n maxWidth: number,\n ellipsisChar: string,\n measureFn: (text: string) => number\n): EllipsisResult {\n const ellipsisWidth = measureFn(ellipsisChar);\n const graphemes = segmentGraphemes(text);\n const availableWidth = maxWidth - ellipsisWidth;\n\n let low = 0;\n let high = graphemes.length;\n\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n const candidate = graphemes.slice(mid).join('');\n const width = measureFn(candidate);\n\n if (width <= availableWidth) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n if (low >= graphemes.length) {\n return {\n truncatedText: ellipsisChar,\n isTruncated: true,\n truncationIndex: 0,\n ellipsisWidth,\n originalLength: graphemes.length,\n };\n }\n\n return {\n truncatedText: ellipsisChar + graphemes.slice(low).join(''),\n isTruncated: true,\n truncationIndex: low,\n ellipsisWidth,\n originalLength: graphemes.length,\n };\n}\n\n/**\n * Truncate from middle with ellipsis in center\n */\nfunction truncateFromMiddle(\n text: string,\n maxWidth: number,\n ellipsisChar: string,\n measureFn: (text: string) => number\n): EllipsisResult {\n const ellipsisWidth = measureFn(ellipsisChar);\n const graphemes = segmentGraphemes(text);\n const availableWidth = maxWidth - ellipsisWidth;\n\n // Binary search for optimal split\n let low = 0;\n let high = Math.floor(graphemes.length / 2);\n\n while (low < high) {\n const startChars = Math.floor((low + high + 1) / 2);\n const endChars = startChars;\n \n const candidate = graphemes.slice(0, startChars).join('') + \n graphemes.slice(-endChars).join('');\n const width = measureFn(candidate);\n\n if (width <= availableWidth) {\n low = startChars;\n } else {\n high = startChars - 1;\n }\n }\n\n const startChars = low;\n const endChars = low;\n\n if (startChars + endChars >= graphemes.length) {\n return {\n truncatedText: text,\n isTruncated: false,\n truncationIndex: graphemes.length,\n ellipsisWidth,\n originalLength: graphemes.length,\n };\n }\n\n const truncatedText = graphemes.slice(0, startChars).join('') + \n ellipsisChar + \n graphemes.slice(-endChars).join('');\n\n return {\n truncatedText,\n isTruncated: true,\n truncationIndex: startChars,\n ellipsisWidth,\n originalLength: graphemes.length,\n };\n}"],"names":["applyEllipsis","text","options","maxWidth","maxHeight","ellipsisChar","measureFn","truncatedText","isTruncated","truncationIndex","ellipsisWidth","originalLength","width","originalMeasurement","originalWidth","originalHeight","height","needsTruncation","segmentGraphemes","length","widthTruncated","truncateByWidth","heightTruncated","truncateByHeight","graphemes","availableWidth","low","high","bestFit","mid","Math","floor","candidate","slice","join","measurement","candidateWidth","_measureFn","lines","split","accumulatedText","lineIndex","testText","lastFittingLine","withEllipsis","replace","firstLineWidth"],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hitTest.min.mjs","sources":["../../../src/text/hitTest.ts"],"sourcesContent":["/**\r\n * Hit Testing and Cursor Positioning System\r\n * \r\n * Maps pointer coordinates to text positions and provides cursor rectangles\r\n * for interactive text editing with grapheme-aware boundaries.\r\n */\r\n\r\nimport type { LayoutResult, LayoutLine, GraphemeBounds } from './layout';\r\nimport type { TextLayoutOptions } from './layout';\r\nimport { segmentGraphemes } from './unicode';\r\n\r\nexport interface HitTestResult {\r\n lineIndex: number;\r\n charIndex: number;\r\n graphemeIndex: number;\r\n isAtLineEnd: boolean;\r\n isAtTextEnd: boolean;\r\n insertionIndex: number; // For cursor positioning\r\n closestBound?: GraphemeBounds;\r\n}\r\n\r\nexport interface CursorRect {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n baseline: number;\r\n}\r\n\r\nexport interface SelectionRect extends CursorRect {\r\n lineIndex: number;\r\n startIndex: number;\r\n endIndex: number;\r\n}\r\n\r\n/**\r\n * Hit test a point against laid out text to find insertion position\r\n */\r\nexport function hitTest(\r\n x: number,\r\n y: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): HitTestResult {\r\n if (layout.lines.length === 0) {\r\n return {\r\n lineIndex: 0,\r\n charIndex: 0,\r\n graphemeIndex: 0,\r\n isAtLineEnd: true,\r\n isAtTextEnd: true,\r\n insertionIndex: 0,\r\n };\r\n }\r\n\r\n // Find the line containing the y coordinate\r\n const lineResult = findLineAtY(y, layout.lines);\r\n const line = layout.lines[lineResult.lineIndex];\r\n \r\n if (!line || line.bounds.length === 0) {\r\n return {\r\n lineIndex: lineResult.lineIndex,\r\n charIndex: 0,\r\n graphemeIndex: 0,\r\n isAtLineEnd: true,\r\n isAtTextEnd: lineResult.lineIndex >= layout.lines.length - 1,\r\n insertionIndex: calculateInsertionIndex(lineResult.lineIndex, 0, layout),\r\n };\r\n }\r\n\r\n // Find the character position within the line\r\n const charResult = findCharAtX(x, line, options);\r\n \r\n // Calculate total insertion index\r\n const insertionIndex = calculateInsertionIndex(\r\n lineResult.lineIndex, \r\n charResult.graphemeIndex, \r\n layout\r\n );\r\n\r\n return {\r\n lineIndex: lineResult.lineIndex,\r\n charIndex: charResult.charIndex,\r\n graphemeIndex: charResult.graphemeIndex,\r\n isAtLineEnd: charResult.isAtLineEnd,\r\n isAtTextEnd: lineResult.lineIndex >= layout.lines.length - 1 && charResult.isAtLineEnd,\r\n insertionIndex,\r\n closestBound: charResult.closestBound,\r\n };\r\n}\r\n\r\n/**\r\n * Get cursor rectangle for a given insertion index\r\n */\r\nexport function getCursorRect(\r\n insertionIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): CursorRect {\r\n if (layout.lines.length === 0) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n width: 2, // Default cursor width\r\n height: options.fontSize,\r\n baseline: options.fontSize * 0.8,\r\n };\r\n }\r\n\r\n const position = findPositionFromIndex(insertionIndex, layout);\r\n const line = layout.lines[position.lineIndex];\r\n\r\n if (!line) {\r\n // Past end of text\r\n const lastLine = layout.lines[layout.lines.length - 1];\r\n return {\r\n x: lastLine.width,\r\n y: (layout.lines.length - 1) * (options.fontSize * options.lineHeight),\r\n width: 2,\r\n height: options.fontSize * options.lineHeight,\r\n baseline: options.fontSize * 0.8,\r\n };\r\n }\r\n\r\n // Get position within line\r\n let x = 0;\r\n if (position.graphemeIndex > 0 && line.bounds.length > 0) {\r\n const boundIndex = Math.min(position.graphemeIndex - 1, line.bounds.length - 1);\r\n const bound = line.bounds[boundIndex];\r\n x = bound.x + bound.kernedWidth;\r\n }\r\n\r\n const y = calculateLineY(position.lineIndex, layout, options);\r\n\r\n return {\r\n x,\r\n y,\r\n width: 2, // Standard cursor width\r\n height: line.height,\r\n baseline: y + line.baseline,\r\n };\r\n}\r\n\r\n/**\r\n * Get selection rectangles for a range of text\r\n */\r\nexport function getSelectionRects(\r\n startIndex: number,\r\n endIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): SelectionRect[] {\r\n if (startIndex >= endIndex || layout.lines.length === 0) {\r\n return [];\r\n }\r\n\r\n const startPos = findPositionFromIndex(startIndex, layout);\r\n const endPos = findPositionFromIndex(endIndex, layout);\r\n const rects: SelectionRect[] = [];\r\n\r\n // Handle selection across multiple lines\r\n for (let lineIndex = startPos.lineIndex; lineIndex <= endPos.lineIndex; lineIndex++) {\r\n const line = layout.lines[lineIndex];\r\n if (!line) continue;\r\n\r\n // Determine start and end positions within this line\r\n const lineStartIndex = lineIndex === startPos.lineIndex ? startPos.graphemeIndex : 0;\r\n const lineEndIndex = lineIndex === endPos.lineIndex \r\n ? endPos.graphemeIndex \r\n : line.graphemes.length;\r\n\r\n if (lineStartIndex >= lineEndIndex) continue;\r\n\r\n // Calculate selection rectangle for this line\r\n const rect = getLineSelectionRect(\r\n line,\r\n lineIndex,\r\n lineStartIndex,\r\n lineEndIndex,\r\n layout,\r\n options\r\n );\r\n\r\n if (rect) {\r\n rects.push(rect);\r\n }\r\n }\r\n\r\n return rects;\r\n}\r\n\r\n/**\r\n * Get grapheme boundaries for text navigation\r\n */\r\nexport function getGraphemeBoundaries(text: string): number[] {\r\n const graphemes = segmentGraphemes(text);\r\n const boundaries: number[] = [0];\r\n let stringIndex = 0;\r\n\r\n for (const grapheme of graphemes) {\r\n stringIndex += grapheme.length;\r\n boundaries.push(stringIndex);\r\n }\r\n\r\n return boundaries;\r\n}\r\n\r\n/**\r\n * Map string index to grapheme index\r\n */\r\nexport function mapStringIndexToGraphemeIndex(text: string, stringIndex: number): number {\r\n const graphemes = segmentGraphemes(text);\r\n let currentStringIndex = 0;\r\n\r\n for (let i = 0; i < graphemes.length; i++) {\r\n if (currentStringIndex >= stringIndex) {\r\n return i;\r\n }\r\n currentStringIndex += graphemes[i].length;\r\n }\r\n\r\n return graphemes.length;\r\n}\r\n\r\n/**\r\n * Map grapheme index to string index\r\n */\r\nexport function mapGraphemeIndexToStringIndex(text: string, graphemeIndex: number): number {\r\n const graphemes = segmentGraphemes(text);\r\n let stringIndex = 0;\r\n\r\n for (let i = 0; i < graphemeIndex && i < graphemes.length; i++) {\r\n stringIndex += graphemes[i].length;\r\n }\r\n\r\n return stringIndex;\r\n}\r\n\r\n// Private helper functions\r\n\r\n/**\r\n * Find which line contains the given Y coordinate\r\n */\r\nfunction findLineAtY(y: number, lines: LayoutLine[]): { lineIndex: number; offsetY: number } {\r\n let currentY = 0;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n if (y >= currentY && y < currentY + line.height) {\r\n return { lineIndex: i, offsetY: y - currentY };\r\n }\r\n currentY += line.height;\r\n }\r\n\r\n // Y is past all lines - return last line\r\n return { \r\n lineIndex: lines.length - 1, \r\n offsetY: lines[lines.length - 1]?.height || 0 \r\n };\r\n}\r\n\r\n/**\r\n * Find character position within a line at given X coordinate\r\n */\r\nfunction findCharAtX(\r\n x: number,\r\n line: LayoutLine,\r\n options: TextLayoutOptions\r\n): {\r\n charIndex: number;\r\n graphemeIndex: number;\r\n isAtLineEnd: boolean;\r\n closestBound?: GraphemeBounds;\r\n} {\r\n if (line.bounds.length === 0) {\r\n return {\r\n charIndex: 0,\r\n graphemeIndex: 0,\r\n isAtLineEnd: true,\r\n };\r\n }\r\n\r\n // Create visual ordering: sort bounds by visual X position (left-to-right)\r\n // This handles mixed LTR/RTL content where visual order != logical order\r\n const visualBounds = line.bounds.map((bound, logicalIndex) => ({\r\n bound,\r\n logicalIndex,\r\n visualX: bound.x,\r\n visualXEnd: bound.x + bound.kernedWidth,\r\n })).sort((a, b) => a.visualX - b.visualX);\r\n\r\n // Find leftmost and rightmost visual positions\r\n const leftmostX = visualBounds[0].visualX;\r\n const rightmostX = visualBounds[visualBounds.length - 1].visualXEnd;\r\n\r\n // Handle clicks before the line starts\r\n if (x < leftmostX) {\r\n // Find the character that appears visually first\r\n const firstVisualBound = visualBounds[0];\r\n return {\r\n charIndex: firstVisualBound.bound.charIndex,\r\n graphemeIndex: firstVisualBound.bound.graphemeIndex,\r\n isAtLineEnd: false,\r\n closestBound: firstVisualBound.bound,\r\n };\r\n }\r\n\r\n // Handle clicks after the line ends\r\n if (x >= rightmostX) {\r\n // Find the character that appears visually last\r\n const lastVisualBound = visualBounds[visualBounds.length - 1];\r\n return {\r\n charIndex: lastVisualBound.bound.charIndex + 1,\r\n graphemeIndex: lastVisualBound.bound.graphemeIndex + 1,\r\n isAtLineEnd: true,\r\n closestBound: lastVisualBound.bound,\r\n };\r\n }\r\n\r\n // Find the character containing the X coordinate\r\n for (let i = 0; i < visualBounds.length; i++) {\r\n const { bound, visualX, visualXEnd } = visualBounds[i];\r\n \r\n if (x >= visualX && x < visualXEnd) {\r\n // Determine if closer to start or end of character\r\n const midpoint = visualX + (visualXEnd - visualX) / 2;\r\n const insertBeforeChar = x < midpoint;\r\n \r\n if (insertBeforeChar) {\r\n return {\r\n charIndex: bound.charIndex,\r\n graphemeIndex: bound.graphemeIndex,\r\n isAtLineEnd: false,\r\n closestBound: bound,\r\n };\r\n } else {\r\n // Insert after this character\r\n return {\r\n charIndex: bound.charIndex + 1,\r\n graphemeIndex: bound.graphemeIndex + 1,\r\n isAtLineEnd: false,\r\n closestBound: bound,\r\n };\r\n }\r\n }\r\n \r\n // Check if x is in the gap between this character and the next\r\n if (i < visualBounds.length - 1) {\r\n const nextVisual = visualBounds[i + 1];\r\n if (x >= visualXEnd && x < nextVisual.visualX) {\r\n // Click in gap - place cursor after current character\r\n return {\r\n charIndex: bound.charIndex + 1,\r\n graphemeIndex: bound.graphemeIndex + 1,\r\n isAtLineEnd: false,\r\n closestBound: bound,\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Fallback - find closest character\r\n const closestBound = visualBounds.reduce((closest, current) => {\r\n const closestDistance = Math.abs((closest.visualX + closest.visualXEnd) / 2 - x);\r\n const currentDistance = Math.abs((current.visualX + current.visualXEnd) / 2 - x);\r\n return currentDistance < closestDistance ? current : closest;\r\n });\r\n\r\n return {\r\n charIndex: closestBound.bound.charIndex,\r\n graphemeIndex: closestBound.bound.graphemeIndex,\r\n isAtLineEnd: false,\r\n closestBound: closestBound.bound,\r\n };\r\n}\r\n\r\n/**\r\n * Calculate total insertion index from line and character indices\r\n */\r\nfunction calculateInsertionIndex(\r\n lineIndex: number,\r\n graphemeIndex: number,\r\n layout: LayoutResult\r\n): number {\r\n let insertionIndex = 0;\r\n\r\n // Add characters from all previous lines\r\n for (let i = 0; i < lineIndex && i < layout.lines.length; i++) {\r\n insertionIndex += layout.lines[i].graphemes.length;\r\n // Add newline character (except for last line)\r\n if (i < layout.lines.length - 1) {\r\n insertionIndex += 1; // \\n character\r\n }\r\n }\r\n\r\n // Add characters within current line\r\n insertionIndex += graphemeIndex;\r\n\r\n return insertionIndex;\r\n}\r\n\r\n/**\r\n * Find line and grapheme position from insertion index\r\n */\r\nfunction findPositionFromIndex(\r\n insertionIndex: number,\r\n layout: LayoutResult\r\n): { lineIndex: number; graphemeIndex: number } {\r\n let currentIndex = 0;\r\n\r\n for (let lineIndex = 0; lineIndex < layout.lines.length; lineIndex++) {\r\n const line = layout.lines[lineIndex];\r\n const lineLength = line.graphemes.length;\r\n\r\n // Check if index is within this line\r\n if (insertionIndex >= currentIndex && insertionIndex <= currentIndex + lineLength) {\r\n return {\r\n lineIndex,\r\n graphemeIndex: insertionIndex - currentIndex,\r\n };\r\n }\r\n\r\n // Move to next line\r\n currentIndex += lineLength;\r\n \r\n // Add newline character (except after last line)\r\n if (lineIndex < layout.lines.length - 1) {\r\n currentIndex += 1; // \\n character\r\n \r\n // If insertion index is exactly at the newline\r\n if (insertionIndex === currentIndex - 1) {\r\n return {\r\n lineIndex,\r\n graphemeIndex: lineLength,\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Index is past end of text\r\n const lastLineIndex = layout.lines.length - 1;\r\n const lastLine = layout.lines[lastLineIndex];\r\n \r\n return {\r\n lineIndex: lastLineIndex,\r\n graphemeIndex: lastLine ? lastLine.graphemes.length : 0,\r\n };\r\n}\r\n\r\n/**\r\n * Calculate Y position of a line\r\n */\r\nfunction calculateLineY(\r\n lineIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): number {\r\n let y = 0;\r\n\r\n for (let i = 0; i < lineIndex && i < layout.lines.length; i++) {\r\n y += layout.lines[i].height;\r\n }\r\n\r\n return y;\r\n}\r\n\r\n/**\r\n * Get selection rectangle for a portion of a line\r\n */\r\nfunction getLineSelectionRect(\r\n line: LayoutLine,\r\n lineIndex: number,\r\n startGraphemeIndex: number,\r\n endGraphemeIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): SelectionRect | null {\r\n if (startGraphemeIndex >= endGraphemeIndex || line.bounds.length === 0) {\r\n return null;\r\n }\r\n\r\n // Calculate start X\r\n let startX = 0;\r\n if (startGraphemeIndex > 0 && startGraphemeIndex <= line.bounds.length) {\r\n const startBound = line.bounds[startGraphemeIndex - 1];\r\n startX = startBound.x + startBound.kernedWidth;\r\n }\r\n\r\n // Calculate end X\r\n let endX = line.width;\r\n if (endGraphemeIndex > 0 && endGraphemeIndex <= line.bounds.length) {\r\n const endBound = line.bounds[endGraphemeIndex - 1];\r\n endX = endBound.x + endBound.kernedWidth;\r\n }\r\n\r\n const y = calculateLineY(lineIndex, layout, options);\r\n\r\n return {\r\n x: Math.min(startX, endX),\r\n y,\r\n width: Math.abs(endX - startX),\r\n height: line.height,\r\n baseline: y + line.baseline,\r\n lineIndex,\r\n startIndex: startGraphemeIndex,\r\n endIndex: endGraphemeIndex,\r\n };\r\n}\r\n\r\n/**\r\n * Get word boundaries for double-click selection\r\n */\r\nexport function getWordBoundaries(\r\n text: string,\r\n graphemeIndex: number\r\n): { start: number; end: number } {\r\n const graphemes = segmentGraphemes(text);\r\n \r\n if (graphemeIndex >= graphemes.length) {\r\n return { start: graphemes.length, end: graphemes.length };\r\n }\r\n\r\n // Find word boundaries\r\n let start = graphemeIndex;\r\n let end = graphemeIndex;\r\n\r\n // Expand backwards to find word start\r\n while (start > 0 && !isWordBoundary(graphemes[start - 1])) {\r\n start--;\r\n }\r\n\r\n // Expand forwards to find word end\r\n while (end < graphemes.length && !isWordBoundary(graphemes[end])) {\r\n end++;\r\n }\r\n\r\n return { start, end };\r\n}\r\n\r\n/**\r\n * Get line boundaries for triple-click selection\r\n */\r\nexport function getLineBoundaries(\r\n insertionIndex: number,\r\n layout: LayoutResult\r\n): { start: number; end: number } {\r\n const position = findPositionFromIndex(insertionIndex, layout);\r\n const line = layout.lines[position.lineIndex];\r\n \r\n if (!line) {\r\n return { start: insertionIndex, end: insertionIndex };\r\n }\r\n\r\n // Calculate line start and end indices\r\n const lineStart = calculateInsertionIndex(position.lineIndex, 0, layout);\r\n const lineEnd = calculateInsertionIndex(\r\n position.lineIndex, \r\n line.graphemes.length, \r\n layout\r\n );\r\n\r\n return { start: lineStart, end: lineEnd };\r\n}\r\n\r\n/**\r\n * Check if a character is a word boundary\r\n */\r\nfunction isWordBoundary(grapheme: string): boolean {\r\n return /\\s/.test(grapheme) || /[^\\w]/.test(grapheme);\r\n}\r\n\r\n/**\r\n * Find closest cursor position to a point (for drag operations)\r\n */\r\nexport function findClosestCursorPosition(\r\n x: number,\r\n y: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): number {\r\n const hitResult = hitTest(x, y, layout, options);\r\n return hitResult.insertionIndex;\r\n}\r\n\r\n/**\r\n * Get bounding box for a range of text\r\n */\r\nexport function getTextRangeBounds(\r\n startIndex: number,\r\n endIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rects: SelectionRect[];\r\n} {\r\n const rects = getSelectionRects(startIndex, endIndex, layout, options);\r\n \r\n if (rects.length === 0) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n rects: [],\r\n };\r\n }\r\n\r\n const minX = Math.min(...rects.map(r => r.x));\r\n const maxX = Math.max(...rects.map(r => r.x + r.width));\r\n const minY = Math.min(...rects.map(r => r.y));\r\n const maxY = Math.max(...rects.map(r => r.y + r.height));\r\n\r\n return {\r\n x: minX,\r\n y: minY,\r\n width: maxX - minX,\r\n height: maxY - minY,\r\n rects,\r\n };\r\n}"],"names":["hitTest","x","y","layout","options","lines","length","lineIndex","charIndex","graphemeIndex","isAtLineEnd","isAtTextEnd","insertionIndex","lineResult","_lines","currentY","i","line","height","offsetY","findLineAtY","bounds","calculateInsertionIndex","charResult","visualBounds","map","bound","logicalIndex","visualX","visualXEnd","kernedWidth","sort","a","b","leftmostX","rightmostX","firstVisualBound","closestBound","lastVisualBound","nextVisual","reduce","closest","current","closestDistance","Math","abs","findCharAtX","getCursorRect","width","fontSize","baseline","position","currentIndex","lineLength","graphemes","lastLineIndex","lastLine","findPositionFromIndex","lineHeight","boundIndex","min","calculateLineY"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hitTest.min.mjs","sources":["../../../src/text/hitTest.ts"],"sourcesContent":["/**\n * Hit Testing and Cursor Positioning System\n * \n * Maps pointer coordinates to text positions and provides cursor rectangles\n * for interactive text editing with grapheme-aware boundaries.\n */\n\nimport type { LayoutResult, LayoutLine, GraphemeBounds } from './layout';\nimport type { TextLayoutOptions } from './layout';\nimport { segmentGraphemes } from './unicode';\n\nexport interface HitTestResult {\n lineIndex: number;\n charIndex: number;\n graphemeIndex: number;\n isAtLineEnd: boolean;\n isAtTextEnd: boolean;\n insertionIndex: number; // For cursor positioning\n closestBound?: GraphemeBounds;\n}\n\nexport interface CursorRect {\n x: number;\n y: number;\n width: number;\n height: number;\n baseline: number;\n}\n\nexport interface SelectionRect extends CursorRect {\n lineIndex: number;\n startIndex: number;\n endIndex: number;\n}\n\n/**\n * Hit test a point against laid out text to find insertion position\n */\nexport function hitTest(\n x: number,\n y: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): HitTestResult {\n if (layout.lines.length === 0) {\n return {\n lineIndex: 0,\n charIndex: 0,\n graphemeIndex: 0,\n isAtLineEnd: true,\n isAtTextEnd: true,\n insertionIndex: 0,\n };\n }\n\n // Find the line containing the y coordinate\n const lineResult = findLineAtY(y, layout.lines);\n const line = layout.lines[lineResult.lineIndex];\n \n if (!line || line.bounds.length === 0) {\n return {\n lineIndex: lineResult.lineIndex,\n charIndex: 0,\n graphemeIndex: 0,\n isAtLineEnd: true,\n isAtTextEnd: lineResult.lineIndex >= layout.lines.length - 1,\n insertionIndex: calculateInsertionIndex(lineResult.lineIndex, 0, layout),\n };\n }\n\n // Find the character position within the line\n const charResult = findCharAtX(x, line, options);\n \n // Calculate total insertion index\n const insertionIndex = calculateInsertionIndex(\n lineResult.lineIndex, \n charResult.graphemeIndex, \n layout\n );\n\n return {\n lineIndex: lineResult.lineIndex,\n charIndex: charResult.charIndex,\n graphemeIndex: charResult.graphemeIndex,\n isAtLineEnd: charResult.isAtLineEnd,\n isAtTextEnd: lineResult.lineIndex >= layout.lines.length - 1 && charResult.isAtLineEnd,\n insertionIndex,\n closestBound: charResult.closestBound,\n };\n}\n\n/**\n * Get cursor rectangle for a given insertion index\n */\nexport function getCursorRect(\n insertionIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): CursorRect {\n if (layout.lines.length === 0) {\n return {\n x: 0,\n y: 0,\n width: 2, // Default cursor width\n height: options.fontSize,\n baseline: options.fontSize * 0.8,\n };\n }\n\n const position = findPositionFromIndex(insertionIndex, layout);\n const line = layout.lines[position.lineIndex];\n\n if (!line) {\n // Past end of text\n const lastLine = layout.lines[layout.lines.length - 1];\n return {\n x: lastLine.width,\n y: (layout.lines.length - 1) * (options.fontSize * options.lineHeight),\n width: 2,\n height: options.fontSize * options.lineHeight,\n baseline: options.fontSize * 0.8,\n };\n }\n\n // Get position within line\n let x = 0;\n if (position.graphemeIndex > 0 && line.bounds.length > 0) {\n const boundIndex = Math.min(position.graphemeIndex - 1, line.bounds.length - 1);\n const bound = line.bounds[boundIndex];\n x = bound.x + bound.kernedWidth;\n }\n\n const y = calculateLineY(position.lineIndex, layout, options);\n\n return {\n x,\n y,\n width: 2, // Standard cursor width\n height: line.height,\n baseline: y + line.baseline,\n };\n}\n\n/**\n * Get selection rectangles for a range of text\n */\nexport function getSelectionRects(\n startIndex: number,\n endIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): SelectionRect[] {\n if (startIndex >= endIndex || layout.lines.length === 0) {\n return [];\n }\n\n const startPos = findPositionFromIndex(startIndex, layout);\n const endPos = findPositionFromIndex(endIndex, layout);\n const rects: SelectionRect[] = [];\n\n // Handle selection across multiple lines\n for (let lineIndex = startPos.lineIndex; lineIndex <= endPos.lineIndex; lineIndex++) {\n const line = layout.lines[lineIndex];\n if (!line) continue;\n\n // Determine start and end positions within this line\n const lineStartIndex = lineIndex === startPos.lineIndex ? startPos.graphemeIndex : 0;\n const lineEndIndex = lineIndex === endPos.lineIndex \n ? endPos.graphemeIndex \n : line.graphemes.length;\n\n if (lineStartIndex >= lineEndIndex) continue;\n\n // Calculate selection rectangle for this line\n const rect = getLineSelectionRect(\n line,\n lineIndex,\n lineStartIndex,\n lineEndIndex,\n layout,\n options\n );\n\n if (rect) {\n rects.push(rect);\n }\n }\n\n return rects;\n}\n\n/**\n * Get grapheme boundaries for text navigation\n */\nexport function getGraphemeBoundaries(text: string): number[] {\n const graphemes = segmentGraphemes(text);\n const boundaries: number[] = [0];\n let stringIndex = 0;\n\n for (const grapheme of graphemes) {\n stringIndex += grapheme.length;\n boundaries.push(stringIndex);\n }\n\n return boundaries;\n}\n\n/**\n * Map string index to grapheme index\n */\nexport function mapStringIndexToGraphemeIndex(text: string, stringIndex: number): number {\n const graphemes = segmentGraphemes(text);\n let currentStringIndex = 0;\n\n for (let i = 0; i < graphemes.length; i++) {\n if (currentStringIndex >= stringIndex) {\n return i;\n }\n currentStringIndex += graphemes[i].length;\n }\n\n return graphemes.length;\n}\n\n/**\n * Map grapheme index to string index\n */\nexport function mapGraphemeIndexToStringIndex(text: string, graphemeIndex: number): number {\n const graphemes = segmentGraphemes(text);\n let stringIndex = 0;\n\n for (let i = 0; i < graphemeIndex && i < graphemes.length; i++) {\n stringIndex += graphemes[i].length;\n }\n\n return stringIndex;\n}\n\n// Private helper functions\n\n/**\n * Find which line contains the given Y coordinate\n */\nfunction findLineAtY(y: number, lines: LayoutLine[]): { lineIndex: number; offsetY: number } {\n let currentY = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (y >= currentY && y < currentY + line.height) {\n return { lineIndex: i, offsetY: y - currentY };\n }\n currentY += line.height;\n }\n\n // Y is past all lines - return last line\n return { \n lineIndex: lines.length - 1, \n offsetY: lines[lines.length - 1]?.height || 0 \n };\n}\n\n/**\n * Find character position within a line at given X coordinate\n */\nfunction findCharAtX(\n x: number,\n line: LayoutLine,\n options: TextLayoutOptions\n): {\n charIndex: number;\n graphemeIndex: number;\n isAtLineEnd: boolean;\n closestBound?: GraphemeBounds;\n} {\n if (line.bounds.length === 0) {\n return {\n charIndex: 0,\n graphemeIndex: 0,\n isAtLineEnd: true,\n };\n }\n\n // Create visual ordering: sort bounds by visual X position (left-to-right)\n // This handles mixed LTR/RTL content where visual order != logical order\n const visualBounds = line.bounds.map((bound, logicalIndex) => ({\n bound,\n logicalIndex,\n visualX: bound.x,\n visualXEnd: bound.x + bound.kernedWidth,\n })).sort((a, b) => a.visualX - b.visualX);\n\n // Find leftmost and rightmost visual positions\n const leftmostX = visualBounds[0].visualX;\n const rightmostX = visualBounds[visualBounds.length - 1].visualXEnd;\n\n // Handle clicks before the line starts\n if (x < leftmostX) {\n // Find the character that appears visually first\n const firstVisualBound = visualBounds[0];\n return {\n charIndex: firstVisualBound.bound.charIndex,\n graphemeIndex: firstVisualBound.bound.graphemeIndex,\n isAtLineEnd: false,\n closestBound: firstVisualBound.bound,\n };\n }\n\n // Handle clicks after the line ends\n if (x >= rightmostX) {\n // Find the character that appears visually last\n const lastVisualBound = visualBounds[visualBounds.length - 1];\n return {\n charIndex: lastVisualBound.bound.charIndex + 1,\n graphemeIndex: lastVisualBound.bound.graphemeIndex + 1,\n isAtLineEnd: true,\n closestBound: lastVisualBound.bound,\n };\n }\n\n // Find the character containing the X coordinate\n for (let i = 0; i < visualBounds.length; i++) {\n const { bound, visualX, visualXEnd } = visualBounds[i];\n \n if (x >= visualX && x < visualXEnd) {\n // Determine if closer to start or end of character\n const midpoint = visualX + (visualXEnd - visualX) / 2;\n const insertBeforeChar = x < midpoint;\n \n if (insertBeforeChar) {\n return {\n charIndex: bound.charIndex,\n graphemeIndex: bound.graphemeIndex,\n isAtLineEnd: false,\n closestBound: bound,\n };\n } else {\n // Insert after this character\n return {\n charIndex: bound.charIndex + 1,\n graphemeIndex: bound.graphemeIndex + 1,\n isAtLineEnd: false,\n closestBound: bound,\n };\n }\n }\n \n // Check if x is in the gap between this character and the next\n if (i < visualBounds.length - 1) {\n const nextVisual = visualBounds[i + 1];\n if (x >= visualXEnd && x < nextVisual.visualX) {\n // Click in gap - place cursor after current character\n return {\n charIndex: bound.charIndex + 1,\n graphemeIndex: bound.graphemeIndex + 1,\n isAtLineEnd: false,\n closestBound: bound,\n };\n }\n }\n }\n\n // Fallback - find closest character\n const closestBound = visualBounds.reduce((closest, current) => {\n const closestDistance = Math.abs((closest.visualX + closest.visualXEnd) / 2 - x);\n const currentDistance = Math.abs((current.visualX + current.visualXEnd) / 2 - x);\n return currentDistance < closestDistance ? current : closest;\n });\n\n return {\n charIndex: closestBound.bound.charIndex,\n graphemeIndex: closestBound.bound.graphemeIndex,\n isAtLineEnd: false,\n closestBound: closestBound.bound,\n };\n}\n\n/**\n * Calculate total insertion index from line and character indices\n */\nfunction calculateInsertionIndex(\n lineIndex: number,\n graphemeIndex: number,\n layout: LayoutResult\n): number {\n let insertionIndex = 0;\n\n // Add characters from all previous lines\n for (let i = 0; i < lineIndex && i < layout.lines.length; i++) {\n insertionIndex += layout.lines[i].graphemes.length;\n // Add newline character (except for last line)\n if (i < layout.lines.length - 1) {\n insertionIndex += 1; // \\n character\n }\n }\n\n // Add characters within current line\n insertionIndex += graphemeIndex;\n\n return insertionIndex;\n}\n\n/**\n * Find line and grapheme position from insertion index\n */\nfunction findPositionFromIndex(\n insertionIndex: number,\n layout: LayoutResult\n): { lineIndex: number; graphemeIndex: number } {\n let currentIndex = 0;\n\n for (let lineIndex = 0; lineIndex < layout.lines.length; lineIndex++) {\n const line = layout.lines[lineIndex];\n const lineLength = line.graphemes.length;\n\n // Check if index is within this line\n if (insertionIndex >= currentIndex && insertionIndex <= currentIndex + lineLength) {\n return {\n lineIndex,\n graphemeIndex: insertionIndex - currentIndex,\n };\n }\n\n // Move to next line\n currentIndex += lineLength;\n \n // Add newline character (except after last line)\n if (lineIndex < layout.lines.length - 1) {\n currentIndex += 1; // \\n character\n \n // If insertion index is exactly at the newline\n if (insertionIndex === currentIndex - 1) {\n return {\n lineIndex,\n graphemeIndex: lineLength,\n };\n }\n }\n }\n\n // Index is past end of text\n const lastLineIndex = layout.lines.length - 1;\n const lastLine = layout.lines[lastLineIndex];\n \n return {\n lineIndex: lastLineIndex,\n graphemeIndex: lastLine ? lastLine.graphemes.length : 0,\n };\n}\n\n/**\n * Calculate Y position of a line\n */\nfunction calculateLineY(\n lineIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): number {\n let y = 0;\n\n for (let i = 0; i < lineIndex && i < layout.lines.length; i++) {\n y += layout.lines[i].height;\n }\n\n return y;\n}\n\n/**\n * Get selection rectangle for a portion of a line\n */\nfunction getLineSelectionRect(\n line: LayoutLine,\n lineIndex: number,\n startGraphemeIndex: number,\n endGraphemeIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): SelectionRect | null {\n if (startGraphemeIndex >= endGraphemeIndex || line.bounds.length === 0) {\n return null;\n }\n\n // Calculate start X\n let startX = 0;\n if (startGraphemeIndex > 0 && startGraphemeIndex <= line.bounds.length) {\n const startBound = line.bounds[startGraphemeIndex - 1];\n startX = startBound.x + startBound.kernedWidth;\n }\n\n // Calculate end X\n let endX = line.width;\n if (endGraphemeIndex > 0 && endGraphemeIndex <= line.bounds.length) {\n const endBound = line.bounds[endGraphemeIndex - 1];\n endX = endBound.x + endBound.kernedWidth;\n }\n\n const y = calculateLineY(lineIndex, layout, options);\n\n return {\n x: Math.min(startX, endX),\n y,\n width: Math.abs(endX - startX),\n height: line.height,\n baseline: y + line.baseline,\n lineIndex,\n startIndex: startGraphemeIndex,\n endIndex: endGraphemeIndex,\n };\n}\n\n/**\n * Get word boundaries for double-click selection\n */\nexport function getWordBoundaries(\n text: string,\n graphemeIndex: number\n): { start: number; end: number } {\n const graphemes = segmentGraphemes(text);\n \n if (graphemeIndex >= graphemes.length) {\n return { start: graphemes.length, end: graphemes.length };\n }\n\n // Find word boundaries\n let start = graphemeIndex;\n let end = graphemeIndex;\n\n // Expand backwards to find word start\n while (start > 0 && !isWordBoundary(graphemes[start - 1])) {\n start--;\n }\n\n // Expand forwards to find word end\n while (end < graphemes.length && !isWordBoundary(graphemes[end])) {\n end++;\n }\n\n return { start, end };\n}\n\n/**\n * Get line boundaries for triple-click selection\n */\nexport function getLineBoundaries(\n insertionIndex: number,\n layout: LayoutResult\n): { start: number; end: number } {\n const position = findPositionFromIndex(insertionIndex, layout);\n const line = layout.lines[position.lineIndex];\n \n if (!line) {\n return { start: insertionIndex, end: insertionIndex };\n }\n\n // Calculate line start and end indices\n const lineStart = calculateInsertionIndex(position.lineIndex, 0, layout);\n const lineEnd = calculateInsertionIndex(\n position.lineIndex, \n line.graphemes.length, \n layout\n );\n\n return { start: lineStart, end: lineEnd };\n}\n\n/**\n * Check if a character is a word boundary\n */\nfunction isWordBoundary(grapheme: string): boolean {\n return /\\s/.test(grapheme) || /[^\\w]/.test(grapheme);\n}\n\n/**\n * Find closest cursor position to a point (for drag operations)\n */\nexport function findClosestCursorPosition(\n x: number,\n y: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): number {\n const hitResult = hitTest(x, y, layout, options);\n return hitResult.insertionIndex;\n}\n\n/**\n * Get bounding box for a range of text\n */\nexport function getTextRangeBounds(\n startIndex: number,\n endIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): {\n x: number;\n y: number;\n width: number;\n height: number;\n rects: SelectionRect[];\n} {\n const rects = getSelectionRects(startIndex, endIndex, layout, options);\n \n if (rects.length === 0) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n rects: [],\n };\n }\n\n const minX = Math.min(...rects.map(r => r.x));\n const maxX = Math.max(...rects.map(r => r.x + r.width));\n const minY = Math.min(...rects.map(r => r.y));\n const maxY = Math.max(...rects.map(r => r.y + r.height));\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rects,\n };\n}"],"names":["hitTest","x","y","layout","options","lines","length","lineIndex","charIndex","graphemeIndex","isAtLineEnd","isAtTextEnd","insertionIndex","lineResult","_lines","currentY","i","line","height","offsetY","findLineAtY","bounds","calculateInsertionIndex","charResult","visualBounds","map","bound","logicalIndex","visualX","visualXEnd","kernedWidth","sort","a","b","leftmostX","rightmostX","firstVisualBound","closestBound","lastVisualBound","nextVisual","reduce","closest","current","closestDistance","Math","abs","findCharAtX","getCursorRect","width","fontSize","baseline","position","currentIndex","lineLength","graphemes","lastLineIndex","lastLine","findPositionFromIndex","lineHeight","boundIndex","min","calculateLineY"],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import '../config.mjs';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Hit Testing and Cursor Positioning System
|
|
5
|
-
*
|
|
6
|
-
* Maps pointer coordinates to text positions and provides cursor rectangles
|
|
7
|
-
* for interactive text editing with grapheme-aware boundaries.
|
|
3
|
+
/**
|
|
4
|
+
* Hit Testing and Cursor Positioning System
|
|
5
|
+
*
|
|
6
|
+
* Maps pointer coordinates to text positions and provides cursor rectangles
|
|
7
|
+
* for interactive text editing with grapheme-aware boundaries.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
/**
|
|
11
|
-
* Hit test a point against laid out text to find insertion position
|
|
10
|
+
/**
|
|
11
|
+
* Hit test a point against laid out text to find insertion position
|
|
12
12
|
*/
|
|
13
13
|
function hitTest(x, y, layout, options) {
|
|
14
14
|
if (layout.lines.length === 0) {
|
|
@@ -52,8 +52,8 @@ function hitTest(x, y, layout, options) {
|
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
/**
|
|
56
|
-
* Get cursor rectangle for a given insertion index
|
|
55
|
+
/**
|
|
56
|
+
* Get cursor rectangle for a given insertion index
|
|
57
57
|
*/
|
|
58
58
|
function getCursorRect(insertionIndex, layout, options) {
|
|
59
59
|
if (layout.lines.length === 0) {
|
|
@@ -100,8 +100,8 @@ function getCursorRect(insertionIndex, layout, options) {
|
|
|
100
100
|
|
|
101
101
|
// Private helper functions
|
|
102
102
|
|
|
103
|
-
/**
|
|
104
|
-
* Find which line contains the given Y coordinate
|
|
103
|
+
/**
|
|
104
|
+
* Find which line contains the given Y coordinate
|
|
105
105
|
*/
|
|
106
106
|
function findLineAtY(y, lines) {
|
|
107
107
|
var _lines;
|
|
@@ -124,8 +124,8 @@ function findLineAtY(y, lines) {
|
|
|
124
124
|
};
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
/**
|
|
128
|
-
* Find character position within a line at given X coordinate
|
|
127
|
+
/**
|
|
128
|
+
* Find character position within a line at given X coordinate
|
|
129
129
|
*/
|
|
130
130
|
function findCharAtX(x, line, options) {
|
|
131
131
|
if (line.bounds.length === 0) {
|
|
@@ -231,8 +231,8 @@ function findCharAtX(x, line, options) {
|
|
|
231
231
|
};
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
/**
|
|
235
|
-
* Calculate total insertion index from line and character indices
|
|
234
|
+
/**
|
|
235
|
+
* Calculate total insertion index from line and character indices
|
|
236
236
|
*/
|
|
237
237
|
function calculateInsertionIndex(lineIndex, graphemeIndex, layout) {
|
|
238
238
|
let insertionIndex = 0;
|
|
@@ -251,8 +251,8 @@ function calculateInsertionIndex(lineIndex, graphemeIndex, layout) {
|
|
|
251
251
|
return insertionIndex;
|
|
252
252
|
}
|
|
253
253
|
|
|
254
|
-
/**
|
|
255
|
-
* Find line and grapheme position from insertion index
|
|
254
|
+
/**
|
|
255
|
+
* Find line and grapheme position from insertion index
|
|
256
256
|
*/
|
|
257
257
|
function findPositionFromIndex(insertionIndex, layout) {
|
|
258
258
|
let currentIndex = 0;
|
|
@@ -294,8 +294,8 @@ function findPositionFromIndex(insertionIndex, layout) {
|
|
|
294
294
|
};
|
|
295
295
|
}
|
|
296
296
|
|
|
297
|
-
/**
|
|
298
|
-
* Calculate Y position of a line
|
|
297
|
+
/**
|
|
298
|
+
* Calculate Y position of a line
|
|
299
299
|
*/
|
|
300
300
|
function calculateLineY(lineIndex, layout, options) {
|
|
301
301
|
let y = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hitTest.mjs","sources":["../../../src/text/hitTest.ts"],"sourcesContent":["/**\r\n * Hit Testing and Cursor Positioning System\r\n * \r\n * Maps pointer coordinates to text positions and provides cursor rectangles\r\n * for interactive text editing with grapheme-aware boundaries.\r\n */\r\n\r\nimport type { LayoutResult, LayoutLine, GraphemeBounds } from './layout';\r\nimport type { TextLayoutOptions } from './layout';\r\nimport { segmentGraphemes } from './unicode';\r\n\r\nexport interface HitTestResult {\r\n lineIndex: number;\r\n charIndex: number;\r\n graphemeIndex: number;\r\n isAtLineEnd: boolean;\r\n isAtTextEnd: boolean;\r\n insertionIndex: number; // For cursor positioning\r\n closestBound?: GraphemeBounds;\r\n}\r\n\r\nexport interface CursorRect {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n baseline: number;\r\n}\r\n\r\nexport interface SelectionRect extends CursorRect {\r\n lineIndex: number;\r\n startIndex: number;\r\n endIndex: number;\r\n}\r\n\r\n/**\r\n * Hit test a point against laid out text to find insertion position\r\n */\r\nexport function hitTest(\r\n x: number,\r\n y: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): HitTestResult {\r\n if (layout.lines.length === 0) {\r\n return {\r\n lineIndex: 0,\r\n charIndex: 0,\r\n graphemeIndex: 0,\r\n isAtLineEnd: true,\r\n isAtTextEnd: true,\r\n insertionIndex: 0,\r\n };\r\n }\r\n\r\n // Find the line containing the y coordinate\r\n const lineResult = findLineAtY(y, layout.lines);\r\n const line = layout.lines[lineResult.lineIndex];\r\n \r\n if (!line || line.bounds.length === 0) {\r\n return {\r\n lineIndex: lineResult.lineIndex,\r\n charIndex: 0,\r\n graphemeIndex: 0,\r\n isAtLineEnd: true,\r\n isAtTextEnd: lineResult.lineIndex >= layout.lines.length - 1,\r\n insertionIndex: calculateInsertionIndex(lineResult.lineIndex, 0, layout),\r\n };\r\n }\r\n\r\n // Find the character position within the line\r\n const charResult = findCharAtX(x, line, options);\r\n \r\n // Calculate total insertion index\r\n const insertionIndex = calculateInsertionIndex(\r\n lineResult.lineIndex, \r\n charResult.graphemeIndex, \r\n layout\r\n );\r\n\r\n return {\r\n lineIndex: lineResult.lineIndex,\r\n charIndex: charResult.charIndex,\r\n graphemeIndex: charResult.graphemeIndex,\r\n isAtLineEnd: charResult.isAtLineEnd,\r\n isAtTextEnd: lineResult.lineIndex >= layout.lines.length - 1 && charResult.isAtLineEnd,\r\n insertionIndex,\r\n closestBound: charResult.closestBound,\r\n };\r\n}\r\n\r\n/**\r\n * Get cursor rectangle for a given insertion index\r\n */\r\nexport function getCursorRect(\r\n insertionIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): CursorRect {\r\n if (layout.lines.length === 0) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n width: 2, // Default cursor width\r\n height: options.fontSize,\r\n baseline: options.fontSize * 0.8,\r\n };\r\n }\r\n\r\n const position = findPositionFromIndex(insertionIndex, layout);\r\n const line = layout.lines[position.lineIndex];\r\n\r\n if (!line) {\r\n // Past end of text\r\n const lastLine = layout.lines[layout.lines.length - 1];\r\n return {\r\n x: lastLine.width,\r\n y: (layout.lines.length - 1) * (options.fontSize * options.lineHeight),\r\n width: 2,\r\n height: options.fontSize * options.lineHeight,\r\n baseline: options.fontSize * 0.8,\r\n };\r\n }\r\n\r\n // Get position within line\r\n let x = 0;\r\n if (position.graphemeIndex > 0 && line.bounds.length > 0) {\r\n const boundIndex = Math.min(position.graphemeIndex - 1, line.bounds.length - 1);\r\n const bound = line.bounds[boundIndex];\r\n x = bound.x + bound.kernedWidth;\r\n }\r\n\r\n const y = calculateLineY(position.lineIndex, layout, options);\r\n\r\n return {\r\n x,\r\n y,\r\n width: 2, // Standard cursor width\r\n height: line.height,\r\n baseline: y + line.baseline,\r\n };\r\n}\r\n\r\n/**\r\n * Get selection rectangles for a range of text\r\n */\r\nexport function getSelectionRects(\r\n startIndex: number,\r\n endIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): SelectionRect[] {\r\n if (startIndex >= endIndex || layout.lines.length === 0) {\r\n return [];\r\n }\r\n\r\n const startPos = findPositionFromIndex(startIndex, layout);\r\n const endPos = findPositionFromIndex(endIndex, layout);\r\n const rects: SelectionRect[] = [];\r\n\r\n // Handle selection across multiple lines\r\n for (let lineIndex = startPos.lineIndex; lineIndex <= endPos.lineIndex; lineIndex++) {\r\n const line = layout.lines[lineIndex];\r\n if (!line) continue;\r\n\r\n // Determine start and end positions within this line\r\n const lineStartIndex = lineIndex === startPos.lineIndex ? startPos.graphemeIndex : 0;\r\n const lineEndIndex = lineIndex === endPos.lineIndex \r\n ? endPos.graphemeIndex \r\n : line.graphemes.length;\r\n\r\n if (lineStartIndex >= lineEndIndex) continue;\r\n\r\n // Calculate selection rectangle for this line\r\n const rect = getLineSelectionRect(\r\n line,\r\n lineIndex,\r\n lineStartIndex,\r\n lineEndIndex,\r\n layout,\r\n options\r\n );\r\n\r\n if (rect) {\r\n rects.push(rect);\r\n }\r\n }\r\n\r\n return rects;\r\n}\r\n\r\n/**\r\n * Get grapheme boundaries for text navigation\r\n */\r\nexport function getGraphemeBoundaries(text: string): number[] {\r\n const graphemes = segmentGraphemes(text);\r\n const boundaries: number[] = [0];\r\n let stringIndex = 0;\r\n\r\n for (const grapheme of graphemes) {\r\n stringIndex += grapheme.length;\r\n boundaries.push(stringIndex);\r\n }\r\n\r\n return boundaries;\r\n}\r\n\r\n/**\r\n * Map string index to grapheme index\r\n */\r\nexport function mapStringIndexToGraphemeIndex(text: string, stringIndex: number): number {\r\n const graphemes = segmentGraphemes(text);\r\n let currentStringIndex = 0;\r\n\r\n for (let i = 0; i < graphemes.length; i++) {\r\n if (currentStringIndex >= stringIndex) {\r\n return i;\r\n }\r\n currentStringIndex += graphemes[i].length;\r\n }\r\n\r\n return graphemes.length;\r\n}\r\n\r\n/**\r\n * Map grapheme index to string index\r\n */\r\nexport function mapGraphemeIndexToStringIndex(text: string, graphemeIndex: number): number {\r\n const graphemes = segmentGraphemes(text);\r\n let stringIndex = 0;\r\n\r\n for (let i = 0; i < graphemeIndex && i < graphemes.length; i++) {\r\n stringIndex += graphemes[i].length;\r\n }\r\n\r\n return stringIndex;\r\n}\r\n\r\n// Private helper functions\r\n\r\n/**\r\n * Find which line contains the given Y coordinate\r\n */\r\nfunction findLineAtY(y: number, lines: LayoutLine[]): { lineIndex: number; offsetY: number } {\r\n let currentY = 0;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n if (y >= currentY && y < currentY + line.height) {\r\n return { lineIndex: i, offsetY: y - currentY };\r\n }\r\n currentY += line.height;\r\n }\r\n\r\n // Y is past all lines - return last line\r\n return { \r\n lineIndex: lines.length - 1, \r\n offsetY: lines[lines.length - 1]?.height || 0 \r\n };\r\n}\r\n\r\n/**\r\n * Find character position within a line at given X coordinate\r\n */\r\nfunction findCharAtX(\r\n x: number,\r\n line: LayoutLine,\r\n options: TextLayoutOptions\r\n): {\r\n charIndex: number;\r\n graphemeIndex: number;\r\n isAtLineEnd: boolean;\r\n closestBound?: GraphemeBounds;\r\n} {\r\n if (line.bounds.length === 0) {\r\n return {\r\n charIndex: 0,\r\n graphemeIndex: 0,\r\n isAtLineEnd: true,\r\n };\r\n }\r\n\r\n // Create visual ordering: sort bounds by visual X position (left-to-right)\r\n // This handles mixed LTR/RTL content where visual order != logical order\r\n const visualBounds = line.bounds.map((bound, logicalIndex) => ({\r\n bound,\r\n logicalIndex,\r\n visualX: bound.x,\r\n visualXEnd: bound.x + bound.kernedWidth,\r\n })).sort((a, b) => a.visualX - b.visualX);\r\n\r\n // Find leftmost and rightmost visual positions\r\n const leftmostX = visualBounds[0].visualX;\r\n const rightmostX = visualBounds[visualBounds.length - 1].visualXEnd;\r\n\r\n // Handle clicks before the line starts\r\n if (x < leftmostX) {\r\n // Find the character that appears visually first\r\n const firstVisualBound = visualBounds[0];\r\n return {\r\n charIndex: firstVisualBound.bound.charIndex,\r\n graphemeIndex: firstVisualBound.bound.graphemeIndex,\r\n isAtLineEnd: false,\r\n closestBound: firstVisualBound.bound,\r\n };\r\n }\r\n\r\n // Handle clicks after the line ends\r\n if (x >= rightmostX) {\r\n // Find the character that appears visually last\r\n const lastVisualBound = visualBounds[visualBounds.length - 1];\r\n return {\r\n charIndex: lastVisualBound.bound.charIndex + 1,\r\n graphemeIndex: lastVisualBound.bound.graphemeIndex + 1,\r\n isAtLineEnd: true,\r\n closestBound: lastVisualBound.bound,\r\n };\r\n }\r\n\r\n // Find the character containing the X coordinate\r\n for (let i = 0; i < visualBounds.length; i++) {\r\n const { bound, visualX, visualXEnd } = visualBounds[i];\r\n \r\n if (x >= visualX && x < visualXEnd) {\r\n // Determine if closer to start or end of character\r\n const midpoint = visualX + (visualXEnd - visualX) / 2;\r\n const insertBeforeChar = x < midpoint;\r\n \r\n if (insertBeforeChar) {\r\n return {\r\n charIndex: bound.charIndex,\r\n graphemeIndex: bound.graphemeIndex,\r\n isAtLineEnd: false,\r\n closestBound: bound,\r\n };\r\n } else {\r\n // Insert after this character\r\n return {\r\n charIndex: bound.charIndex + 1,\r\n graphemeIndex: bound.graphemeIndex + 1,\r\n isAtLineEnd: false,\r\n closestBound: bound,\r\n };\r\n }\r\n }\r\n \r\n // Check if x is in the gap between this character and the next\r\n if (i < visualBounds.length - 1) {\r\n const nextVisual = visualBounds[i + 1];\r\n if (x >= visualXEnd && x < nextVisual.visualX) {\r\n // Click in gap - place cursor after current character\r\n return {\r\n charIndex: bound.charIndex + 1,\r\n graphemeIndex: bound.graphemeIndex + 1,\r\n isAtLineEnd: false,\r\n closestBound: bound,\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Fallback - find closest character\r\n const closestBound = visualBounds.reduce((closest, current) => {\r\n const closestDistance = Math.abs((closest.visualX + closest.visualXEnd) / 2 - x);\r\n const currentDistance = Math.abs((current.visualX + current.visualXEnd) / 2 - x);\r\n return currentDistance < closestDistance ? current : closest;\r\n });\r\n\r\n return {\r\n charIndex: closestBound.bound.charIndex,\r\n graphemeIndex: closestBound.bound.graphemeIndex,\r\n isAtLineEnd: false,\r\n closestBound: closestBound.bound,\r\n };\r\n}\r\n\r\n/**\r\n * Calculate total insertion index from line and character indices\r\n */\r\nfunction calculateInsertionIndex(\r\n lineIndex: number,\r\n graphemeIndex: number,\r\n layout: LayoutResult\r\n): number {\r\n let insertionIndex = 0;\r\n\r\n // Add characters from all previous lines\r\n for (let i = 0; i < lineIndex && i < layout.lines.length; i++) {\r\n insertionIndex += layout.lines[i].graphemes.length;\r\n // Add newline character (except for last line)\r\n if (i < layout.lines.length - 1) {\r\n insertionIndex += 1; // \\n character\r\n }\r\n }\r\n\r\n // Add characters within current line\r\n insertionIndex += graphemeIndex;\r\n\r\n return insertionIndex;\r\n}\r\n\r\n/**\r\n * Find line and grapheme position from insertion index\r\n */\r\nfunction findPositionFromIndex(\r\n insertionIndex: number,\r\n layout: LayoutResult\r\n): { lineIndex: number; graphemeIndex: number } {\r\n let currentIndex = 0;\r\n\r\n for (let lineIndex = 0; lineIndex < layout.lines.length; lineIndex++) {\r\n const line = layout.lines[lineIndex];\r\n const lineLength = line.graphemes.length;\r\n\r\n // Check if index is within this line\r\n if (insertionIndex >= currentIndex && insertionIndex <= currentIndex + lineLength) {\r\n return {\r\n lineIndex,\r\n graphemeIndex: insertionIndex - currentIndex,\r\n };\r\n }\r\n\r\n // Move to next line\r\n currentIndex += lineLength;\r\n \r\n // Add newline character (except after last line)\r\n if (lineIndex < layout.lines.length - 1) {\r\n currentIndex += 1; // \\n character\r\n \r\n // If insertion index is exactly at the newline\r\n if (insertionIndex === currentIndex - 1) {\r\n return {\r\n lineIndex,\r\n graphemeIndex: lineLength,\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Index is past end of text\r\n const lastLineIndex = layout.lines.length - 1;\r\n const lastLine = layout.lines[lastLineIndex];\r\n \r\n return {\r\n lineIndex: lastLineIndex,\r\n graphemeIndex: lastLine ? lastLine.graphemes.length : 0,\r\n };\r\n}\r\n\r\n/**\r\n * Calculate Y position of a line\r\n */\r\nfunction calculateLineY(\r\n lineIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): number {\r\n let y = 0;\r\n\r\n for (let i = 0; i < lineIndex && i < layout.lines.length; i++) {\r\n y += layout.lines[i].height;\r\n }\r\n\r\n return y;\r\n}\r\n\r\n/**\r\n * Get selection rectangle for a portion of a line\r\n */\r\nfunction getLineSelectionRect(\r\n line: LayoutLine,\r\n lineIndex: number,\r\n startGraphemeIndex: number,\r\n endGraphemeIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): SelectionRect | null {\r\n if (startGraphemeIndex >= endGraphemeIndex || line.bounds.length === 0) {\r\n return null;\r\n }\r\n\r\n // Calculate start X\r\n let startX = 0;\r\n if (startGraphemeIndex > 0 && startGraphemeIndex <= line.bounds.length) {\r\n const startBound = line.bounds[startGraphemeIndex - 1];\r\n startX = startBound.x + startBound.kernedWidth;\r\n }\r\n\r\n // Calculate end X\r\n let endX = line.width;\r\n if (endGraphemeIndex > 0 && endGraphemeIndex <= line.bounds.length) {\r\n const endBound = line.bounds[endGraphemeIndex - 1];\r\n endX = endBound.x + endBound.kernedWidth;\r\n }\r\n\r\n const y = calculateLineY(lineIndex, layout, options);\r\n\r\n return {\r\n x: Math.min(startX, endX),\r\n y,\r\n width: Math.abs(endX - startX),\r\n height: line.height,\r\n baseline: y + line.baseline,\r\n lineIndex,\r\n startIndex: startGraphemeIndex,\r\n endIndex: endGraphemeIndex,\r\n };\r\n}\r\n\r\n/**\r\n * Get word boundaries for double-click selection\r\n */\r\nexport function getWordBoundaries(\r\n text: string,\r\n graphemeIndex: number\r\n): { start: number; end: number } {\r\n const graphemes = segmentGraphemes(text);\r\n \r\n if (graphemeIndex >= graphemes.length) {\r\n return { start: graphemes.length, end: graphemes.length };\r\n }\r\n\r\n // Find word boundaries\r\n let start = graphemeIndex;\r\n let end = graphemeIndex;\r\n\r\n // Expand backwards to find word start\r\n while (start > 0 && !isWordBoundary(graphemes[start - 1])) {\r\n start--;\r\n }\r\n\r\n // Expand forwards to find word end\r\n while (end < graphemes.length && !isWordBoundary(graphemes[end])) {\r\n end++;\r\n }\r\n\r\n return { start, end };\r\n}\r\n\r\n/**\r\n * Get line boundaries for triple-click selection\r\n */\r\nexport function getLineBoundaries(\r\n insertionIndex: number,\r\n layout: LayoutResult\r\n): { start: number; end: number } {\r\n const position = findPositionFromIndex(insertionIndex, layout);\r\n const line = layout.lines[position.lineIndex];\r\n \r\n if (!line) {\r\n return { start: insertionIndex, end: insertionIndex };\r\n }\r\n\r\n // Calculate line start and end indices\r\n const lineStart = calculateInsertionIndex(position.lineIndex, 0, layout);\r\n const lineEnd = calculateInsertionIndex(\r\n position.lineIndex, \r\n line.graphemes.length, \r\n layout\r\n );\r\n\r\n return { start: lineStart, end: lineEnd };\r\n}\r\n\r\n/**\r\n * Check if a character is a word boundary\r\n */\r\nfunction isWordBoundary(grapheme: string): boolean {\r\n return /\\s/.test(grapheme) || /[^\\w]/.test(grapheme);\r\n}\r\n\r\n/**\r\n * Find closest cursor position to a point (for drag operations)\r\n */\r\nexport function findClosestCursorPosition(\r\n x: number,\r\n y: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): number {\r\n const hitResult = hitTest(x, y, layout, options);\r\n return hitResult.insertionIndex;\r\n}\r\n\r\n/**\r\n * Get bounding box for a range of text\r\n */\r\nexport function getTextRangeBounds(\r\n startIndex: number,\r\n endIndex: number,\r\n layout: LayoutResult,\r\n options: TextLayoutOptions\r\n): {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rects: SelectionRect[];\r\n} {\r\n const rects = getSelectionRects(startIndex, endIndex, layout, options);\r\n \r\n if (rects.length === 0) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n rects: [],\r\n };\r\n }\r\n\r\n const minX = Math.min(...rects.map(r => r.x));\r\n const maxX = Math.max(...rects.map(r => r.x + r.width));\r\n const minY = Math.min(...rects.map(r => r.y));\r\n const maxY = Math.max(...rects.map(r => r.y + r.height));\r\n\r\n return {\r\n x: minX,\r\n y: minY,\r\n width: maxX - minX,\r\n height: maxY - minY,\r\n rects,\r\n };\r\n}"],"names":["hitTest","x","y","layout","options","lines","length","lineIndex","charIndex","graphemeIndex","isAtLineEnd","isAtTextEnd","insertionIndex","lineResult","findLineAtY","line","bounds","calculateInsertionIndex","charResult","findCharAtX","closestBound","getCursorRect","width","height","fontSize","baseline","position","findPositionFromIndex","lastLine","lineHeight","boundIndex","Math","min","bound","kernedWidth","calculateLineY","_lines","currentY","i","offsetY","visualBounds","map","logicalIndex","visualX","visualXEnd","sort","a","b","leftmostX","rightmostX","firstVisualBound","lastVisualBound","midpoint","insertBeforeChar","nextVisual","reduce","closest","current","closestDistance","abs","currentDistance","graphemes","currentIndex","lineLength","lastLineIndex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hitTest.mjs","sources":["../../../src/text/hitTest.ts"],"sourcesContent":["/**\n * Hit Testing and Cursor Positioning System\n * \n * Maps pointer coordinates to text positions and provides cursor rectangles\n * for interactive text editing with grapheme-aware boundaries.\n */\n\nimport type { LayoutResult, LayoutLine, GraphemeBounds } from './layout';\nimport type { TextLayoutOptions } from './layout';\nimport { segmentGraphemes } from './unicode';\n\nexport interface HitTestResult {\n lineIndex: number;\n charIndex: number;\n graphemeIndex: number;\n isAtLineEnd: boolean;\n isAtTextEnd: boolean;\n insertionIndex: number; // For cursor positioning\n closestBound?: GraphemeBounds;\n}\n\nexport interface CursorRect {\n x: number;\n y: number;\n width: number;\n height: number;\n baseline: number;\n}\n\nexport interface SelectionRect extends CursorRect {\n lineIndex: number;\n startIndex: number;\n endIndex: number;\n}\n\n/**\n * Hit test a point against laid out text to find insertion position\n */\nexport function hitTest(\n x: number,\n y: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): HitTestResult {\n if (layout.lines.length === 0) {\n return {\n lineIndex: 0,\n charIndex: 0,\n graphemeIndex: 0,\n isAtLineEnd: true,\n isAtTextEnd: true,\n insertionIndex: 0,\n };\n }\n\n // Find the line containing the y coordinate\n const lineResult = findLineAtY(y, layout.lines);\n const line = layout.lines[lineResult.lineIndex];\n \n if (!line || line.bounds.length === 0) {\n return {\n lineIndex: lineResult.lineIndex,\n charIndex: 0,\n graphemeIndex: 0,\n isAtLineEnd: true,\n isAtTextEnd: lineResult.lineIndex >= layout.lines.length - 1,\n insertionIndex: calculateInsertionIndex(lineResult.lineIndex, 0, layout),\n };\n }\n\n // Find the character position within the line\n const charResult = findCharAtX(x, line, options);\n \n // Calculate total insertion index\n const insertionIndex = calculateInsertionIndex(\n lineResult.lineIndex, \n charResult.graphemeIndex, \n layout\n );\n\n return {\n lineIndex: lineResult.lineIndex,\n charIndex: charResult.charIndex,\n graphemeIndex: charResult.graphemeIndex,\n isAtLineEnd: charResult.isAtLineEnd,\n isAtTextEnd: lineResult.lineIndex >= layout.lines.length - 1 && charResult.isAtLineEnd,\n insertionIndex,\n closestBound: charResult.closestBound,\n };\n}\n\n/**\n * Get cursor rectangle for a given insertion index\n */\nexport function getCursorRect(\n insertionIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): CursorRect {\n if (layout.lines.length === 0) {\n return {\n x: 0,\n y: 0,\n width: 2, // Default cursor width\n height: options.fontSize,\n baseline: options.fontSize * 0.8,\n };\n }\n\n const position = findPositionFromIndex(insertionIndex, layout);\n const line = layout.lines[position.lineIndex];\n\n if (!line) {\n // Past end of text\n const lastLine = layout.lines[layout.lines.length - 1];\n return {\n x: lastLine.width,\n y: (layout.lines.length - 1) * (options.fontSize * options.lineHeight),\n width: 2,\n height: options.fontSize * options.lineHeight,\n baseline: options.fontSize * 0.8,\n };\n }\n\n // Get position within line\n let x = 0;\n if (position.graphemeIndex > 0 && line.bounds.length > 0) {\n const boundIndex = Math.min(position.graphemeIndex - 1, line.bounds.length - 1);\n const bound = line.bounds[boundIndex];\n x = bound.x + bound.kernedWidth;\n }\n\n const y = calculateLineY(position.lineIndex, layout, options);\n\n return {\n x,\n y,\n width: 2, // Standard cursor width\n height: line.height,\n baseline: y + line.baseline,\n };\n}\n\n/**\n * Get selection rectangles for a range of text\n */\nexport function getSelectionRects(\n startIndex: number,\n endIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): SelectionRect[] {\n if (startIndex >= endIndex || layout.lines.length === 0) {\n return [];\n }\n\n const startPos = findPositionFromIndex(startIndex, layout);\n const endPos = findPositionFromIndex(endIndex, layout);\n const rects: SelectionRect[] = [];\n\n // Handle selection across multiple lines\n for (let lineIndex = startPos.lineIndex; lineIndex <= endPos.lineIndex; lineIndex++) {\n const line = layout.lines[lineIndex];\n if (!line) continue;\n\n // Determine start and end positions within this line\n const lineStartIndex = lineIndex === startPos.lineIndex ? startPos.graphemeIndex : 0;\n const lineEndIndex = lineIndex === endPos.lineIndex \n ? endPos.graphemeIndex \n : line.graphemes.length;\n\n if (lineStartIndex >= lineEndIndex) continue;\n\n // Calculate selection rectangle for this line\n const rect = getLineSelectionRect(\n line,\n lineIndex,\n lineStartIndex,\n lineEndIndex,\n layout,\n options\n );\n\n if (rect) {\n rects.push(rect);\n }\n }\n\n return rects;\n}\n\n/**\n * Get grapheme boundaries for text navigation\n */\nexport function getGraphemeBoundaries(text: string): number[] {\n const graphemes = segmentGraphemes(text);\n const boundaries: number[] = [0];\n let stringIndex = 0;\n\n for (const grapheme of graphemes) {\n stringIndex += grapheme.length;\n boundaries.push(stringIndex);\n }\n\n return boundaries;\n}\n\n/**\n * Map string index to grapheme index\n */\nexport function mapStringIndexToGraphemeIndex(text: string, stringIndex: number): number {\n const graphemes = segmentGraphemes(text);\n let currentStringIndex = 0;\n\n for (let i = 0; i < graphemes.length; i++) {\n if (currentStringIndex >= stringIndex) {\n return i;\n }\n currentStringIndex += graphemes[i].length;\n }\n\n return graphemes.length;\n}\n\n/**\n * Map grapheme index to string index\n */\nexport function mapGraphemeIndexToStringIndex(text: string, graphemeIndex: number): number {\n const graphemes = segmentGraphemes(text);\n let stringIndex = 0;\n\n for (let i = 0; i < graphemeIndex && i < graphemes.length; i++) {\n stringIndex += graphemes[i].length;\n }\n\n return stringIndex;\n}\n\n// Private helper functions\n\n/**\n * Find which line contains the given Y coordinate\n */\nfunction findLineAtY(y: number, lines: LayoutLine[]): { lineIndex: number; offsetY: number } {\n let currentY = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (y >= currentY && y < currentY + line.height) {\n return { lineIndex: i, offsetY: y - currentY };\n }\n currentY += line.height;\n }\n\n // Y is past all lines - return last line\n return { \n lineIndex: lines.length - 1, \n offsetY: lines[lines.length - 1]?.height || 0 \n };\n}\n\n/**\n * Find character position within a line at given X coordinate\n */\nfunction findCharAtX(\n x: number,\n line: LayoutLine,\n options: TextLayoutOptions\n): {\n charIndex: number;\n graphemeIndex: number;\n isAtLineEnd: boolean;\n closestBound?: GraphemeBounds;\n} {\n if (line.bounds.length === 0) {\n return {\n charIndex: 0,\n graphemeIndex: 0,\n isAtLineEnd: true,\n };\n }\n\n // Create visual ordering: sort bounds by visual X position (left-to-right)\n // This handles mixed LTR/RTL content where visual order != logical order\n const visualBounds = line.bounds.map((bound, logicalIndex) => ({\n bound,\n logicalIndex,\n visualX: bound.x,\n visualXEnd: bound.x + bound.kernedWidth,\n })).sort((a, b) => a.visualX - b.visualX);\n\n // Find leftmost and rightmost visual positions\n const leftmostX = visualBounds[0].visualX;\n const rightmostX = visualBounds[visualBounds.length - 1].visualXEnd;\n\n // Handle clicks before the line starts\n if (x < leftmostX) {\n // Find the character that appears visually first\n const firstVisualBound = visualBounds[0];\n return {\n charIndex: firstVisualBound.bound.charIndex,\n graphemeIndex: firstVisualBound.bound.graphemeIndex,\n isAtLineEnd: false,\n closestBound: firstVisualBound.bound,\n };\n }\n\n // Handle clicks after the line ends\n if (x >= rightmostX) {\n // Find the character that appears visually last\n const lastVisualBound = visualBounds[visualBounds.length - 1];\n return {\n charIndex: lastVisualBound.bound.charIndex + 1,\n graphemeIndex: lastVisualBound.bound.graphemeIndex + 1,\n isAtLineEnd: true,\n closestBound: lastVisualBound.bound,\n };\n }\n\n // Find the character containing the X coordinate\n for (let i = 0; i < visualBounds.length; i++) {\n const { bound, visualX, visualXEnd } = visualBounds[i];\n \n if (x >= visualX && x < visualXEnd) {\n // Determine if closer to start or end of character\n const midpoint = visualX + (visualXEnd - visualX) / 2;\n const insertBeforeChar = x < midpoint;\n \n if (insertBeforeChar) {\n return {\n charIndex: bound.charIndex,\n graphemeIndex: bound.graphemeIndex,\n isAtLineEnd: false,\n closestBound: bound,\n };\n } else {\n // Insert after this character\n return {\n charIndex: bound.charIndex + 1,\n graphemeIndex: bound.graphemeIndex + 1,\n isAtLineEnd: false,\n closestBound: bound,\n };\n }\n }\n \n // Check if x is in the gap between this character and the next\n if (i < visualBounds.length - 1) {\n const nextVisual = visualBounds[i + 1];\n if (x >= visualXEnd && x < nextVisual.visualX) {\n // Click in gap - place cursor after current character\n return {\n charIndex: bound.charIndex + 1,\n graphemeIndex: bound.graphemeIndex + 1,\n isAtLineEnd: false,\n closestBound: bound,\n };\n }\n }\n }\n\n // Fallback - find closest character\n const closestBound = visualBounds.reduce((closest, current) => {\n const closestDistance = Math.abs((closest.visualX + closest.visualXEnd) / 2 - x);\n const currentDistance = Math.abs((current.visualX + current.visualXEnd) / 2 - x);\n return currentDistance < closestDistance ? current : closest;\n });\n\n return {\n charIndex: closestBound.bound.charIndex,\n graphemeIndex: closestBound.bound.graphemeIndex,\n isAtLineEnd: false,\n closestBound: closestBound.bound,\n };\n}\n\n/**\n * Calculate total insertion index from line and character indices\n */\nfunction calculateInsertionIndex(\n lineIndex: number,\n graphemeIndex: number,\n layout: LayoutResult\n): number {\n let insertionIndex = 0;\n\n // Add characters from all previous lines\n for (let i = 0; i < lineIndex && i < layout.lines.length; i++) {\n insertionIndex += layout.lines[i].graphemes.length;\n // Add newline character (except for last line)\n if (i < layout.lines.length - 1) {\n insertionIndex += 1; // \\n character\n }\n }\n\n // Add characters within current line\n insertionIndex += graphemeIndex;\n\n return insertionIndex;\n}\n\n/**\n * Find line and grapheme position from insertion index\n */\nfunction findPositionFromIndex(\n insertionIndex: number,\n layout: LayoutResult\n): { lineIndex: number; graphemeIndex: number } {\n let currentIndex = 0;\n\n for (let lineIndex = 0; lineIndex < layout.lines.length; lineIndex++) {\n const line = layout.lines[lineIndex];\n const lineLength = line.graphemes.length;\n\n // Check if index is within this line\n if (insertionIndex >= currentIndex && insertionIndex <= currentIndex + lineLength) {\n return {\n lineIndex,\n graphemeIndex: insertionIndex - currentIndex,\n };\n }\n\n // Move to next line\n currentIndex += lineLength;\n \n // Add newline character (except after last line)\n if (lineIndex < layout.lines.length - 1) {\n currentIndex += 1; // \\n character\n \n // If insertion index is exactly at the newline\n if (insertionIndex === currentIndex - 1) {\n return {\n lineIndex,\n graphemeIndex: lineLength,\n };\n }\n }\n }\n\n // Index is past end of text\n const lastLineIndex = layout.lines.length - 1;\n const lastLine = layout.lines[lastLineIndex];\n \n return {\n lineIndex: lastLineIndex,\n graphemeIndex: lastLine ? lastLine.graphemes.length : 0,\n };\n}\n\n/**\n * Calculate Y position of a line\n */\nfunction calculateLineY(\n lineIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): number {\n let y = 0;\n\n for (let i = 0; i < lineIndex && i < layout.lines.length; i++) {\n y += layout.lines[i].height;\n }\n\n return y;\n}\n\n/**\n * Get selection rectangle for a portion of a line\n */\nfunction getLineSelectionRect(\n line: LayoutLine,\n lineIndex: number,\n startGraphemeIndex: number,\n endGraphemeIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): SelectionRect | null {\n if (startGraphemeIndex >= endGraphemeIndex || line.bounds.length === 0) {\n return null;\n }\n\n // Calculate start X\n let startX = 0;\n if (startGraphemeIndex > 0 && startGraphemeIndex <= line.bounds.length) {\n const startBound = line.bounds[startGraphemeIndex - 1];\n startX = startBound.x + startBound.kernedWidth;\n }\n\n // Calculate end X\n let endX = line.width;\n if (endGraphemeIndex > 0 && endGraphemeIndex <= line.bounds.length) {\n const endBound = line.bounds[endGraphemeIndex - 1];\n endX = endBound.x + endBound.kernedWidth;\n }\n\n const y = calculateLineY(lineIndex, layout, options);\n\n return {\n x: Math.min(startX, endX),\n y,\n width: Math.abs(endX - startX),\n height: line.height,\n baseline: y + line.baseline,\n lineIndex,\n startIndex: startGraphemeIndex,\n endIndex: endGraphemeIndex,\n };\n}\n\n/**\n * Get word boundaries for double-click selection\n */\nexport function getWordBoundaries(\n text: string,\n graphemeIndex: number\n): { start: number; end: number } {\n const graphemes = segmentGraphemes(text);\n \n if (graphemeIndex >= graphemes.length) {\n return { start: graphemes.length, end: graphemes.length };\n }\n\n // Find word boundaries\n let start = graphemeIndex;\n let end = graphemeIndex;\n\n // Expand backwards to find word start\n while (start > 0 && !isWordBoundary(graphemes[start - 1])) {\n start--;\n }\n\n // Expand forwards to find word end\n while (end < graphemes.length && !isWordBoundary(graphemes[end])) {\n end++;\n }\n\n return { start, end };\n}\n\n/**\n * Get line boundaries for triple-click selection\n */\nexport function getLineBoundaries(\n insertionIndex: number,\n layout: LayoutResult\n): { start: number; end: number } {\n const position = findPositionFromIndex(insertionIndex, layout);\n const line = layout.lines[position.lineIndex];\n \n if (!line) {\n return { start: insertionIndex, end: insertionIndex };\n }\n\n // Calculate line start and end indices\n const lineStart = calculateInsertionIndex(position.lineIndex, 0, layout);\n const lineEnd = calculateInsertionIndex(\n position.lineIndex, \n line.graphemes.length, \n layout\n );\n\n return { start: lineStart, end: lineEnd };\n}\n\n/**\n * Check if a character is a word boundary\n */\nfunction isWordBoundary(grapheme: string): boolean {\n return /\\s/.test(grapheme) || /[^\\w]/.test(grapheme);\n}\n\n/**\n * Find closest cursor position to a point (for drag operations)\n */\nexport function findClosestCursorPosition(\n x: number,\n y: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): number {\n const hitResult = hitTest(x, y, layout, options);\n return hitResult.insertionIndex;\n}\n\n/**\n * Get bounding box for a range of text\n */\nexport function getTextRangeBounds(\n startIndex: number,\n endIndex: number,\n layout: LayoutResult,\n options: TextLayoutOptions\n): {\n x: number;\n y: number;\n width: number;\n height: number;\n rects: SelectionRect[];\n} {\n const rects = getSelectionRects(startIndex, endIndex, layout, options);\n \n if (rects.length === 0) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n rects: [],\n };\n }\n\n const minX = Math.min(...rects.map(r => r.x));\n const maxX = Math.max(...rects.map(r => r.x + r.width));\n const minY = Math.min(...rects.map(r => r.y));\n const maxY = Math.max(...rects.map(r => r.y + r.height));\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rects,\n };\n}"],"names":["hitTest","x","y","layout","options","lines","length","lineIndex","charIndex","graphemeIndex","isAtLineEnd","isAtTextEnd","insertionIndex","lineResult","findLineAtY","line","bounds","calculateInsertionIndex","charResult","findCharAtX","closestBound","getCursorRect","width","height","fontSize","baseline","position","findPositionFromIndex","lastLine","lineHeight","boundIndex","Math","min","bound","kernedWidth","calculateLineY","_lines","currentY","i","offsetY","visualBounds","map","logicalIndex","visualX","visualXEnd","sort","a","b","leftmostX","rightmostX","firstVisualBound","lastVisualBound","midpoint","insertBeforeChar","nextVisual","reduce","closest","current","closestDistance","abs","currentDistance","graphemes","currentIndex","lineLength","lastLineIndex"],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.min.mjs","sources":["../../../src/text/layout.ts"],"sourcesContent":["/**\r\n * Core Text Layout Engine\r\n * \r\n * Implements Konva-compatible text layout with support for:\r\n * - Multiple wrap modes (word/char/none)\r\n * - Ellipsis truncation\r\n * - Justify alignment with proper space distribution\r\n * - RTL/LTR text direction\r\n * - Advanced grapheme handling\r\n */\r\n\r\nimport { graphemeSplit } from '../util/lang_string';\r\nimport type { MeasurementOptions, GraphemeMeasurement, KerningMeasurement } from './measure';\r\nimport { measureGrapheme, measureGraphemeWithKerning, getFontMetrics } from './measure';\r\nimport type { EllipsisResult } from './ellipsis';\r\nimport { applyEllipsis } from './ellipsis';\r\nimport { segmentGraphemes, analyzeBiDi, type BiDiRun } from './unicode';\r\n\r\nexport interface TextLayoutOptions {\r\n text: string;\r\n width?: number;\r\n height?: number;\r\n wrap: 'word' | 'char' | 'none';\r\n align: 'left' | 'center' | 'right' | 'justify';\r\n ellipsis?: boolean | string;\r\n fontSize: number;\r\n lineHeight: number;\r\n letterSpacing?: number; // px-based (Konva style)\r\n charSpacing?: number; // em-based (Fabric style) \r\n direction: 'ltr' | 'rtl' | 'inherit';\r\n fontFamily: string;\r\n fontStyle: string;\r\n fontWeight: string | number;\r\n padding?: number;\r\n verticalAlign?: 'top' | 'middle' | 'bottom';\r\n}\r\n\r\nexport interface LayoutResult {\r\n lines: LayoutLine[];\r\n totalWidth: number;\r\n totalHeight: number;\r\n isTruncated: boolean;\r\n graphemeCount: number;\r\n ellipsisApplied?: EllipsisResult;\r\n}\r\n\r\nexport interface LayoutLine {\r\n text: string;\r\n graphemes: string[];\r\n width: number;\r\n height: number;\r\n bounds: GraphemeBounds[];\r\n isWrapped: boolean;\r\n isLastInParagraph: boolean;\r\n justifyRatio?: number; // For justify alignment - space expansion factor\r\n baseline: number;\r\n}\r\n\r\nexport interface GraphemeBounds {\r\n grapheme: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n kernedWidth: number;\r\n left: number;\r\n baseline: number;\r\n deltaY?: number;\r\n charIndex: number; // Logical character index in original text\r\n graphemeIndex: number; // Logical grapheme index in original text\r\n}\r\n\r\n/**\r\n * Main text layout function - converts text and options into positioned layout\r\n */\r\nexport function layoutText(options: TextLayoutOptions): LayoutResult {\r\n const {\r\n text,\r\n width: containerWidth,\r\n height: containerHeight,\r\n wrap,\r\n align,\r\n ellipsis,\r\n direction,\r\n padding = 0,\r\n verticalAlign = 'top'\r\n } = options;\r\n\r\n // Handle empty text\r\n if (!text) {\r\n return {\r\n lines: [],\r\n totalWidth: 0,\r\n totalHeight: 0,\r\n isTruncated: false,\r\n graphemeCount: 0,\r\n };\r\n }\r\n\r\n // Calculate available space\r\n const maxWidth = containerWidth ? containerWidth - (padding * 2) : Infinity;\r\n const maxHeight = containerHeight ? containerHeight - (padding * 2) : Infinity;\r\n\r\n // Split text into paragraphs (by \\n)\r\n const paragraphs = text.split('\\n');\r\n \r\n // Process each paragraph\r\n const allLines: LayoutLine[] = [];\r\n let totalHeight = 0;\r\n let maxLineWidth = 0;\r\n let totalGraphemes = 0;\r\n\r\n for (let i = 0; i < paragraphs.length; i++) {\r\n const paragraph = paragraphs[i];\r\n const isLastParagraph = i === paragraphs.length - 1;\r\n \r\n // Layout this paragraph\r\n const paragraphLines = layoutParagraph(paragraph, {\r\n ...options,\r\n width: maxWidth,\r\n isLastParagraph,\r\n });\r\n \r\n // Check height constraints\r\n for (const line of paragraphLines) {\r\n if (containerHeight && totalHeight + line.height > maxHeight) {\r\n // Height exceeded - truncate here\r\n const truncatedResult = handleHeightOverflow(\r\n allLines,\r\n line,\r\n maxHeight - totalHeight,\r\n options\r\n );\r\n \r\n return {\r\n lines: truncatedResult.lines,\r\n totalWidth: Math.max(maxLineWidth, ...truncatedResult.lines.map(l => l.width)),\r\n totalHeight: maxHeight,\r\n isTruncated: true,\r\n graphemeCount: totalGraphemes + truncatedResult.addedGraphemes,\r\n ellipsisApplied: truncatedResult.ellipsisResult,\r\n };\r\n }\r\n\r\n // Mark last line in paragraph\r\n if (line === paragraphLines[paragraphLines.length - 1]) {\r\n line.isLastInParagraph = true;\r\n }\r\n\r\n allLines.push(line);\r\n totalHeight += line.height;\r\n maxLineWidth = Math.max(maxLineWidth, line.width);\r\n totalGraphemes += line.graphemes.length;\r\n }\r\n }\r\n\r\n // Apply ellipsis if width exceeded and ellipsis enabled\r\n let ellipsisResult: EllipsisResult | undefined;\r\n if (ellipsis && containerWidth) {\r\n for (const line of allLines) {\r\n if (line.width > maxWidth) {\r\n ellipsisResult = applyEllipsis(line.text, {\r\n maxWidth,\r\n maxHeight: Infinity,\r\n ellipsisChar: typeof ellipsis === 'string' ? ellipsis : '…',\r\n measureFn: (text: string) => measureLineWidth(text, options),\r\n });\r\n \r\n if (ellipsisResult.isTruncated) {\r\n // Rebuild truncated line\r\n const truncatedLine = layoutSingleLine(ellipsisResult.truncatedText, options);\r\n Object.assign(line, truncatedLine);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Apply alignment\r\n const alignedLines = applyAlignment(allLines, align, maxLineWidth, options);\r\n\r\n // Apply vertical alignment\r\n const verticalOffset = calculateVerticalOffset(\r\n totalHeight,\r\n containerHeight || totalHeight,\r\n verticalAlign\r\n );\r\n\r\n // Adjust line positions for vertical alignment\r\n alignedLines.forEach(line => {\r\n line.bounds.forEach(bound => {\r\n bound.y += verticalOffset;\r\n });\r\n });\r\n\r\n return {\r\n lines: alignedLines,\r\n totalWidth: maxLineWidth,\r\n totalHeight: totalHeight,\r\n isTruncated: !!ellipsisResult?.isTruncated,\r\n graphemeCount: totalGraphemes,\r\n ellipsisApplied: ellipsisResult,\r\n };\r\n}\r\n\r\n/**\r\n * Layout a single paragraph with wrapping\r\n */\r\nfunction layoutParagraph(\r\n text: string, \r\n options: TextLayoutOptions & { width: number; isLastParagraph: boolean }\r\n): LayoutLine[] {\r\n const { wrap, width: maxWidth } = options;\r\n\r\n if (!text) {\r\n // Empty paragraph - create empty line\r\n return [createEmptyLine(options)];\r\n }\r\n\r\n // Handle no wrapping\r\n if (wrap === 'none' || maxWidth === Infinity) {\r\n return [layoutSingleLine(text, options, 0)];\r\n }\r\n\r\n // Apply wrapping\r\n const lines: string[] = [];\r\n \r\n if (wrap === 'word') {\r\n lines.push(...wrapByWords(text, maxWidth, options));\r\n } else if (wrap === 'char') {\r\n lines.push(...wrapByCharacters(text, maxWidth, options));\r\n }\r\n\r\n // Convert wrapped lines to layout lines, tracking text offset\r\n let textOffset = 0;\r\n const layoutLines = lines.map(lineText => {\r\n const line = layoutSingleLine(lineText, options, textOffset);\r\n textOffset += lineText.length + 1; // +1 for newline character\r\n return line;\r\n });\r\n \r\n return layoutLines;\r\n}\r\n\r\n/**\r\n * Layout a single line of text (no wrapping)\r\n */\r\nfunction layoutSingleLine(text: string, options: TextLayoutOptions, textOffset: number = 0): LayoutLine {\r\n const graphemes = segmentGraphemes(text);\r\n const bounds: GraphemeBounds[] = [];\r\n const measurementOptions = createMeasurementOptions(options);\r\n \r\n let x = 0;\r\n let lineWidth = 0;\r\n let lineHeight = 0;\r\n let charIndex = textOffset; // Track character position in original text\r\n \r\n // Measure each grapheme\r\n for (let i = 0; i < graphemes.length; i++) {\r\n const grapheme = graphemes[i];\r\n const prevGrapheme = i > 0 ? graphemes[i - 1] : undefined;\r\n \r\n // Measure with kerning\r\n const measurement = measureGraphemeWithKerning(\r\n grapheme,\r\n prevGrapheme,\r\n measurementOptions\r\n );\r\n \r\n // Apply letter spacing (Konva style - applied to ALL characters including last)\r\n const letterSpacing = options.letterSpacing || 0;\r\n const charSpacing = options.charSpacing ? \r\n (options.fontSize * options.charSpacing) / 1000 : 0;\r\n \r\n const totalSpacing = letterSpacing + charSpacing;\r\n const effectiveWidth = measurement.kernedWidth + totalSpacing;\r\n \r\n bounds.push({\r\n grapheme,\r\n x,\r\n y: 0, // Will be adjusted later\r\n width: measurement.width,\r\n height: measurement.height,\r\n kernedWidth: measurement.kernedWidth,\r\n left: x,\r\n baseline: measurement.baseline,\r\n charIndex: charIndex, // Character position in original text\r\n graphemeIndex: textOffset + i, // Grapheme index in original text\r\n });\r\n \r\n // Update character index for next iteration\r\n charIndex += grapheme.length;\r\n \r\n x += effectiveWidth;\r\n lineWidth += effectiveWidth;\r\n lineHeight = Math.max(lineHeight, measurement.height);\r\n }\r\n\r\n // Remove trailing spacing from total width (but keep in bounds for rendering)\r\n if (bounds.length > 0) {\r\n const letterSpacing = options.letterSpacing || 0;\r\n const charSpacing = options.charSpacing ? \r\n (options.fontSize * options.charSpacing) / 1000 : 0;\r\n const totalSpacing = letterSpacing + charSpacing;\r\n \r\n // Konva applies letterSpacing to all chars, so we don't remove it\r\n // lineWidth -= totalSpacing;\r\n }\r\n\r\n // Apply line height\r\n const finalHeight = lineHeight * options.lineHeight;\r\n\r\n return {\r\n text,\r\n graphemes,\r\n width: lineWidth,\r\n height: finalHeight,\r\n bounds,\r\n isWrapped: false,\r\n isLastInParagraph: false,\r\n baseline: finalHeight * 0.8, // Approximate baseline position\r\n };\r\n}\r\n\r\n/**\r\n * Word-based wrapping algorithm\r\n */\r\nfunction wrapByWords(text: string, maxWidth: number, options: TextLayoutOptions): string[] {\r\n const lines: string[] = [];\r\n const words = text.split(/(\\s+)/); // Preserve whitespace\r\n let currentLine = '';\r\n let currentWidth = 0;\r\n\r\n for (let i = 0; i < words.length; i++) {\r\n const word = words[i];\r\n const wordWidth = measureLineWidth(word, options);\r\n const testLine = currentLine ? currentLine + word : word;\r\n const testWidth = measureLineWidth(testLine, options);\r\n\r\n // If adding this word exceeds max width and we have content\r\n if (testWidth > maxWidth && currentLine) {\r\n lines.push(currentLine.trim());\r\n currentLine = word;\r\n currentWidth = wordWidth;\r\n }\r\n // If single word is too long, break it by characters\r\n else if (wordWidth > maxWidth && !currentLine) {\r\n const brokenWord = wrapByCharacters(word, maxWidth, options);\r\n lines.push(...brokenWord.slice(0, -1)); // All but last part\r\n currentLine = brokenWord[brokenWord.length - 1]; // Last part\r\n currentWidth = measureLineWidth(currentLine, options);\r\n }\r\n else {\r\n currentLine = testLine;\r\n currentWidth = testWidth;\r\n }\r\n }\r\n\r\n if (currentLine) {\r\n lines.push(currentLine.trim());\r\n }\r\n\r\n return lines.length > 0 ? lines : [''];\r\n}\r\n\r\n/**\r\n * Character-based wrapping algorithm \r\n */\r\nfunction wrapByCharacters(text: string, maxWidth: number, options: TextLayoutOptions): string[] {\r\n const lines: string[] = [];\r\n const graphemes = segmentGraphemes(text);\r\n let currentLine = '';\r\n \r\n for (const grapheme of graphemes) {\r\n const testLine = currentLine + grapheme;\r\n const testWidth = measureLineWidth(testLine, options);\r\n \r\n if (testWidth > maxWidth && currentLine) {\r\n lines.push(currentLine);\r\n currentLine = grapheme;\r\n } else {\r\n currentLine = testLine;\r\n }\r\n }\r\n \r\n if (currentLine) {\r\n lines.push(currentLine);\r\n }\r\n \r\n return lines.length > 0 ? lines : [''];\r\n}\r\n\r\n/**\r\n * Apply text alignment to lines\r\n */\r\nfunction applyAlignment(\r\n lines: LayoutLine[], \r\n align: string, \r\n containerWidth: number,\r\n options: TextLayoutOptions\r\n): LayoutLine[] {\r\n return lines.map(line => {\r\n let offsetX = 0;\r\n \r\n switch (align) {\r\n case 'center':\r\n offsetX = (containerWidth - line.width) / 2;\r\n break;\r\n case 'right':\r\n offsetX = containerWidth - line.width;\r\n break;\r\n case 'justify':\r\n if (!line.isLastInParagraph && line.graphemes.length > 1) {\r\n return applyJustification(line, containerWidth, options);\r\n }\r\n break;\r\n case 'left':\r\n default:\r\n offsetX = 0;\r\n break;\r\n }\r\n \r\n // Apply offset to all bounds\r\n if (offsetX !== 0) {\r\n line.bounds.forEach(bound => {\r\n bound.x += offsetX;\r\n bound.left += offsetX;\r\n });\r\n }\r\n \r\n return line;\r\n });\r\n}\r\n\r\n/**\r\n * Apply justify alignment by expanding spaces\r\n */\r\nfunction applyJustification(\r\n line: LayoutLine, \r\n containerWidth: number, \r\n options: TextLayoutOptions\r\n): LayoutLine {\r\n const spaces = line.graphemes.filter(g => /\\s/.test(g)).length;\r\n if (spaces === 0) return line;\r\n \r\n const extraSpace = containerWidth - line.width;\r\n const spaceExpansion = extraSpace / spaces;\r\n \r\n let offsetX = 0;\r\n line.bounds.forEach(bound => {\r\n bound.x += offsetX;\r\n bound.left += offsetX;\r\n \r\n if (/\\s/.test(bound.grapheme)) {\r\n bound.kernedWidth += spaceExpansion;\r\n bound.width += spaceExpansion;\r\n offsetX += spaceExpansion;\r\n }\r\n });\r\n \r\n line.width = containerWidth;\r\n line.justifyRatio = 1 + (spaceExpansion / (options.fontSize * 0.25)); // Approximate space width\r\n \r\n return line;\r\n}\r\n\r\n/**\r\n * Calculate vertical alignment offset\r\n */\r\nfunction calculateVerticalOffset(\r\n contentHeight: number,\r\n containerHeight: number, \r\n align: 'top' | 'middle' | 'bottom'\r\n): number {\r\n switch (align) {\r\n case 'middle':\r\n return (containerHeight - contentHeight) / 2;\r\n case 'bottom':\r\n return containerHeight - contentHeight;\r\n case 'top':\r\n default:\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Handle height overflow with ellipsis\r\n */\r\nfunction handleHeightOverflow(\r\n existingLines: LayoutLine[],\r\n overflowLine: LayoutLine,\r\n remainingHeight: number,\r\n options: TextLayoutOptions\r\n): { \r\n lines: LayoutLine[]; \r\n addedGraphemes: number; \r\n ellipsisResult?: EllipsisResult;\r\n} {\r\n // If ellipsis is enabled, try to fit part of the overflow line\r\n if (options.ellipsis && remainingHeight > 0) {\r\n const ellipsisChar = typeof options.ellipsis === 'string' ? options.ellipsis : '…';\r\n const maxWidth = options.width || Infinity;\r\n \r\n const ellipsisResult = applyEllipsis(overflowLine.text, {\r\n maxWidth,\r\n maxHeight: remainingHeight,\r\n ellipsisChar,\r\n measureFn: (text: string) => measureLineWidth(text, options),\r\n });\r\n \r\n if (ellipsisResult.isTruncated) {\r\n const truncatedLine = layoutSingleLine(ellipsisResult.truncatedText, options);\r\n truncatedLine.isLastInParagraph = true;\r\n \r\n return {\r\n lines: [...existingLines, truncatedLine],\r\n addedGraphemes: truncatedLine.graphemes.length,\r\n ellipsisResult,\r\n };\r\n }\r\n }\r\n \r\n return {\r\n lines: existingLines,\r\n addedGraphemes: 0,\r\n };\r\n}\r\n\r\n/**\r\n * Create empty line for empty paragraphs\r\n */\r\nfunction createEmptyLine(options: TextLayoutOptions): LayoutLine {\r\n const height = options.fontSize * options.lineHeight;\r\n \r\n return {\r\n text: '',\r\n graphemes: [],\r\n width: 0,\r\n height,\r\n bounds: [],\r\n isWrapped: false,\r\n isLastInParagraph: true,\r\n baseline: height * 0.8,\r\n };\r\n}\r\n\r\n/**\r\n * Measure width of a line of text\r\n */\r\nfunction measureLineWidth(text: string, options: TextLayoutOptions): number {\r\n const graphemes = segmentGraphemes(text);\r\n const measurementOptions = createMeasurementOptions(options);\r\n \r\n let width = 0;\r\n for (let i = 0; i < graphemes.length; i++) {\r\n const grapheme = graphemes[i];\r\n const prevGrapheme = i > 0 ? graphemes[i - 1] : undefined;\r\n \r\n const measurement = measureGraphemeWithKerning(\r\n grapheme,\r\n prevGrapheme, \r\n measurementOptions\r\n );\r\n \r\n const letterSpacing = options.letterSpacing || 0;\r\n const charSpacing = options.charSpacing ? \r\n (options.fontSize * options.charSpacing) / 1000 : 0;\r\n \r\n width += measurement.kernedWidth + letterSpacing + charSpacing;\r\n }\r\n \r\n return width;\r\n}\r\n\r\n/**\r\n * Convert layout options to measurement options\r\n */\r\nfunction createMeasurementOptions(options: TextLayoutOptions): MeasurementOptions {\r\n return {\r\n fontFamily: options.fontFamily,\r\n fontSize: options.fontSize,\r\n fontStyle: options.fontStyle,\r\n fontWeight: options.fontWeight,\r\n letterSpacing: options.letterSpacing,\r\n direction: options.direction === 'inherit' ? 'ltr' : options.direction,\r\n };\r\n}"],"names":["layoutText","options","_ellipsisResult","text","width","containerWidth","height","containerHeight","wrap","align","ellipsis","direction","padding","verticalAlign","lines","totalWidth","totalHeight","isTruncated","graphemeCount","maxWidth","Infinity","maxHeight","paragraphs","split","allLines","ellipsisResult","maxLineWidth","totalGraphemes","i","length","paragraph","isLastParagraph","paragraphLines","layoutParagraph","line","truncatedResult","handleHeightOverflow","Math","max","map","l","addedGraphemes","ellipsisApplied","isLastInParagraph","push","graphemes","applyEllipsis","ellipsisChar","measureFn","measureLineWidth","truncatedLine","layoutSingleLine","truncatedText","Object","assign","alignedLines","offsetX","spaces","filter","g","test","extraSpace","spaceExpansion","bounds","forEach","bound","x","left","grapheme","kernedWidth","justifyRatio","fontSize","applyJustification","applyAlignment","verticalOffset","contentHeight","calculateVerticalOffset","y","createEmptyLine","words","currentLine","word","wordWidth","testLine","trim","brokenWord","wrapByCharacters","slice","wrapByWords","textOffset","lineText","arguments","undefined","segmentGraphemes","measurementOptions","createMeasurementOptions","lineWidth","lineHeight","charIndex","prevGrapheme","measurement","measureGraphemeWithKerning","totalSpacing","letterSpacing","charSpacing","effectiveWidth","baseline","graphemeIndex","finalHeight","isWrapped","existingLines","overflowLine","remainingHeight","fontFamily","fontStyle","fontWeight"],"mappings":"uKA2EO,SAASA,EAAWC,GAA0C,IAAAC,EACnE,MAAMC,KACJA,EACAC,MAAOC,EACPC,OAAQC,EAAeC,KACvBA,EAAIC,MACJA,EAAKC,SACLA,EAAQC,UACRA,EAASC,QACTA,EAAU,EAACC,cACXA,EAAgB,OACdZ,EAGJ,IAAKE,EACH,MAAO,CACLW,MAAO,GACPC,WAAY,EACZC,YAAa,EACbC,aAAa,EACbC,cAAe,GAKnB,MAAMC,EAAWd,EAAiBA,EAA4B,EAAVO,EAAeQ,IAC7DC,EAAYd,EAAkBA,EAA6B,EAAVK,EAAeQ,IAGhEE,EAAanB,EAAKoB,MAAM,MAGxBC,EAAyB,GAC/B,IAiDIC,EAjDAT,EAAc,EACdU,EAAe,EACfC,EAAiB,EAErB,IAAK,IAAIC,EAAI,EAAGA,EAAIN,EAAWO,OAAQD,IAAK,CAC1C,MAAME,EAAYR,EAAWM,GACvBG,EAAkBH,IAAMN,EAAWO,OAAS,EAG5CG,EAAiBC,EAAgBH,EAAW,IAC7C7B,EACHG,MAAOe,EACPY,oBAIF,IAAK,MAAMG,KAAQF,EAAgB,CACjC,GAAIzB,GAAmBS,EAAckB,EAAK5B,OAASe,EAAW,CAE5D,MAAMc,EAAkBC,EACtBZ,EACAU,EACAb,EAAYL,EACZf,GAGF,MAAO,CACLa,MAAOqB,EAAgBrB,MACvBC,WAAYsB,KAAKC,IAAIZ,KAAiBS,EAAgBrB,MAAMyB,IAAIC,GAAKA,EAAEpC,QACvEY,YAAaK,EACbJ,aAAa,EACbC,cAAeS,EAAiBQ,EAAgBM,eAChDC,gBAAiBP,EAAgBV,eAErC,CAGIS,IAASF,EAAeA,EAAeH,OAAS,KAClDK,EAAKS,mBAAoB,GAG3BnB,EAASoB,KAAKV,GACdlB,GAAekB,EAAK5B,OACpBoB,EAAeW,KAAKC,IAAIZ,EAAcQ,EAAK9B,OAC3CuB,GAAkBO,EAAKW,UAAUhB,MACnC,CACF,CAIA,GAAInB,GAAYL,EACd,IAAK,MAAM6B,KAAQV,EACjB,GAAIU,EAAK9B,MAAQe,IACfM,EAAiBqB,EAAcZ,EAAK/B,KAAM,CACxCgB,WACAE,UAAWD,IACX2B,aAAkC,iBAAbrC,EAAwBA,EAAW,IACxDsC,UAAY7C,GAAiB8C,EAAiB9C,EAAMF,KAGlDwB,EAAeR,aAAa,CAE9B,MAAMiC,EAAgBC,EAAiB1B,EAAe2B,cAAenD,GACrEoD,OAAOC,OAAOpB,EAAMgB,GACpB,KACF,CAMN,MAAMK,EAwNR,SACEzC,EACAL,EACAJ,EACAJ,GAEA,OAAOa,EAAMyB,IAAIL,IACf,IAAIsB,EAAU,EAEd,OAAQ/C,GACN,IAAK,SACH+C,GAAWnD,EAAiB6B,EAAK9B,OAAS,EAC1C,MACF,IAAK,QACHoD,EAAUnD,EAAiB6B,EAAK9B,MAChC,MACF,IAAK,UACH,IAAK8B,EAAKS,mBAAqBT,EAAKW,UAAUhB,OAAS,EACrD,OAwBV,SACEK,EACA7B,EACAJ,GAEA,MAAMwD,EAASvB,EAAKW,UAAUa,OAAOC,GAAK,KAAKC,KAAKD,IAAI9B,OACxD,GAAe,IAAX4B,EAAc,OAAOvB,EAEzB,MAAM2B,EAAaxD,EAAiB6B,EAAK9B,MACnC0D,EAAiBD,EAAaJ,EAEpC,IAAID,EAAU,EAed,OAdAtB,EAAK6B,OAAOC,QAAQC,IAClBA,EAAMC,GAAKV,EACXS,EAAME,MAAQX,EAEV,KAAKI,KAAKK,EAAMG,YAClBH,EAAMI,aAAeP,EACrBG,EAAM7D,OAAS0D,EACfN,GAAWM,KAIf5B,EAAK9B,MAAQC,EACb6B,EAAKoC,aAAe,EAAKR,GAAqC,IAAnB7D,EAAQsE,UAE5CrC,CACT,CAnDiBsC,CAAmBtC,EAAM7B,EAAgBJ,GAElD,MAEF,QACEuD,EAAU,EAYd,OAPgB,IAAZA,GACFtB,EAAK6B,OAAOC,QAAQC,IAClBA,EAAMC,GAAKV,EACXS,EAAME,MAAQX,IAIXtB,GAEX,CA7PuBuC,CAAejD,EAAUf,EAAOiB,EAAczB,GAG7DyE,EA+RR,SACEC,EACApE,EACAE,GAEA,OAAQA,GACN,IAAK,SACH,OAAQF,EAAkBoE,GAAiB,EAC7C,IAAK,SACH,OAAOpE,EAAkBoE,EAE3B,QACE,OAAO,EAEb,CA7SyBC,CACrB5D,EACAT,GAAmBS,EACnBH,GAUF,OANA0C,EAAaS,QAAQ9B,IACnBA,EAAK6B,OAAOC,QAAQC,IAClBA,EAAMY,GAAKH,MAIR,CACL5D,MAAOyC,EACPxC,WAAYW,EACZV,YAAaA,EACbC,cAA6B,QAAff,EAACuB,SAAc,IAAAvB,IAAdA,EAAgBe,aAC/BC,cAAeS,EACfe,gBAAiBjB,EAErB,CAKA,SAASQ,EACP9B,EACAF,GAEA,MAAMO,KAAEA,EAAMJ,MAAOe,GAAalB,EAElC,IAAKE,EAEH,MAAO,CAAC2E,EAAgB7E,IAI1B,GAAa,SAATO,GAAmBW,IAAaC,IAClC,MAAO,CAAC+B,EAAiBhD,EAAMF,EAAS,IAI1C,MAAMa,EAAkB,GAEX,SAATN,EACFM,EAAM8B,QAmGV,SAAqBzC,EAAcgB,EAAkBlB,GACnD,MAAMa,EAAkB,GAClBiE,EAAQ5E,EAAKoB,MAAM,SACzB,IAAIyD,EAAc,GAGlB,IAAK,IAAIpD,EAAI,EAAGA,EAAImD,EAAMlD,OAAQD,IAAK,CACrC,MAAMqD,EAAOF,EAAMnD,GACbsD,EAAYjC,EAAiBgC,EAAMhF,GACnCkF,EAAWH,EAAcA,EAAcC,EAAOA,EAIpD,GAHkBhC,EAAiBkC,EAAUlF,GAG7BkB,GAAY6D,EAC1BlE,EAAM8B,KAAKoC,EAAYI,QACvBJ,EAAcC,OAIX,GAAIC,EAAY/D,IAAa6D,EAAa,CAC7C,MAAMK,EAAaC,EAAiBL,EAAM9D,EAAUlB,GACpDa,EAAM8B,QAAQyC,EAAWE,MAAM,GAAG,IAClCP,EAAcK,EAAWA,EAAWxD,OAAS,GAC9BoB,EAAiB+B,EAAa/E,EAC/C,MAEE+E,EAAcG,CAGlB,CAEIH,GACFlE,EAAM8B,KAAKoC,EAAYI,QAGzB,OAAOtE,EAAMe,OAAS,EAAIf,EAAQ,CAAC,GACrC,CAvIkB0E,CAAYrF,EAAMgB,EAAUlB,IACxB,SAATO,GACTM,EAAM8B,QAAQ0C,EAAiBnF,EAAMgB,EAAUlB,IAIjD,IAAIwF,EAAa,EAOjB,OANoB3E,EAAMyB,IAAImD,IAC5B,MAAMxD,EAAOiB,EAAiBuC,EAAUzF,EAASwF,GAEjD,OADAA,GAAcC,EAAS7D,OAAS,EACzBK,GAIX,CAKA,SAASiB,EAAiBhD,EAAcF,GAAgE,IAApCwF,EAAkBE,UAAA9D,OAAA,QAAA+D,IAAAD,UAAA,GAAAA,UAAA,GAAG,EACvF,MAAM9C,EAAYgD,EAAiB1F,GAC7B4D,EAA2B,GAC3B+B,EAAqBC,EAAyB9F,GAEpD,IAAIiE,EAAI,EACJ8B,EAAY,EACZC,EAAa,EACbC,EAAYT,EAGhB,IAAK,IAAI7D,EAAI,EAAGA,EAAIiB,EAAUhB,OAAQD,IAAK,CACzC,MAAMwC,EAAWvB,EAAUjB,GACrBuE,EAAevE,EAAI,EAAIiB,EAAUjB,EAAI,QAAKgE,EAG1CQ,EAAcC,EAClBjC,EACA+B,EACAL,GAQIQ,GAJgBrG,EAAQsG,eAAiB,IAC3BtG,EAAQuG,YACzBvG,EAAQsE,SAAWtE,EAAQuG,YAAe,IAAO,GAG9CC,EAAiBL,EAAY/B,YAAciC,EAEjDvC,EAAOnB,KAAK,CACVwB,WACAF,IACAW,EAAG,EACHzE,MAAOgG,EAAYhG,MACnBE,OAAQ8F,EAAY9F,OACpB+D,YAAa+B,EAAY/B,YACzBF,KAAMD,EACNwC,SAAUN,EAAYM,SACtBR,UAAWA,EACXS,cAAelB,EAAa7D,IAI9BsE,GAAa9B,EAASvC,OAEtBqC,GAAKuC,EACLT,GAAaS,EACbR,EAAa5D,KAAKC,IAAI2D,EAAYG,EAAY9F,OAChD,CAGIyD,EAAOlC,OAAS,IACI5B,EAAQsG,cACVtG,EAAQuG,cACzBvG,EAAQsE,SAAWtE,EAAQuG,cAQhC,MAAMI,EAAcX,EAAahG,EAAQgG,WAEzC,MAAO,CACL9F,OACA0C,YACAzC,MAAO4F,EACP1F,OAAQsG,EACR7C,SACA8C,WAAW,EACXlE,mBAAmB,EACnB+D,SAAwB,GAAdE,EAEd,CA8CA,SAAStB,EAAiBnF,EAAcgB,EAAkBlB,GACxD,MAAMa,EAAkB,GAClB+B,EAAYgD,EAAiB1F,GACnC,IAAI6E,EAAc,GAElB,IAAK,MAAMZ,KAAYvB,EAAW,CAChC,MAAMsC,EAAWH,EAAcZ,EACbnB,EAAiBkC,EAAUlF,GAE7BkB,GAAY6D,GAC1BlE,EAAM8B,KAAKoC,GACXA,EAAcZ,GAEdY,EAAcG,CAElB,CAMA,OAJIH,GACFlE,EAAM8B,KAAKoC,GAGNlE,EAAMe,OAAS,EAAIf,EAAQ,CAAC,GACrC,CAkGA,SAASsB,EACP0E,EACAC,EACAC,EACA/G,GAOA,GAAIA,EAAQS,UAAYsG,EAAkB,EAAG,CAC3C,MAAMjE,EAA2C,iBAArB9C,EAAQS,SAAwBT,EAAQS,SAAW,IACzES,EAAWlB,EAAQG,OAASgB,IAE5BK,EAAiBqB,EAAciE,EAAa5G,KAAM,CACtDgB,WACAE,UAAW2F,EACXjE,eACAC,UAAY7C,GAAiB8C,EAAiB9C,EAAMF,KAGtD,GAAIwB,EAAeR,YAAa,CAC9B,MAAMiC,EAAgBC,EAAiB1B,EAAe2B,cAAenD,GAGrE,OAFAiD,EAAcP,mBAAoB,EAE3B,CACL7B,MAAO,IAAIgG,EAAe5D,GAC1BT,eAAgBS,EAAcL,UAAUhB,OACxCJ,iBAEJ,CACF,CAEA,MAAO,CACLX,MAAOgG,EACPrE,eAAgB,EAEpB,CAKA,SAASqC,EAAgB7E,GACvB,MAAMK,EAASL,EAAQsE,SAAWtE,EAAQgG,WAE1C,MAAO,CACL9F,KAAM,GACN0C,UAAW,GACXzC,MAAO,EACPE,SACAyD,OAAQ,GACR8C,WAAW,EACXlE,mBAAmB,EACnB+D,SAAmB,GAATpG,EAEd,CAKA,SAAS2C,EAAiB9C,EAAcF,GACtC,MAAM4C,EAAYgD,EAAiB1F,GAC7B2F,EAAqBC,EAAyB9F,GAEpD,IAAIG,EAAQ,EACZ,IAAK,IAAIwB,EAAI,EAAGA,EAAIiB,EAAUhB,OAAQD,IAAK,CACzC,MAAMwC,EAAWvB,EAAUjB,GACrBuE,EAAevE,EAAI,EAAIiB,EAAUjB,EAAI,QAAKgE,EAE1CQ,EAAcC,EAClBjC,EACA+B,EACAL,GAGIS,EAAgBtG,EAAQsG,eAAiB,EACzCC,EAAcvG,EAAQuG,YACzBvG,EAAQsE,SAAWtE,EAAQuG,YAAe,IAAO,EAEpDpG,GAASgG,EAAY/B,YAAckC,EAAgBC,CACrD,CAEA,OAAOpG,CACT,CAKA,SAAS2F,EAAyB9F,GAChC,MAAO,CACLgH,WAAYhH,EAAQgH,WACpB1C,SAAUtE,EAAQsE,SAClB2C,UAAWjH,EAAQiH,UACnBC,WAAYlH,EAAQkH,WACpBZ,cAAetG,EAAQsG,cACvB5F,UAAiC,YAAtBV,EAAQU,UAA0B,MAAQV,EAAQU,UAEjE"}
|
|
1
|
+
{"version":3,"file":"layout.min.mjs","sources":["../../../src/text/layout.ts"],"sourcesContent":["/**\n * Core Text Layout Engine\n * \n * Implements Konva-compatible text layout with support for:\n * - Multiple wrap modes (word/char/none)\n * - Ellipsis truncation\n * - Justify alignment with proper space distribution\n * - RTL/LTR text direction\n * - Advanced grapheme handling\n */\n\nimport { graphemeSplit } from '../util/lang_string';\nimport type { MeasurementOptions, GraphemeMeasurement, KerningMeasurement } from './measure';\nimport { measureGrapheme, measureGraphemeWithKerning, getFontMetrics } from './measure';\nimport type { EllipsisResult } from './ellipsis';\nimport { applyEllipsis } from './ellipsis';\nimport { segmentGraphemes, analyzeBiDi, type BiDiRun } from './unicode';\n\nexport interface TextLayoutOptions {\n text: string;\n width?: number;\n height?: number;\n wrap: 'word' | 'char' | 'none';\n align: 'left' | 'center' | 'right' | 'justify';\n ellipsis?: boolean | string;\n fontSize: number;\n lineHeight: number;\n letterSpacing?: number; // px-based (Konva style)\n charSpacing?: number; // em-based (Fabric style) \n direction: 'ltr' | 'rtl' | 'inherit';\n fontFamily: string;\n fontStyle: string;\n fontWeight: string | number;\n padding?: number;\n verticalAlign?: 'top' | 'middle' | 'bottom';\n}\n\nexport interface LayoutResult {\n lines: LayoutLine[];\n totalWidth: number;\n totalHeight: number;\n isTruncated: boolean;\n graphemeCount: number;\n ellipsisApplied?: EllipsisResult;\n}\n\nexport interface LayoutLine {\n text: string;\n graphemes: string[];\n width: number;\n height: number;\n bounds: GraphemeBounds[];\n isWrapped: boolean;\n isLastInParagraph: boolean;\n justifyRatio?: number; // For justify alignment - space expansion factor\n baseline: number;\n}\n\nexport interface GraphemeBounds {\n grapheme: string;\n x: number;\n y: number;\n width: number;\n height: number;\n kernedWidth: number;\n left: number;\n baseline: number;\n deltaY?: number;\n charIndex: number; // Logical character index in original text\n graphemeIndex: number; // Logical grapheme index in original text\n}\n\n/**\n * Main text layout function - converts text and options into positioned layout\n */\nexport function layoutText(options: TextLayoutOptions): LayoutResult {\n const {\n text,\n width: containerWidth,\n height: containerHeight,\n wrap,\n align,\n ellipsis,\n direction,\n padding = 0,\n verticalAlign = 'top'\n } = options;\n\n // Handle empty text\n if (!text) {\n return {\n lines: [],\n totalWidth: 0,\n totalHeight: 0,\n isTruncated: false,\n graphemeCount: 0,\n };\n }\n\n // Calculate available space\n const maxWidth = containerWidth ? containerWidth - (padding * 2) : Infinity;\n const maxHeight = containerHeight ? containerHeight - (padding * 2) : Infinity;\n\n // Split text into paragraphs (by \\n)\n const paragraphs = text.split('\\n');\n \n // Process each paragraph\n const allLines: LayoutLine[] = [];\n let totalHeight = 0;\n let maxLineWidth = 0;\n let totalGraphemes = 0;\n\n for (let i = 0; i < paragraphs.length; i++) {\n const paragraph = paragraphs[i];\n const isLastParagraph = i === paragraphs.length - 1;\n \n // Layout this paragraph\n const paragraphLines = layoutParagraph(paragraph, {\n ...options,\n width: maxWidth,\n isLastParagraph,\n });\n \n // Check height constraints\n for (const line of paragraphLines) {\n if (containerHeight && totalHeight + line.height > maxHeight) {\n // Height exceeded - truncate here\n const truncatedResult = handleHeightOverflow(\n allLines,\n line,\n maxHeight - totalHeight,\n options\n );\n \n return {\n lines: truncatedResult.lines,\n totalWidth: Math.max(maxLineWidth, ...truncatedResult.lines.map(l => l.width)),\n totalHeight: maxHeight,\n isTruncated: true,\n graphemeCount: totalGraphemes + truncatedResult.addedGraphemes,\n ellipsisApplied: truncatedResult.ellipsisResult,\n };\n }\n\n // Mark last line in paragraph\n if (line === paragraphLines[paragraphLines.length - 1]) {\n line.isLastInParagraph = true;\n }\n\n allLines.push(line);\n totalHeight += line.height;\n maxLineWidth = Math.max(maxLineWidth, line.width);\n totalGraphemes += line.graphemes.length;\n }\n }\n\n // Apply ellipsis if width exceeded and ellipsis enabled\n let ellipsisResult: EllipsisResult | undefined;\n if (ellipsis && containerWidth) {\n for (const line of allLines) {\n if (line.width > maxWidth) {\n ellipsisResult = applyEllipsis(line.text, {\n maxWidth,\n maxHeight: Infinity,\n ellipsisChar: typeof ellipsis === 'string' ? ellipsis : '…',\n measureFn: (text: string) => measureLineWidth(text, options),\n });\n \n if (ellipsisResult.isTruncated) {\n // Rebuild truncated line\n const truncatedLine = layoutSingleLine(ellipsisResult.truncatedText, options);\n Object.assign(line, truncatedLine);\n break;\n }\n }\n }\n }\n\n // Apply alignment\n const alignedLines = applyAlignment(allLines, align, maxLineWidth, options);\n\n // Apply vertical alignment\n const verticalOffset = calculateVerticalOffset(\n totalHeight,\n containerHeight || totalHeight,\n verticalAlign\n );\n\n // Adjust line positions for vertical alignment\n alignedLines.forEach(line => {\n line.bounds.forEach(bound => {\n bound.y += verticalOffset;\n });\n });\n\n return {\n lines: alignedLines,\n totalWidth: maxLineWidth,\n totalHeight: totalHeight,\n isTruncated: !!ellipsisResult?.isTruncated,\n graphemeCount: totalGraphemes,\n ellipsisApplied: ellipsisResult,\n };\n}\n\n/**\n * Layout a single paragraph with wrapping\n */\nfunction layoutParagraph(\n text: string, \n options: TextLayoutOptions & { width: number; isLastParagraph: boolean }\n): LayoutLine[] {\n const { wrap, width: maxWidth } = options;\n\n if (!text) {\n // Empty paragraph - create empty line\n return [createEmptyLine(options)];\n }\n\n // Handle no wrapping\n if (wrap === 'none' || maxWidth === Infinity) {\n return [layoutSingleLine(text, options, 0)];\n }\n\n // Apply wrapping\n const lines: string[] = [];\n \n if (wrap === 'word') {\n lines.push(...wrapByWords(text, maxWidth, options));\n } else if (wrap === 'char') {\n lines.push(...wrapByCharacters(text, maxWidth, options));\n }\n\n // Convert wrapped lines to layout lines, tracking text offset\n let textOffset = 0;\n const layoutLines = lines.map(lineText => {\n const line = layoutSingleLine(lineText, options, textOffset);\n textOffset += lineText.length + 1; // +1 for newline character\n return line;\n });\n \n return layoutLines;\n}\n\n/**\n * Layout a single line of text (no wrapping)\n */\nfunction layoutSingleLine(text: string, options: TextLayoutOptions, textOffset: number = 0): LayoutLine {\n const graphemes = segmentGraphemes(text);\n const bounds: GraphemeBounds[] = [];\n const measurementOptions = createMeasurementOptions(options);\n \n let x = 0;\n let lineWidth = 0;\n let lineHeight = 0;\n let charIndex = textOffset; // Track character position in original text\n \n // Measure each grapheme\n for (let i = 0; i < graphemes.length; i++) {\n const grapheme = graphemes[i];\n const prevGrapheme = i > 0 ? graphemes[i - 1] : undefined;\n \n // Measure with kerning\n const measurement = measureGraphemeWithKerning(\n grapheme,\n prevGrapheme,\n measurementOptions\n );\n \n // Apply letter spacing (Konva style - applied to ALL characters including last)\n const letterSpacing = options.letterSpacing || 0;\n const charSpacing = options.charSpacing ? \n (options.fontSize * options.charSpacing) / 1000 : 0;\n \n const totalSpacing = letterSpacing + charSpacing;\n const effectiveWidth = measurement.kernedWidth + totalSpacing;\n \n bounds.push({\n grapheme,\n x,\n y: 0, // Will be adjusted later\n width: measurement.width,\n height: measurement.height,\n kernedWidth: measurement.kernedWidth,\n left: x,\n baseline: measurement.baseline,\n charIndex: charIndex, // Character position in original text\n graphemeIndex: textOffset + i, // Grapheme index in original text\n });\n \n // Update character index for next iteration\n charIndex += grapheme.length;\n \n x += effectiveWidth;\n lineWidth += effectiveWidth;\n lineHeight = Math.max(lineHeight, measurement.height);\n }\n\n // Remove trailing spacing from total width (but keep in bounds for rendering)\n if (bounds.length > 0) {\n const letterSpacing = options.letterSpacing || 0;\n const charSpacing = options.charSpacing ? \n (options.fontSize * options.charSpacing) / 1000 : 0;\n const totalSpacing = letterSpacing + charSpacing;\n \n // Konva applies letterSpacing to all chars, so we don't remove it\n // lineWidth -= totalSpacing;\n }\n\n // Apply line height\n const finalHeight = lineHeight * options.lineHeight;\n\n return {\n text,\n graphemes,\n width: lineWidth,\n height: finalHeight,\n bounds,\n isWrapped: false,\n isLastInParagraph: false,\n baseline: finalHeight * 0.8, // Approximate baseline position\n };\n}\n\n/**\n * Word-based wrapping algorithm\n */\nfunction wrapByWords(text: string, maxWidth: number, options: TextLayoutOptions): string[] {\n const lines: string[] = [];\n const words = text.split(/(\\s+)/); // Preserve whitespace\n let currentLine = '';\n let currentWidth = 0;\n\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n const wordWidth = measureLineWidth(word, options);\n const testLine = currentLine ? currentLine + word : word;\n const testWidth = measureLineWidth(testLine, options);\n\n // If adding this word exceeds max width and we have content\n if (testWidth > maxWidth && currentLine) {\n lines.push(currentLine.trim());\n currentLine = word;\n currentWidth = wordWidth;\n }\n // If single word is too long, break it by characters\n else if (wordWidth > maxWidth && !currentLine) {\n const brokenWord = wrapByCharacters(word, maxWidth, options);\n lines.push(...brokenWord.slice(0, -1)); // All but last part\n currentLine = brokenWord[brokenWord.length - 1]; // Last part\n currentWidth = measureLineWidth(currentLine, options);\n }\n else {\n currentLine = testLine;\n currentWidth = testWidth;\n }\n }\n\n if (currentLine) {\n lines.push(currentLine.trim());\n }\n\n return lines.length > 0 ? lines : [''];\n}\n\n/**\n * Character-based wrapping algorithm \n */\nfunction wrapByCharacters(text: string, maxWidth: number, options: TextLayoutOptions): string[] {\n const lines: string[] = [];\n const graphemes = segmentGraphemes(text);\n let currentLine = '';\n \n for (const grapheme of graphemes) {\n const testLine = currentLine + grapheme;\n const testWidth = measureLineWidth(testLine, options);\n \n if (testWidth > maxWidth && currentLine) {\n lines.push(currentLine);\n currentLine = grapheme;\n } else {\n currentLine = testLine;\n }\n }\n \n if (currentLine) {\n lines.push(currentLine);\n }\n \n return lines.length > 0 ? lines : [''];\n}\n\n/**\n * Apply text alignment to lines\n */\nfunction applyAlignment(\n lines: LayoutLine[], \n align: string, \n containerWidth: number,\n options: TextLayoutOptions\n): LayoutLine[] {\n return lines.map(line => {\n let offsetX = 0;\n \n switch (align) {\n case 'center':\n offsetX = (containerWidth - line.width) / 2;\n break;\n case 'right':\n offsetX = containerWidth - line.width;\n break;\n case 'justify':\n if (!line.isLastInParagraph && line.graphemes.length > 1) {\n return applyJustification(line, containerWidth, options);\n }\n break;\n case 'left':\n default:\n offsetX = 0;\n break;\n }\n \n // Apply offset to all bounds\n if (offsetX !== 0) {\n line.bounds.forEach(bound => {\n bound.x += offsetX;\n bound.left += offsetX;\n });\n }\n \n return line;\n });\n}\n\n/**\n * Apply justify alignment by expanding spaces\n */\nfunction applyJustification(\n line: LayoutLine, \n containerWidth: number, \n options: TextLayoutOptions\n): LayoutLine {\n const spaces = line.graphemes.filter(g => /\\s/.test(g)).length;\n if (spaces === 0) return line;\n \n const extraSpace = containerWidth - line.width;\n const spaceExpansion = extraSpace / spaces;\n \n let offsetX = 0;\n line.bounds.forEach(bound => {\n bound.x += offsetX;\n bound.left += offsetX;\n \n if (/\\s/.test(bound.grapheme)) {\n bound.kernedWidth += spaceExpansion;\n bound.width += spaceExpansion;\n offsetX += spaceExpansion;\n }\n });\n \n line.width = containerWidth;\n line.justifyRatio = 1 + (spaceExpansion / (options.fontSize * 0.25)); // Approximate space width\n \n return line;\n}\n\n/**\n * Calculate vertical alignment offset\n */\nfunction calculateVerticalOffset(\n contentHeight: number,\n containerHeight: number, \n align: 'top' | 'middle' | 'bottom'\n): number {\n switch (align) {\n case 'middle':\n return (containerHeight - contentHeight) / 2;\n case 'bottom':\n return containerHeight - contentHeight;\n case 'top':\n default:\n return 0;\n }\n}\n\n/**\n * Handle height overflow with ellipsis\n */\nfunction handleHeightOverflow(\n existingLines: LayoutLine[],\n overflowLine: LayoutLine,\n remainingHeight: number,\n options: TextLayoutOptions\n): { \n lines: LayoutLine[]; \n addedGraphemes: number; \n ellipsisResult?: EllipsisResult;\n} {\n // If ellipsis is enabled, try to fit part of the overflow line\n if (options.ellipsis && remainingHeight > 0) {\n const ellipsisChar = typeof options.ellipsis === 'string' ? options.ellipsis : '…';\n const maxWidth = options.width || Infinity;\n \n const ellipsisResult = applyEllipsis(overflowLine.text, {\n maxWidth,\n maxHeight: remainingHeight,\n ellipsisChar,\n measureFn: (text: string) => measureLineWidth(text, options),\n });\n \n if (ellipsisResult.isTruncated) {\n const truncatedLine = layoutSingleLine(ellipsisResult.truncatedText, options);\n truncatedLine.isLastInParagraph = true;\n \n return {\n lines: [...existingLines, truncatedLine],\n addedGraphemes: truncatedLine.graphemes.length,\n ellipsisResult,\n };\n }\n }\n \n return {\n lines: existingLines,\n addedGraphemes: 0,\n };\n}\n\n/**\n * Create empty line for empty paragraphs\n */\nfunction createEmptyLine(options: TextLayoutOptions): LayoutLine {\n const height = options.fontSize * options.lineHeight;\n \n return {\n text: '',\n graphemes: [],\n width: 0,\n height,\n bounds: [],\n isWrapped: false,\n isLastInParagraph: true,\n baseline: height * 0.8,\n };\n}\n\n/**\n * Measure width of a line of text\n */\nfunction measureLineWidth(text: string, options: TextLayoutOptions): number {\n const graphemes = segmentGraphemes(text);\n const measurementOptions = createMeasurementOptions(options);\n \n let width = 0;\n for (let i = 0; i < graphemes.length; i++) {\n const grapheme = graphemes[i];\n const prevGrapheme = i > 0 ? graphemes[i - 1] : undefined;\n \n const measurement = measureGraphemeWithKerning(\n grapheme,\n prevGrapheme, \n measurementOptions\n );\n \n const letterSpacing = options.letterSpacing || 0;\n const charSpacing = options.charSpacing ? \n (options.fontSize * options.charSpacing) / 1000 : 0;\n \n width += measurement.kernedWidth + letterSpacing + charSpacing;\n }\n \n return width;\n}\n\n/**\n * Convert layout options to measurement options\n */\nfunction createMeasurementOptions(options: TextLayoutOptions): MeasurementOptions {\n return {\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontStyle: options.fontStyle,\n fontWeight: options.fontWeight,\n letterSpacing: options.letterSpacing,\n direction: options.direction === 'inherit' ? 'ltr' : options.direction,\n };\n}"],"names":["layoutText","options","_ellipsisResult","text","width","containerWidth","height","containerHeight","wrap","align","ellipsis","direction","padding","verticalAlign","lines","totalWidth","totalHeight","isTruncated","graphemeCount","maxWidth","Infinity","maxHeight","paragraphs","split","allLines","ellipsisResult","maxLineWidth","totalGraphemes","i","length","paragraph","isLastParagraph","paragraphLines","layoutParagraph","line","truncatedResult","handleHeightOverflow","Math","max","map","l","addedGraphemes","ellipsisApplied","isLastInParagraph","push","graphemes","applyEllipsis","ellipsisChar","measureFn","measureLineWidth","truncatedLine","layoutSingleLine","truncatedText","Object","assign","alignedLines","offsetX","spaces","filter","g","test","extraSpace","spaceExpansion","bounds","forEach","bound","x","left","grapheme","kernedWidth","justifyRatio","fontSize","applyJustification","applyAlignment","verticalOffset","contentHeight","calculateVerticalOffset","y","createEmptyLine","words","currentLine","word","wordWidth","testLine","trim","brokenWord","wrapByCharacters","slice","wrapByWords","textOffset","lineText","arguments","undefined","segmentGraphemes","measurementOptions","createMeasurementOptions","lineWidth","lineHeight","charIndex","prevGrapheme","measurement","measureGraphemeWithKerning","totalSpacing","letterSpacing","charSpacing","effectiveWidth","baseline","graphemeIndex","finalHeight","isWrapped","existingLines","overflowLine","remainingHeight","fontFamily","fontStyle","fontWeight"],"mappings":"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"}
|