fabric 6.2.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1161) hide show
  1. package/.prettierignore +1 -0
  2. package/CHANGELOG.md +12 -4
  3. package/README.md +1 -1
  4. package/dist/extensions/aligning_guidelines/constant.d.ts +3 -0
  5. package/dist/extensions/aligning_guidelines/constant.d.ts.map +1 -0
  6. package/dist/extensions/aligning_guidelines/index.d.ts +5 -0
  7. package/dist/extensions/aligning_guidelines/index.d.ts.map +1 -0
  8. package/dist/extensions/aligning_guidelines/typedefs.d.ts +33 -0
  9. package/dist/extensions/aligning_guidelines/typedefs.d.ts.map +1 -0
  10. package/dist/extensions/aligning_guidelines/util/basic.d.ts +4 -0
  11. package/dist/extensions/aligning_guidelines/util/basic.d.ts.map +1 -0
  12. package/dist/extensions/aligning_guidelines/util/collect-line.d.ts +13 -0
  13. package/dist/extensions/aligning_guidelines/util/collect-line.d.ts.map +1 -0
  14. package/dist/extensions/aligning_guidelines/util/collect-point.d.ts +20 -0
  15. package/dist/extensions/aligning_guidelines/util/collect-point.d.ts.map +1 -0
  16. package/dist/extensions/aligning_guidelines/util/draw.d.ts +6 -0
  17. package/dist/extensions/aligning_guidelines/util/draw.d.ts.map +1 -0
  18. package/dist/extensions/aligning_guidelines/util/get-objects-by-target.d.ts +3 -0
  19. package/dist/extensions/aligning_guidelines/util/get-objects-by-target.d.ts.map +1 -0
  20. package/dist/extensions/index.d.ts +2 -0
  21. package/dist/extensions/index.d.ts.map +1 -0
  22. package/dist/index.js +140 -108
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.min.js +1 -1
  25. package/dist/index.min.js.map +1 -1
  26. package/dist/index.min.mjs +1 -1
  27. package/dist/index.min.mjs.map +1 -1
  28. package/dist/index.mjs +140 -108
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/index.node.cjs +140 -108
  31. package/dist/index.node.cjs.map +1 -1
  32. package/dist/index.node.mjs +140 -108
  33. package/dist/index.node.mjs.map +1 -1
  34. package/dist/package.json.min.mjs +1 -1
  35. package/dist/package.json.mjs +1 -1
  36. package/dist/src/ClassRegistry.min.mjs.map +1 -1
  37. package/dist/src/ClassRegistry.mjs.map +1 -1
  38. package/dist/src/Collection.min.mjs.map +1 -1
  39. package/dist/src/Collection.mjs.map +1 -1
  40. package/dist/src/Intersection.min.mjs.map +1 -1
  41. package/dist/src/Intersection.mjs.map +1 -1
  42. package/dist/src/LayoutManager/ActiveSelectionLayoutManager.min.mjs.map +1 -1
  43. package/dist/src/LayoutManager/ActiveSelectionLayoutManager.mjs.map +1 -1
  44. package/dist/src/LayoutManager/LayoutManager.d.ts +1 -1
  45. package/dist/src/LayoutManager/LayoutManager.d.ts.map +1 -1
  46. package/dist/src/LayoutManager/LayoutManager.min.mjs.map +1 -1
  47. package/dist/src/LayoutManager/LayoutManager.mjs +1 -1
  48. package/dist/src/LayoutManager/LayoutManager.mjs.map +1 -1
  49. package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.min.mjs.map +1 -1
  50. package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.mjs.map +1 -1
  51. package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.min.mjs.map +1 -1
  52. package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.mjs.map +1 -1
  53. package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.min.mjs.map +1 -1
  54. package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.mjs.map +1 -1
  55. package/dist/src/LayoutManager/LayoutStrategies/utils.min.mjs.map +1 -1
  56. package/dist/src/LayoutManager/LayoutStrategies/utils.mjs.map +1 -1
  57. package/dist/src/LayoutManager/types.d.ts.map +1 -1
  58. package/dist/src/Observable.min.mjs.map +1 -1
  59. package/dist/src/Observable.mjs.map +1 -1
  60. package/dist/src/Pattern/Pattern.d.ts +2 -2
  61. package/dist/src/Pattern/Pattern.d.ts.map +1 -1
  62. package/dist/src/Pattern/Pattern.min.mjs +1 -1
  63. package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
  64. package/dist/src/Pattern/Pattern.mjs +14 -12
  65. package/dist/src/Pattern/Pattern.mjs.map +1 -1
  66. package/dist/src/Point.min.mjs.map +1 -1
  67. package/dist/src/Point.mjs.map +1 -1
  68. package/dist/src/Shadow.min.mjs.map +1 -1
  69. package/dist/src/Shadow.mjs.map +1 -1
  70. package/dist/src/brushes/CircleBrush.min.mjs.map +1 -1
  71. package/dist/src/brushes/CircleBrush.mjs.map +1 -1
  72. package/dist/src/brushes/PatternBrush.min.mjs.map +1 -1
  73. package/dist/src/brushes/PatternBrush.mjs.map +1 -1
  74. package/dist/src/brushes/PencilBrush.min.mjs.map +1 -1
  75. package/dist/src/brushes/PencilBrush.mjs.map +1 -1
  76. package/dist/src/brushes/SprayBrush.min.mjs.map +1 -1
  77. package/dist/src/brushes/SprayBrush.mjs.map +1 -1
  78. package/dist/src/canvas/Canvas.d.ts +1 -1
  79. package/dist/src/canvas/Canvas.d.ts.map +1 -1
  80. package/dist/src/canvas/Canvas.min.mjs.map +1 -1
  81. package/dist/src/canvas/Canvas.mjs +2 -1
  82. package/dist/src/canvas/Canvas.mjs.map +1 -1
  83. package/dist/src/canvas/DOMManagers/CanvasDOMManager.min.mjs.map +1 -1
  84. package/dist/src/canvas/DOMManagers/CanvasDOMManager.mjs.map +1 -1
  85. package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.min.mjs.map +1 -1
  86. package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.mjs.map +1 -1
  87. package/dist/src/canvas/DOMManagers/util.min.mjs.map +1 -1
  88. package/dist/src/canvas/DOMManagers/util.mjs.map +1 -1
  89. package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
  90. package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
  91. package/dist/src/canvas/StaticCanvas.d.ts +1 -1
  92. package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
  93. package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
  94. package/dist/src/canvas/StaticCanvas.mjs +1 -1
  95. package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
  96. package/dist/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
  97. package/dist/src/canvas/StaticCanvasOptions.min.mjs.map +1 -1
  98. package/dist/src/canvas/StaticCanvasOptions.mjs.map +1 -1
  99. package/dist/src/canvas/TextEditingManager.min.mjs.map +1 -1
  100. package/dist/src/canvas/TextEditingManager.mjs.map +1 -1
  101. package/dist/src/color/Color.d.ts.map +1 -1
  102. package/dist/src/color/Color.min.mjs.map +1 -1
  103. package/dist/src/color/Color.mjs +1 -0
  104. package/dist/src/color/Color.mjs.map +1 -1
  105. package/dist/src/color/util.min.mjs.map +1 -1
  106. package/dist/src/color/util.mjs.map +1 -1
  107. package/dist/src/config.min.mjs.map +1 -1
  108. package/dist/src/config.mjs.map +1 -1
  109. package/dist/src/controls/Control.min.mjs.map +1 -1
  110. package/dist/src/controls/Control.mjs.map +1 -1
  111. package/dist/src/controls/changeWidth.min.mjs.map +1 -1
  112. package/dist/src/controls/changeWidth.mjs.map +1 -1
  113. package/dist/src/controls/controlRendering.min.mjs.map +1 -1
  114. package/dist/src/controls/controlRendering.mjs.map +1 -1
  115. package/dist/src/controls/drag.min.mjs.map +1 -1
  116. package/dist/src/controls/drag.mjs.map +1 -1
  117. package/dist/src/controls/fireEvent.min.mjs.map +1 -1
  118. package/dist/src/controls/fireEvent.mjs.map +1 -1
  119. package/dist/src/controls/pathControl.min.mjs.map +1 -1
  120. package/dist/src/controls/pathControl.mjs.map +1 -1
  121. package/dist/src/controls/polyControl.min.mjs.map +1 -1
  122. package/dist/src/controls/polyControl.mjs.map +1 -1
  123. package/dist/src/controls/rotate.min.mjs.map +1 -1
  124. package/dist/src/controls/rotate.mjs.map +1 -1
  125. package/dist/src/controls/scale.min.mjs.map +1 -1
  126. package/dist/src/controls/scale.mjs.map +1 -1
  127. package/dist/src/controls/scaleSkew.min.mjs.map +1 -1
  128. package/dist/src/controls/scaleSkew.mjs.map +1 -1
  129. package/dist/src/controls/skew.min.mjs.map +1 -1
  130. package/dist/src/controls/skew.mjs.map +1 -1
  131. package/dist/src/controls/util.min.mjs.map +1 -1
  132. package/dist/src/controls/util.mjs.map +1 -1
  133. package/dist/src/controls/wrapWithFireEvent.min.mjs.map +1 -1
  134. package/dist/src/controls/wrapWithFireEvent.mjs.map +1 -1
  135. package/dist/src/controls/wrapWithFixedAnchor.min.mjs.map +1 -1
  136. package/dist/src/controls/wrapWithFixedAnchor.mjs.map +1 -1
  137. package/dist/src/filters/BaseFilter.d.ts +5 -5
  138. package/dist/src/filters/BaseFilter.d.ts.map +1 -1
  139. package/dist/src/filters/BaseFilter.min.mjs.map +1 -1
  140. package/dist/src/filters/BaseFilter.mjs +5 -5
  141. package/dist/src/filters/BaseFilter.mjs.map +1 -1
  142. package/dist/src/filters/BlendColor.min.mjs.map +1 -1
  143. package/dist/src/filters/BlendColor.mjs.map +1 -1
  144. package/dist/src/filters/BlendImage.min.mjs.map +1 -1
  145. package/dist/src/filters/BlendImage.mjs.map +1 -1
  146. package/dist/src/filters/Blur.min.mjs.map +1 -1
  147. package/dist/src/filters/Blur.mjs.map +1 -1
  148. package/dist/src/filters/Brightness.min.mjs.map +1 -1
  149. package/dist/src/filters/Brightness.mjs.map +1 -1
  150. package/dist/src/filters/Canvas2dFilterBackend.min.mjs.map +1 -1
  151. package/dist/src/filters/Canvas2dFilterBackend.mjs.map +1 -1
  152. package/dist/src/filters/ColorMatrix.min.mjs.map +1 -1
  153. package/dist/src/filters/ColorMatrix.mjs.map +1 -1
  154. package/dist/src/filters/ColorMatrixFilters.min.mjs.map +1 -1
  155. package/dist/src/filters/ColorMatrixFilters.mjs.map +1 -1
  156. package/dist/src/filters/Composed.min.mjs.map +1 -1
  157. package/dist/src/filters/Composed.mjs.map +1 -1
  158. package/dist/src/filters/Contrast.min.mjs.map +1 -1
  159. package/dist/src/filters/Contrast.mjs.map +1 -1
  160. package/dist/src/filters/Convolute.min.mjs.map +1 -1
  161. package/dist/src/filters/Convolute.mjs.map +1 -1
  162. package/dist/src/filters/GLProbes/WebGLProbe.min.mjs.map +1 -1
  163. package/dist/src/filters/GLProbes/WebGLProbe.mjs.map +1 -1
  164. package/dist/src/filters/Gamma.min.mjs.map +1 -1
  165. package/dist/src/filters/Gamma.mjs.map +1 -1
  166. package/dist/src/filters/Grayscale.min.mjs.map +1 -1
  167. package/dist/src/filters/Grayscale.mjs.map +1 -1
  168. package/dist/src/filters/Invert.min.mjs.map +1 -1
  169. package/dist/src/filters/Invert.mjs.map +1 -1
  170. package/dist/src/filters/Noise.min.mjs.map +1 -1
  171. package/dist/src/filters/Noise.mjs.map +1 -1
  172. package/dist/src/filters/Pixelate.min.mjs.map +1 -1
  173. package/dist/src/filters/Pixelate.mjs.map +1 -1
  174. package/dist/src/filters/RemoveColor.min.mjs.map +1 -1
  175. package/dist/src/filters/RemoveColor.mjs.map +1 -1
  176. package/dist/src/filters/Resize.min.mjs.map +1 -1
  177. package/dist/src/filters/Resize.mjs.map +1 -1
  178. package/dist/src/filters/Saturation.min.mjs.map +1 -1
  179. package/dist/src/filters/Saturation.mjs.map +1 -1
  180. package/dist/src/filters/Vibrance.min.mjs.map +1 -1
  181. package/dist/src/filters/Vibrance.mjs.map +1 -1
  182. package/dist/src/filters/WebGLFilterBackend.min.mjs.map +1 -1
  183. package/dist/src/filters/WebGLFilterBackend.mjs.map +1 -1
  184. package/dist/src/filters/typedefs.d.ts +0 -1
  185. package/dist/src/filters/typedefs.d.ts.map +1 -1
  186. package/dist/src/filters/utils.min.mjs.map +1 -1
  187. package/dist/src/filters/utils.mjs.map +1 -1
  188. package/dist/src/gradient/Gradient.d.ts +7 -3
  189. package/dist/src/gradient/Gradient.d.ts.map +1 -1
  190. package/dist/src/gradient/Gradient.min.mjs +1 -1
  191. package/dist/src/gradient/Gradient.min.mjs.map +1 -1
  192. package/dist/src/gradient/Gradient.mjs +36 -24
  193. package/dist/src/gradient/Gradient.mjs.map +1 -1
  194. package/dist/src/gradient/parser/parseColorStops.min.mjs.map +1 -1
  195. package/dist/src/gradient/parser/parseColorStops.mjs.map +1 -1
  196. package/dist/src/gradient/parser/parseCoords.d.ts.map +1 -1
  197. package/dist/src/gradient/parser/parseCoords.min.mjs.map +1 -1
  198. package/dist/src/gradient/parser/parseCoords.mjs.map +1 -1
  199. package/dist/src/parser/applyViewboxTransform.min.mjs.map +1 -1
  200. package/dist/src/parser/applyViewboxTransform.mjs.map +1 -1
  201. package/dist/src/parser/constants.min.mjs.map +1 -1
  202. package/dist/src/parser/constants.mjs.map +1 -1
  203. package/dist/src/parser/elements_parser.min.mjs.map +1 -1
  204. package/dist/src/parser/elements_parser.mjs.map +1 -1
  205. package/dist/src/parser/getCSSRules.min.mjs.map +1 -1
  206. package/dist/src/parser/getCSSRules.mjs.map +1 -1
  207. package/dist/src/parser/getGlobalStylesForElement.min.mjs.map +1 -1
  208. package/dist/src/parser/getGlobalStylesForElement.mjs.map +1 -1
  209. package/dist/src/parser/getGradientDefs.min.mjs.map +1 -1
  210. package/dist/src/parser/getGradientDefs.mjs.map +1 -1
  211. package/dist/src/parser/getMultipleNodes.min.mjs.map +1 -1
  212. package/dist/src/parser/getMultipleNodes.mjs.map +1 -1
  213. package/dist/src/parser/loadSVGFromString.min.mjs.map +1 -1
  214. package/dist/src/parser/loadSVGFromString.mjs.map +1 -1
  215. package/dist/src/parser/loadSVGFromURL.min.mjs.map +1 -1
  216. package/dist/src/parser/loadSVGFromURL.mjs.map +1 -1
  217. package/dist/src/parser/normalizeAttr.min.mjs.map +1 -1
  218. package/dist/src/parser/normalizeAttr.mjs.map +1 -1
  219. package/dist/src/parser/normalizeValue.min.mjs.map +1 -1
  220. package/dist/src/parser/normalizeValue.mjs.map +1 -1
  221. package/dist/src/parser/parseAttributes.min.mjs.map +1 -1
  222. package/dist/src/parser/parseAttributes.mjs.map +1 -1
  223. package/dist/src/parser/parseFontDeclaration.min.mjs.map +1 -1
  224. package/dist/src/parser/parseFontDeclaration.mjs.map +1 -1
  225. package/dist/src/parser/parseSVGDocument.min.mjs.map +1 -1
  226. package/dist/src/parser/parseSVGDocument.mjs.map +1 -1
  227. package/dist/src/parser/parseStyleObject.min.mjs.map +1 -1
  228. package/dist/src/parser/parseStyleObject.mjs.map +1 -1
  229. package/dist/src/parser/parseStyleString.min.mjs.map +1 -1
  230. package/dist/src/parser/parseStyleString.mjs.map +1 -1
  231. package/dist/src/parser/parseTransformAttribute.min.mjs.map +1 -1
  232. package/dist/src/parser/parseTransformAttribute.mjs.map +1 -1
  233. package/dist/src/parser/parseUseDirectives.min.mjs.map +1 -1
  234. package/dist/src/parser/parseUseDirectives.mjs.map +1 -1
  235. package/dist/src/parser/percent.min.mjs.map +1 -1
  236. package/dist/src/parser/percent.mjs.map +1 -1
  237. package/dist/src/parser/recursivelyParseGradientsXlink.min.mjs.map +1 -1
  238. package/dist/src/parser/recursivelyParseGradientsXlink.mjs.map +1 -1
  239. package/dist/src/parser/setStrokeFillOpacity.min.mjs.map +1 -1
  240. package/dist/src/parser/setStrokeFillOpacity.mjs.map +1 -1
  241. package/dist/src/shapes/ActiveSelection.min.mjs.map +1 -1
  242. package/dist/src/shapes/ActiveSelection.mjs.map +1 -1
  243. package/dist/src/shapes/Circle.min.mjs.map +1 -1
  244. package/dist/src/shapes/Circle.mjs.map +1 -1
  245. package/dist/src/shapes/Ellipse.min.mjs.map +1 -1
  246. package/dist/src/shapes/Ellipse.mjs.map +1 -1
  247. package/dist/src/shapes/Group.d.ts +2 -2
  248. package/dist/src/shapes/Group.d.ts.map +1 -1
  249. package/dist/src/shapes/Group.min.mjs.map +1 -1
  250. package/dist/src/shapes/Group.mjs.map +1 -1
  251. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts.map +1 -1
  252. package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs +1 -1
  253. package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs.map +1 -1
  254. package/dist/src/shapes/IText/DraggableTextDelegate.mjs +2 -2
  255. package/dist/src/shapes/IText/DraggableTextDelegate.mjs.map +1 -1
  256. package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
  257. package/dist/src/shapes/IText/IText.mjs.map +1 -1
  258. package/dist/src/shapes/IText/ITextBehavior.min.mjs.map +1 -1
  259. package/dist/src/shapes/IText/ITextBehavior.mjs.map +1 -1
  260. package/dist/src/shapes/IText/ITextClickBehavior.min.mjs.map +1 -1
  261. package/dist/src/shapes/IText/ITextClickBehavior.mjs.map +1 -1
  262. package/dist/src/shapes/IText/ITextKeyBehavior.min.mjs.map +1 -1
  263. package/dist/src/shapes/IText/ITextKeyBehavior.mjs.map +1 -1
  264. package/dist/src/shapes/Image.min.mjs.map +1 -1
  265. package/dist/src/shapes/Image.mjs.map +1 -1
  266. package/dist/src/shapes/Line.min.mjs.map +1 -1
  267. package/dist/src/shapes/Line.mjs.map +1 -1
  268. package/dist/src/shapes/Object/AnimatableObject.d.ts.map +1 -1
  269. package/dist/src/shapes/Object/AnimatableObject.min.mjs.map +1 -1
  270. package/dist/src/shapes/Object/AnimatableObject.mjs.map +1 -1
  271. package/dist/src/shapes/Object/FabricObject.d.ts.map +1 -1
  272. package/dist/src/shapes/Object/FabricObject.min.mjs.map +1 -1
  273. package/dist/src/shapes/Object/FabricObject.mjs +2 -1
  274. package/dist/src/shapes/Object/FabricObject.mjs.map +1 -1
  275. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +1 -1
  276. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  277. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
  278. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +1 -1
  279. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
  280. package/dist/src/shapes/Object/InteractiveObject.d.ts +13 -13
  281. package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  282. package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
  283. package/dist/src/shapes/Object/InteractiveObject.mjs +13 -13
  284. package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
  285. package/dist/src/shapes/Object/Object.d.ts +4 -4
  286. package/dist/src/shapes/Object/Object.d.ts.map +1 -1
  287. package/dist/src/shapes/Object/Object.min.mjs +1 -1
  288. package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
  289. package/dist/src/shapes/Object/Object.mjs +10 -14
  290. package/dist/src/shapes/Object/Object.mjs.map +1 -1
  291. package/dist/src/shapes/Object/ObjectGeometry.d.ts +1 -1
  292. package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +1 -1
  293. package/dist/src/shapes/Object/ObjectGeometry.mjs +1 -1
  294. package/dist/src/shapes/Object/ObjectGeometry.mjs.map +1 -1
  295. package/dist/src/shapes/Object/ObjectOrigin.min.mjs.map +1 -1
  296. package/dist/src/shapes/Object/ObjectOrigin.mjs.map +1 -1
  297. package/dist/src/shapes/Object/StackedObject.d.ts.map +1 -1
  298. package/dist/src/shapes/Object/StackedObject.min.mjs.map +1 -1
  299. package/dist/src/shapes/Object/StackedObject.mjs.map +1 -1
  300. package/dist/src/shapes/Path.min.mjs.map +1 -1
  301. package/dist/src/shapes/Path.mjs.map +1 -1
  302. package/dist/src/shapes/Polyline.d.ts.map +1 -1
  303. package/dist/src/shapes/Polyline.min.mjs +1 -1
  304. package/dist/src/shapes/Polyline.min.mjs.map +1 -1
  305. package/dist/src/shapes/Polyline.mjs +10 -2
  306. package/dist/src/shapes/Polyline.mjs.map +1 -1
  307. package/dist/src/shapes/Rect.min.mjs.map +1 -1
  308. package/dist/src/shapes/Rect.mjs.map +1 -1
  309. package/dist/src/shapes/Text/StyledText.min.mjs.map +1 -1
  310. package/dist/src/shapes/Text/StyledText.mjs.map +1 -1
  311. package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
  312. package/dist/src/shapes/Text/Text.mjs +1 -1
  313. package/dist/src/shapes/Text/Text.mjs.map +1 -1
  314. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
  315. package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
  316. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  317. package/dist/src/shapes/Textbox.mjs.map +1 -1
  318. package/dist/src/shapes/Triangle.min.mjs.map +1 -1
  319. package/dist/src/shapes/Triangle.mjs.map +1 -1
  320. package/dist/src/util/animation/AnimationBase.min.mjs.map +1 -1
  321. package/dist/src/util/animation/AnimationBase.mjs.map +1 -1
  322. package/dist/src/util/animation/AnimationRegistry.min.mjs.map +1 -1
  323. package/dist/src/util/animation/AnimationRegistry.mjs.map +1 -1
  324. package/dist/src/util/animation/ArrayAnimation.min.mjs.map +1 -1
  325. package/dist/src/util/animation/ArrayAnimation.mjs.map +1 -1
  326. package/dist/src/util/animation/ColorAnimation.min.mjs.map +1 -1
  327. package/dist/src/util/animation/ColorAnimation.mjs.map +1 -1
  328. package/dist/src/util/animation/ValueAnimation.min.mjs.map +1 -1
  329. package/dist/src/util/animation/ValueAnimation.mjs.map +1 -1
  330. package/dist/src/util/animation/animate.d.ts.map +1 -1
  331. package/dist/src/util/animation/animate.min.mjs.map +1 -1
  332. package/dist/src/util/animation/animate.mjs.map +1 -1
  333. package/dist/src/util/animation/easing.min.mjs.map +1 -1
  334. package/dist/src/util/animation/easing.mjs.map +1 -1
  335. package/dist/src/util/animation/types.d.ts.map +1 -1
  336. package/dist/src/util/applyMixins.min.mjs.map +1 -1
  337. package/dist/src/util/applyMixins.mjs.map +1 -1
  338. package/dist/src/util/dom_style.min.mjs.map +1 -1
  339. package/dist/src/util/dom_style.mjs.map +1 -1
  340. package/dist/src/util/internals/cloneDeep.d.ts +6 -0
  341. package/dist/src/util/internals/cloneDeep.d.ts.map +1 -1
  342. package/dist/src/util/internals/cloneStyles.d.ts +3 -0
  343. package/dist/src/util/internals/cloneStyles.d.ts.map +1 -0
  344. package/dist/src/util/internals/cloneStyles.min.mjs +2 -0
  345. package/dist/src/util/internals/cloneStyles.min.mjs.map +1 -0
  346. package/dist/src/util/internals/cloneStyles.mjs +15 -0
  347. package/dist/src/util/internals/cloneStyles.mjs.map +1 -0
  348. package/dist/src/util/internals/findRight.min.mjs.map +1 -1
  349. package/dist/src/util/internals/findRight.mjs.map +1 -1
  350. package/dist/src/util/misc/boundingBoxFromPoints.min.mjs.map +1 -1
  351. package/dist/src/util/misc/boundingBoxFromPoints.mjs.map +1 -1
  352. package/dist/src/util/misc/dom.min.mjs.map +1 -1
  353. package/dist/src/util/misc/dom.mjs.map +1 -1
  354. package/dist/src/util/misc/findScaleTo.min.mjs.map +1 -1
  355. package/dist/src/util/misc/findScaleTo.mjs.map +1 -1
  356. package/dist/src/util/misc/groupSVGElements.min.mjs.map +1 -1
  357. package/dist/src/util/misc/groupSVGElements.mjs.map +1 -1
  358. package/dist/src/util/misc/isTransparent.min.mjs.map +1 -1
  359. package/dist/src/util/misc/isTransparent.mjs.map +1 -1
  360. package/dist/src/util/misc/matrix.min.mjs.map +1 -1
  361. package/dist/src/util/misc/matrix.mjs.map +1 -1
  362. package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
  363. package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
  364. package/dist/src/util/misc/objectTransforms.min.mjs.map +1 -1
  365. package/dist/src/util/misc/objectTransforms.mjs.map +1 -1
  366. package/dist/src/util/misc/pick.min.mjs.map +1 -1
  367. package/dist/src/util/misc/pick.mjs.map +1 -1
  368. package/dist/src/util/misc/planeChange.min.mjs.map +1 -1
  369. package/dist/src/util/misc/planeChange.mjs.map +1 -1
  370. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.min.mjs.map +1 -1
  371. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.mjs.map +1 -1
  372. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.min.mjs.map +1 -1
  373. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.mjs.map +1 -1
  374. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.min.mjs.map +1 -1
  375. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.mjs.map +1 -1
  376. package/dist/src/util/misc/projectStroke/index.min.mjs.map +1 -1
  377. package/dist/src/util/misc/projectStroke/index.mjs.map +1 -1
  378. package/dist/src/util/misc/resolveOrigin.min.mjs.map +1 -1
  379. package/dist/src/util/misc/resolveOrigin.mjs.map +1 -1
  380. package/dist/src/util/misc/rotatePoint.min.mjs.map +1 -1
  381. package/dist/src/util/misc/rotatePoint.mjs.map +1 -1
  382. package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
  383. package/dist/src/util/misc/svgParsing.mjs.map +1 -1
  384. package/dist/src/util/misc/textStyles.min.mjs +1 -1
  385. package/dist/src/util/misc/textStyles.min.mjs.map +1 -1
  386. package/dist/src/util/misc/textStyles.mjs +3 -3
  387. package/dist/src/util/misc/textStyles.mjs.map +1 -1
  388. package/dist/src/util/misc/vectors.min.mjs.map +1 -1
  389. package/dist/src/util/misc/vectors.mjs.map +1 -1
  390. package/dist/src/util/path/index.min.mjs.map +1 -1
  391. package/dist/src/util/path/index.mjs.map +1 -1
  392. package/dist/src/util/path/typedefs.d.ts.map +1 -1
  393. package/dist/src/util/transform_matrix_removal.min.mjs.map +1 -1
  394. package/dist/src/util/transform_matrix_removal.mjs.map +1 -1
  395. package/dist/src/util/typeAssertions.min.mjs.map +1 -1
  396. package/dist/src/util/typeAssertions.mjs.map +1 -1
  397. package/dist-extensions/aligning_guidelines/constant.mjs +11 -0
  398. package/dist-extensions/aligning_guidelines/constant.mjs.map +1 -0
  399. package/dist-extensions/aligning_guidelines/index.mjs +130 -0
  400. package/dist-extensions/aligning_guidelines/index.mjs.map +1 -0
  401. package/dist-extensions/aligning_guidelines/util/basic.mjs +11 -0
  402. package/dist-extensions/aligning_guidelines/util/basic.mjs.map +1 -0
  403. package/dist-extensions/aligning_guidelines/util/collect-line.mjs +193 -0
  404. package/dist-extensions/aligning_guidelines/util/collect-line.mjs.map +1 -0
  405. package/dist-extensions/aligning_guidelines/util/collect-point.mjs +102 -0
  406. package/dist-extensions/aligning_guidelines/util/collect-point.mjs.map +1 -0
  407. package/dist-extensions/aligning_guidelines/util/draw.mjs +75 -0
  408. package/dist-extensions/aligning_guidelines/util/draw.mjs.map +1 -0
  409. package/dist-extensions/aligning_guidelines/util/get-objects-by-target.mjs +42 -0
  410. package/dist-extensions/aligning_guidelines/util/get-objects-by-target.mjs.map +1 -0
  411. package/dist-extensions/extensions/aligning_guidelines/constant.d.ts +3 -0
  412. package/dist-extensions/extensions/aligning_guidelines/constant.d.ts.map +1 -0
  413. package/dist-extensions/extensions/aligning_guidelines/index.d.ts +5 -0
  414. package/dist-extensions/extensions/aligning_guidelines/index.d.ts.map +1 -0
  415. package/dist-extensions/extensions/aligning_guidelines/typedefs.d.ts +33 -0
  416. package/dist-extensions/extensions/aligning_guidelines/typedefs.d.ts.map +1 -0
  417. package/dist-extensions/extensions/aligning_guidelines/util/basic.d.ts +4 -0
  418. package/dist-extensions/extensions/aligning_guidelines/util/basic.d.ts.map +1 -0
  419. package/dist-extensions/extensions/aligning_guidelines/util/collect-line.d.ts +13 -0
  420. package/dist-extensions/extensions/aligning_guidelines/util/collect-line.d.ts.map +1 -0
  421. package/dist-extensions/extensions/aligning_guidelines/util/collect-point.d.ts +20 -0
  422. package/dist-extensions/extensions/aligning_guidelines/util/collect-point.d.ts.map +1 -0
  423. package/dist-extensions/extensions/aligning_guidelines/util/draw.d.ts +6 -0
  424. package/dist-extensions/extensions/aligning_guidelines/util/draw.d.ts.map +1 -0
  425. package/dist-extensions/extensions/aligning_guidelines/util/get-objects-by-target.d.ts +3 -0
  426. package/dist-extensions/extensions/aligning_guidelines/util/get-objects-by-target.d.ts.map +1 -0
  427. package/dist-extensions/extensions/index.d.ts +2 -0
  428. package/dist-extensions/extensions/index.d.ts.map +1 -0
  429. package/dist-extensions/fabric-extensions.min.js +2 -0
  430. package/dist-extensions/fabric-extensions.min.js.map +1 -0
  431. package/dist-extensions/fabric.d.ts +119 -0
  432. package/dist-extensions/fabric.d.ts.map +1 -0
  433. package/dist-extensions/index.d.ts +2 -0
  434. package/dist-extensions/index.d.ts.map +1 -0
  435. package/dist-extensions/index.mjs +2 -0
  436. package/dist-extensions/index.mjs.map +1 -0
  437. package/dist-extensions/src/ClassRegistry.d.ts +14 -0
  438. package/dist-extensions/src/ClassRegistry.d.ts.map +1 -0
  439. package/dist-extensions/src/Collection.d.ts +141 -0
  440. package/dist-extensions/src/Collection.d.ts.map +1 -0
  441. package/dist-extensions/src/CommonMethods.d.ts +32 -0
  442. package/dist-extensions/src/CommonMethods.d.ts.map +1 -0
  443. package/dist-extensions/src/EventTypeDefs.d.ts +286 -0
  444. package/dist-extensions/src/EventTypeDefs.d.ts.map +1 -0
  445. package/dist-extensions/src/Intersection.d.ts +120 -0
  446. package/dist-extensions/src/Intersection.d.ts.map +1 -0
  447. package/dist-extensions/src/LayoutManager/ActiveSelectionLayoutManager.d.ts +22 -0
  448. package/dist-extensions/src/LayoutManager/ActiveSelectionLayoutManager.d.ts.map +1 -0
  449. package/dist-extensions/src/LayoutManager/LayoutManager.d.ts +56 -0
  450. package/dist-extensions/src/LayoutManager/LayoutManager.d.ts.map +1 -0
  451. package/dist-extensions/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts +13 -0
  452. package/dist-extensions/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts.map +1 -0
  453. package/dist-extensions/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts +14 -0
  454. package/dist-extensions/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts.map +1 -0
  455. package/dist-extensions/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts +14 -0
  456. package/dist-extensions/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts.map +1 -0
  457. package/dist-extensions/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts +30 -0
  458. package/dist-extensions/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts.map +1 -0
  459. package/dist-extensions/src/LayoutManager/LayoutStrategies/utils.d.ts +10 -0
  460. package/dist-extensions/src/LayoutManager/LayoutStrategies/utils.d.ts.map +1 -0
  461. package/dist-extensions/src/LayoutManager/constants.d.ts +7 -0
  462. package/dist-extensions/src/LayoutManager/constants.d.ts.map +1 -0
  463. package/dist-extensions/src/LayoutManager/index.d.ts +7 -0
  464. package/dist-extensions/src/LayoutManager/index.d.ts.map +1 -0
  465. package/dist-extensions/src/LayoutManager/types.d.ts +106 -0
  466. package/dist-extensions/src/LayoutManager/types.d.ts.map +1 -0
  467. package/dist-extensions/src/Observable.d.ts +68 -0
  468. package/dist-extensions/src/Observable.d.ts.map +1 -0
  469. package/dist-extensions/src/Pattern/Pattern.d.ts +99 -0
  470. package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -0
  471. package/dist-extensions/src/Pattern/index.d.ts +3 -0
  472. package/dist-extensions/src/Pattern/index.d.ts.map +1 -0
  473. package/dist-extensions/src/Pattern/types.d.ts +12 -0
  474. package/dist-extensions/src/Pattern/types.d.ts.map +1 -0
  475. package/dist-extensions/src/Point.d.ts +233 -0
  476. package/dist-extensions/src/Point.d.ts.map +1 -0
  477. package/dist-extensions/src/Shadow.d.ts +95 -0
  478. package/dist-extensions/src/Shadow.d.ts.map +1 -0
  479. package/dist-extensions/src/brushes/BaseBrush.d.ts +101 -0
  480. package/dist-extensions/src/brushes/BaseBrush.d.ts.map +1 -0
  481. package/dist-extensions/src/brushes/CircleBrush.d.ts +44 -0
  482. package/dist-extensions/src/brushes/CircleBrush.d.ts.map +1 -0
  483. package/dist-extensions/src/brushes/PatternBrush.d.ts +23 -0
  484. package/dist-extensions/src/brushes/PatternBrush.d.ts.map +1 -0
  485. package/dist-extensions/src/brushes/PencilBrush.d.ts +92 -0
  486. package/dist-extensions/src/brushes/PencilBrush.d.ts.map +1 -0
  487. package/dist-extensions/src/brushes/SprayBrush.d.ts +74 -0
  488. package/dist-extensions/src/brushes/SprayBrush.d.ts.map +1 -0
  489. package/dist-extensions/src/brushes/typedefs.d.ts +18 -0
  490. package/dist-extensions/src/brushes/typedefs.d.ts.map +1 -0
  491. package/dist-extensions/src/cache.d.ts +47 -0
  492. package/dist-extensions/src/cache.d.ts.map +1 -0
  493. package/dist-extensions/src/canvas/Canvas.d.ts +339 -0
  494. package/dist-extensions/src/canvas/Canvas.d.ts.map +1 -0
  495. package/dist-extensions/src/canvas/CanvasOptions.d.ts +229 -0
  496. package/dist-extensions/src/canvas/CanvasOptions.d.ts.map +1 -0
  497. package/dist-extensions/src/canvas/DOMManagers/CanvasDOMManager.d.ts +29 -0
  498. package/dist-extensions/src/canvas/DOMManagers/CanvasDOMManager.d.ts.map +1 -0
  499. package/dist-extensions/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +29 -0
  500. package/dist-extensions/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts.map +1 -0
  501. package/dist-extensions/src/canvas/DOMManagers/util.d.ts +24 -0
  502. package/dist-extensions/src/canvas/DOMManagers/util.d.ts.map +1 -0
  503. package/dist-extensions/src/canvas/SelectableCanvas.d.ts +534 -0
  504. package/dist-extensions/src/canvas/SelectableCanvas.d.ts.map +1 -0
  505. package/dist-extensions/src/canvas/StaticCanvas.d.ts +639 -0
  506. package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +1 -0
  507. package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts +153 -0
  508. package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts.map +1 -0
  509. package/dist-extensions/src/canvas/TextEditingManager.d.ts +21 -0
  510. package/dist-extensions/src/canvas/TextEditingManager.d.ts.map +1 -0
  511. package/dist-extensions/src/color/Color.d.ts +162 -0
  512. package/dist-extensions/src/color/Color.d.ts.map +1 -0
  513. package/dist-extensions/src/color/color_map.d.ts +155 -0
  514. package/dist-extensions/src/color/color_map.d.ts.map +1 -0
  515. package/dist-extensions/src/color/constants.d.ts +111 -0
  516. package/dist-extensions/src/color/constants.d.ts.map +1 -0
  517. package/dist-extensions/src/color/typedefs.d.ts +16 -0
  518. package/dist-extensions/src/color/typedefs.d.ts.map +1 -0
  519. package/dist-extensions/src/color/util.d.ts +27 -0
  520. package/dist-extensions/src/color/util.d.ts.map +1 -0
  521. package/dist-extensions/src/config.d.ts +115 -0
  522. package/dist-extensions/src/config.d.ts.map +1 -0
  523. package/dist-extensions/src/constants.d.ts +35 -0
  524. package/dist-extensions/src/constants.d.ts.map +1 -0
  525. package/dist-extensions/src/controls/Control.d.ts +229 -0
  526. package/dist-extensions/src/controls/Control.d.ts.map +1 -0
  527. package/dist-extensions/src/controls/changeWidth.d.ts +13 -0
  528. package/dist-extensions/src/controls/changeWidth.d.ts.map +1 -0
  529. package/dist-extensions/src/controls/commonControls.d.ts +28 -0
  530. package/dist-extensions/src/controls/commonControls.d.ts.map +1 -0
  531. package/dist-extensions/src/controls/controlRendering.d.ts +29 -0
  532. package/dist-extensions/src/controls/controlRendering.d.ts.map +1 -0
  533. package/dist-extensions/src/controls/drag.d.ts +12 -0
  534. package/dist-extensions/src/controls/drag.d.ts.map +1 -0
  535. package/dist-extensions/src/controls/fireEvent.d.ts +3 -0
  536. package/dist-extensions/src/controls/fireEvent.d.ts.map +1 -0
  537. package/dist-extensions/src/controls/index.d.ts +14 -0
  538. package/dist-extensions/src/controls/index.d.ts.map +1 -0
  539. package/dist-extensions/src/controls/pathControl.d.ts +12 -0
  540. package/dist-extensions/src/controls/pathControl.d.ts.map +1 -0
  541. package/dist-extensions/src/controls/polyControl.d.ts +30 -0
  542. package/dist-extensions/src/controls/polyControl.d.ts.map +1 -0
  543. package/dist-extensions/src/controls/rotate.d.ts +12 -0
  544. package/dist-extensions/src/controls/rotate.d.ts.map +1 -0
  545. package/dist-extensions/src/controls/scale.d.ts +47 -0
  546. package/dist-extensions/src/controls/scale.d.ts.map +1 -0
  547. package/dist-extensions/src/controls/scaleSkew.d.ts +39 -0
  548. package/dist-extensions/src/controls/scaleSkew.d.ts.map +1 -0
  549. package/dist-extensions/src/controls/skew.d.ts +33 -0
  550. package/dist-extensions/src/controls/skew.d.ts.map +1 -0
  551. package/dist-extensions/src/controls/util.d.ts +41 -0
  552. package/dist-extensions/src/controls/util.d.ts.map +1 -0
  553. package/dist-extensions/src/controls/wrapWithFireEvent.d.ts +10 -0
  554. package/dist-extensions/src/controls/wrapWithFireEvent.d.ts.map +1 -0
  555. package/dist-extensions/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  556. package/dist-extensions/src/controls/wrapWithFixedAnchor.d.ts.map +1 -0
  557. package/dist-extensions/src/env/browser.d.ts +3 -0
  558. package/dist-extensions/src/env/browser.d.ts.map +1 -0
  559. package/dist-extensions/src/env/index.d.ts +34 -0
  560. package/dist-extensions/src/env/index.d.ts.map +1 -0
  561. package/dist-extensions/src/env/types.d.ts +16 -0
  562. package/dist-extensions/src/env/types.d.ts.map +1 -0
  563. package/dist-extensions/src/filters/BaseFilter.d.ts +153 -0
  564. package/dist-extensions/src/filters/BaseFilter.d.ts.map +1 -0
  565. package/dist-extensions/src/filters/BlendColor.d.ts +68 -0
  566. package/dist-extensions/src/filters/BlendColor.d.ts.map +1 -0
  567. package/dist-extensions/src/filters/BlendImage.d.ts +99 -0
  568. package/dist-extensions/src/filters/BlendImage.d.ts.map +1 -0
  569. package/dist-extensions/src/filters/Blur.d.ts +50 -0
  570. package/dist-extensions/src/filters/Blur.d.ts.map +1 -0
  571. package/dist-extensions/src/filters/Brightness.d.ts +46 -0
  572. package/dist-extensions/src/filters/Brightness.d.ts.map +1 -0
  573. package/dist-extensions/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  574. package/dist-extensions/src/filters/Canvas2dFilterBackend.d.ts.map +1 -0
  575. package/dist-extensions/src/filters/ColorMatrix.d.ts +66 -0
  576. package/dist-extensions/src/filters/ColorMatrix.d.ts.map +1 -0
  577. package/dist-extensions/src/filters/ColorMatrixFilters.d.ts +15 -0
  578. package/dist-extensions/src/filters/ColorMatrixFilters.d.ts.map +1 -0
  579. package/dist-extensions/src/filters/Composed.d.ts +47 -0
  580. package/dist-extensions/src/filters/Composed.d.ts.map +1 -0
  581. package/dist-extensions/src/filters/Contrast.d.ts +44 -0
  582. package/dist-extensions/src/filters/Contrast.d.ts.map +1 -0
  583. package/dist-extensions/src/filters/Convolute.d.ts +81 -0
  584. package/dist-extensions/src/filters/Convolute.d.ts.map +1 -0
  585. package/dist-extensions/src/filters/FilterBackend.d.ts +15 -0
  586. package/dist-extensions/src/filters/FilterBackend.d.ts.map +1 -0
  587. package/dist-extensions/src/filters/GLProbes/GLProbe.d.ts +7 -0
  588. package/dist-extensions/src/filters/GLProbes/GLProbe.d.ts.map +1 -0
  589. package/dist-extensions/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
  590. package/dist-extensions/src/filters/GLProbes/WebGLProbe.d.ts.map +1 -0
  591. package/dist-extensions/src/filters/Gamma.d.ts +58 -0
  592. package/dist-extensions/src/filters/Gamma.d.ts.map +1 -0
  593. package/dist-extensions/src/filters/Grayscale.d.ts +44 -0
  594. package/dist-extensions/src/filters/Grayscale.d.ts.map +1 -0
  595. package/dist-extensions/src/filters/HueRotation.d.ts +31 -0
  596. package/dist-extensions/src/filters/HueRotation.d.ts.map +1 -0
  597. package/dist-extensions/src/filters/Invert.d.ts +53 -0
  598. package/dist-extensions/src/filters/Invert.d.ts.map +1 -0
  599. package/dist-extensions/src/filters/Noise.d.ts +44 -0
  600. package/dist-extensions/src/filters/Noise.d.ts.map +1 -0
  601. package/dist-extensions/src/filters/Pixelate.d.ts +41 -0
  602. package/dist-extensions/src/filters/Pixelate.d.ts.map +1 -0
  603. package/dist-extensions/src/filters/RemoveColor.d.ts +53 -0
  604. package/dist-extensions/src/filters/RemoveColor.d.ts.map +1 -0
  605. package/dist-extensions/src/filters/Resize.d.ts +137 -0
  606. package/dist-extensions/src/filters/Resize.d.ts.map +1 -0
  607. package/dist-extensions/src/filters/Saturation.d.ts +46 -0
  608. package/dist-extensions/src/filters/Saturation.d.ts.map +1 -0
  609. package/dist-extensions/src/filters/Vibrance.d.ts +46 -0
  610. package/dist-extensions/src/filters/Vibrance.d.ts.map +1 -0
  611. package/dist-extensions/src/filters/WebGLFilterBackend.d.ts +131 -0
  612. package/dist-extensions/src/filters/WebGLFilterBackend.d.ts.map +1 -0
  613. package/dist-extensions/src/filters/filters.d.ts +23 -0
  614. package/dist-extensions/src/filters/filters.d.ts.map +1 -0
  615. package/dist-extensions/src/filters/index.d.ts +7 -0
  616. package/dist-extensions/src/filters/index.d.ts.map +1 -0
  617. package/dist-extensions/src/filters/shaders/baseFilter.d.ts +4 -0
  618. package/dist-extensions/src/filters/shaders/baseFilter.d.ts.map +1 -0
  619. package/dist-extensions/src/filters/shaders/blendColor.d.ts +13 -0
  620. package/dist-extensions/src/filters/shaders/blendColor.d.ts.map +1 -0
  621. package/dist-extensions/src/filters/shaders/blendImage.d.ts +4 -0
  622. package/dist-extensions/src/filters/shaders/blendImage.d.ts.map +1 -0
  623. package/dist-extensions/src/filters/shaders/blur.d.ts +2 -0
  624. package/dist-extensions/src/filters/shaders/blur.d.ts.map +1 -0
  625. package/dist-extensions/src/filters/shaders/brightness.d.ts +2 -0
  626. package/dist-extensions/src/filters/shaders/brightness.d.ts.map +1 -0
  627. package/dist-extensions/src/filters/shaders/colorMatrix.d.ts +2 -0
  628. package/dist-extensions/src/filters/shaders/colorMatrix.d.ts.map +1 -0
  629. package/dist-extensions/src/filters/shaders/constrast.d.ts +2 -0
  630. package/dist-extensions/src/filters/shaders/constrast.d.ts.map +1 -0
  631. package/dist-extensions/src/filters/shaders/convolute.d.ts +11 -0
  632. package/dist-extensions/src/filters/shaders/convolute.d.ts.map +1 -0
  633. package/dist-extensions/src/filters/shaders/gamma.d.ts +2 -0
  634. package/dist-extensions/src/filters/shaders/gamma.d.ts.map +1 -0
  635. package/dist-extensions/src/filters/shaders/grayscale.d.ts +3 -0
  636. package/dist-extensions/src/filters/shaders/grayscale.d.ts.map +1 -0
  637. package/dist-extensions/src/filters/shaders/invert.d.ts +2 -0
  638. package/dist-extensions/src/filters/shaders/invert.d.ts.map +1 -0
  639. package/dist-extensions/src/filters/shaders/noise.d.ts +2 -0
  640. package/dist-extensions/src/filters/shaders/noise.d.ts.map +1 -0
  641. package/dist-extensions/src/filters/shaders/pixelate.d.ts +2 -0
  642. package/dist-extensions/src/filters/shaders/pixelate.d.ts.map +1 -0
  643. package/dist-extensions/src/filters/shaders/removeColor.d.ts +2 -0
  644. package/dist-extensions/src/filters/shaders/removeColor.d.ts.map +1 -0
  645. package/dist-extensions/src/filters/shaders/saturation.d.ts +2 -0
  646. package/dist-extensions/src/filters/shaders/saturation.d.ts.map +1 -0
  647. package/dist-extensions/src/filters/shaders/vibrance.d.ts +2 -0
  648. package/dist-extensions/src/filters/shaders/vibrance.d.ts.map +1 -0
  649. package/dist-extensions/src/filters/typedefs.d.ts +70 -0
  650. package/dist-extensions/src/filters/typedefs.d.ts.map +1 -0
  651. package/dist-extensions/src/filters/utils.d.ts +10 -0
  652. package/dist-extensions/src/filters/utils.d.ts.map +1 -0
  653. package/dist-extensions/src/gradient/Gradient.d.ts +156 -0
  654. package/dist-extensions/src/gradient/Gradient.d.ts.map +1 -0
  655. package/dist-extensions/src/gradient/constants.d.ts +15 -0
  656. package/dist-extensions/src/gradient/constants.d.ts.map +1 -0
  657. package/dist-extensions/src/gradient/index.d.ts +3 -0
  658. package/dist-extensions/src/gradient/index.d.ts.map +1 -0
  659. package/dist-extensions/src/gradient/parser/misc.d.ts +4 -0
  660. package/dist-extensions/src/gradient/parser/misc.d.ts.map +1 -0
  661. package/dist-extensions/src/gradient/parser/parseColorStops.d.ts +3 -0
  662. package/dist-extensions/src/gradient/parser/parseColorStops.d.ts.map +1 -0
  663. package/dist-extensions/src/gradient/parser/parseCoords.d.ts +17 -0
  664. package/dist-extensions/src/gradient/parser/parseCoords.d.ts.map +1 -0
  665. package/dist-extensions/src/gradient/typedefs.d.ts +93 -0
  666. package/dist-extensions/src/gradient/typedefs.d.ts.map +1 -0
  667. package/dist-extensions/src/parser/applyViewboxTransform.d.ts +13 -0
  668. package/dist-extensions/src/parser/applyViewboxTransform.d.ts.map +1 -0
  669. package/dist-extensions/src/parser/attributes.d.ts +6 -0
  670. package/dist-extensions/src/parser/attributes.d.ts.map +1 -0
  671. package/dist-extensions/src/parser/constants.d.ts +41 -0
  672. package/dist-extensions/src/parser/constants.d.ts.map +1 -0
  673. package/dist-extensions/src/parser/doesSomeParentMatch.d.ts +2 -0
  674. package/dist-extensions/src/parser/doesSomeParentMatch.d.ts.map +1 -0
  675. package/dist-extensions/src/parser/elementMatchesRule.d.ts +5 -0
  676. package/dist-extensions/src/parser/elementMatchesRule.d.ts.map +1 -0
  677. package/dist-extensions/src/parser/elements_parser.d.ts +33 -0
  678. package/dist-extensions/src/parser/elements_parser.d.ts.map +1 -0
  679. package/dist-extensions/src/parser/getCSSRules.d.ts +8 -0
  680. package/dist-extensions/src/parser/getCSSRules.d.ts.map +1 -0
  681. package/dist-extensions/src/parser/getGlobalStylesForElement.d.ts +6 -0
  682. package/dist-extensions/src/parser/getGlobalStylesForElement.d.ts.map +1 -0
  683. package/dist-extensions/src/parser/getGradientDefs.d.ts +7 -0
  684. package/dist-extensions/src/parser/getGradientDefs.d.ts.map +1 -0
  685. package/dist-extensions/src/parser/getMultipleNodes.d.ts +2 -0
  686. package/dist-extensions/src/parser/getMultipleNodes.d.ts.map +1 -0
  687. package/dist-extensions/src/parser/getSvgRegex.d.ts +2 -0
  688. package/dist-extensions/src/parser/getSvgRegex.d.ts.map +1 -0
  689. package/dist-extensions/src/parser/getTagName.d.ts +2 -0
  690. package/dist-extensions/src/parser/getTagName.d.ts.map +1 -0
  691. package/dist-extensions/src/parser/hasInvalidAncestor.d.ts +2 -0
  692. package/dist-extensions/src/parser/hasInvalidAncestor.d.ts.map +1 -0
  693. package/dist-extensions/src/parser/loadSVGFromString.d.ts +18 -0
  694. package/dist-extensions/src/parser/loadSVGFromString.d.ts.map +1 -0
  695. package/dist-extensions/src/parser/loadSVGFromURL.d.ts +19 -0
  696. package/dist-extensions/src/parser/loadSVGFromURL.d.ts.map +1 -0
  697. package/dist-extensions/src/parser/normalizeAttr.d.ts +3 -0
  698. package/dist-extensions/src/parser/normalizeAttr.d.ts.map +1 -0
  699. package/dist-extensions/src/parser/normalizeValue.d.ts +2 -0
  700. package/dist-extensions/src/parser/normalizeValue.d.ts.map +1 -0
  701. package/dist-extensions/src/parser/parseAttributes.d.ts +10 -0
  702. package/dist-extensions/src/parser/parseAttributes.d.ts.map +1 -0
  703. package/dist-extensions/src/parser/parseFontDeclaration.d.ts +10 -0
  704. package/dist-extensions/src/parser/parseFontDeclaration.d.ts.map +1 -0
  705. package/dist-extensions/src/parser/parsePointsAttribute.d.ts +10 -0
  706. package/dist-extensions/src/parser/parsePointsAttribute.d.ts.map +1 -0
  707. package/dist-extensions/src/parser/parseSVGDocument.d.ts +22 -0
  708. package/dist-extensions/src/parser/parseSVGDocument.d.ts.map +1 -0
  709. package/dist-extensions/src/parser/parseStyleAttribute.d.ts +9 -0
  710. package/dist-extensions/src/parser/parseStyleAttribute.d.ts.map +1 -0
  711. package/dist-extensions/src/parser/parseStyleObject.d.ts +8 -0
  712. package/dist-extensions/src/parser/parseStyleObject.d.ts.map +1 -0
  713. package/dist-extensions/src/parser/parseStyleString.d.ts +8 -0
  714. package/dist-extensions/src/parser/parseStyleString.d.ts.map +1 -0
  715. package/dist-extensions/src/parser/parseTransformAttribute.d.ts +11 -0
  716. package/dist-extensions/src/parser/parseTransformAttribute.d.ts.map +1 -0
  717. package/dist-extensions/src/parser/parseUseDirectives.d.ts +2 -0
  718. package/dist-extensions/src/parser/parseUseDirectives.d.ts.map +1 -0
  719. package/dist-extensions/src/parser/percent.d.ts +9 -0
  720. package/dist-extensions/src/parser/percent.d.ts.map +1 -0
  721. package/dist-extensions/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  722. package/dist-extensions/src/parser/recursivelyParseGradientsXlink.d.ts.map +1 -0
  723. package/dist-extensions/src/parser/selectorMatches.d.ts +2 -0
  724. package/dist-extensions/src/parser/selectorMatches.d.ts.map +1 -0
  725. package/dist-extensions/src/parser/setStrokeFillOpacity.d.ts +6 -0
  726. package/dist-extensions/src/parser/setStrokeFillOpacity.d.ts.map +1 -0
  727. package/dist-extensions/src/parser/typedefs.d.ts +10 -0
  728. package/dist-extensions/src/parser/typedefs.d.ts.map +1 -0
  729. package/dist-extensions/src/shapes/ActiveSelection.d.ts +109 -0
  730. package/dist-extensions/src/shapes/ActiveSelection.d.ts.map +1 -0
  731. package/dist-extensions/src/shapes/Circle.d.ts +111 -0
  732. package/dist-extensions/src/shapes/Circle.d.ts.map +1 -0
  733. package/dist-extensions/src/shapes/Ellipse.d.ts +88 -0
  734. package/dist-extensions/src/shapes/Ellipse.d.ts.map +1 -0
  735. package/dist-extensions/src/shapes/Group.d.ts +303 -0
  736. package/dist-extensions/src/shapes/Group.d.ts.map +1 -0
  737. package/dist-extensions/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  738. package/dist-extensions/src/shapes/IText/DraggableTextDelegate.d.ts.map +1 -0
  739. package/dist-extensions/src/shapes/IText/IText.d.ts +314 -0
  740. package/dist-extensions/src/shapes/IText/IText.d.ts.map +1 -0
  741. package/dist-extensions/src/shapes/IText/ITextBehavior.d.ts +299 -0
  742. package/dist-extensions/src/shapes/IText/ITextBehavior.d.ts.map +1 -0
  743. package/dist-extensions/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
  744. package/dist-extensions/src/shapes/IText/ITextClickBehavior.d.ts.map +1 -0
  745. package/dist-extensions/src/shapes/IText/ITextKeyBehavior.d.ts +198 -0
  746. package/dist-extensions/src/shapes/IText/ITextKeyBehavior.d.ts.map +1 -0
  747. package/dist-extensions/src/shapes/IText/constants.d.ts +13 -0
  748. package/dist-extensions/src/shapes/IText/constants.d.ts.map +1 -0
  749. package/dist-extensions/src/shapes/Image.d.ts +312 -0
  750. package/dist-extensions/src/shapes/Image.d.ts.map +1 -0
  751. package/dist-extensions/src/shapes/Line.d.ts +122 -0
  752. package/dist-extensions/src/shapes/Line.d.ts.map +1 -0
  753. package/dist-extensions/src/shapes/Object/AnimatableObject.d.ts +33 -0
  754. package/dist-extensions/src/shapes/Object/AnimatableObject.d.ts.map +1 -0
  755. package/dist-extensions/src/shapes/Object/FabricObject.d.ts +11 -0
  756. package/dist-extensions/src/shapes/Object/FabricObject.d.ts.map +1 -0
  757. package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +72 -0
  758. package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -0
  759. package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts +317 -0
  760. package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +1 -0
  761. package/dist-extensions/src/shapes/Object/Object.d.ts +614 -0
  762. package/dist-extensions/src/shapes/Object/Object.d.ts.map +1 -0
  763. package/dist-extensions/src/shapes/Object/ObjectGeometry.d.ts +237 -0
  764. package/dist-extensions/src/shapes/Object/ObjectGeometry.d.ts.map +1 -0
  765. package/dist-extensions/src/shapes/Object/ObjectOrigin.d.ts +96 -0
  766. package/dist-extensions/src/shapes/Object/ObjectOrigin.d.ts.map +1 -0
  767. package/dist-extensions/src/shapes/Object/StackedObject.d.ts +60 -0
  768. package/dist-extensions/src/shapes/Object/StackedObject.d.ts.map +1 -0
  769. package/dist-extensions/src/shapes/Object/defaultValues.d.ts +8 -0
  770. package/dist-extensions/src/shapes/Object/defaultValues.d.ts.map +1 -0
  771. package/dist-extensions/src/shapes/Object/types/BaseProps.d.ts +88 -0
  772. package/dist-extensions/src/shapes/Object/types/BaseProps.d.ts.map +1 -0
  773. package/dist-extensions/src/shapes/Object/types/BorderProps.d.ts +37 -0
  774. package/dist-extensions/src/shapes/Object/types/BorderProps.d.ts.map +1 -0
  775. package/dist-extensions/src/shapes/Object/types/ControlProps.d.ts +63 -0
  776. package/dist-extensions/src/shapes/Object/types/ControlProps.d.ts.map +1 -0
  777. package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts +66 -0
  778. package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -0
  779. package/dist-extensions/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
  780. package/dist-extensions/src/shapes/Object/types/FillStrokeProps.d.ts.map +1 -0
  781. package/dist-extensions/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
  782. package/dist-extensions/src/shapes/Object/types/LockInteractionProps.d.ts.map +1 -0
  783. package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts +43 -0
  784. package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts.map +1 -0
  785. package/dist-extensions/src/shapes/Object/types/ObjectTransformProps.d.ts +34 -0
  786. package/dist-extensions/src/shapes/Object/types/ObjectTransformProps.d.ts.map +1 -0
  787. package/dist-extensions/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
  788. package/dist-extensions/src/shapes/Object/types/SerializedObjectProps.d.ts.map +1 -0
  789. package/dist-extensions/src/shapes/Object/types/index.d.ts +6 -0
  790. package/dist-extensions/src/shapes/Object/types/index.d.ts.map +1 -0
  791. package/dist-extensions/src/shapes/Path.d.ts +215 -0
  792. package/dist-extensions/src/shapes/Path.d.ts.map +1 -0
  793. package/dist-extensions/src/shapes/Polygon.d.ts +7 -0
  794. package/dist-extensions/src/shapes/Polygon.d.ts.map +1 -0
  795. package/dist-extensions/src/shapes/Polyline.d.ts +156 -0
  796. package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -0
  797. package/dist-extensions/src/shapes/Rect.d.ts +83 -0
  798. package/dist-extensions/src/shapes/Rect.d.ts.map +1 -0
  799. package/dist-extensions/src/shapes/Text/StyledText.d.ts +128 -0
  800. package/dist-extensions/src/shapes/Text/StyledText.d.ts.map +1 -0
  801. package/dist-extensions/src/shapes/Text/Text.d.ts +697 -0
  802. package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -0
  803. package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts +47 -0
  804. package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -0
  805. package/dist-extensions/src/shapes/Text/constants.d.ts +13 -0
  806. package/dist-extensions/src/shapes/Text/constants.d.ts.map +1 -0
  807. package/dist-extensions/src/shapes/Textbox.d.ts +226 -0
  808. package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -0
  809. package/dist-extensions/src/shapes/Triangle.d.ts +27 -0
  810. package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -0
  811. package/dist-extensions/src/typedefs.d.ts +97 -0
  812. package/dist-extensions/src/typedefs.d.ts.map +1 -0
  813. package/dist-extensions/src/util/animation/AnimationBase.d.ts +54 -0
  814. package/dist-extensions/src/util/animation/AnimationBase.d.ts.map +1 -0
  815. package/dist-extensions/src/util/animation/AnimationFrameProvider.d.ts +3 -0
  816. package/dist-extensions/src/util/animation/AnimationFrameProvider.d.ts.map +1 -0
  817. package/dist-extensions/src/util/animation/AnimationRegistry.d.ts +29 -0
  818. package/dist-extensions/src/util/animation/AnimationRegistry.d.ts.map +1 -0
  819. package/dist-extensions/src/util/animation/ArrayAnimation.d.ts +10 -0
  820. package/dist-extensions/src/util/animation/ArrayAnimation.d.ts.map +1 -0
  821. package/dist-extensions/src/util/animation/ColorAnimation.d.ts +11 -0
  822. package/dist-extensions/src/util/animation/ColorAnimation.d.ts.map +1 -0
  823. package/dist-extensions/src/util/animation/ValueAnimation.d.ts +10 -0
  824. package/dist-extensions/src/util/animation/ValueAnimation.d.ts.map +1 -0
  825. package/dist-extensions/src/util/animation/animate.d.ts +37 -0
  826. package/dist-extensions/src/util/animation/animate.d.ts.map +1 -0
  827. package/dist-extensions/src/util/animation/easing.d.ts +130 -0
  828. package/dist-extensions/src/util/animation/easing.d.ts.map +1 -0
  829. package/dist-extensions/src/util/animation/index.d.ts +3 -0
  830. package/dist-extensions/src/util/animation/index.d.ts.map +1 -0
  831. package/dist-extensions/src/util/animation/types.d.ts +87 -0
  832. package/dist-extensions/src/util/animation/types.d.ts.map +1 -0
  833. package/dist-extensions/src/util/applyMixins.d.ts +8 -0
  834. package/dist-extensions/src/util/applyMixins.d.ts.map +1 -0
  835. package/dist-extensions/src/util/dom_event.d.ts +6 -0
  836. package/dist-extensions/src/util/dom_event.d.ts.map +1 -0
  837. package/dist-extensions/src/util/dom_misc.d.ts +12 -0
  838. package/dist-extensions/src/util/dom_misc.d.ts.map +1 -0
  839. package/dist-extensions/src/util/dom_style.d.ts +7 -0
  840. package/dist-extensions/src/util/dom_style.d.ts.map +1 -0
  841. package/dist-extensions/src/util/index.d.ts +37 -0
  842. package/dist-extensions/src/util/index.d.ts.map +1 -0
  843. package/dist-extensions/src/util/internals/cleanupSvgAttribute.d.ts +2 -0
  844. package/dist-extensions/src/util/internals/cleanupSvgAttribute.d.ts.map +1 -0
  845. package/dist-extensions/src/util/internals/cloneStyles.d.ts +3 -0
  846. package/dist-extensions/src/util/internals/cloneStyles.d.ts.map +1 -0
  847. package/dist-extensions/src/util/internals/console.d.ts +8 -0
  848. package/dist-extensions/src/util/internals/console.d.ts.map +1 -0
  849. package/dist-extensions/src/util/internals/dom_request.d.ts +16 -0
  850. package/dist-extensions/src/util/internals/dom_request.d.ts.map +1 -0
  851. package/dist-extensions/src/util/internals/findRight.d.ts +2 -0
  852. package/dist-extensions/src/util/internals/findRight.d.ts.map +1 -0
  853. package/dist-extensions/src/util/internals/getRandomInt.d.ts +8 -0
  854. package/dist-extensions/src/util/internals/getRandomInt.d.ts.map +1 -0
  855. package/dist-extensions/src/util/internals/ifNaN.d.ts +8 -0
  856. package/dist-extensions/src/util/internals/ifNaN.d.ts.map +1 -0
  857. package/dist-extensions/src/util/internals/removeFromArray.d.ts +9 -0
  858. package/dist-extensions/src/util/internals/removeFromArray.d.ts.map +1 -0
  859. package/dist-extensions/src/util/internals/uid.d.ts +2 -0
  860. package/dist-extensions/src/util/internals/uid.d.ts.map +1 -0
  861. package/dist-extensions/src/util/lang_string.d.ts +22 -0
  862. package/dist-extensions/src/util/lang_string.d.ts.map +1 -0
  863. package/dist-extensions/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  864. package/dist-extensions/src/util/misc/boundingBoxFromPoints.d.ts.map +1 -0
  865. package/dist-extensions/src/util/misc/capValue.d.ts +2 -0
  866. package/dist-extensions/src/util/misc/capValue.d.ts.map +1 -0
  867. package/dist-extensions/src/util/misc/cos.d.ts +10 -0
  868. package/dist-extensions/src/util/misc/cos.d.ts.map +1 -0
  869. package/dist-extensions/src/util/misc/dom.d.ts +28 -0
  870. package/dist-extensions/src/util/misc/dom.d.ts.map +1 -0
  871. package/dist-extensions/src/util/misc/findScaleTo.d.ts +20 -0
  872. package/dist-extensions/src/util/misc/findScaleTo.d.ts.map +1 -0
  873. package/dist-extensions/src/util/misc/groupSVGElements.d.ts +11 -0
  874. package/dist-extensions/src/util/misc/groupSVGElements.d.ts.map +1 -0
  875. package/dist-extensions/src/util/misc/isTransparent.d.ts +11 -0
  876. package/dist-extensions/src/util/misc/isTransparent.d.ts.map +1 -0
  877. package/dist-extensions/src/util/misc/matrix.d.ts +170 -0
  878. package/dist-extensions/src/util/misc/matrix.d.ts.map +1 -0
  879. package/dist-extensions/src/util/misc/mergeClipPaths.d.ts +23 -0
  880. package/dist-extensions/src/util/misc/mergeClipPaths.d.ts.map +1 -0
  881. package/dist-extensions/src/util/misc/objectEnlive.d.ts +45 -0
  882. package/dist-extensions/src/util/misc/objectEnlive.d.ts.map +1 -0
  883. package/dist-extensions/src/util/misc/objectTransforms.d.ts +62 -0
  884. package/dist-extensions/src/util/misc/objectTransforms.d.ts.map +1 -0
  885. package/dist-extensions/src/util/misc/pick.d.ts +9 -0
  886. package/dist-extensions/src/util/misc/pick.d.ts.map +1 -0
  887. package/dist-extensions/src/util/misc/planeChange.d.ts +64 -0
  888. package/dist-extensions/src/util/misc/planeChange.d.ts.map +1 -0
  889. package/dist-extensions/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +52 -0
  890. package/dist-extensions/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts.map +1 -0
  891. package/dist-extensions/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +90 -0
  892. package/dist-extensions/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts.map +1 -0
  893. package/dist-extensions/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +27 -0
  894. package/dist-extensions/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts.map +1 -0
  895. package/dist-extensions/src/util/misc/projectStroke/index.d.ts +12 -0
  896. package/dist-extensions/src/util/misc/projectStroke/index.d.ts.map +1 -0
  897. package/dist-extensions/src/util/misc/projectStroke/types.d.ts +23 -0
  898. package/dist-extensions/src/util/misc/projectStroke/types.d.ts.map +1 -0
  899. package/dist-extensions/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  900. package/dist-extensions/src/util/misc/radiansDegreesConversion.d.ts.map +1 -0
  901. package/dist-extensions/src/util/misc/resolveOrigin.d.ts +9 -0
  902. package/dist-extensions/src/util/misc/resolveOrigin.d.ts.map +1 -0
  903. package/dist-extensions/src/util/misc/rotatePoint.d.ts +12 -0
  904. package/dist-extensions/src/util/misc/rotatePoint.d.ts.map +1 -0
  905. package/dist-extensions/src/util/misc/sin.d.ts +10 -0
  906. package/dist-extensions/src/util/misc/sin.d.ts.map +1 -0
  907. package/dist-extensions/src/util/misc/svgParsing.d.ts +46 -0
  908. package/dist-extensions/src/util/misc/svgParsing.d.ts.map +1 -0
  909. package/dist-extensions/src/util/misc/textStyles.d.ts +32 -0
  910. package/dist-extensions/src/util/misc/textStyles.d.ts.map +1 -0
  911. package/dist-extensions/src/util/misc/toFixed.d.ts +8 -0
  912. package/dist-extensions/src/util/misc/toFixed.d.ts.map +1 -0
  913. package/dist-extensions/src/util/misc/vectors.d.ts +72 -0
  914. package/dist-extensions/src/util/misc/vectors.d.ts.map +1 -0
  915. package/dist-extensions/src/util/path/index.d.ts +95 -0
  916. package/dist-extensions/src/util/path/index.d.ts.map +1 -0
  917. package/dist-extensions/src/util/path/regex.d.ts +2 -0
  918. package/dist-extensions/src/util/path/regex.d.ts.map +1 -0
  919. package/dist-extensions/src/util/path/typedefs.d.ts +221 -0
  920. package/dist-extensions/src/util/path/typedefs.d.ts.map +1 -0
  921. package/dist-extensions/src/util/transform_matrix_removal.d.ts +14 -0
  922. package/dist-extensions/src/util/transform_matrix_removal.d.ts.map +1 -0
  923. package/dist-extensions/src/util/typeAssertions.d.ts +13 -0
  924. package/dist-extensions/src/util/typeAssertions.d.ts.map +1 -0
  925. package/eslint.config.mjs +108 -0
  926. package/extensions/README.MD +27 -0
  927. package/extensions/aligning_guidelines/README.MD +22 -0
  928. package/extensions/aligning_guidelines/constant.ts +10 -0
  929. package/extensions/aligning_guidelines/index.ts +166 -0
  930. package/extensions/aligning_guidelines/typedefs.ts +36 -0
  931. package/extensions/aligning_guidelines/util/basic.spec.ts +31 -0
  932. package/extensions/aligning_guidelines/util/basic.ts +20 -0
  933. package/extensions/aligning_guidelines/util/collect-line.ts +172 -0
  934. package/extensions/aligning_guidelines/util/collect-point.ts +83 -0
  935. package/extensions/aligning_guidelines/util/draw.ts +74 -0
  936. package/extensions/aligning_guidelines/util/get-objects-by-target.ts +45 -0
  937. package/extensions/index.ts +4 -0
  938. package/jest.config.js +1 -1
  939. package/jest.extend.ts +14 -15
  940. package/package.json +17 -12
  941. package/playwright.setup.ts +5 -5
  942. package/rollup.config.mjs +46 -4
  943. package/scripts/build.mjs +1 -1
  944. package/scripts/buildLock.mjs +5 -5
  945. package/scripts/buildStats.mjs +2 -2
  946. package/scripts/git.mjs +1 -1
  947. package/scripts/index.mjs +34 -32
  948. package/scripts/sandbox.mjs +15 -15
  949. package/src/ClassRegistry.spec.ts +1 -1
  950. package/src/ClassRegistry.ts +1 -1
  951. package/src/Collection.ts +9 -9
  952. package/src/EventTypeDefs.ts +2 -2
  953. package/src/Intersection.spec.ts +2 -2
  954. package/src/Intersection.ts +11 -11
  955. package/src/LayoutManager/ActiveSelectionLayoutManager.spec.ts +3 -3
  956. package/src/LayoutManager/ActiveSelectionLayoutManager.ts +2 -2
  957. package/src/LayoutManager/LayoutManager.spec.ts +17 -17
  958. package/src/LayoutManager/LayoutManager.ts +15 -15
  959. package/src/LayoutManager/LayoutStrategies/ClipPathLayout.ts +3 -3
  960. package/src/LayoutManager/LayoutStrategies/FixedLayout.ts +1 -1
  961. package/src/LayoutManager/LayoutStrategies/LayoutStrategy.ts +4 -4
  962. package/src/LayoutManager/LayoutStrategies/utils.ts +4 -4
  963. package/src/LayoutManager/types.ts +12 -13
  964. package/src/Observable.ts +7 -7
  965. package/src/Pattern/Pattern.ts +20 -10
  966. package/src/Point.ts +3 -3
  967. package/src/Shadow.ts +7 -7
  968. package/src/brushes/CircleBrush.ts +1 -1
  969. package/src/brushes/PatternBrush.ts +1 -1
  970. package/src/brushes/PencilBrush.ts +1 -1
  971. package/src/brushes/SprayBrush.ts +3 -3
  972. package/src/canvas/Canvas.ts +38 -35
  973. package/src/canvas/DOMManagers/CanvasDOMManager.ts +2 -2
  974. package/src/canvas/DOMManagers/StaticCanvasDOMManager.ts +1 -1
  975. package/src/canvas/DOMManagers/util.ts +2 -2
  976. package/src/canvas/SelectableCanvas.spec.ts +8 -8
  977. package/src/canvas/SelectableCanvas.ts +20 -20
  978. package/src/canvas/StaticCanvas.ts +44 -43
  979. package/src/canvas/StaticCanvasOptions.ts +0 -1
  980. package/src/canvas/TextEditingManager.ts +1 -1
  981. package/src/canvas/__tests__/eventData.test.ts +17 -17
  982. package/src/color/Color.ts +3 -2
  983. package/src/color/color.test.ts +2 -2
  984. package/src/color/typedefs.ts +1 -1
  985. package/src/color/util.ts +1 -1
  986. package/src/config.ts +1 -1
  987. package/src/controls/Control.spec.ts +8 -8
  988. package/src/controls/Control.ts +14 -14
  989. package/src/controls/changeWidth.test.ts +2 -2
  990. package/src/controls/changeWidth.ts +4 -4
  991. package/src/controls/controlRendering.ts +4 -4
  992. package/src/controls/drag.ts +1 -1
  993. package/src/controls/fireEvent.ts +1 -1
  994. package/src/controls/pathControl.spec.ts +9 -9
  995. package/src/controls/pathControl.ts +20 -20
  996. package/src/controls/polyControl.spec.ts +6 -6
  997. package/src/controls/polyControl.ts +11 -11
  998. package/src/controls/rotate.ts +4 -4
  999. package/src/controls/scale.test.ts +9 -9
  1000. package/src/controls/scale.ts +13 -13
  1001. package/src/controls/scaleSkew.ts +3 -3
  1002. package/src/controls/skew.ts +8 -8
  1003. package/src/controls/util.ts +6 -6
  1004. package/src/controls/wrapWithFireEvent.ts +2 -2
  1005. package/src/controls/wrapWithFixedAnchor.spec.ts +5 -5
  1006. package/src/controls/wrapWithFixedAnchor.ts +2 -2
  1007. package/src/env/node.ts +2 -2
  1008. package/src/filters/BaseFilter.ts +27 -25
  1009. package/src/filters/BlendColor.ts +1 -1
  1010. package/src/filters/BlendImage.ts +4 -4
  1011. package/src/filters/Blur.ts +1 -1
  1012. package/src/filters/Boilerplate.ts +1 -1
  1013. package/src/filters/Brightness.ts +1 -1
  1014. package/src/filters/Canvas2dFilterBackend.ts +1 -1
  1015. package/src/filters/ColorMatrix.ts +2 -2
  1016. package/src/filters/ColorMatrixFilters.ts +7 -7
  1017. package/src/filters/Composed.ts +5 -5
  1018. package/src/filters/Contrast.ts +1 -1
  1019. package/src/filters/Convolute.ts +1 -1
  1020. package/src/filters/GLProbes/WebGLProbe.ts +2 -2
  1021. package/src/filters/Gamma.ts +1 -1
  1022. package/src/filters/Grayscale.ts +1 -1
  1023. package/src/filters/Invert.ts +1 -1
  1024. package/src/filters/Noise.ts +1 -1
  1025. package/src/filters/Pixelate.ts +1 -1
  1026. package/src/filters/RemoveColor.ts +1 -1
  1027. package/src/filters/Resize.ts +9 -9
  1028. package/src/filters/Saturation.ts +1 -1
  1029. package/src/filters/Vibrance.ts +1 -1
  1030. package/src/filters/WebGLFilterBackend.ts +10 -10
  1031. package/src/filters/typedefs.ts +1 -3
  1032. package/src/filters/utils.ts +3 -3
  1033. package/src/gradient/Gradient.spec.ts +19 -19
  1034. package/src/gradient/Gradient.ts +51 -50
  1035. package/src/gradient/parser/parseColorStops.ts +3 -3
  1036. package/src/gradient/parser/parseCoords.ts +28 -25
  1037. package/src/mixins/eraser_brush.mixin.ts +21 -21
  1038. package/src/parkinglot/straighten.ts +1 -1
  1039. package/src/parser/applyViewboxTransform.ts +2 -2
  1040. package/src/parser/constants.ts +2 -2
  1041. package/src/parser/elements_parser.ts +13 -13
  1042. package/src/parser/getCSSRules.ts +1 -1
  1043. package/src/parser/getGlobalStylesForElement.ts +1 -1
  1044. package/src/parser/getGradientDefs.ts +1 -1
  1045. package/src/parser/getMultipleNodes.ts +2 -2
  1046. package/src/parser/loadSVGFromString.test.ts +1 -4
  1047. package/src/parser/loadSVGFromString.ts +1 -1
  1048. package/src/parser/loadSVGFromURL.ts +1 -1
  1049. package/src/parser/normalizeAttr.ts +1 -1
  1050. package/src/parser/normalizeValue.ts +2 -2
  1051. package/src/parser/parseAttributes.ts +3 -3
  1052. package/src/parser/parseFontDeclaration.ts +1 -1
  1053. package/src/parser/parseSVGDocument.ts +3 -3
  1054. package/src/parser/parseStyleObject.ts +1 -1
  1055. package/src/parser/parseStyleString.ts +1 -1
  1056. package/src/parser/parseTransformAttribute.ts +1 -1
  1057. package/src/parser/parseUseDirectives.ts +1 -1
  1058. package/src/parser/percent.ts +4 -4
  1059. package/src/parser/recursivelyParseGradientsXlink.ts +1 -1
  1060. package/src/parser/setStrokeFillOpacity.ts +1 -1
  1061. package/src/parser/typedefs.ts +1 -1
  1062. package/src/shapes/ActiveSelection.spec.ts +1 -1
  1063. package/src/shapes/ActiveSelection.ts +4 -4
  1064. package/src/shapes/Circle.ts +5 -5
  1065. package/src/shapes/Ellipse.ts +4 -4
  1066. package/src/shapes/Group.spec.ts +5 -5
  1067. package/src/shapes/Group.ts +19 -17
  1068. package/src/shapes/IText/DraggableTextDelegate.ts +9 -10
  1069. package/src/shapes/IText/IText.test.ts +1 -1
  1070. package/src/shapes/IText/IText.ts +12 -12
  1071. package/src/shapes/IText/ITextBehavior.test.ts +2 -2
  1072. package/src/shapes/IText/ITextBehavior.ts +21 -21
  1073. package/src/shapes/IText/ITextClickBehavior.ts +2 -2
  1074. package/src/shapes/IText/ITextKeyBehavior.test.ts +2 -2
  1075. package/src/shapes/IText/ITextKeyBehavior.ts +13 -13
  1076. package/src/shapes/Image.ts +16 -16
  1077. package/src/shapes/Line.ts +4 -4
  1078. package/src/shapes/Object/AnimatableObject.ts +13 -10
  1079. package/src/shapes/Object/FabricObject.ts +7 -3
  1080. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +9 -9
  1081. package/src/shapes/Object/InteractiveObject.spec.ts +3 -3
  1082. package/src/shapes/Object/InteractiveObject.ts +32 -32
  1083. package/src/shapes/Object/Object.ts +33 -31
  1084. package/src/shapes/Object/ObjectGeometry.ts +9 -9
  1085. package/src/shapes/Object/ObjectOrigin.ts +11 -11
  1086. package/src/shapes/Object/StackedObject.ts +3 -4
  1087. package/src/shapes/Path.ts +14 -14
  1088. package/src/shapes/Polyline.spec.ts +1 -1
  1089. package/src/shapes/Polyline.ts +15 -16
  1090. package/src/shapes/Rect.ts +6 -6
  1091. package/src/shapes/Text/StyledText.spec.ts +2 -2
  1092. package/src/shapes/Text/StyledText.ts +7 -7
  1093. package/src/shapes/Text/Text.spec.ts +1 -1
  1094. package/src/shapes/Text/Text.ts +33 -33
  1095. package/src/shapes/Text/TextSVGExportMixin.spec.ts +1 -1
  1096. package/src/shapes/Text/TextSVGExportMixin.ts +23 -23
  1097. package/src/shapes/Textbox.ts +7 -7
  1098. package/src/shapes/Triangle.ts +1 -1
  1099. package/src/typedefs.ts +3 -3
  1100. package/src/util/animation/AnimationBase.ts +2 -2
  1101. package/src/util/animation/AnimationRegistry.ts +1 -1
  1102. package/src/util/animation/ArrayAnimation.ts +2 -2
  1103. package/src/util/animation/ColorAnimation.ts +5 -5
  1104. package/src/util/animation/ValueAnimation.ts +1 -1
  1105. package/src/util/animation/animate.ts +6 -6
  1106. package/src/util/animation/animations.spec.ts +7 -7
  1107. package/src/util/animation/easing.ts +1 -1
  1108. package/src/util/animation/types.ts +5 -6
  1109. package/src/util/applyMixins.ts +2 -2
  1110. package/src/util/dom_style.ts +2 -2
  1111. package/src/util/internals/cloneDeep.ts +6 -0
  1112. package/src/util/internals/cloneStyles.spec.ts +46 -0
  1113. package/src/util/internals/cloneStyles.ts +12 -0
  1114. package/src/util/internals/findRight.ts +1 -1
  1115. package/src/util/internals/getRandomInt.test.ts +1 -1
  1116. package/src/util/misc/boundingBoxFromPoints.ts +1 -1
  1117. package/src/util/misc/dom.ts +3 -3
  1118. package/src/util/misc/findScaleTo.ts +2 -2
  1119. package/src/util/misc/groupSVGElements.ts +1 -1
  1120. package/src/util/misc/isTransparent.ts +1 -1
  1121. package/src/util/misc/matrix.ts +6 -6
  1122. package/src/util/misc/objectEnlive.ts +9 -9
  1123. package/src/util/misc/objectTransforms.ts +5 -5
  1124. package/src/util/misc/pick.ts +2 -2
  1125. package/src/util/misc/planeChange.spec.ts +9 -9
  1126. package/src/util/misc/planeChange.ts +5 -5
  1127. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +7 -7
  1128. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +16 -16
  1129. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +2 -2
  1130. package/src/util/misc/projectStroke/index.ts +7 -7
  1131. package/src/util/misc/resolveOrigin.ts +1 -1
  1132. package/src/util/misc/rotatePoint.ts +1 -1
  1133. package/src/util/misc/svgParsing.ts +5 -5
  1134. package/src/util/misc/textStyles.ts +6 -6
  1135. package/src/util/misc/vectors.ts +1 -1
  1136. package/src/util/path/index.spec.ts +3 -3
  1137. package/src/util/path/index.ts +30 -30
  1138. package/src/util/path/typechecks.ts +22 -22
  1139. package/src/util/path/typedefs.ts +14 -17
  1140. package/src/util/transform_matrix_removal.ts +3 -3
  1141. package/src/util/typeAssertions.ts +4 -4
  1142. package/tsconfig-extensions.json +108 -0
  1143. package/tsconfig.json +4 -3
  1144. package/.eslintignore +0 -3
  1145. package/.eslintrc.js +0 -60
  1146. package/.eslintrc.json +0 -143
  1147. package/.eslintrc_tests +0 -58
  1148. package/dist/src/util/internals/cloneDeep.min.mjs +0 -2
  1149. package/dist/src/util/internals/cloneDeep.min.mjs.map +0 -1
  1150. package/dist/src/util/internals/cloneDeep.mjs +0 -4
  1151. package/dist/src/util/internals/cloneDeep.mjs.map +0 -1
  1152. package/dist/src/util/internals/index.d.ts +0 -5
  1153. package/dist/src/util/internals/index.d.ts.map +0 -1
  1154. package/src/benchmarks/README.md +0 -7
  1155. package/src/benchmarks/calcCornerCoords.mjs +0 -117
  1156. package/src/benchmarks/calcTransformMatrix.mjs +0 -104
  1157. package/src/benchmarks/pathCloning.mjs +0 -111
  1158. package/src/benchmarks/pathData.mjs +0 -5
  1159. package/src/benchmarks/raycasting.mjs +0 -152
  1160. package/src/benchmarks/transformMatrixKey.mjs +0 -97
  1161. package/src/util/internals/index.ts +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"ITextBehavior.min.mjs","sources":["../../../../src/shapes/IText/ITextBehavior.ts"],"sourcesContent":["import type {\n ObjectEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n tripleclick: TPointerEventInfo;\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents\n> extends FabricText<Props, SProps, EventSpec> {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n protected declare inCompositionMode: boolean;\n\n protected declare _reSpace: RegExp;\n private declare _currentTickState?: ValueAnimation;\n private declare _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n private declare _textBeforeEdit: string;\n protected declare __selectionStartOnMouseDown: number;\n\n protected declare selected: boolean;\n protected declare cursorOffsetCache: { left?: number; top?: number };\n protected declare _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n protected declare _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback<number, void>;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n }\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone()\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * TODO fix: selectionStart set as 0 will be ignored?\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart || this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1)\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n\n /**\n * TODO fix: selectionStart set as 0 will be ignored?\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart || this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[]\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight\n )\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n */\n protected _exitEditing() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this._exitEditing();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration }\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[]\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[]\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n"],"names":["reNonWord","ITextBehavior","FabricText","constructor","super","arguments","_defineProperty","initBehavior","this","_tick","bind","_onTickComplete","updateSelectionOnMouseMove","onDeselect","options","isEditing","exitEditing","selected","_animateCursor","_ref","toValue","duration","delay","onComplete","animate","startValue","_currentCursorOpacity","endValue","abort","canvas","selectionStart","selectionEnd","onChange","value","renderCursorOrSelection","_currentTickState","cursorDuration","Math","max","_this$_currentTickCom","_currentTickCompleteState","initDelayedCursor","restart","abortCursorAnimation","cursorDelay","shouldClear","forEach","cursorAnimation","isDone","clearContextTop","restartCursorIfNeeded","some","selectAll","_text","length","_fireSelectionChanged","_updateTextarea","getSelectedText","slice","join","findWordBoundaryLeft","startFrom","offset","index","_reSpace","test","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","direction","text","reNewline","_char","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditing","e","editable","calcOffset","textEditingManager","exitTextEditing","initHiddenTextarea","hiddenTextarea","focus","_saveEditingProps","_setEditingProps","_textBeforeEdit","fire","undefined","target","requestRenderAll","getActiveControl","el","getDocumentFromElement","activeElement","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","hoverCursor","defaultCursor","moveCursor","borderColor","editingBorderColor","hasControls","selectable","lockMovementX","lockMovementY","fromStringToGraphemeSelection","start","end","smallerTextStart","graphemeStart","graphemeSplit","smallerTextEnd","fromGraphemeToStringSelection","graphemes","cursorOffsetCache","inCompositionMode","newSelection","updateTextareaPosition","updateFromTextArea","textarea","set","initDimensions","setCoords","style","_calcTextareaPosition","left","top","desiredPosition","compositionStart","boundaries","_getCursorBoundaries","cursorLocation","get2DCursorLocation","lineIndex","charIndex","charHeight","getValueOfPropertyAt","lineHeight","leftOffset","retinaScaling","getCanvasRetinaScaling","upperCanvas","upperCanvasEl","upperCanvasWidth","width","upperCanvasHeight","height","maxWidth","maxHeight","p","Point","topOffset","transform","calcTransformMatrix","viewportTransform","multiply","clientWidth","clientHeight","x","y","_offset","concat","fontSize","_savedProps","_restoreEditingProps","_exitEditing","blur","parentNode","removeChild","isTextChanged","_forceClearCache","MODIFIED","_removeExtraneousStyles","prop","styles","_textLines","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","i","_unwrappedTextLines","styleObj","shiftLineStyles","diff","char","numericChar","parseInt","clonedStyles","Object","assign","line","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","_objectSpread","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","keys","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","removeChars","splice","insertChars","setSelectionStartEndWithShift","_selectionDirection","LEFT","RIGHT"],"mappings":"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"}
