fabric 5.3.0 → 6.0.0-beta1

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 (533) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintrc.js +43 -0
  5. package/.eslintrc.json +38 -46
  6. package/.eslintrc_tests +12 -0
  7. package/.gitattributes +2 -0
  8. package/.prettierignore +16 -0
  9. package/.prettierrc +4 -0
  10. package/CHANGELOG.md +491 -189
  11. package/CONTRIBUTING.md +226 -58
  12. package/README.md +188 -239
  13. package/bower.json +1 -3
  14. package/dist/fabric.d.ts +1021 -0
  15. package/dist/index.cjs +28027 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.min.js +1 -0
  19. package/dist/index.mjs +27964 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/index.node.cjs +28092 -0
  22. package/dist/index.node.cjs.map +1 -0
  23. package/dist/index.node.d.ts +15 -0
  24. package/dist/index.node.mjs +28035 -0
  25. package/dist/index.node.mjs.map +1 -0
  26. package/dist/src/Collection.d.ts +126 -0
  27. package/dist/src/CommonMethods.d.ts +32 -0
  28. package/dist/src/EventTypeDefs.d.ts +226 -0
  29. package/dist/src/Intersection.d.ts +100 -0
  30. package/dist/src/Observable.d.ts +54 -0
  31. package/dist/src/Pattern.d.ts +104 -0
  32. package/dist/src/Point.d.ts +232 -0
  33. package/dist/src/Shadow.d.ts +87 -0
  34. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  35. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  36. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  37. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  38. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  39. package/dist/src/cache.d.ts +46 -0
  40. package/dist/src/canvas/Canvas.d.ts +567 -0
  41. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  42. package/dist/src/canvas/StaticCanvas.d.ts +751 -0
  43. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  44. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  45. package/dist/src/color/Color.d.ts +174 -0
  46. package/dist/src/color/color_map.d.ts +155 -0
  47. package/dist/src/color/constants.d.ts +22 -0
  48. package/dist/src/color/util.d.ts +12 -0
  49. package/dist/src/config.d.ts +115 -0
  50. package/dist/src/constants.d.ts +14 -0
  51. package/dist/src/controls/Control.d.ts +228 -0
  52. package/dist/src/controls/changeWidth.d.ts +13 -0
  53. package/dist/src/controls/controls.render.d.ts +29 -0
  54. package/dist/src/controls/default_controls.d.ts +50 -0
  55. package/dist/src/controls/drag.d.ts +12 -0
  56. package/dist/src/controls/polyControl.d.ts +5 -0
  57. package/dist/src/controls/rotate.d.ts +12 -0
  58. package/dist/src/controls/scale.d.ts +47 -0
  59. package/dist/src/controls/scaleSkew.d.ts +39 -0
  60. package/dist/src/controls/skew.d.ts +33 -0
  61. package/dist/src/controls/util.d.ts +41 -0
  62. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  63. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  64. package/dist/src/env/browser.d.ts +3 -0
  65. package/dist/src/env/index.d.ts +7 -0
  66. package/dist/src/env/node.d.ts +3 -0
  67. package/dist/src/env/types.d.ts +15 -0
  68. package/dist/src/filters/BaseFilter.d.ts +156 -0
  69. package/dist/src/filters/BlendColor.d.ts +80 -0
  70. package/dist/src/filters/BlendImage.d.ts +90 -0
  71. package/dist/src/filters/Blur.d.ts +50 -0
  72. package/dist/src/filters/Boilerplate.d.ts +46 -0
  73. package/dist/src/filters/Brightness.d.ts +46 -0
  74. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  75. package/dist/src/filters/ColorMatrix.d.ts +62 -0
  76. package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
  77. package/dist/src/filters/Composed.d.ts +47 -0
  78. package/dist/src/filters/Contrast.d.ts +44 -0
  79. package/dist/src/filters/Convolute.d.ts +82 -0
  80. package/dist/src/filters/FilterBackend.d.ts +14 -0
  81. package/dist/src/filters/Gamma.d.ts +53 -0
  82. package/dist/src/filters/Grayscale.d.ts +45 -0
  83. package/dist/src/filters/HueRotation.d.ts +24 -0
  84. package/dist/src/filters/Invert.d.ts +54 -0
  85. package/dist/src/filters/Noise.d.ts +53 -0
  86. package/dist/src/filters/Pixelate.d.ts +43 -0
  87. package/dist/src/filters/RemoveColor.d.ts +62 -0
  88. package/dist/src/filters/Resize.d.ts +134 -0
  89. package/dist/src/filters/Saturation.d.ts +47 -0
  90. package/dist/src/filters/Vibrance.d.ts +47 -0
  91. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  92. package/dist/src/filters/WebGLProbe.d.ts +28 -0
  93. package/dist/src/filters/typedefs.d.ts +49 -0
  94. package/dist/src/gradient/Gradient.d.ts +149 -0
  95. package/dist/src/gradient/constants.d.ts +15 -0
  96. package/dist/src/gradient/parser/index.d.ts +4 -0
  97. package/dist/src/gradient/parser/misc.d.ts +4 -0
  98. package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
  99. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  100. package/dist/src/gradient/typedefs.d.ts +93 -0
  101. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  102. package/dist/src/mixins/stateful.mixin.d.ts +18 -0
  103. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  104. package/dist/src/parkinglot/straighten.d.ts +2 -0
  105. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  106. package/dist/src/parser/attributes.d.ts +6 -0
  107. package/dist/src/parser/constants.d.ts +54 -0
  108. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  109. package/dist/src/parser/elementById.d.ts +6 -0
  110. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  111. package/dist/src/parser/elements_parser.d.ts +3 -0
  112. package/dist/src/parser/getCSSRules.d.ts +7 -0
  113. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  114. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  115. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  116. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  117. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  118. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  119. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  120. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  121. package/dist/src/parser/normalizeValue.d.ts +2 -0
  122. package/dist/src/parser/parseAttributes.d.ts +9 -0
  123. package/dist/src/parser/parseElements.d.ts +11 -0
  124. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  125. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  126. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  127. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  128. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  129. package/dist/src/parser/parseStyleString.d.ts +2 -0
  130. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  131. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  132. package/dist/src/parser/percent.d.ts +9 -0
  133. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  134. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  135. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  136. package/dist/src/parser/selectorMatches.d.ts +2 -0
  137. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  138. package/dist/src/parser/skewMatrix.d.ts +2 -0
  139. package/dist/src/parser/translateMatrix.d.ts +2 -0
  140. package/dist/src/shapes/ActiveSelection.d.ts +66 -0
  141. package/dist/src/shapes/Circle.d.ts +80 -0
  142. package/dist/src/shapes/Ellipse.d.ts +74 -0
  143. package/dist/src/shapes/Group.d.ts +381 -0
  144. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  145. package/dist/src/shapes/IText/IText.d.ts +322 -0
  146. package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
  147. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
  148. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
  149. package/dist/src/shapes/IText/constants.d.ts +13 -0
  150. package/dist/src/shapes/Image.d.ts +283 -0
  151. package/dist/src/shapes/Line.d.ts +117 -0
  152. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  153. package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
  154. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  155. package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
  156. package/dist/src/shapes/Object/Object.d.ts +906 -0
  157. package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
  158. package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
  159. package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
  160. package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
  161. package/dist/src/shapes/Path.d.ts +123 -0
  162. package/dist/src/shapes/Polygon.d.ts +7 -0
  163. package/dist/src/shapes/Polyline.d.ts +130 -0
  164. package/dist/src/shapes/Rect.d.ts +62 -0
  165. package/dist/src/shapes/Text/StyledText.d.ts +118 -0
  166. package/dist/src/shapes/Text/Text.d.ts +656 -0
  167. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  168. package/dist/src/shapes/Textbox.d.ts +170 -0
  169. package/dist/src/shapes/Triangle.d.ts +17 -0
  170. package/dist/src/typedefs.d.ts +93 -0
  171. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  172. package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
  173. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  174. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  175. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  176. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  177. package/dist/src/util/animation/animate.d.ts +37 -0
  178. package/dist/src/util/animation/easing.d.ts +130 -0
  179. package/dist/src/util/animation/types.d.ts +87 -0
  180. package/dist/src/util/applyMixins.d.ts +8 -0
  181. package/dist/src/util/class_registry.d.ts +14 -0
  182. package/dist/src/util/dom_event.d.ts +5 -0
  183. package/dist/src/util/dom_misc.d.ts +40 -0
  184. package/dist/src/util/dom_request.d.ts +14 -0
  185. package/dist/src/util/dom_style.d.ts +7 -0
  186. package/dist/src/util/fireEvent.d.ts +3 -0
  187. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  188. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  189. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  190. package/dist/src/util/internals/index.d.ts +4 -0
  191. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  192. package/dist/src/util/internals/uid.d.ts +2 -0
  193. package/dist/src/util/lang_class.d.ts +12 -0
  194. package/dist/src/util/lang_string.d.ts +22 -0
  195. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  196. package/dist/src/util/misc/capValue.d.ts +2 -0
  197. package/dist/src/util/misc/cos.d.ts +10 -0
  198. package/dist/src/util/misc/dom.d.ts +28 -0
  199. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  200. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  201. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  202. package/dist/src/util/misc/matrix.d.ts +92 -0
  203. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  204. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  205. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  206. package/dist/src/util/misc/pick.d.ts +8 -0
  207. package/dist/src/util/misc/planeChange.d.ts +84 -0
  208. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  209. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  210. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  211. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  212. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  213. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  214. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  215. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  216. package/dist/src/util/misc/sin.d.ts +10 -0
  217. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  218. package/dist/src/util/misc/textStyles.d.ts +32 -0
  219. package/dist/src/util/misc/toFixed.d.ts +8 -0
  220. package/dist/src/util/misc/vectors.d.ts +57 -0
  221. package/dist/src/util/path.d.ts +108 -0
  222. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  223. package/dist/src/util/types.d.ts +19 -0
  224. package/fabric.ts +427 -0
  225. package/index.node.ts +43 -0
  226. package/index.ts +1 -0
  227. package/package.json +90 -39
  228. package/publish.js +0 -26
  229. package/rollup.config.mjs +79 -0
  230. package/rollup.test.config.js +24 -0
  231. package/scripts/build.mjs +50 -0
  232. package/scripts/buildLock.mjs +115 -0
  233. package/scripts/buildReporter.mjs +15 -0
  234. package/scripts/buildStats.mjs +139 -0
  235. package/scripts/dirname.mjs +14 -0
  236. package/scripts/index.mjs +679 -0
  237. package/scripts/transform_files.mjs +504 -0
  238. package/src/Collection.ts +311 -0
  239. package/src/CommonMethods.ts +63 -0
  240. package/src/EventTypeDefs.ts +294 -0
  241. package/src/Intersection.ts +273 -0
  242. package/src/Observable.ts +175 -0
  243. package/src/Pattern.ts +211 -0
  244. package/src/Point.ts +388 -0
  245. package/src/Shadow.ts +215 -0
  246. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  247. package/src/brushes/CircleBrush.ts +145 -0
  248. package/src/brushes/PatternBrush.ts +70 -0
  249. package/src/brushes/PencilBrush.ts +300 -0
  250. package/src/brushes/SprayBrush.ts +219 -0
  251. package/src/cache.ts +89 -0
  252. package/src/canvas/Canvas.ts +1672 -0
  253. package/src/canvas/SelectableCanvas.ts +1636 -0
  254. package/src/canvas/StaticCanvas.ts +1709 -0
  255. package/src/canvas/TextEditingManager.ts +48 -0
  256. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  257. package/src/color/Color.ts +404 -0
  258. package/src/color/color_map.ts +154 -0
  259. package/src/color/constants.ts +26 -0
  260. package/src/color/util.ts +32 -0
  261. package/src/config.ts +159 -0
  262. package/src/constants.ts +19 -0
  263. package/src/controls/Control.ts +377 -0
  264. package/src/controls/changeWidth.ts +52 -0
  265. package/src/controls/controls.render.ts +138 -0
  266. package/src/controls/default_controls.ts +132 -0
  267. package/src/controls/drag.ts +31 -0
  268. package/src/controls/polyControl.ts +135 -0
  269. package/src/controls/rotate.ts +87 -0
  270. package/src/controls/scale.ts +277 -0
  271. package/src/controls/scaleSkew.ts +92 -0
  272. package/src/controls/skew.ts +242 -0
  273. package/src/controls/util.ts +154 -0
  274. package/src/controls/wrapWithFireEvent.ts +25 -0
  275. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  276. package/src/env/browser.ts +28 -0
  277. package/src/env/index.ts +19 -0
  278. package/src/env/node.ts +52 -0
  279. package/src/env/types.ts +15 -0
  280. package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
  281. package/src/filters/BlendColor.ts +258 -0
  282. package/src/filters/BlendImage.ts +254 -0
  283. package/src/filters/Blur.ts +202 -0
  284. package/src/filters/Boilerplate.ts +91 -0
  285. package/src/filters/Brightness.ts +93 -0
  286. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  287. package/src/filters/ColorMatrix.ts +156 -0
  288. package/src/filters/ColorMatrixFilters.ts +106 -0
  289. package/src/filters/Composed.ts +85 -0
  290. package/src/filters/Contrast.ts +94 -0
  291. package/src/filters/Convolute.ts +341 -0
  292. package/src/filters/FilterBackend.ts +32 -0
  293. package/src/filters/Gamma.ts +127 -0
  294. package/src/filters/Grayscale.ts +137 -0
  295. package/src/filters/HueRotation.ts +66 -0
  296. package/src/filters/Invert.ts +117 -0
  297. package/src/filters/Noise.ts +109 -0
  298. package/src/filters/Pixelate.ts +114 -0
  299. package/src/filters/RemoveColor.ts +148 -0
  300. package/src/filters/Resize.ts +540 -0
  301. package/src/filters/Saturation.ts +100 -0
  302. package/src/filters/Vibrance.ts +103 -0
  303. package/src/filters/WebGLFilterBackend.ts +430 -0
  304. package/src/filters/WebGLProbe.ts +62 -0
  305. package/src/filters/typedefs.ts +65 -0
  306. package/src/gradient/Gradient.ts +401 -0
  307. package/src/gradient/constants.ts +12 -0
  308. package/src/gradient/parser/index.ts +3 -0
  309. package/src/gradient/parser/misc.ts +13 -0
  310. package/src/gradient/parser/parseColorStops.ts +55 -0
  311. package/src/gradient/parser/parseCoords.ts +73 -0
  312. package/src/gradient/typedefs.ts +104 -0
  313. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  314. package/src/mixins/stateful.mixin.ts +104 -0
  315. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  316. package/src/parkinglot/straighten.ts +58 -0
  317. package/src/parser/applyViewboxTransform.ts +162 -0
  318. package/src/parser/attributes.ts +25 -0
  319. package/src/parser/constants.ts +118 -0
  320. package/src/parser/doesSomeParentMatch.ts +19 -0
  321. package/src/parser/elementById.ts +23 -0
  322. package/src/parser/elementMatchesRule.ts +19 -0
  323. package/src/parser/elements_parser.ts +191 -0
  324. package/src/parser/getCSSRules.ts +62 -0
  325. package/src/parser/getGlobalStylesForElement.ts +19 -0
  326. package/src/parser/getGradientDefs.ts +32 -0
  327. package/src/parser/getMultipleNodes.ts +15 -0
  328. package/src/parser/getSvgRegex.ts +5 -0
  329. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  330. package/src/parser/loadSVGFromString.ts +26 -0
  331. package/src/parser/loadSVGFromURL.ts +40 -0
  332. package/src/parser/normalizeAttr.ts +10 -0
  333. package/src/parser/normalizeValue.ts +63 -0
  334. package/src/parser/parseAttributes.ts +90 -0
  335. package/src/parser/parseElements.ts +28 -0
  336. package/src/parser/parseFontDeclaration.ts +44 -0
  337. package/src/parser/parsePointsAttribute.ts +36 -0
  338. package/src/parser/parseSVGDocument.ts +106 -0
  339. package/src/parser/parseStyleAttribute.ts +27 -0
  340. package/src/parser/parseStyleObject.ts +15 -0
  341. package/src/parser/parseStyleString.ts +16 -0
  342. package/src/parser/parseTransformAttribute.ts +155 -0
  343. package/src/parser/parseUseDirectives.ts +79 -0
  344. package/src/parser/percent.ts +27 -0
  345. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  346. package/src/parser/rotateMatrix.ts +21 -0
  347. package/src/parser/scaleMatrix.ts +9 -0
  348. package/src/parser/selectorMatches.ts +25 -0
  349. package/src/parser/setStrokeFillOpacity.ts +40 -0
  350. package/src/parser/skewMatrix.ts +6 -0
  351. package/src/parser/translateMatrix.ts +8 -0
  352. package/src/shapes/ActiveSelection.ts +157 -0
  353. package/src/shapes/Circle.ts +205 -0
  354. package/src/shapes/Ellipse.ts +154 -0
  355. package/src/shapes/Group.ts +1053 -0
  356. package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
  357. package/src/shapes/IText/IText.ts +666 -0
  358. package/src/shapes/IText/ITextBehavior.ts +1055 -0
  359. package/src/shapes/IText/ITextClickBehavior.ts +321 -0
  360. package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
  361. package/src/shapes/IText/constants.ts +47 -0
  362. package/src/shapes/Image.ts +789 -0
  363. package/src/shapes/Line.ts +329 -0
  364. package/src/shapes/Object/AnimatableObject.ts +106 -0
  365. package/src/shapes/Object/FabricObject.ts +19 -0
  366. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  367. package/src/shapes/Object/InteractiveObject.ts +645 -0
  368. package/src/shapes/Object/Object.ts +1896 -0
  369. package/src/shapes/Object/ObjectGeometry.ts +830 -0
  370. package/src/shapes/Object/ObjectOrigin.ts +354 -0
  371. package/src/shapes/Object/StackedObject.ts +191 -0
  372. package/src/shapes/Object/defaultValues.ts +112 -0
  373. package/src/shapes/Path.ts +395 -0
  374. package/src/shapes/Polygon.ts +19 -0
  375. package/src/shapes/Polyline.ts +333 -0
  376. package/src/shapes/Rect.ts +199 -0
  377. package/src/shapes/Text/StyledText.ts +319 -0
  378. package/src/shapes/Text/Text.ts +1948 -0
  379. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  380. package/src/shapes/Textbox.ts +471 -0
  381. package/src/shapes/Triangle.ts +45 -0
  382. package/src/typedefs.ts +119 -0
  383. package/src/util/animation/AnimationBase.ts +166 -0
  384. package/src/util/animation/AnimationFrameProvider.ts +28 -0
  385. package/src/util/animation/AnimationRegistry.ts +58 -0
  386. package/src/util/animation/ArrayAnimation.ts +27 -0
  387. package/src/util/animation/ColorAnimation.ts +74 -0
  388. package/src/util/animation/ValueAnimation.ts +29 -0
  389. package/src/util/animation/animate.ts +74 -0
  390. package/src/util/animation/easing.ts +327 -0
  391. package/src/util/animation/types.ts +136 -0
  392. package/src/util/applyMixins.ts +22 -0
  393. package/src/util/class_registry.ts +54 -0
  394. package/src/util/dom_event.ts +28 -0
  395. package/src/util/dom_misc.ts +138 -0
  396. package/src/util/dom_request.ts +64 -0
  397. package/src/util/dom_style.ts +20 -0
  398. package/src/util/fireEvent.ts +15 -0
  399. package/src/util/internals/cloneDeep.ts +2 -0
  400. package/src/util/internals/getRandomInt.ts +8 -0
  401. package/src/util/internals/ifNaN.ts +9 -0
  402. package/src/util/internals/index.ts +3 -0
  403. package/src/util/internals/removeFromArray.ts +14 -0
  404. package/src/util/internals/uid.ts +3 -0
  405. package/src/util/lang_class.ts +90 -0
  406. package/src/util/lang_string.ts +79 -0
  407. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  408. package/src/util/misc/capValue.ts +2 -0
  409. package/src/util/misc/cos.ts +24 -0
  410. package/src/util/misc/dom.ts +50 -0
  411. package/src/util/misc/findScaleTo.ts +44 -0
  412. package/src/util/misc/groupSVGElements.ts +15 -0
  413. package/src/util/misc/isTransparent.ts +51 -0
  414. package/src/util/misc/matrix.ts +207 -0
  415. package/src/util/misc/mergeClipPaths.ts +40 -0
  416. package/src/util/misc/objectEnlive.ts +189 -0
  417. package/src/util/misc/objectTransforms.ts +129 -0
  418. package/src/util/misc/pick.ts +17 -0
  419. package/src/util/misc/planeChange.ts +136 -0
  420. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  421. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
  422. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  423. package/src/util/misc/projectStroke/index.ts +53 -0
  424. package/src/util/misc/projectStroke/types.ts +24 -0
  425. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  426. package/src/util/misc/resolveOrigin.ts +22 -0
  427. package/src/util/misc/rotatePoint.ts +15 -0
  428. package/src/util/misc/sin.ts +26 -0
  429. package/src/util/misc/svgParsing.ts +181 -0
  430. package/src/util/misc/textStyles.ts +133 -0
  431. package/src/util/misc/toFixed.ts +8 -0
  432. package/src/util/misc/vectors.ts +82 -0
  433. package/src/util/path.ts +941 -0
  434. package/src/util/transform_matrix_removal.ts +60 -0
  435. package/src/util/types.ts +78 -0
  436. package/tsconfig.json +106 -0
  437. package/HEADER.js +0 -203
  438. package/build.js +0 -287
  439. package/dist/fabric.js +0 -31187
  440. package/dist/fabric.min.js +0 -1
  441. package/old-travis-reference.yml +0 -97
  442. package/src/brushes/circle_brush.class.js +0 -144
  443. package/src/brushes/pattern_brush.class.js +0 -61
  444. package/src/brushes/pencil_brush.class.js +0 -310
  445. package/src/brushes/spray_brush.class.js +0 -219
  446. package/src/canvas.class.js +0 -1312
  447. package/src/color.class.js +0 -636
  448. package/src/control.class.js +0 -339
  449. package/src/controls.actions.js +0 -740
  450. package/src/controls.render.js +0 -99
  451. package/src/elements_parser.js +0 -152
  452. package/src/filters/2d_backend.class.js +0 -65
  453. package/src/filters/blendcolor_filter.class.js +0 -251
  454. package/src/filters/blendimage_filter.class.js +0 -247
  455. package/src/filters/blur_filter.class.js +0 -217
  456. package/src/filters/brightness_filter.class.js +0 -113
  457. package/src/filters/colormatrix_filter.class.js +0 -159
  458. package/src/filters/composed_filter.class.js +0 -72
  459. package/src/filters/contrast_filter.class.js +0 -113
  460. package/src/filters/convolute_filter.class.js +0 -352
  461. package/src/filters/filter_boilerplate.js +0 -111
  462. package/src/filters/filter_generator.js +0 -85
  463. package/src/filters/gamma_filter.class.js +0 -136
  464. package/src/filters/grayscale_filter.class.js +0 -154
  465. package/src/filters/hue_rotation.class.js +0 -107
  466. package/src/filters/invert_filter.class.js +0 -111
  467. package/src/filters/noise_filter.class.js +0 -134
  468. package/src/filters/pixelate_filter.class.js +0 -137
  469. package/src/filters/removecolor_filter.class.js +0 -173
  470. package/src/filters/resize_filter.class.js +0 -490
  471. package/src/filters/saturate_filter.class.js +0 -119
  472. package/src/filters/vibrance_filter.class.js +0 -122
  473. package/src/filters/webgl_backend.class.js +0 -396
  474. package/src/globalFabric.js +0 -4
  475. package/src/gradient.class.js +0 -490
  476. package/src/intersection.class.js +0 -172
  477. package/src/log.js +0 -11
  478. package/src/mixins/animation.mixin.js +0 -231
  479. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  480. package/src/mixins/canvas_events.mixin.js +0 -974
  481. package/src/mixins/canvas_gestures.mixin.js +0 -149
  482. package/src/mixins/canvas_grouping.mixin.js +0 -177
  483. package/src/mixins/canvas_serialization.mixin.js +0 -228
  484. package/src/mixins/collection.mixin.js +0 -170
  485. package/src/mixins/default_controls.js +0 -114
  486. package/src/mixins/itext.svg_export.js +0 -241
  487. package/src/mixins/itext_behavior.mixin.js +0 -940
  488. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  489. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  490. package/src/mixins/object.svg_export.js +0 -258
  491. package/src/mixins/object_geometry.mixin.js +0 -683
  492. package/src/mixins/object_interactivity.mixin.js +0 -314
  493. package/src/mixins/object_origin.mixin.js +0 -255
  494. package/src/mixins/object_stacking.mixin.js +0 -80
  495. package/src/mixins/object_straightening.mixin.js +0 -80
  496. package/src/mixins/observable.mixin.js +0 -141
  497. package/src/mixins/shared_methods.mixin.js +0 -94
  498. package/src/mixins/stateful.mixin.js +0 -107
  499. package/src/mixins/text_style.mixin.js +0 -324
  500. package/src/parser.js +0 -1090
  501. package/src/pattern.class.js +0 -189
  502. package/src/point.class.js +0 -337
  503. package/src/shadow.class.js +0 -195
  504. package/src/shapes/active_selection.class.js +0 -155
  505. package/src/shapes/circle.class.js +0 -210
  506. package/src/shapes/ellipse.class.js +0 -181
  507. package/src/shapes/group.class.js +0 -593
  508. package/src/shapes/image.class.js +0 -764
  509. package/src/shapes/itext.class.js +0 -526
  510. package/src/shapes/line.class.js +0 -324
  511. package/src/shapes/object.class.js +0 -2008
  512. package/src/shapes/path.class.js +0 -384
  513. package/src/shapes/polygon.class.js +0 -81
  514. package/src/shapes/polyline.class.js +0 -268
  515. package/src/shapes/rect.class.js +0 -187
  516. package/src/shapes/text.class.js +0 -1696
  517. package/src/shapes/textbox.class.js +0 -461
  518. package/src/shapes/triangle.class.js +0 -93
  519. package/src/static_canvas.class.js +0 -1881
  520. package/src/util/anim_ease.js +0 -398
  521. package/src/util/animate.js +0 -254
  522. package/src/util/animate_color.js +0 -74
  523. package/src/util/dom_event.js +0 -50
  524. package/src/util/dom_misc.js +0 -300
  525. package/src/util/dom_request.js +0 -54
  526. package/src/util/dom_style.js +0 -70
  527. package/src/util/lang_array.js +0 -94
  528. package/src/util/lang_class.js +0 -115
  529. package/src/util/lang_object.js +0 -75
  530. package/src/util/lang_string.js +0 -110
  531. package/src/util/misc.js +0 -1330
  532. package/src/util/named_accessors.mixin.js +0 -428
  533. package/src/util/path.js +0 -829
