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,685 @@
1
+ //@ts-nocheck
2
+
3
+ import { config } from '../../config';
4
+ import { getDocument, 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
+ import { TProps } from '../Object/types';
10
+ import { TextProps, SerializedTextProps } from '../Text/Text';
11
+
12
+ export abstract class ITextKeyBehavior<
13
+ Props extends TProps<TextProps> = Partial<TextProps>,
14
+ SProps extends SerializedTextProps = SerializedTextProps,
15
+ EventSpec extends ITextEvents = ITextEvents
16
+ > extends ITextBehavior<Props, SProps, EventSpec> {
17
+ /**
18
+ * For functionalities on keyDown
19
+ * Map a special key to a function of the instance/prototype
20
+ * If you need different behavior for ESC or TAB or arrows, you have to change
21
+ * this map setting the name of a function that you build on the IText or
22
+ * your prototype.
23
+ * the map change will affect all Instances unless you need for only some text Instances
24
+ * in that case you have to clone this object and assign your Instance.
25
+ * this.keysMap = Object.assign({}, this.keysMap);
26
+ * The function must be in IText.prototype.myFunction And will receive event as args[0]
27
+ */
28
+ declare keysMap: TKeyMapIText;
29
+
30
+ declare keysMapRtl: TKeyMapIText;
31
+
32
+ /**
33
+ * For functionalities on keyUp + ctrl || cmd
34
+ */
35
+ declare ctrlKeysMapUp: TKeyMapIText;
36
+
37
+ /**
38
+ * For functionalities on keyDown + ctrl || cmd
39
+ */
40
+ declare ctrlKeysMapDown: TKeyMapIText;
41
+
42
+ declare hiddenTextarea: HTMLTextAreaElement | null;
43
+
44
+ /**
45
+ * DOM container to append the hiddenTextarea.
46
+ * An alternative to attaching to the document.body.
47
+ * Useful to reduce laggish redraw of the full document.body tree and
48
+ * also with modals event capturing that won't let the textarea take focus.
49
+ * @type HTMLElement
50
+ * @default
51
+ */
52
+ declare hiddenTextareaContainer?: HTMLElement | null;
53
+
54
+ private declare _clickHandlerInitialized: boolean;
55
+ private declare _copyDone: boolean;
56
+ private declare fromPaste: boolean;
57
+
58
+ /**
59
+ * Initializes hidden textarea (needed to bring up keyboard in iOS)
60
+ */
61
+ initHiddenTextarea() {
62
+ this.hiddenTextarea = getDocument().createElement('textarea');
63
+ this.hiddenTextarea.setAttribute('autocapitalize', 'off');
64
+ this.hiddenTextarea.setAttribute('autocorrect', 'off');
65
+ this.hiddenTextarea.setAttribute('autocomplete', 'off');
66
+ this.hiddenTextarea.setAttribute('spellcheck', 'false');
67
+ this.hiddenTextarea.setAttribute('data-fabric', 'textarea');
68
+ this.hiddenTextarea.setAttribute('wrap', 'off');
69
+ const style = this._calcTextareaPosition();
70
+ // line-height: 1px; was removed from the style to fix this:
71
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=870966
72
+ 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};`;
73
+
74
+ if (this.hiddenTextareaContainer) {
75
+ this.hiddenTextareaContainer.appendChild(this.hiddenTextarea);
76
+ } else {
77
+ getDocument().body.appendChild(this.hiddenTextarea);
78
+ }
79
+
80
+ this.hiddenTextarea.addEventListener('blur', this.blur.bind(this));
81
+ this.hiddenTextarea.addEventListener('keydown', this.onKeyDown.bind(this));
82
+ this.hiddenTextarea.addEventListener('keyup', this.onKeyUp.bind(this));
83
+ this.hiddenTextarea.addEventListener('input', this.onInput.bind(this));
84
+ this.hiddenTextarea.addEventListener('copy', this.copy.bind(this));
85
+ this.hiddenTextarea.addEventListener('cut', this.copy.bind(this));
86
+ this.hiddenTextarea.addEventListener('paste', this.paste.bind(this));
87
+ this.hiddenTextarea.addEventListener(
88
+ 'compositionstart',
89
+ this.onCompositionStart.bind(this)
90
+ );
91
+ this.hiddenTextarea.addEventListener(
92
+ 'compositionupdate',
93
+ this.onCompositionUpdate.bind(this)
94
+ );
95
+ this.hiddenTextarea.addEventListener(
96
+ 'compositionend',
97
+ this.onCompositionEnd.bind(this)
98
+ );
99
+
100
+ if (!this._clickHandlerInitialized && this.canvas) {
101
+ this.canvas.upperCanvasEl.addEventListener(
102
+ 'click',
103
+ this.onClick.bind(this)
104
+ );
105
+ this._clickHandlerInitialized = true;
106
+ }
107
+ }
108
+
109
+ onClick() {
110
+ this.hiddenTextarea && this.hiddenTextarea.focus();
111
+ }
112
+
113
+ /**
114
+ * Override this method to customize cursor behavior on textbox blur
115
+ */
116
+ blur() {
117
+ this.abortCursorAnimation();
118
+ }
119
+
120
+ /**
121
+ * Handles keydown event
122
+ * only used for arrows and combination of modifier keys.
123
+ * @param {KeyboardEvent} e Event object
124
+ */
125
+ onKeyDown(e: KeyboardEvent) {
126
+ if (!this.isEditing) {
127
+ return;
128
+ }
129
+ const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;
130
+ if (e.keyCode in keyMap) {
131
+ this[keyMap[e.keyCode]](e);
132
+ } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {
133
+ this[this.ctrlKeysMapDown[e.keyCode]](e);
134
+ } else {
135
+ return;
136
+ }
137
+ e.stopImmediatePropagation();
138
+ e.preventDefault();
139
+ if (e.keyCode >= 33 && e.keyCode <= 40) {
140
+ // if i press an arrow key just update selection
141
+ this.inCompositionMode = false;
142
+ this.clearContextTop();
143
+ this.renderCursorOrSelection();
144
+ } else {
145
+ this.canvas && this.canvas.requestRenderAll();
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Handles keyup event
151
+ * We handle KeyUp because ie11 and edge have difficulties copy/pasting
152
+ * if a copy/cut event fired, keyup is dismissed
153
+ * @param {KeyboardEvent} e Event object
154
+ */
155
+ onKeyUp(e: KeyboardEvent) {
156
+ if (!this.isEditing || this._copyDone || this.inCompositionMode) {
157
+ this._copyDone = false;
158
+ return;
159
+ }
160
+ if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {
161
+ this[this.ctrlKeysMapUp[e.keyCode]](e);
162
+ } else {
163
+ return;
164
+ }
165
+ e.stopImmediatePropagation();
166
+ e.preventDefault();
167
+ this.canvas && this.canvas.requestRenderAll();
168
+ }
169
+
170
+ /**
171
+ * Handles onInput event
172
+ * @param {Event} e Event object
173
+ */
174
+ onInput(e: Event) {
175
+ const fromPaste = this.fromPaste;
176
+ this.fromPaste = false;
177
+ e && e.stopPropagation();
178
+ if (!this.isEditing) {
179
+ return;
180
+ }
181
+ const updateAndFire = () => {
182
+ this.updateFromTextArea();
183
+ this.fire('changed');
184
+ if (this.canvas) {
185
+ this.canvas.fire('text:changed', { target: this });
186
+ this.canvas.requestRenderAll();
187
+ }
188
+ };
189
+ if (this.hiddenTextarea.value === '') {
190
+ this.styles = {};
191
+ updateAndFire();
192
+ return;
193
+ }
194
+ // decisions about style changes.
195
+ const nextText = this._splitTextIntoLines(
196
+ this.hiddenTextarea.value
197
+ ).graphemeText,
198
+ charCount = this._text.length,
199
+ nextCharCount = nextText.length,
200
+ selectionStart = this.selectionStart,
201
+ selectionEnd = this.selectionEnd,
202
+ selection = selectionStart !== selectionEnd;
203
+ let copiedStyle,
204
+ removedText,
205
+ charDiff = nextCharCount - charCount,
206
+ removeFrom,
207
+ removeTo;
208
+
209
+ const textareaSelection = this.fromStringToGraphemeSelection(
210
+ this.hiddenTextarea.selectionStart,
211
+ this.hiddenTextarea.selectionEnd,
212
+ this.hiddenTextarea.value
213
+ );
214
+ const backDelete = selectionStart > textareaSelection.selectionStart;
215
+
216
+ if (selection) {
217
+ removedText = this._text.slice(selectionStart, selectionEnd);
218
+ charDiff += selectionEnd - selectionStart;
219
+ } else if (nextCharCount < charCount) {
220
+ if (backDelete) {
221
+ removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);
222
+ } else {
223
+ removedText = this._text.slice(
224
+ selectionStart,
225
+ selectionStart - charDiff
226
+ );
227
+ }
228
+ }
229
+ const insertedText = nextText.slice(
230
+ textareaSelection.selectionEnd - charDiff,
231
+ textareaSelection.selectionEnd
232
+ );
233
+ if (removedText && removedText.length) {
234
+ if (insertedText.length) {
235
+ // let's copy some style before deleting.
236
+ // we want to copy the style before the cursor OR the style at the cursor if selection
237
+ // is bigger than 0.
238
+ copiedStyle = this.getSelectionStyles(
239
+ selectionStart,
240
+ selectionStart + 1,
241
+ false
242
+ );
243
+ // now duplicate the style one for each inserted text.
244
+ copiedStyle = insertedText.map(
245
+ () =>
246
+ // this return an array of references, but that is fine since we are
247
+ // copying the style later.
248
+ copiedStyle[0]
249
+ );
250
+ }
251
+ if (selection) {
252
+ removeFrom = selectionStart;
253
+ removeTo = selectionEnd;
254
+ } else if (backDelete) {
255
+ // detect differences between forwardDelete and backDelete
256
+ removeFrom = selectionEnd - removedText.length;
257
+ removeTo = selectionEnd;
258
+ } else {
259
+ removeFrom = selectionEnd;
260
+ removeTo = selectionEnd + removedText.length;
261
+ }
262
+ this.removeStyleFromTo(removeFrom, removeTo);
263
+ }
264
+ if (insertedText.length) {
265
+ const { copyPasteData } = getEnv();
266
+ if (
267
+ fromPaste &&
268
+ insertedText.join('') === copyPasteData.copiedText &&
269
+ !config.disableStyleCopyPaste
270
+ ) {
271
+ copiedStyle = copyPasteData.copiedTextStyle;
272
+ }
273
+ this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);
274
+ }
275
+ updateAndFire();
276
+ }
277
+
278
+ /**
279
+ * Composition start
280
+ */
281
+ onCompositionStart() {
282
+ this.inCompositionMode = true;
283
+ }
284
+
285
+ /**
286
+ * Composition end
287
+ */
288
+ onCompositionEnd() {
289
+ this.inCompositionMode = false;
290
+ }
291
+
292
+ // */
293
+ onCompositionUpdate(e) {
294
+ this.compositionStart = e.target.selectionStart;
295
+ this.compositionEnd = e.target.selectionEnd;
296
+ this.updateTextareaPosition();
297
+ }
298
+
299
+ /**
300
+ * Copies selected text
301
+ */
302
+ copy() {
303
+ if (this.selectionStart === this.selectionEnd) {
304
+ //do not cut-copy if no selection
305
+ return;
306
+ }
307
+ const { copyPasteData } = getEnv();
308
+ copyPasteData.copiedText = this.getSelectedText();
309
+ if (!config.disableStyleCopyPaste) {
310
+ copyPasteData.copiedTextStyle = this.getSelectionStyles(
311
+ this.selectionStart,
312
+ this.selectionEnd,
313
+ true
314
+ );
315
+ } else {
316
+ copyPasteData.copiedTextStyle = null;
317
+ }
318
+ this._copyDone = true;
319
+ }
320
+
321
+ /**
322
+ * Pastes text
323
+ */
324
+ paste() {
325
+ this.fromPaste = true;
326
+ }
327
+
328
+ /**
329
+ * Finds the width in pixels before the cursor on the same line
330
+ * @private
331
+ * @param {Number} lineIndex
332
+ * @param {Number} charIndex
333
+ * @return {Number} widthBeforeCursor width before cursor
334
+ */
335
+ _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {
336
+ let widthBeforeCursor = this._getLineLeftOffset(lineIndex),
337
+ bound;
338
+
339
+ if (charIndex > 0) {
340
+ bound = this.__charBounds[lineIndex][charIndex - 1];
341
+ widthBeforeCursor += bound.left + bound.width;
342
+ }
343
+ return widthBeforeCursor;
344
+ }
345
+
346
+ /**
347
+ * Gets start offset of a selection
348
+ * @param {TPointerEvent} e Event object
349
+ * @param {Boolean} isRight
350
+ * @return {Number}
351
+ */
352
+ getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {
353
+ const selectionProp = this._getSelectionForOffset(e, isRight),
354
+ cursorLocation = this.get2DCursorLocation(selectionProp),
355
+ lineIndex = cursorLocation.lineIndex;
356
+ // if on last line, down cursor goes to end of line
357
+ if (
358
+ lineIndex === this._textLines.length - 1 ||
359
+ e.metaKey ||
360
+ e.keyCode === 34
361
+ ) {
362
+ // move to the end of a text
363
+ return this._text.length - selectionProp;
364
+ }
365
+ const charIndex = cursorLocation.charIndex,
366
+ widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),
367
+ indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),
368
+ textAfterCursor = this._textLines[lineIndex].slice(charIndex);
369
+ return (
370
+ textAfterCursor.length +
371
+ indexOnOtherLine +
372
+ 1 +
373
+ this.missingNewlineOffset(lineIndex)
374
+ );
375
+ }
376
+
377
+ /**
378
+ * private
379
+ * Helps finding if the offset should be counted from Start or End
380
+ * @param {KeyboardEvent} e Event object
381
+ * @param {Boolean} isRight
382
+ * @return {Number}
383
+ */
384
+ _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {
385
+ if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {
386
+ return this.selectionEnd;
387
+ } else {
388
+ return this.selectionStart;
389
+ }
390
+ }
391
+
392
+ /**
393
+ * @param {KeyboardEvent} e Event object
394
+ * @param {Boolean} isRight
395
+ * @return {Number}
396
+ */
397
+ getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {
398
+ const selectionProp = this._getSelectionForOffset(e, isRight),
399
+ cursorLocation = this.get2DCursorLocation(selectionProp),
400
+ lineIndex = cursorLocation.lineIndex;
401
+ if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {
402
+ // if on first line, up cursor goes to start of line
403
+ return -selectionProp;
404
+ }
405
+ const charIndex = cursorLocation.charIndex,
406
+ widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),
407
+ indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),
408
+ textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),
409
+ missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);
410
+ // return a negative offset
411
+ return (
412
+ -this._textLines[lineIndex - 1].length +
413
+ indexOnOtherLine -
414
+ textBeforeCursor.length +
415
+ (1 - missingNewlineOffset)
416
+ );
417
+ }
418
+
419
+ /**
420
+ * for a given width it founds the matching character.
421
+ * @private
422
+ */
423
+ _getIndexOnLine(lineIndex: number, width: number) {
424
+ const line = this._textLines[lineIndex],
425
+ lineLeftOffset = this._getLineLeftOffset(lineIndex);
426
+ let widthOfCharsOnLine = lineLeftOffset,
427
+ indexOnLine = 0,
428
+ charWidth,
429
+ foundMatch;
430
+
431
+ for (let j = 0, jlen = line.length; j < jlen; j++) {
432
+ charWidth = this.__charBounds[lineIndex][j].width;
433
+ widthOfCharsOnLine += charWidth;
434
+ if (widthOfCharsOnLine > width) {
435
+ foundMatch = true;
436
+ const leftEdge = widthOfCharsOnLine - charWidth,
437
+ rightEdge = widthOfCharsOnLine,
438
+ offsetFromLeftEdge = Math.abs(leftEdge - width),
439
+ offsetFromRightEdge = Math.abs(rightEdge - width);
440
+
441
+ indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;
442
+ break;
443
+ }
444
+ }
445
+
446
+ // reached end
447
+ if (!foundMatch) {
448
+ indexOnLine = line.length - 1;
449
+ }
450
+
451
+ return indexOnLine;
452
+ }
453
+
454
+ /**
455
+ * Moves cursor down
456
+ * @param {TPointerEvent} e Event object
457
+ */
458
+ moveCursorDown(e: TPointerEvent) {
459
+ if (
460
+ this.selectionStart >= this._text.length &&
461
+ this.selectionEnd >= this._text.length
462
+ ) {
463
+ return;
464
+ }
465
+ this._moveCursorUpOrDown('Down', e);
466
+ }
467
+
468
+ /**
469
+ * Moves cursor up
470
+ * @param {TPointerEvent} e Event object
471
+ */
472
+ moveCursorUp(e: TPointerEvent) {
473
+ if (this.selectionStart === 0 && this.selectionEnd === 0) {
474
+ return;
475
+ }
476
+ this._moveCursorUpOrDown('Up', e);
477
+ }
478
+
479
+ /**
480
+ * Moves cursor up or down, fires the events
481
+ * @param {String} direction 'Up' or 'Down'
482
+ * @param {TPointerEvent} e Event object
483
+ */
484
+ _moveCursorUpOrDown(direction: 'Up' | 'Down', e: TPointerEvent) {
485
+ const action = `get${direction}CursorOffset`,
486
+ offset = this[action](e, this._selectionDirection === 'right');
487
+ if (e.shiftKey) {
488
+ this.moveCursorWithShift(offset);
489
+ } else {
490
+ this.moveCursorWithoutShift(offset);
491
+ }
492
+ if (offset !== 0) {
493
+ const max = this.text.length;
494
+ this.selectionStart = capValue(0, this.selectionStart, max);
495
+ this.selectionEnd = capValue(0, this.selectionEnd, max);
496
+ this.abortCursorAnimation();
497
+ this._currentCursorOpacity = 1;
498
+ this.initDelayedCursor();
499
+ this._fireSelectionChanged();
500
+ this._updateTextarea();
501
+ }
502
+ }
503
+
504
+ /**
505
+ * Moves cursor with shift
506
+ * @param {Number} offset
507
+ */
508
+ moveCursorWithShift(offset: number) {
509
+ const newSelection =
510
+ this._selectionDirection === 'left'
511
+ ? this.selectionStart + offset
512
+ : this.selectionEnd + offset;
513
+ this.setSelectionStartEndWithShift(
514
+ this.selectionStart,
515
+ this.selectionEnd,
516
+ newSelection
517
+ );
518
+ return offset !== 0;
519
+ }
520
+
521
+ /**
522
+ * Moves cursor up without shift
523
+ * @param {Number} offset
524
+ */
525
+ moveCursorWithoutShift(offset: number) {
526
+ if (offset < 0) {
527
+ this.selectionStart += offset;
528
+ this.selectionEnd = this.selectionStart;
529
+ } else {
530
+ this.selectionEnd += offset;
531
+ this.selectionStart = this.selectionEnd;
532
+ }
533
+ return offset !== 0;
534
+ }
535
+
536
+ /**
537
+ * Moves cursor left
538
+ * @param {TPointerEvent} e Event object
539
+ */
540
+ moveCursorLeft(e: TPointerEvent) {
541
+ if (this.selectionStart === 0 && this.selectionEnd === 0) {
542
+ return;
543
+ }
544
+ this._moveCursorLeftOrRight('Left', e);
545
+ }
546
+
547
+ /**
548
+ * @private
549
+ * @return {Boolean} true if a change happened
550
+ */
551
+ _move(e, prop, direction): boolean {
552
+ let newValue;
553
+ if (e.altKey) {
554
+ newValue = this['findWordBoundary' + direction](this[prop]);
555
+ } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {
556
+ newValue = this['findLineBoundary' + direction](this[prop]);
557
+ } else {
558
+ this[prop] += direction === 'Left' ? -1 : 1;
559
+ return true;
560
+ }
561
+ if (typeof newValue !== 'undefined' && this[prop] !== newValue) {
562
+ this[prop] = newValue;
563
+ return true;
564
+ }
565
+ }
566
+
567
+ /**
568
+ * @private
569
+ */
570
+ _moveLeft(e, prop) {
571
+ return this._move(e, prop, 'Left');
572
+ }
573
+
574
+ /**
575
+ * @private
576
+ */
577
+ _moveRight(e, prop) {
578
+ return this._move(e, prop, 'Right');
579
+ }
580
+
581
+ /**
582
+ * Moves cursor left without keeping selection
583
+ * @param {TPointerEvent} e
584
+ */
585
+ moveCursorLeftWithoutShift(e: TPointerEvent) {
586
+ let change = true;
587
+ this._selectionDirection = 'left';
588
+
589
+ // only move cursor when there is no selection,
590
+ // otherwise we discard it, and leave cursor on same place
591
+ if (
592
+ this.selectionEnd === this.selectionStart &&
593
+ this.selectionStart !== 0
594
+ ) {
595
+ change = this._moveLeft(e, 'selectionStart');
596
+ }
597
+ this.selectionEnd = this.selectionStart;
598
+ return change;
599
+ }
600
+
601
+ /**
602
+ * Moves cursor left while keeping selection
603
+ * @param {TPointerEvent} e
604
+ */
605
+ moveCursorLeftWithShift(e: TPointerEvent) {
606
+ if (
607
+ this._selectionDirection === 'right' &&
608
+ this.selectionStart !== this.selectionEnd
609
+ ) {
610
+ return this._moveLeft(e, 'selectionEnd');
611
+ } else if (this.selectionStart !== 0) {
612
+ this._selectionDirection = 'left';
613
+ return this._moveLeft(e, 'selectionStart');
614
+ }
615
+ }
616
+
617
+ /**
618
+ * Moves cursor right
619
+ * @param {TPointerEvent} e Event object
620
+ */
621
+ moveCursorRight(e: TPointerEvent) {
622
+ if (
623
+ this.selectionStart >= this._text.length &&
624
+ this.selectionEnd >= this._text.length
625
+ ) {
626
+ return;
627
+ }
628
+ this._moveCursorLeftOrRight('Right', e);
629
+ }
630
+
631
+ /**
632
+ * Moves cursor right or Left, fires event
633
+ * @param {String} direction 'Left', 'Right'
634
+ * @param {TPointerEvent} e Event object
635
+ */
636
+ _moveCursorLeftOrRight(direction: string, e: TPointerEvent) {
637
+ let actionName = 'moveCursor' + direction + 'With';
638
+ this._currentCursorOpacity = 1;
639
+
640
+ if (e.shiftKey) {
641
+ actionName += 'Shift';
642
+ } else {
643
+ actionName += 'outShift';
644
+ }
645
+ if (this[actionName](e)) {
646
+ this.abortCursorAnimation();
647
+ this.initDelayedCursor();
648
+ this._fireSelectionChanged();
649
+ this._updateTextarea();
650
+ }
651
+ }
652
+
653
+ /**
654
+ * Moves cursor right while keeping selection
655
+ * @param {TPointerEvent} e
656
+ */
657
+ moveCursorRightWithShift(e: TPointerEvent) {
658
+ if (
659
+ this._selectionDirection === 'left' &&
660
+ this.selectionStart !== this.selectionEnd
661
+ ) {
662
+ return this._moveRight(e, 'selectionStart');
663
+ } else if (this.selectionEnd !== this._text.length) {
664
+ this._selectionDirection = 'right';
665
+ return this._moveRight(e, 'selectionEnd');
666
+ }
667
+ }
668
+
669
+ /**
670
+ * Moves cursor right without keeping selection
671
+ * @param {TPointerEvent} e Event object
672
+ */
673
+ moveCursorRightWithoutShift(e: TPointerEvent) {
674
+ let changed = true;
675
+ this._selectionDirection = 'right';
676
+
677
+ if (this.selectionStart === this.selectionEnd) {
678
+ changed = this._moveRight(e, 'selectionStart');
679
+ this.selectionEnd = this.selectionStart;
680
+ } else {
681
+ this.selectionStart = this.selectionEnd;
682
+ }
683
+ return changed;
684
+ }
685
+ }