fabric 5.3.0-browser → 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 +142 -88
  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,666 @@
1
+ import { Canvas } from '../../canvas/Canvas';
2
+ import { ITextEvents } from './ITextBehavior';
3
+ import { ITextClickBehavior } from './ITextClickBehavior';
4
+ import {
5
+ ctrlKeysMapDown,
6
+ ctrlKeysMapUp,
7
+ keysMap,
8
+ keysMapRtl,
9
+ } from './constants';
10
+ import { AssertKeys, TFiller } from '../../typedefs';
11
+ import { classRegistry } from '../../util/class_registry';
12
+
13
+ type CursorBoundaries = {
14
+ left: number;
15
+ top: number;
16
+ leftOffset: number;
17
+ topOffset: number;
18
+ };
19
+
20
+ /**
21
+ * @fires changed
22
+ * @fires selection:changed
23
+ * @fires editing:entered
24
+ * @fires editing:exited
25
+ * @fires dragstart
26
+ * @fires drag drag event firing on the drag source
27
+ * @fires dragend
28
+ * @fires copy
29
+ * @fires cut
30
+ * @fires paste
31
+ *
32
+ * #### Supported key combinations
33
+ * ```
34
+ * Move cursor: left, right, up, down
35
+ * Select character: shift + left, shift + right
36
+ * Select text vertically: shift + up, shift + down
37
+ * Move cursor by word: alt + left, alt + right
38
+ * Select words: shift + alt + left, shift + alt + right
39
+ * Move cursor to line start/end: cmd + left, cmd + right or home, end
40
+ * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end
41
+ * Jump to start/end of text: cmd + up, cmd + down
42
+ * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown
43
+ * Delete character: backspace
44
+ * Delete word: alt + backspace
45
+ * Delete line: cmd + backspace
46
+ * Forward delete: delete
47
+ * Copy text: ctrl/cmd + c
48
+ * Paste text: ctrl/cmd + v
49
+ * Cut text: ctrl/cmd + x
50
+ * Select entire text: ctrl/cmd + a
51
+ * Quit editing tab or esc
52
+ * ```
53
+ *
54
+ * #### Supported mouse/touch combination
55
+ * ```
56
+ * Position cursor: click/touch
57
+ * Create selection: click/touch & drag
58
+ * Create selection: click & shift + click
59
+ * Select word: double click
60
+ * Select line: triple click
61
+ * ```
62
+ */
63
+ export class IText<
64
+ EventSpec extends ITextEvents = ITextEvents
65
+ > extends ITextClickBehavior<EventSpec> {
66
+ /**
67
+ * Index where text selection starts (or where cursor is when there is no selection)
68
+ * @type Number
69
+ * @default
70
+ */
71
+ declare selectionStart: number;
72
+
73
+ /**
74
+ * Index where text selection ends
75
+ * @type Number
76
+ * @default
77
+ */
78
+ declare selectionEnd: number;
79
+
80
+ declare compositionStart: number;
81
+
82
+ declare compositionEnd: number;
83
+
84
+ /**
85
+ * Color of text selection
86
+ * @type String
87
+ * @default
88
+ */
89
+ declare selectionColor: string;
90
+
91
+ /**
92
+ * Indicates whether text is in editing mode
93
+ * @type Boolean
94
+ * @default
95
+ */
96
+ declare isEditing: boolean;
97
+
98
+ /**
99
+ * Indicates whether a text can be edited
100
+ * @type Boolean
101
+ * @default
102
+ */
103
+ declare editable: boolean;
104
+
105
+ /**
106
+ * Border color of text object while it's in editing mode
107
+ * @type String
108
+ * @default
109
+ */
110
+ declare editingBorderColor: string;
111
+
112
+ /**
113
+ * Width of cursor (in px)
114
+ * @type Number
115
+ * @default
116
+ */
117
+ declare cursorWidth: number;
118
+
119
+ /**
120
+ * Color of text cursor color in editing mode.
121
+ * if not set (default) will take color from the text.
122
+ * if set to a color value that fabric can understand, it will
123
+ * be used instead of the color of the text at the current position.
124
+ * @type String
125
+ * @default
126
+ */
127
+ declare cursorColor: string;
128
+
129
+ /**
130
+ * Delay between cursor blink (in ms)
131
+ * @type Number
132
+ * @default
133
+ */
134
+ declare cursorDelay: number;
135
+
136
+ /**
137
+ * Duration of cursor fade in (in ms)
138
+ * @type Number
139
+ * @default
140
+ */
141
+ declare cursorDuration: number;
142
+
143
+ declare compositionColor: string;
144
+
145
+ /**
146
+ * Indicates whether internal text char widths can be cached
147
+ * @type Boolean
148
+ * @default
149
+ */
150
+ declare caching: boolean;
151
+
152
+ /**
153
+
154
+ * Constructor
155
+ * @param {String} text Text string
156
+ * @param {Object} [options] Options object
157
+ */
158
+ constructor(text: string, options: object) {
159
+ super(text, options);
160
+ this.initBehavior();
161
+ }
162
+
163
+ /**
164
+ * While editing handle differently
165
+ * @private
166
+ * @param {string} key
167
+ * @param {*} value
168
+ */
169
+ _set(key: string, value: any) {
170
+ if (this.isEditing && this._savedProps && key in this._savedProps) {
171
+ // @ts-expect-error irritating TS
172
+ this._savedProps[key] = value;
173
+ return this;
174
+ }
175
+ if (key === 'canvas') {
176
+ this.canvas instanceof Canvas &&
177
+ this.canvas.textEditingManager.remove(this);
178
+ value instanceof Canvas && value.textEditingManager.add(this);
179
+ }
180
+ return super._set(key, value);
181
+ }
182
+
183
+ /**
184
+ * Sets selection start (left boundary of a selection)
185
+ * @param {Number} index Index to set selection start to
186
+ */
187
+ setSelectionStart(index: number) {
188
+ index = Math.max(index, 0);
189
+ this._updateAndFire('selectionStart', index);
190
+ }
191
+
192
+ /**
193
+ * Sets selection end (right boundary of a selection)
194
+ * @param {Number} index Index to set selection end to
195
+ */
196
+ setSelectionEnd(index: number) {
197
+ index = Math.min(index, this.text.length);
198
+ this._updateAndFire('selectionEnd', index);
199
+ }
200
+
201
+ /**
202
+ * @private
203
+ * @param {String} property 'selectionStart' or 'selectionEnd'
204
+ * @param {Number} index new position of property
205
+ */
206
+ protected _updateAndFire(
207
+ property: 'selectionStart' | 'selectionEnd',
208
+ index: number
209
+ ) {
210
+ if (this[property] !== index) {
211
+ this._fireSelectionChanged();
212
+ this[property] = index;
213
+ }
214
+ this._updateTextarea();
215
+ }
216
+
217
+ /**
218
+ * Fires the even of selection changed
219
+ * @private
220
+ */
221
+ _fireSelectionChanged() {
222
+ this.fire('selection:changed');
223
+ this.canvas && this.canvas.fire('text:selection:changed', { target: this });
224
+ }
225
+
226
+ /**
227
+ * Initialize text dimensions. Render all text on given context
228
+ * or on a offscreen canvas to get the text width with measureText.
229
+ * Updates this.width and this.height with the proper values.
230
+ * Does not return dimensions.
231
+ * @private
232
+ */
233
+ initDimensions() {
234
+ this.isEditing && this.initDelayedCursor();
235
+ super.initDimensions();
236
+ }
237
+
238
+ /**
239
+ * Gets style of a current selection/cursor (at the start position)
240
+ * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.
241
+ * @param {Number} startIndex Start index to get styles at
242
+ * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1
243
+ * @param {Boolean} [complete] get full style or not
244
+ * @return {Array} styles an array with one, zero or more Style objects
245
+ */
246
+ getSelectionStyles(
247
+ startIndex: number = this.selectionStart || 0,
248
+ endIndex: number = this.selectionEnd,
249
+ complete?: boolean
250
+ ) {
251
+ return super.getSelectionStyles(startIndex, endIndex, complete);
252
+ }
253
+
254
+ /**
255
+ * Sets style of a current selection, if no selection exist, do not set anything.
256
+ * @param {Object} [styles] Styles object
257
+ * @param {Number} [startIndex] Start index to get styles at
258
+ * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1
259
+ */
260
+ setSelectionStyles(
261
+ styles: object,
262
+ startIndex: number = this.selectionStart || 0,
263
+ endIndex: number = this.selectionEnd
264
+ ) {
265
+ return super.setSelectionStyles(styles, startIndex, endIndex);
266
+ }
267
+
268
+ /**
269
+ * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)
270
+ * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.
271
+ * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.
272
+ */
273
+ get2DCursorLocation(
274
+ selectionStart = this.selectionStart,
275
+ skipWrapping?: boolean
276
+ ) {
277
+ return super.get2DCursorLocation(selectionStart, skipWrapping);
278
+ }
279
+
280
+ /**
281
+ * @private
282
+ * @param {CanvasRenderingContext2D} ctx Context to render on
283
+ */
284
+ render(ctx: CanvasRenderingContext2D) {
285
+ super.render(ctx);
286
+ // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor
287
+ // the correct position but not at every cursor animation.
288
+ this.cursorOffsetCache = {};
289
+ this.renderCursorOrSelection();
290
+ }
291
+
292
+ /**
293
+ * @override block cursor/selection logic while rendering the exported canvas
294
+ * @todo this workaround should be replaced with a more robust solution
295
+ */
296
+ toCanvasElement(options?: any): HTMLCanvasElement {
297
+ const isEditing = this.isEditing;
298
+ this.isEditing = false;
299
+ const canvas = super.toCanvasElement(options);
300
+ this.isEditing = isEditing;
301
+ return canvas;
302
+ }
303
+
304
+ /**
305
+ * Renders cursor or selection (depending on what exists)
306
+ * it does on the contextTop. If contextTop is not available, do nothing.
307
+ */
308
+ renderCursorOrSelection() {
309
+ if (!this.isEditing) {
310
+ return;
311
+ }
312
+ const ctx = this.clearContextTop(true);
313
+ if (!ctx) {
314
+ return;
315
+ }
316
+ const boundaries = this._getCursorBoundaries();
317
+ if (this.selectionStart === this.selectionEnd) {
318
+ this.renderCursor(ctx, boundaries);
319
+ } else {
320
+ this.renderSelection(ctx, boundaries);
321
+ }
322
+ this.canvas!.contextTopDirty = true;
323
+ ctx.restore();
324
+ }
325
+
326
+ /**
327
+ * Returns cursor boundaries (left, top, leftOffset, topOffset)
328
+ * left/top are left/top of entire text box
329
+ * leftOffset/topOffset are offset from that left/top point of a text box
330
+ * @private
331
+ * @param {number} [index] index from start
332
+ * @param {boolean} [skipCaching]
333
+ */
334
+ _getCursorBoundaries(
335
+ index: number = this.selectionStart,
336
+ skipCaching?: boolean
337
+ ): CursorBoundaries {
338
+ const left = this._getLeftOffset(),
339
+ top = this._getTopOffset(),
340
+ offsets = this._getCursorBoundariesOffsets(index, skipCaching);
341
+ return {
342
+ left: left,
343
+ top: top,
344
+ leftOffset: offsets.left,
345
+ topOffset: offsets.top,
346
+ };
347
+ }
348
+
349
+ /**
350
+ * Caches and returns cursor left/top offset relative to instance's center point
351
+ * @private
352
+ * @param {number} index index from start
353
+ * @param {boolean} [skipCaching]
354
+ */
355
+ _getCursorBoundariesOffsets(
356
+ index: number,
357
+ skipCaching?: boolean
358
+ ): { left: number; top: number } {
359
+ if (skipCaching) {
360
+ return this.__getCursorBoundariesOffsets(index);
361
+ }
362
+ if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {
363
+ return this.cursorOffsetCache as { left: number; top: number };
364
+ }
365
+ return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));
366
+ }
367
+
368
+ /**
369
+ * Calculates cursor left/top offset relative to instance's center point
370
+ * @private
371
+ * @param {number} index index from start
372
+ */
373
+ __getCursorBoundariesOffsets(index: number) {
374
+ let topOffset = 0,
375
+ leftOffset = 0;
376
+ const { charIndex, lineIndex } = this.get2DCursorLocation(index);
377
+
378
+ for (let i = 0; i < lineIndex; i++) {
379
+ topOffset += this.getHeightOfLine(i);
380
+ }
381
+ const lineLeftOffset = this._getLineLeftOffset(lineIndex);
382
+ const bound = this.__charBounds[lineIndex][charIndex];
383
+ bound && (leftOffset = bound.left);
384
+ if (
385
+ this.charSpacing !== 0 &&
386
+ charIndex === this._textLines[lineIndex].length
387
+ ) {
388
+ leftOffset -= this._getWidthOfCharSpacing();
389
+ }
390
+ const boundaries = {
391
+ top: topOffset,
392
+ left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),
393
+ };
394
+ if (this.direction === 'rtl') {
395
+ if (
396
+ this.textAlign === 'right' ||
397
+ this.textAlign === 'justify' ||
398
+ this.textAlign === 'justify-right'
399
+ ) {
400
+ boundaries.left *= -1;
401
+ } else if (
402
+ this.textAlign === 'left' ||
403
+ this.textAlign === 'justify-left'
404
+ ) {
405
+ boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);
406
+ } else if (
407
+ this.textAlign === 'center' ||
408
+ this.textAlign === 'justify-center'
409
+ ) {
410
+ boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);
411
+ }
412
+ }
413
+ return boundaries;
414
+ }
415
+
416
+ /**
417
+ * Renders cursor on context Top, outside the animation cycle, on request
418
+ * Used for the drag/drop effect.
419
+ * If contextTop is not available, do nothing.
420
+ */
421
+ renderCursorAt(selectionStart: number) {
422
+ const boundaries = this._getCursorBoundaries(selectionStart, true);
423
+ this._renderCursor(this.canvas!.contextTop, boundaries, selectionStart);
424
+ }
425
+
426
+ /**
427
+ * Renders cursor
428
+ * @param {Object} boundaries
429
+ * @param {CanvasRenderingContext2D} ctx transformed context to draw on
430
+ */
431
+ renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {
432
+ this._renderCursor(ctx, boundaries, this.selectionStart);
433
+ }
434
+
435
+ _renderCursor(
436
+ ctx: CanvasRenderingContext2D,
437
+ boundaries: CursorBoundaries,
438
+ selectionStart: number
439
+ ) {
440
+ const cursorLocation = this.get2DCursorLocation(selectionStart),
441
+ lineIndex = cursorLocation.lineIndex,
442
+ charIndex =
443
+ cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,
444
+ charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),
445
+ multiplier = this.scaleX * this.canvas!.getZoom(),
446
+ cursorWidth = this.cursorWidth / multiplier,
447
+ dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),
448
+ topOffset =
449
+ boundaries.topOffset +
450
+ ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /
451
+ this.lineHeight -
452
+ charHeight * (1 - this._fontSizeFraction);
453
+
454
+ if (this.inCompositionMode) {
455
+ // TODO: investigate why there isn't a return inside the if,
456
+ // and why can't happen at the top of the function
457
+ this.renderSelection(ctx, boundaries);
458
+ }
459
+ ctx.fillStyle =
460
+ this.cursorColor ||
461
+ this.getValueOfPropertyAt(lineIndex, charIndex, 'fill');
462
+ ctx.globalAlpha = this._currentCursorOpacity;
463
+ ctx.fillRect(
464
+ boundaries.left + boundaries.leftOffset - cursorWidth / 2,
465
+ topOffset + boundaries.top + dy,
466
+ cursorWidth,
467
+ charHeight
468
+ );
469
+ }
470
+
471
+ /**
472
+ * Renders text selection
473
+ * @param {Object} boundaries Object with left/top/leftOffset/topOffset
474
+ * @param {CanvasRenderingContext2D} ctx transformed context to draw on
475
+ */
476
+ renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {
477
+ const selection = {
478
+ selectionStart: this.inCompositionMode
479
+ ? this.hiddenTextarea!.selectionStart
480
+ : this.selectionStart,
481
+ selectionEnd: this.inCompositionMode
482
+ ? this.hiddenTextarea!.selectionEnd
483
+ : this.selectionEnd,
484
+ };
485
+ this._renderSelection(ctx, selection, boundaries);
486
+ }
487
+
488
+ /**
489
+ * Renders drag start text selection
490
+ */
491
+ renderDragSourceEffect(this: AssertKeys<this, 'canvas'>) {
492
+ const dragStartSelection =
493
+ this.draggableTextDelegate.getDragStartSelection()!;
494
+ this._renderSelection(
495
+ this.canvas.contextTop,
496
+ dragStartSelection,
497
+ this._getCursorBoundaries(dragStartSelection.selectionStart, true)
498
+ );
499
+ }
500
+
501
+ renderDropTargetEffect(e: DragEvent) {
502
+ const dragSelection = this.getSelectionStartFromPointer(e);
503
+ this.renderCursorAt(dragSelection);
504
+ }
505
+
506
+ /**
507
+ * Renders text selection
508
+ * @private
509
+ * @param {{ selectionStart: number, selectionEnd: number }} selection
510
+ * @param {Object} boundaries Object with left/top/leftOffset/topOffset
511
+ * @param {CanvasRenderingContext2D} ctx transformed context to draw on
512
+ */
513
+ _renderSelection(
514
+ ctx: CanvasRenderingContext2D,
515
+ selection: { selectionStart: number; selectionEnd: number },
516
+ boundaries: CursorBoundaries
517
+ ) {
518
+ const selectionStart = selection.selectionStart,
519
+ selectionEnd = selection.selectionEnd,
520
+ isJustify = this.textAlign.indexOf('justify') !== -1,
521
+ start = this.get2DCursorLocation(selectionStart),
522
+ end = this.get2DCursorLocation(selectionEnd),
523
+ startLine = start.lineIndex,
524
+ endLine = end.lineIndex,
525
+ startChar = start.charIndex < 0 ? 0 : start.charIndex,
526
+ endChar = end.charIndex < 0 ? 0 : end.charIndex;
527
+
528
+ for (let i = startLine; i <= endLine; i++) {
529
+ const lineOffset = this._getLineLeftOffset(i) || 0;
530
+ let lineHeight = this.getHeightOfLine(i),
531
+ realLineHeight = 0,
532
+ boxStart = 0,
533
+ boxEnd = 0;
534
+
535
+ if (i === startLine) {
536
+ boxStart = this.__charBounds[startLine][startChar].left;
537
+ }
538
+ if (i >= startLine && i < endLine) {
539
+ boxEnd =
540
+ isJustify && !this.isEndOfWrapping(i)
541
+ ? this.width
542
+ : this.getLineWidth(i) || 5; // WTF is this 5?
543
+ } else if (i === endLine) {
544
+ if (endChar === 0) {
545
+ boxEnd = this.__charBounds[endLine][endChar].left;
546
+ } else {
547
+ const charSpacing = this._getWidthOfCharSpacing();
548
+ boxEnd =
549
+ this.__charBounds[endLine][endChar - 1].left +
550
+ this.__charBounds[endLine][endChar - 1].width -
551
+ charSpacing;
552
+ }
553
+ }
554
+ realLineHeight = lineHeight;
555
+ if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {
556
+ lineHeight /= this.lineHeight;
557
+ }
558
+ let drawStart = boundaries.left + lineOffset + boxStart,
559
+ drawHeight = lineHeight,
560
+ extraTop = 0;
561
+ const drawWidth = boxEnd - boxStart;
562
+ if (this.inCompositionMode) {
563
+ ctx.fillStyle = this.compositionColor || 'black';
564
+ drawHeight = 1;
565
+ extraTop = lineHeight;
566
+ } else {
567
+ ctx.fillStyle = this.selectionColor;
568
+ }
569
+ if (this.direction === 'rtl') {
570
+ if (
571
+ this.textAlign === 'right' ||
572
+ this.textAlign === 'justify' ||
573
+ this.textAlign === 'justify-right'
574
+ ) {
575
+ drawStart = this.width - drawStart - drawWidth;
576
+ } else if (
577
+ this.textAlign === 'left' ||
578
+ this.textAlign === 'justify-left'
579
+ ) {
580
+ drawStart = boundaries.left + lineOffset - boxEnd;
581
+ } else if (
582
+ this.textAlign === 'center' ||
583
+ this.textAlign === 'justify-center'
584
+ ) {
585
+ drawStart = boundaries.left + lineOffset - boxEnd;
586
+ }
587
+ }
588
+ ctx.fillRect(
589
+ drawStart,
590
+ boundaries.top + boundaries.topOffset + extraTop,
591
+ drawWidth,
592
+ drawHeight
593
+ );
594
+ boundaries.topOffset += realLineHeight;
595
+ }
596
+ }
597
+
598
+ /**
599
+ * High level function to know the height of the cursor.
600
+ * the currentChar is the one that precedes the cursor
601
+ * Returns fontSize of char at the current cursor
602
+ * Unused from the library, is for the end user
603
+ * @return {Number} Character font size
604
+ */
605
+ getCurrentCharFontSize(): number {
606
+ const cp = this._getCurrentCharIndex();
607
+ return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');
608
+ }
609
+
610
+ /**
611
+ * High level function to know the color of the cursor.
612
+ * the currentChar is the one that precedes the cursor
613
+ * Returns color (fill) of char at the current cursor
614
+ * if the text object has a pattern or gradient for filler, it will return that.
615
+ * Unused by the library, is for the end user
616
+ * @return {String | TFiller} Character color (fill)
617
+ */
618
+ getCurrentCharColor(): string | TFiller {
619
+ const cp = this._getCurrentCharIndex();
620
+ return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');
621
+ }
622
+
623
+ /**
624
+ * Returns the cursor position for the getCurrent.. functions
625
+ * @private
626
+ */
627
+ _getCurrentCharIndex() {
628
+ const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),
629
+ charIndex =
630
+ cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;
631
+ return { l: cursorPosition.lineIndex, c: charIndex };
632
+ }
633
+
634
+ dispose() {
635
+ this._exitEditing();
636
+ this.draggableTextDelegate.dispose();
637
+ super.dispose();
638
+ }
639
+ }
640
+
641
+ export const iTextDefaultValues = {
642
+ type: 'i-text',
643
+ selectionStart: 0,
644
+ selectionEnd: 0,
645
+ selectionColor: 'rgba(17,119,255,0.3)',
646
+ isEditing: false,
647
+ editable: true,
648
+ editingBorderColor: 'rgba(102,153,255,0.25)',
649
+ cursorWidth: 2,
650
+ cursorColor: '',
651
+ cursorDelay: 1000,
652
+ cursorDuration: 600,
653
+ caching: true,
654
+ hiddenTextareaContainer: null,
655
+ _selectionDirection: null,
656
+ _reSpace: /\s|\n/,
657
+ inCompositionMode: false,
658
+ keysMap,
659
+ keysMapRtl,
660
+ ctrlKeysMapDown,
661
+ ctrlKeysMapUp,
662
+ };
663
+
664
+ Object.assign(IText.prototype, iTextDefaultValues);
665
+
666
+ classRegistry.setClass(IText);