fabric 5.3.0 → 6.0.0-beta3

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