1
+ {"version":3,"file":"ITextBehavior.min.mjs","sources":["../../../../src/shapes/IText/ITextBehavior.ts"],"sourcesContent":["import type {\n ObjectEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n tripleclick: TPointerEventInfo;\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText<Props, SProps, EventSpec> {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n protected declare inCompositionMode: boolean;\n\n protected declare _reSpace: RegExp;\n private declare _currentTickState?: ValueAnimation;\n private declare _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n private declare _textBeforeEdit: string;\n protected declare __selectionStartOnMouseDown: number;\n\n protected declare selected: boolean;\n protected declare cursorOffsetCache: { left?: number; top?: number };\n protected declare _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n protected declare _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback<number, void>;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * TODO fix: selectionStart set as 0 will be ignored?\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart || this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n\n /**\n * TODO fix: selectionStart set as 0 will be ignored?\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart || this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n */\n protected _exitEditing() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this._exitEditing();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n"],"names":["reNonWord","ITextBehavior","FabricText","constructor","super","arguments","_defineProperty","initBehavior","this","_tick","bind","_onTickComplete","updateSelectionOnMouseMove","onDeselect","options","isEditing","exitEditing","selected","_animateCursor","_ref","toValue","duration","delay","onComplete","animate","startValue","_currentCursorOpacity","endValue","abort","canvas","selectionStart","selectionEnd","onChange","value","renderCursorOrSelection","_currentTickState","cursorDuration","Math","max","_this$_currentTickCom","_currentTickCompleteState","initDelayedCursor","restart","abortCursorAnimation","cursorDelay","shouldClear","forEach","cursorAnimation","isDone","clearContextTop","restartCursorIfNeeded","some","selectAll","_text","length","_fireSelectionChanged","_updateTextarea","getSelectedText","slice","join","findWordBoundaryLeft","startFrom","offset","index","_reSpace","test","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","direction","text","reNewline","_char","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditing","e","editable","calcOffset","textEditingManager","exitTextEditing","initHiddenTextarea","hiddenTextarea","focus","_saveEditingProps","_setEditingProps","_textBeforeEdit","fire","undefined","target","requestRenderAll","getActiveControl","el","getDocumentFromElement","activeElement","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","hoverCursor","defaultCursor","moveCursor","borderColor","editingBorderColor","hasControls","selectable","lockMovementX","lockMovementY","fromStringToGraphemeSelection","start","end","smallerTextStart","graphemeStart","graphemeSplit","smallerTextEnd","fromGraphemeToStringSelection","graphemes","cursorOffsetCache","inCompositionMode","newSelection","updateTextareaPosition","updateFromTextArea","textarea","set","initDimensions","setCoords","style","_calcTextareaPosition","left","top","desiredPosition","compositionStart","boundaries","_getCursorBoundaries","cursorLocation","get2DCursorLocation","lineIndex","charIndex","charHeight","getValueOfPropertyAt","lineHeight","leftOffset","retinaScaling","getCanvasRetinaScaling","upperCanvas","upperCanvasEl","upperCanvasWidth","width","upperCanvasHeight","height","maxWidth","maxHeight","p","Point","topOffset","transform","calcTransformMatrix","viewportTransform","multiply","clientWidth","clientHeight","x","y","_offset","concat","fontSize","_savedProps","_restoreEditingProps","_exitEditing","blur","parentNode","removeChild","isTextChanged","_forceClearCache","MODIFIED","_removeExtraneousStyles","prop","styles","_textLines","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","i","_unwrappedTextLines","styleObj","shiftLineStyles","diff","char","numericChar","parseInt","clonedStyles","Object","assign","line","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","_objectSpread","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","keys","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","removeChars","splice","insertChars","setSelectionStartEndWithShift","_selectionDirection","LEFT","RIGHT"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ITextBehavior.mjs","sources":["../../../../src/shapes/IText/ITextBehavior.ts"],"sourcesContent":["import type {\n ObjectEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n tripleclick: TPointerEventInfo;\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents\n> extends FabricText<Props, SProps, EventSpec> {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n protected declare inCompositionMode: boolean;\n\n protected declare _reSpace: RegExp;\n private declare _currentTickState?: ValueAnimation;\n private declare _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n private declare _textBeforeEdit: string;\n protected declare __selectionStartOnMouseDown: number;\n\n protected declare selected: boolean;\n protected declare cursorOffsetCache: { left?: number; top?: number };\n protected declare _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n protected declare _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback<number, void>;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n }\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone()\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * TODO fix: selectionStart set as 0 will be ignored?\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart || this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1)\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n\n /**\n * TODO fix: selectionStart set as 0 will be ignored?\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart || this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[]\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight\n )\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n */\n protected _exitEditing() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this._exitEditing();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration }\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[]\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[]\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n"],"names":["reNonWord","ITextBehavior","FabricText","constructor","arguments","_defineProperty","initBehavior","_tick","bind","_onTickComplete","updateSelectionOnMouseMove","onDeselect","options","isEditing","exitEditing","selected","_animateCursor","_ref","toValue","duration","delay","onComplete","animate","startValue","_currentCursorOpacity","endValue","abort","canvas","selectionStart","selectionEnd","onChange","value","renderCursorOrSelection","_currentTickState","cursorDuration","Math","max","_this$_currentTickCom","_currentTickCompleteState","initDelayedCursor","restart","abortCursorAnimation","cursorDelay","shouldClear","forEach","cursorAnimation","isDone","clearContextTop","restartCursorIfNeeded","some","selectAll","_text","length","_fireSelectionChanged","_updateTextarea","getSelectedText","slice","join","findWordBoundaryLeft","startFrom","offset","index","_reSpace","test","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","direction","text","reNewline","_char","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditing","e","editable","calcOffset","textEditingManager","exitTextEditing","initHiddenTextarea","hiddenTextarea","focus","_saveEditingProps","_setEditingProps","_textBeforeEdit","fire","undefined","target","requestRenderAll","getActiveControl","el","getDocumentFromElement","activeElement","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","hoverCursor","defaultCursor","moveCursor","borderColor","editingBorderColor","hasControls","selectable","lockMovementX","lockMovementY","fromStringToGraphemeSelection","start","end","smallerTextStart","graphemeStart","graphemeSplit","smallerTextEnd","graphemeEnd","fromGraphemeToStringSelection","graphemes","cursorOffsetCache","inCompositionMode","newSelection","updateTextareaPosition","updateFromTextArea","textarea","set","initDimensions","setCoords","style","_calcTextareaPosition","left","top","desiredPosition","compositionStart","boundaries","_getCursorBoundaries","cursorLocation","get2DCursorLocation","lineIndex","charIndex","charHeight","getValueOfPropertyAt","lineHeight","leftOffset","retinaScaling","getCanvasRetinaScaling","upperCanvas","upperCanvasEl","upperCanvasWidth","width","upperCanvasHeight","height","maxWidth","maxHeight","p","Point","topOffset","transform","calcTransformMatrix","viewportTransform","multiply","clientWidth","clientHeight","x","y","_offset","concat","fontSize","_savedProps","_restoreEditingProps","_exitEditing","blur","parentNode","removeChild","isTextChanged","_forceClearCache","MODIFIED","_removeExtraneousStyles","prop","styles","_textLines","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","i","_unwrappedTextLines","styleObj","shiftLineStyles","diff","char","numericChar","parseInt","clonedStyles","Object","assign","line","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","_objectSpread","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","keys","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","removeChars","splice","insertChars","setSelectionStartEndWithShift","_selectionDirection","LEFT","RIGHT"],"mappings":"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"}
1
+ {"version":3,"file":"ITextBehavior.mjs","sources":["../../../../src/shapes/IText/ITextBehavior.ts"],"sourcesContent":["import type {\n ObjectEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n * extend this regex to support non english languages\n *\n * - ` ` Matches a SPACE character (char code 32).\n * - `\\n` Matches a LINE FEED character (char code 10).\n * - `\\.` Matches a \".\" character (char code 46).\n * - `,` Matches a \",\" character (char code 44).\n * - `;` Matches a \";\" character (char code 59).\n * - `!` Matches a \"!\" character (char code 33).\n * - `\\?` Matches a \"?\" character (char code 63).\n * - `\\-` Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n 'selection:changed': never;\n changed: never | { index: number; action: string };\n tripleclick: TPointerEventInfo;\n 'editing:entered': never | { e: TPointerEvent };\n 'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText<Props, SProps, EventSpec> {\n declare abstract isEditing: boolean;\n declare abstract cursorDelay: number;\n declare abstract selectionStart: number;\n declare abstract selectionEnd: number;\n declare abstract cursorDuration: number;\n declare abstract editable: boolean;\n declare abstract editingBorderColor: string;\n\n declare abstract compositionStart: number;\n declare abstract compositionEnd: number;\n\n declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n protected declare inCompositionMode: boolean;\n\n protected declare _reSpace: RegExp;\n private declare _currentTickState?: ValueAnimation;\n private declare _currentTickCompleteState?: ValueAnimation;\n protected _currentCursorOpacity = 1;\n private declare _textBeforeEdit: string;\n protected declare __selectionStartOnMouseDown: number;\n\n protected declare selected: boolean;\n protected declare cursorOffsetCache: { left?: number; top?: number };\n protected declare _savedProps?: {\n hasControls: boolean;\n borderColor: string;\n lockMovementX: boolean;\n lockMovementY: boolean;\n selectable: boolean;\n hoverCursor: CSSStyleDeclaration['cursor'] | null;\n defaultCursor?: CSSStyleDeclaration['cursor'];\n moveCursor?: CSSStyleDeclaration['cursor'];\n };\n protected declare _selectionDirection: 'left' | 'right' | null;\n\n abstract initHiddenTextarea(): void;\n abstract _fireSelectionChanged(): void;\n abstract renderCursorOrSelection(): void;\n abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n abstract _getCursorBoundaries(\n index: number,\n skipCaching?: boolean,\n ): {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n };\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior() {\n this._tick = this._tick.bind(this);\n this._onTickComplete = this._onTickComplete.bind(this);\n this.updateSelectionOnMouseMove =\n this.updateSelectionOnMouseMove.bind(this);\n }\n\n onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n this.isEditing && this.exitEditing();\n this.selected = false;\n return super.onDeselect(options);\n }\n\n /**\n * @private\n */\n _animateCursor({\n toValue,\n duration,\n delay,\n onComplete,\n }: {\n toValue: number;\n duration: number;\n delay?: number;\n onComplete?: TOnAnimationChangeCallback<number, void>;\n }) {\n return animate({\n startValue: this._currentCursorOpacity,\n endValue: toValue,\n duration,\n delay,\n onComplete,\n abort: () =>\n !this.canvas ||\n // we do not want to animate a selection, only cursor\n this.selectionStart !== this.selectionEnd,\n onChange: (value) => {\n this._currentCursorOpacity = value;\n this.renderCursorOrSelection();\n },\n });\n }\n\n /**\n * changes the cursor from visible to invisible\n */\n private _tick(delay?: number) {\n this._currentTickState = this._animateCursor({\n toValue: 0,\n duration: this.cursorDuration / 2,\n delay: Math.max(delay || 0, 100),\n onComplete: this._onTickComplete,\n });\n }\n\n /**\n * Changes the cursor from invisible to visible\n */\n private _onTickComplete() {\n this._currentTickCompleteState?.abort();\n this._currentTickCompleteState = this._animateCursor({\n toValue: 1,\n duration: this.cursorDuration,\n onComplete: this._tick,\n });\n }\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor(restart?: boolean) {\n this.abortCursorAnimation();\n this._tick(restart ? 0 : this.cursorDelay);\n }\n\n /**\n * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n */\n abortCursorAnimation() {\n let shouldClear = false;\n [this._currentTickState, this._currentTickCompleteState].forEach(\n (cursorAnimation) => {\n if (cursorAnimation && !cursorAnimation.isDone()) {\n shouldClear = true;\n cursorAnimation.abort();\n }\n },\n );\n\n this._currentCursorOpacity = 1;\n\n // make sure we clear context even if instance is not editing\n if (shouldClear) {\n this.clearContextTop();\n }\n }\n\n /**\n * Restart tue cursor animation if either is in complete state ( between animations )\n * or if it never started before\n */\n restartCursorIfNeeded() {\n if (\n [this._currentTickState, this._currentTickCompleteState].some(\n (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n )\n ) {\n this.initDelayedCursor();\n }\n }\n\n /**\n * Selects entire text\n */\n selectAll() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText(): string {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n }\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft(startFrom: number): number {\n let offset = 0,\n index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n }\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight(startFrom: number): number {\n let offset = 0,\n index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n }\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n const text = this._text;\n // if we land on a space we move the cursor backwards\n // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n let index =\n selectionStart > 0 &&\n this._reSpace.test(text[selectionStart]) &&\n (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n ? selectionStart - 1\n : selectionStart,\n _char = text[index];\n while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n index += direction;\n _char = text[index];\n }\n if (direction === -1 && reNonWord.test(_char)) {\n index++;\n }\n return index;\n }\n\n /**\n * TODO fix: selectionStart set as 0 will be ignored?\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord(selectionStart?: number) {\n selectionStart = selectionStart || this.selectionStart;\n // search backwards\n const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n // search forward\n newSelectionEnd = Math.max(\n newSelectionStart,\n this.searchWordBoundary(selectionStart, 1),\n );\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n\n /**\n * TODO fix: selectionStart set as 0 will be ignored?\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectLine(selectionStart?: number) {\n selectionStart = selectionStart || this.selectionStart;\n const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n }\n\n /**\n * Enters editing state\n */\n enterEditing(e?: TPointerEvent) {\n if (this.isEditing || !this.editable) {\n return;\n }\n if (this.canvas) {\n this.canvas.calcOffset();\n this.canvas.textEditingManager.exitTextEditing();\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea();\n this.hiddenTextarea!.focus();\n this.hiddenTextarea!.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered', e ? { e } : undefined);\n this._fireSelectionChanged();\n if (this.canvas) {\n this.canvas.fire('text:editing:entered', {\n target: this as unknown as IText,\n e,\n });\n this.canvas.requestRenderAll();\n }\n }\n\n /**\n * called by {@link Canvas#textEditingManager}\n */\n updateSelectionOnMouseMove(e: TPointerEvent) {\n if (this.getActiveControl()) {\n return;\n }\n\n const el = this.hiddenTextarea!;\n // regain focus\n getDocumentFromElement(el).activeElement !== el && el.focus();\n\n const newSelectionStart = this.getSelectionStartFromPointer(e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown ||\n currentStart === currentEnd) &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n } else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (\n this.selectionStart !== currentStart ||\n this.selectionEnd !== currentEnd\n ) {\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n }\n\n /**\n * @private\n */\n _setEditingProps() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n }\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection(start: number, end: number, text: string) {\n const smallerTextStart = text.slice(0, start),\n graphemeStart = this.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = text.slice(start, end),\n graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection(\n start: number,\n end: number,\n graphemes: string[],\n ) {\n const smallerTextStart = graphemes.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n const smallerTextEnd = graphemes.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return {\n selectionStart: graphemeStart,\n selectionEnd: graphemeStart + graphemeEnd,\n };\n }\n\n /**\n * @private\n */\n _updateTextarea() {\n this.cursorOffsetCache = {};\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n const newSelection = this.fromGraphemeToStringSelection(\n this.selectionStart,\n this.selectionEnd,\n this._text,\n );\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateFromTextArea() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = {};\n const textarea = this.hiddenTextarea;\n this.text = textarea.value;\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n const newSelection = this.fromStringToGraphemeSelection(\n textarea.selectionStart,\n textarea.selectionEnd,\n textarea.value,\n );\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n }\n\n /**\n * @private\n */\n updateTextareaPosition() {\n if (this.selectionStart === this.selectionEnd) {\n const style = this._calcTextareaPosition();\n this.hiddenTextarea!.style.left = style.left;\n this.hiddenTextarea!.style.top = style.top;\n }\n }\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition() {\n if (!this.canvas) {\n return { left: '1px', top: '1px' };\n }\n const desiredPosition = this.inCompositionMode\n ? this.compositionStart\n : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight =\n this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n this.lineHeight,\n leftOffset = boundaries.leftOffset,\n retinaScaling = this.getCanvasRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight;\n\n const p = new Point(\n boundaries.left + leftOffset,\n boundaries.top + boundaries.topOffset + charHeight,\n )\n .transform(this.calcTransformMatrix())\n .transform(this.canvas.viewportTransform)\n .multiply(\n new Point(\n upperCanvas.clientWidth / upperCanvasWidth,\n upperCanvas.clientHeight / upperCanvasHeight,\n ),\n );\n\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return {\n left: `${p.x}px`,\n top: `${p.y}px`,\n fontSize: `${charHeight}px`,\n charHeight: charHeight,\n };\n }\n\n /**\n * @private\n */\n _saveEditingProps() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor,\n };\n }\n\n /**\n * @private\n */\n _restoreEditingProps() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor =\n this._savedProps.defaultCursor || this.canvas.defaultCursor;\n this.canvas.moveCursor =\n this._savedProps.moveCursor || this.canvas.moveCursor;\n }\n\n delete this._savedProps;\n }\n\n /**\n * runs the actual logic that exits from editing state, see {@link exitEditing}\n */\n protected _exitEditing() {\n const hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode &&\n hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this.selectionStart !== this.selectionEnd && this.clearContextTop();\n }\n\n /**\n * Exits from editing state and fires relevant events\n */\n exitEditing() {\n const isTextChanged = this._textBeforeEdit !== this.text;\n this._exitEditing();\n this.selectionEnd = this.selectionStart;\n this._restoreEditingProps();\n if (this._forceClearCache) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire(MODIFIED);\n if (this.canvas) {\n this.canvas.fire('text:editing:exited', {\n target: this as unknown as IText,\n });\n // todo: evaluate add an action to this event\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n }\n\n /**\n * @private\n */\n _removeExtraneousStyles() {\n for (const prop in this.styles) {\n if (!this._textLines[prop as unknown as number]) {\n delete this.styles[prop];\n }\n }\n }\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo(start: number, end: number) {\n const { lineIndex: lineStart, charIndex: charStart } =\n this.get2DCursorLocation(start, true),\n { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n end,\n true,\n );\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (\n let i = charStart;\n i < this._unwrappedTextLines[lineStart].length;\n i++\n ) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (\n let i = charEnd;\n i < this._unwrappedTextLines[lineEnd].length;\n i++\n ) {\n const styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = {});\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (let i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n } else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n const styleObj = this.styles[lineStart];\n const diff = charEnd - charStart;\n for (let i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (const char in this.styles[lineStart]) {\n const numericChar = parseInt(char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[char];\n delete styleObj[char];\n }\n }\n }\n }\n }\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles(lineIndex: number, offset: number) {\n const clonedStyles = Object.assign({}, this.styles);\n for (const line in this.styles) {\n const numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n }\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject(\n lineIndex: number,\n charIndex: number,\n qty: number,\n copiedStyle?: { [index: number]: TextStyleDeclaration },\n ) {\n const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n const isEndOfLine = originalLineLength === charIndex;\n\n let someStyleIsCarryingOver = false;\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n const currentCharStyle = this.styles[lineIndex]\n ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n : undefined;\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (const index in this.styles[lineIndex]) {\n const numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n someStyleIsCarryingOver = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n let styleCarriedOver = false;\n if (someStyleIsCarryingOver && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver || originalLineLength > charIndex) {\n // skip the last line of since we already prepared it.\n // or contains text without style that we don't want to style\n // just because it changed lines\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = {\n 0: { ...copiedStyle[qty - 1] },\n };\n } else if (currentCharStyle) {\n this.styles[lineIndex + qty] = {\n 0: { ...currentCharStyle },\n };\n } else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n }\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject(\n lineIndex: number,\n charIndex: number,\n quantity: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n if (!this.styles) {\n this.styles = {};\n }\n const currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles\n ? { ...currentLineStyles }\n : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (const index in currentLineStylesCloned) {\n const numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] =\n currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = {\n ...copiedStyle[quantity],\n };\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n }\n }\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock(\n insertedText: string[],\n start: number,\n copiedStyle?: TextStyleDeclaration[],\n ) {\n const cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0];\n let linesLength = 0;\n // get an array of how many char per lines are being added.\n for (let i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n } else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex,\n addedLines[0],\n copiedStyle,\n );\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength &&\n this.insertNewlineStyleObject(\n cursorLoc.lineIndex,\n cursorLoc.charIndex + addedLines[0],\n linesLength,\n );\n let i;\n for (i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n } else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(\n cursorLoc.lineIndex + i,\n 0,\n addedLines[i],\n copiedStyle,\n );\n }\n }\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars(start: number, end: number = start + 1) {\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars(\n text: string,\n style: TextStyleDeclaration[] | undefined,\n start: number,\n end: number = start,\n ) {\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n const graphemes = this.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [\n ...this._text.slice(0, start),\n ...graphemes,\n ...this._text.slice(end),\n ];\n this.text = this._text.join('');\n this.set('dirty', true);\n this.initDimensions();\n this.setCoords();\n this._removeExtraneousStyles();\n }\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift(\n start: number,\n end: number,\n newSelection: number,\n ) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = LEFT;\n } else if (this._selectionDirection === RIGHT) {\n this._selectionDirection = LEFT;\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n } else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === RIGHT) {\n this.selectionEnd = newSelection;\n } else {\n this.selectionStart = newSelection;\n }\n } else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = RIGHT;\n } else if (this._selectionDirection === LEFT) {\n this._selectionDirection = RIGHT;\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n }\n}\n"],"names":["reNonWord","ITextBehavior","FabricText","constructor","arguments","_defineProperty","initBehavior","_tick","bind","_onTickComplete","updateSelectionOnMouseMove","onDeselect","options","isEditing","exitEditing","selected","_animateCursor","_ref","toValue","duration","delay","onComplete","animate","startValue","_currentCursorOpacity","endValue","abort","canvas","selectionStart","selectionEnd","onChange","value","renderCursorOrSelection","_currentTickState","cursorDuration","Math","max","_this$_currentTickCom","_currentTickCompleteState","initDelayedCursor","restart","abortCursorAnimation","cursorDelay","shouldClear","forEach","cursorAnimation","isDone","clearContextTop","restartCursorIfNeeded","some","selectAll","_text","length","_fireSelectionChanged","_updateTextarea","getSelectedText","slice","join","findWordBoundaryLeft","startFrom","offset","index","_reSpace","test","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","direction","text","reNewline","_char","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditing","e","editable","calcOffset","textEditingManager","exitTextEditing","initHiddenTextarea","hiddenTextarea","focus","_saveEditingProps","_setEditingProps","_textBeforeEdit","fire","undefined","target","requestRenderAll","getActiveControl","el","getDocumentFromElement","activeElement","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","hoverCursor","defaultCursor","moveCursor","borderColor","editingBorderColor","hasControls","selectable","lockMovementX","lockMovementY","fromStringToGraphemeSelection","start","end","smallerTextStart","graphemeStart","graphemeSplit","smallerTextEnd","graphemeEnd","fromGraphemeToStringSelection","graphemes","cursorOffsetCache","inCompositionMode","newSelection","updateTextareaPosition","updateFromTextArea","textarea","set","initDimensions","setCoords","style","_calcTextareaPosition","left","top","desiredPosition","compositionStart","boundaries","_getCursorBoundaries","cursorLocation","get2DCursorLocation","lineIndex","charIndex","charHeight","getValueOfPropertyAt","lineHeight","leftOffset","retinaScaling","getCanvasRetinaScaling","upperCanvas","upperCanvasEl","upperCanvasWidth","width","upperCanvasHeight","height","maxWidth","maxHeight","p","Point","topOffset","transform","calcTransformMatrix","viewportTransform","multiply","clientWidth","clientHeight","x","y","_offset","concat","fontSize","_savedProps","_restoreEditingProps","_exitEditing","blur","parentNode","removeChild","isTextChanged","_forceClearCache","MODIFIED","_removeExtraneousStyles","prop","styles","_textLines","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","i","_unwrappedTextLines","styleObj","shiftLineStyles","diff","char","numericChar","parseInt","clonedStyles","Object","assign","line","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","_objectSpread","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","keys","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","removeChars","splice","insertChars","setSelectionStartEndWithShift","_selectionDirection","LEFT","RIGHT"],"mappings":"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"}