@@ -0,0 +1,683 @@
1
+ //@ts-nocheck
2
+
3
+ import { config } from '../../config';
4
+ import { getEnv } from '../../env';
5
+ import { TPointerEvent } from '../../EventTypeDefs';
6
+ import { capValue } from '../../util/misc/capValue';
7
+ import { ITextBehavior, ITextEvents } from './ITextBehavior';
8
+ import type { TKeyMapIText } from './constants';
9
+
10
+ export abstract class ITextKeyBehavior<
11
+ EventSpec extends ITextEvents = ITextEvents
12
+ > extends ITextBehavior<EventSpec> {
13
+ /**
14
+ * For functionalities on keyDown
15
+ * Map a special key to a function of the instance/prototype
16
+ * If you need different behavior for ESC or TAB or arrows, you have to change
17
+ * this map setting the name of a function that you build on the IText or
18
+ * your prototype.
19
+ * the map change will affect all Instances unless you need for only some text Instances
20
+ * in that case you have to clone this object and assign your Instance.
21
+ * this.keysMap = Object.assign({}, this.keysMap);
22
+ * The function must be in IText.prototype.myFunction And will receive event as args[0]
23
+ */
24
+ declare keysMap: TKeyMapIText;
25
+
26
+ declare keysMapRtl: TKeyMapIText;
27
+
28
+ /**
29
+ * For functionalities on keyUp + ctrl || cmd
30
+ */
31
+ declare ctrlKeysMapUp: TKeyMapIText;
32
+
33
+ /**
34
+ * For functionalities on keyDown + ctrl || cmd
35
+ */
36
+ declare ctrlKeysMapDown: TKeyMapIText;
37
+
38
+ declare hiddenTextarea: HTMLTextAreaElement | null;
39
+
40
+ /**
41
+ * DOM container to append the hiddenTextarea.
42
+ * An alternative to attaching to the document.body.
43
+ * Useful to reduce laggish redraw of the full document.body tree and
44
+ * also with modals event capturing that won't let the textarea take focus.
45
+ * @type HTMLElement
46
+ * @default
47
+ */
48
+ declare hiddenTextareaContainer?: HTMLElement | null;
49
+
50
+ private declare _clickHandlerInitialized: boolean;
51
+ private declare _copyDone: boolean;
52
+ private declare fromPaste: boolean;
53
+
54
+ /**
55
+ * Initializes hidden textarea (needed to bring up keyboard in iOS)
56
+ */
57
+ initHiddenTextarea() {
58
+ this.hiddenTextarea = getEnv().document.createElement('textarea');
59
+ this.hiddenTextarea.setAttribute('autocapitalize', 'off');
60
+ this.hiddenTextarea.setAttribute('autocorrect', 'off');
61
+ this.hiddenTextarea.setAttribute('autocomplete', 'off');
62
+ this.hiddenTextarea.setAttribute('spellcheck', 'false');
63
+ this.hiddenTextarea.setAttribute('data-fabric', 'textarea');
64
+ this.hiddenTextarea.setAttribute('wrap', 'off');
65
+ const style = this._calcTextareaPosition();
66
+ // line-height: 1px; was removed from the style to fix this:
67
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=870966
68
+ this.hiddenTextarea.style.cssText = `position: absolute; top: ${style.top}; left: ${style.left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${style.fontSize};`;
69
+
70
+ if (this.hiddenTextareaContainer) {
71
+ this.hiddenTextareaContainer.appendChild(this.hiddenTextarea);
72
+ } else {
73
+ getEnv().document.body.appendChild(this.hiddenTextarea);
74
+ }
75
+
76
+ this.hiddenTextarea.addEventListener('blur', this.blur.bind(this));
77
+ this.hiddenTextarea.addEventListener('keydown', this.onKeyDown.bind(this));
78
+ this.hiddenTextarea.addEventListener('keyup', this.onKeyUp.bind(this));
79
+ this.hiddenTextarea.addEventListener('input', this.onInput.bind(this));
80
+ this.hiddenTextarea.addEventListener('copy', this.copy.bind(this));
81
+ this.hiddenTextarea.addEventListener('cut', this.copy.bind(this));
82
+ this.hiddenTextarea.addEventListener('paste', this.paste.bind(this));
83
+ this.hiddenTextarea.addEventListener(
84
+ 'compositionstart',
85
+ this.onCompositionStart.bind(this)
86
+ );
87
+ this.hiddenTextarea.addEventListener(
88
+ 'compositionupdate',
89
+ this.onCompositionUpdate.bind(this)
90
+ );
91
+ this.hiddenTextarea.addEventListener(
92
+ 'compositionend',
93
+ this.onCompositionEnd.bind(this)
94
+ );
95
+
96
+ if (!this._clickHandlerInitialized && this.canvas) {
97
+ this.canvas.upperCanvasEl.addEventListener(
98
+ 'click',
99
+ this.onClick.bind(this)
100
+ );
101
+ this._clickHandlerInitialized = true;
102
+ }
103
+ }
104
+
105
+ onClick() {
106
+ this.hiddenTextarea && this.hiddenTextarea.focus();
107
+ }
108
+
109
+ /**
110
+ * Override this method to customize cursor behavior on textbox blur
111
+ */
112
+ blur() {
113
+ this.abortCursorAnimation();
114
+ }
115
+
116
+ /**
117
+ * Handles keydown event
118
+ * only used for arrows and combination of modifier keys.
119
+ * @param {KeyboardEvent} e Event object
120
+ */
121
+ onKeyDown(e: KeyboardEvent) {
122
+ if (!this.isEditing) {
123
+ return;
124
+ }
125
+ const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;
126
+ if (e.keyCode in keyMap) {
127
+ this[keyMap[e.keyCode]](e);
128
+ } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {
129
+ this[this.ctrlKeysMapDown[e.keyCode]](e);
130
+ } else {
131
+ return;
132
+ }
133
+ e.stopImmediatePropagation();
134
+ e.preventDefault();
135
+ if (e.keyCode >= 33 && e.keyCode <= 40) {
136
+ // if i press an arrow key just update selection
137
+ this.inCompositionMode = false;
138
+ this.clearContextTop();
139
+ this.renderCursorOrSelection();
140
+ } else {
141
+ this.canvas && this.canvas.requestRenderAll();
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Handles keyup event
147
+ * We handle KeyUp because ie11 and edge have difficulties copy/pasting
148
+ * if a copy/cut event fired, keyup is dismissed
149
+ * @param {KeyboardEvent} e Event object
150
+ */
151
+ onKeyUp(e: KeyboardEvent) {
152
+ if (!this.isEditing || this._copyDone || this.inCompositionMode) {
153
+ this._copyDone = false;
154
+ return;
155
+ }
156
+ if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {
157
+ this[this.ctrlKeysMapUp[e.keyCode]](e);
158
+ } else {
159
+ return;
160
+ }
161
+ e.stopImmediatePropagation();
162
+ e.preventDefault();
163
+ this.canvas && this.canvas.requestRenderAll();
164
+ }
165
+
166
+ /**
167
+ * Handles onInput event
168
+ * @param {Event} e Event object
169
+ */
170
+ onInput(e: Event) {
171
+ const fromPaste = this.fromPaste;
172
+ this.fromPaste = false;
173
+ e && e.stopPropagation();
174
+ if (!this.isEditing) {
175
+ return;
176
+ }
177
+ // decisions about style changes.
178
+ const nextText = this._splitTextIntoLines(
179
+ this.hiddenTextarea.value
180
+ ).graphemeText,
181
+ charCount = this._text.length,
182
+ nextCharCount = nextText.length,
183
+ selectionStart = this.selectionStart,
184
+ selectionEnd = this.selectionEnd,
185
+ selection = selectionStart !== selectionEnd;
186
+ let copiedStyle,
187
+ removedText,
188
+ charDiff = nextCharCount - charCount,
189
+ removeFrom,
190
+ removeTo;
191
+ if (this.hiddenTextarea.value === '') {
192
+ this.styles = {};
193
+ this.updateFromTextArea();
194
+ this.fire('changed');
195
+ if (this.canvas) {
196
+ this.canvas.fire('text:changed', { target: this });
197
+ this.canvas.requestRenderAll();
198
+ }
199
+ return;
200
+ }
201
+
202
+ const textareaSelection = this.fromStringToGraphemeSelection(
203
+ this.hiddenTextarea.selectionStart,
204
+ this.hiddenTextarea.selectionEnd,
205
+ this.hiddenTextarea.value
206
+ );
207
+ const backDelete = selectionStart > textareaSelection.selectionStart;
208
+
209
+ if (selection) {
210
+ removedText = this._text.slice(selectionStart, selectionEnd);
211
+ charDiff += selectionEnd - selectionStart;
212
+ } else if (nextCharCount < charCount) {
213
+ if (backDelete) {
214
+ removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);
215
+ } else {
216
+ removedText = this._text.slice(
217
+ selectionStart,
218
+ selectionStart - charDiff
219
+ );
220
+ }
221
+ }
222
+ const insertedText = nextText.slice(
223
+ textareaSelection.selectionEnd - charDiff,
224
+ textareaSelection.selectionEnd
225
+ );
226
+ if (removedText && removedText.length) {
227
+ if (insertedText.length) {
228
+ // let's copy some style before deleting.
229
+ // we want to copy the style before the cursor OR the style at the cursor if selection
230
+ // is bigger than 0.
231
+ copiedStyle = this.getSelectionStyles(
232
+ selectionStart,
233
+ selectionStart + 1,
234
+ false
235
+ );
236
+ // now duplicate the style one for each inserted text.
237
+ copiedStyle = insertedText.map(
238
+ () =>
239
+ // this return an array of references, but that is fine since we are
240
+ // copying the style later.
241
+ copiedStyle[0]
242
+ );
243
+ }
244
+ if (selection) {
245
+ removeFrom = selectionStart;
246
+ removeTo = selectionEnd;
247
+ } else if (backDelete) {
248
+ // detect differences between forwardDelete and backDelete
249
+ removeFrom = selectionEnd - removedText.length;
250
+ removeTo = selectionEnd;
251
+ } else {
252
+ removeFrom = selectionEnd;
253
+ removeTo = selectionEnd + removedText.length;
254
+ }
255
+ this.removeStyleFromTo(removeFrom, removeTo);
256
+ }
257
+ if (insertedText.length) {
258
+ const { copyPasteData } = getEnv();
259
+ if (
260
+ fromPaste &&
261
+ insertedText.join('') === copyPasteData.copiedText &&
262
+ !config.disableStyleCopyPaste
263
+ ) {
264
+ copiedStyle = copyPasteData.copiedTextStyle;
265
+ }
266
+ this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);
267
+ }
268
+ this.updateFromTextArea();
269
+ this.fire('changed');
270
+ if (this.canvas) {
271
+ this.canvas.fire('text:changed', { target: this });
272
+ this.canvas.requestRenderAll();
273
+ }
274
+ }
275
+
276
+ /**
277
+ * Composition start
278
+ */
279
+ onCompositionStart() {
280
+ this.inCompositionMode = true;
281
+ }
282
+
283
+ /**
284
+ * Composition end
285
+ */
286
+ onCompositionEnd() {
287
+ this.inCompositionMode = false;
288
+ }
289
+
290
+ // */
291
+ onCompositionUpdate(e) {
292
+ this.compositionStart = e.target.selectionStart;
293
+ this.compositionEnd = e.target.selectionEnd;
294
+ this.updateTextareaPosition();
295
+ }
296
+
297
+ /**
298
+ * Copies selected text
299
+ */
300
+ copy() {
301
+ if (this.selectionStart === this.selectionEnd) {
302
+ //do not cut-copy if no selection
303
+ return;
304
+ }
305
+ const { copyPasteData } = getEnv();
306
+ copyPasteData.copiedText = this.getSelectedText();
307
+ if (!config.disableStyleCopyPaste) {
308
+ copyPasteData.copiedTextStyle = this.getSelectionStyles(
309
+ this.selectionStart,
310
+ this.selectionEnd,
311
+ true
312
+ );
313
+ } else {
314
+ copyPasteData.copiedTextStyle = null;
315
+ }
316
+ this._copyDone = true;
317
+ }
318
+
319
+ /**
320
+ * Pastes text
321
+ */
322
+ paste() {
323
+ this.fromPaste = true;
324
+ }
325
+
326
+ /**
327
+ * Finds the width in pixels before the cursor on the same line
328
+ * @private
329
+ * @param {Number} lineIndex
330
+ * @param {Number} charIndex
331
+ * @return {Number} widthBeforeCursor width before cursor
332
+ */
333
+ _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {
334
+ let widthBeforeCursor = this._getLineLeftOffset(lineIndex),
335
+ bound;
336
+
337
+ if (charIndex > 0) {
338
+ bound = this.__charBounds[lineIndex][charIndex - 1];
339
+ widthBeforeCursor += bound.left + bound.width;
340
+ }
341
+ return widthBeforeCursor;
342
+ }
343
+
344
+ /**
345
+ * Gets start offset of a selection
346
+ * @param {TPointerEvent} e Event object
347
+ * @param {Boolean} isRight
348
+ * @return {Number}
349
+ */
350
+ getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {
351
+ const selectionProp = this._getSelectionForOffset(e, isRight),
352
+ cursorLocation = this.get2DCursorLocation(selectionProp),
353
+ lineIndex = cursorLocation.lineIndex;
354
+ // if on last line, down cursor goes to end of line
355
+ if (
356
+ lineIndex === this._textLines.length - 1 ||
357
+ e.metaKey ||
358
+ e.keyCode === 34
359
+ ) {
360
+ // move to the end of a text
361
+ return this._text.length - selectionProp;
362
+ }
363
+ const charIndex = cursorLocation.charIndex,
364
+ widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),
365
+ indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),
366
+ textAfterCursor = this._textLines[lineIndex].slice(charIndex);
367
+ return (
368
+ textAfterCursor.length +
369
+ indexOnOtherLine +
370
+ 1 +
371
+ this.missingNewlineOffset(lineIndex)
372
+ );
373
+ }
374
+
375
+ /**
376
+ * private
377
+ * Helps finding if the offset should be counted from Start or End
378
+ * @param {KeyboardEvent} e Event object
379
+ * @param {Boolean} isRight
380
+ * @return {Number}
381
+ */
382
+ _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {
383
+ if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {
384
+ return this.selectionEnd;
385
+ } else {
386
+ return this.selectionStart;
387
+ }
388
+ }
389
+
390
+ /**
391
+ * @param {KeyboardEvent} e Event object
392
+ * @param {Boolean} isRight
393
+ * @return {Number}
394
+ */
395
+ getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {
396
+ const selectionProp = this._getSelectionForOffset(e, isRight),
397
+ cursorLocation = this.get2DCursorLocation(selectionProp),
398
+ lineIndex = cursorLocation.lineIndex;
399
+ if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {
400
+ // if on first line, up cursor goes to start of line
401
+ return -selectionProp;
402
+ }
403
+ const charIndex = cursorLocation.charIndex,
404
+ widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),
405
+ indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),
406
+ textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),
407
+ missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);
408
+ // return a negative offset
409
+ return (
410
+ -this._textLines[lineIndex - 1].length +
411
+ indexOnOtherLine -
412
+ textBeforeCursor.length +
413
+ (1 - missingNewlineOffset)
414
+ );
415
+ }
416
+
417
+ /**
418
+ * for a given width it founds the matching character.
419
+ * @private
420
+ */
421
+ _getIndexOnLine(lineIndex: number, width: number) {
422
+ const line = this._textLines[lineIndex],
423
+ lineLeftOffset = this._getLineLeftOffset(lineIndex);
424
+ let widthOfCharsOnLine = lineLeftOffset,
425
+ indexOnLine = 0,
426
+ charWidth,
427
+ foundMatch;
428
+
429
+ for (let j = 0, jlen = line.length; j < jlen; j++) {
430
+ charWidth = this.__charBounds[lineIndex][j].width;
431
+ widthOfCharsOnLine += charWidth;
432
+ if (widthOfCharsOnLine > width) {
433
+ foundMatch = true;
434
+ const leftEdge = widthOfCharsOnLine - charWidth,
435
+ rightEdge = widthOfCharsOnLine,
436
+ offsetFromLeftEdge = Math.abs(leftEdge - width),
437
+ offsetFromRightEdge = Math.abs(rightEdge - width);
438
+
439
+ indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;
440
+ break;
441
+ }
442
+ }
443
+
444
+ // reached end
445
+ if (!foundMatch) {
446
+ indexOnLine = line.length - 1;
447
+ }
448
+
449
+ return indexOnLine;
450
+ }
451
+
452
+ /**
453
+ * Moves cursor down
454
+ * @param {TPointerEvent} e Event object
455
+ */
456
+ moveCursorDown(e: TPointerEvent) {
457
+ if (
458
+ this.selectionStart >= this._text.length &&
459
+ this.selectionEnd >= this._text.length
460
+ ) {
461
+ return;
462
+ }
463
+ this._moveCursorUpOrDown('Down', e);
464
+ }
465
+
466
+ /**
467
+ * Moves cursor up
468
+ * @param {TPointerEvent} e Event object
469
+ */
470
+ moveCursorUp(e: TPointerEvent) {
471
+ if (this.selectionStart === 0 && this.selectionEnd === 0) {
472
+ return;
473
+ }
474
+ this._moveCursorUpOrDown('Up', e);
475
+ }
476
+
477
+ /**
478
+ * Moves cursor up or down, fires the events
479
+ * @param {String} direction 'Up' or 'Down'
480
+ * @param {TPointerEvent} e Event object
481
+ */
482
+ _moveCursorUpOrDown(direction: 'Up' | 'Down', e: TPointerEvent) {
483
+ const action = `get${direction}CursorOffset`,
484
+ offset = this[action](e, this._selectionDirection === 'right');
485
+ if (e.shiftKey) {
486
+ this.moveCursorWithShift(offset);
487
+ } else {
488
+ this.moveCursorWithoutShift(offset);
489
+ }
490
+ if (offset !== 0) {
491
+ const max = this.text.length;
492
+ this.selectionStart = capValue(0, this.selectionStart, max);
493
+ this.selectionEnd = capValue(0, this.selectionEnd, max);
494
+ this.abortCursorAnimation();
495
+ this._currentCursorOpacity = 1;
496
+ this.initDelayedCursor();
497
+ this._fireSelectionChanged();
498
+ this._updateTextarea();
499
+ }
500
+ }
501
+
502
+ /**
503
+ * Moves cursor with shift
504
+ * @param {Number} offset
505
+ */
506
+ moveCursorWithShift(offset: number) {
507
+ const newSelection =
508
+ this._selectionDirection === 'left'
509
+ ? this.selectionStart + offset
510
+ : this.selectionEnd + offset;
511
+ this.setSelectionStartEndWithShift(
512
+ this.selectionStart,
513
+ this.selectionEnd,
514
+ newSelection
515
+ );
516
+ return offset !== 0;
517
+ }
518
+
519
+ /**
520
+ * Moves cursor up without shift
521
+ * @param {Number} offset
522
+ */
523
+ moveCursorWithoutShift(offset: number) {
524
+ if (offset < 0) {
525
+ this.selectionStart += offset;
526
+ this.selectionEnd = this.selectionStart;
527
+ } else {
528
+ this.selectionEnd += offset;
529
+ this.selectionStart = this.selectionEnd;
530
+ }
531
+ return offset !== 0;
532
+ }
533
+
534
+ /**
535
+ * Moves cursor left
536
+ * @param {TPointerEvent} e Event object
537
+ */
538
+ moveCursorLeft(e: TPointerEvent) {
539
+ if (this.selectionStart === 0 && this.selectionEnd === 0) {
540
+ return;
541
+ }
542
+ this._moveCursorLeftOrRight('Left', e);
543
+ }
544
+
545
+ /**
546
+ * @private
547
+ * @return {Boolean} true if a change happened
548
+ */
549
+ _move(e, prop, direction): boolean {
550
+ let newValue;
551
+ if (e.altKey) {
552
+ newValue = this['findWordBoundary' + direction](this[prop]);
553
+ } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {
554
+ newValue = this['findLineBoundary' + direction](this[prop]);
555
+ } else {
556
+ this[prop] += direction === 'Left' ? -1 : 1;
557
+ return true;
558
+ }
559
+ if (typeof newValue !== 'undefined' && this[prop] !== newValue) {
560
+ this[prop] = newValue;
561
+ return true;
562
+ }
563
+ }
564
+
565
+ /**
566
+ * @private
567
+ */
568
+ _moveLeft(e, prop) {
569
+ return this._move(e, prop, 'Left');
570
+ }
571
+
572
+ /**
573
+ * @private
574
+ */
575
+ _moveRight(e, prop) {
576
+ return this._move(e, prop, 'Right');
577
+ }
578
+
579
+ /**
580
+ * Moves cursor left without keeping selection
581
+ * @param {TPointerEvent} e
582
+ */
583
+ moveCursorLeftWithoutShift(e: TPointerEvent) {
584
+ let change = true;
585
+ this._selectionDirection = 'left';
586
+
587
+ // only move cursor when there is no selection,
588
+ // otherwise we discard it, and leave cursor on same place
589
+ if (
590
+ this.selectionEnd === this.selectionStart &&
591
+ this.selectionStart !== 0
592
+ ) {
593
+ change = this._moveLeft(e, 'selectionStart');
594
+ }
595
+ this.selectionEnd = this.selectionStart;
596
+ return change;
597
+ }
598
+
599
+ /**
600
+ * Moves cursor left while keeping selection
601
+ * @param {TPointerEvent} e
602
+ */
603
+ moveCursorLeftWithShift(e: TPointerEvent) {
604
+ if (
605
+ this._selectionDirection === 'right' &&
606
+ this.selectionStart !== this.selectionEnd
607
+ ) {
608
+ return this._moveLeft(e, 'selectionEnd');
609
+ } else if (this.selectionStart !== 0) {
610
+ this._selectionDirection = 'left';
611
+ return this._moveLeft(e, 'selectionStart');
612
+ }
613
+ }
614
+
615
+ /**
616
+ * Moves cursor right
617
+ * @param {TPointerEvent} e Event object
618
+ */
619
+ moveCursorRight(e: TPointerEvent) {
620
+ if (
621
+ this.selectionStart >= this._text.length &&
622
+ this.selectionEnd >= this._text.length
623
+ ) {
624
+ return;
625
+ }
626
+ this._moveCursorLeftOrRight('Right', e);
627
+ }
628
+
629
+ /**
630
+ * Moves cursor right or Left, fires event
631
+ * @param {String} direction 'Left', 'Right'
632
+ * @param {TPointerEvent} e Event object
633
+ */
634
+ _moveCursorLeftOrRight(direction: string, e: TPointerEvent) {
635
+ let actionName = 'moveCursor' + direction + 'With';
636
+ this._currentCursorOpacity = 1;
637
+
638
+ if (e.shiftKey) {
639
+ actionName += 'Shift';
640
+ } else {
641
+ actionName += 'outShift';
642
+ }
643
+ if (this[actionName](e)) {
644
+ this.abortCursorAnimation();
645
+ this.initDelayedCursor();
646
+ this._fireSelectionChanged();
647
+ this._updateTextarea();
648
+ }
649
+ }
650
+
651
+ /**
652
+ * Moves cursor right while keeping selection
653
+ * @param {TPointerEvent} e
654
+ */
655
+ moveCursorRightWithShift(e: TPointerEvent) {
656
+ if (
657
+ this._selectionDirection === 'left' &&
658
+ this.selectionStart !== this.selectionEnd
659
+ ) {
660
+ return this._moveRight(e, 'selectionStart');
661
+ } else if (this.selectionEnd !== this._text.length) {
662
+ this._selectionDirection = 'right';
663
+ return this._moveRight(e, 'selectionEnd');
664
+ }
665
+ }
666
+
667
+ /**
668
+ * Moves cursor right without keeping selection
669
+ * @param {TPointerEvent} e Event object
670
+ */
671
+ moveCursorRightWithoutShift(e: TPointerEvent) {
672
+ let changed = true;
673
+ this._selectionDirection = 'right';
674
+
675
+ if (this.selectionStart === this.selectionEnd) {
676
+ changed = this._moveRight(e, 'selectionStart');
677
+ this.selectionEnd = this.selectionStart;
678
+ } else {
679
+ this.selectionStart = this.selectionEnd;
680
+ }
681
+ return changed;
682
+ }
683
+ }