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
@@ -1,940 +0,0 @@
1
- (function() {
2
-
3
- var clone = fabric.util.object.clone;
4
-
5
- fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {
6
-
7
- /**
8
- * Initializes all the interactive behavior of IText
9
- */
10
- initBehavior: function() {
11
- this.initAddedHandler();
12
- this.initRemovedHandler();
13
- this.initCursorSelectionHandlers();
14
- this.initDoubleClickSimulation();
15
- this.mouseMoveHandler = this.mouseMoveHandler.bind(this);
16
- },
17
-
18
- onDeselect: function() {
19
- this.isEditing && this.exitEditing();
20
- this.selected = false;
21
- },
22
-
23
- /**
24
- * Initializes "added" event handler
25
- */
26
- initAddedHandler: function() {
27
- var _this = this;
28
- this.on('added', function() {
29
- var canvas = _this.canvas;
30
- if (canvas) {
31
- if (!canvas._hasITextHandlers) {
32
- canvas._hasITextHandlers = true;
33
- _this._initCanvasHandlers(canvas);
34
- }
35
- canvas._iTextInstances = canvas._iTextInstances || [];
36
- canvas._iTextInstances.push(_this);
37
- }
38
- });
39
- },
40
-
41
- initRemovedHandler: function() {
42
- var _this = this;
43
- this.on('removed', function() {
44
- var canvas = _this.canvas;
45
- if (canvas) {
46
- canvas._iTextInstances = canvas._iTextInstances || [];
47
- fabric.util.removeFromArray(canvas._iTextInstances, _this);
48
- if (canvas._iTextInstances.length === 0) {
49
- canvas._hasITextHandlers = false;
50
- _this._removeCanvasHandlers(canvas);
51
- }
52
- }
53
- });
54
- },
55
-
56
- /**
57
- * register canvas event to manage exiting on other instances
58
- * @private
59
- */
60
- _initCanvasHandlers: function(canvas) {
61
- canvas._mouseUpITextHandler = function() {
62
- if (canvas._iTextInstances) {
63
- canvas._iTextInstances.forEach(function(obj) {
64
- obj.__isMousedown = false;
65
- });
66
- }
67
- };
68
- canvas.on('mouse:up', canvas._mouseUpITextHandler);
69
- },
70
-
71
- /**
72
- * remove canvas event to manage exiting on other instances
73
- * @private
74
- */
75
- _removeCanvasHandlers: function(canvas) {
76
- canvas.off('mouse:up', canvas._mouseUpITextHandler);
77
- },
78
-
79
- /**
80
- * @private
81
- */
82
- _tick: function() {
83
- this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete');
84
- },
85
-
86
- /**
87
- * @private
88
- */
89
- _animateCursor: function(obj, targetOpacity, duration, completeMethod) {
90
-
91
- var tickState;
92
-
93
- tickState = {
94
- isAborted: false,
95
- abort: function() {
96
- this.isAborted = true;
97
- },
98
- };
99
-
100
- obj.animate('_currentCursorOpacity', targetOpacity, {
101
- duration: duration,
102
- onComplete: function() {
103
- if (!tickState.isAborted) {
104
- obj[completeMethod]();
105
- }
106
- },
107
- onChange: function() {
108
- // we do not want to animate a selection, only cursor
109
- if (obj.canvas && obj.selectionStart === obj.selectionEnd) {
110
- obj.renderCursorOrSelection();
111
- }
112
- },
113
- abort: function() {
114
- return tickState.isAborted;
115
- }
116
- });
117
- return tickState;
118
- },
119
-
120
- /**
121
- * @private
122
- */
123
- _onTickComplete: function() {
124
-
125
- var _this = this;
126
-
127
- if (this._cursorTimeout1) {
128
- clearTimeout(this._cursorTimeout1);
129
- }
130
- this._cursorTimeout1 = setTimeout(function() {
131
- _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick');
132
- }, 100);
133
- },
134
-
135
- /**
136
- * Initializes delayed cursor
137
- */
138
- initDelayedCursor: function(restart) {
139
- var _this = this,
140
- delay = restart ? 0 : this.cursorDelay;
141
-
142
- this.abortCursorAnimation();
143
- this._currentCursorOpacity = 1;
144
- this._cursorTimeout2 = setTimeout(function() {
145
- _this._tick();
146
- }, delay);
147
- },
148
-
149
- /**
150
- * Aborts cursor animation and clears all timeouts
151
- */
152
- abortCursorAnimation: function() {
153
- var shouldClear = this._currentTickState || this._currentTickCompleteState,
154
- canvas = this.canvas;
155
- this._currentTickState && this._currentTickState.abort();
156
- this._currentTickCompleteState && this._currentTickCompleteState.abort();
157
-
158
- clearTimeout(this._cursorTimeout1);
159
- clearTimeout(this._cursorTimeout2);
160
-
161
- this._currentCursorOpacity = 0;
162
- // to clear just itext area we need to transform the context
163
- // it may not be worth it
164
- if (shouldClear && canvas) {
165
- canvas.clearContext(canvas.contextTop || canvas.contextContainer);
166
- }
167
-
168
- },
169
-
170
- /**
171
- * Selects entire text
172
- * @return {fabric.IText} thisArg
173
- * @chainable
174
- */
175
- selectAll: function() {
176
- this.selectionStart = 0;
177
- this.selectionEnd = this._text.length;
178
- this._fireSelectionChanged();
179
- this._updateTextarea();
180
- return this;
181
- },
182
-
183
- /**
184
- * Returns selected text
185
- * @return {String}
186
- */
187
- getSelectedText: function() {
188
- return this._text.slice(this.selectionStart, this.selectionEnd).join('');
189
- },
190
-
191
- /**
192
- * Find new selection index representing start of current word according to current selection index
193
- * @param {Number} startFrom Current selection index
194
- * @return {Number} New selection index
195
- */
196
- findWordBoundaryLeft: function(startFrom) {
197
- var offset = 0, index = startFrom - 1;
198
-
199
- // remove space before cursor first
200
- if (this._reSpace.test(this._text[index])) {
201
- while (this._reSpace.test(this._text[index])) {
202
- offset++;
203
- index--;
204
- }
205
- }
206
- while (/\S/.test(this._text[index]) && index > -1) {
207
- offset++;
208
- index--;
209
- }
210
-
211
- return startFrom - offset;
212
- },
213
-
214
- /**
215
- * Find new selection index representing end of current word according to current selection index
216
- * @param {Number} startFrom Current selection index
217
- * @return {Number} New selection index
218
- */
219
- findWordBoundaryRight: function(startFrom) {
220
- var offset = 0, index = startFrom;
221
-
222
- // remove space after cursor first
223
- if (this._reSpace.test(this._text[index])) {
224
- while (this._reSpace.test(this._text[index])) {
225
- offset++;
226
- index++;
227
- }
228
- }
229
- while (/\S/.test(this._text[index]) && index < this._text.length) {
230
- offset++;
231
- index++;
232
- }
233
-
234
- return startFrom + offset;
235
- },
236
-
237
- /**
238
- * Find new selection index representing start of current line according to current selection index
239
- * @param {Number} startFrom Current selection index
240
- * @return {Number} New selection index
241
- */
242
- findLineBoundaryLeft: function(startFrom) {
243
- var offset = 0, index = startFrom - 1;
244
-
245
- while (!/\n/.test(this._text[index]) && index > -1) {
246
- offset++;
247
- index--;
248
- }
249
-
250
- return startFrom - offset;
251
- },
252
-
253
- /**
254
- * Find new selection index representing end of current line according to current selection index
255
- * @param {Number} startFrom Current selection index
256
- * @return {Number} New selection index
257
- */
258
- findLineBoundaryRight: function(startFrom) {
259
- var offset = 0, index = startFrom;
260
-
261
- while (!/\n/.test(this._text[index]) && index < this._text.length) {
262
- offset++;
263
- index++;
264
- }
265
-
266
- return startFrom + offset;
267
- },
268
-
269
- /**
270
- * Finds index corresponding to beginning or end of a word
271
- * @param {Number} selectionStart Index of a character
272
- * @param {Number} direction 1 or -1
273
- * @return {Number} Index of the beginning or end of a word
274
- */
275
- searchWordBoundary: function(selectionStart, direction) {
276
- var text = this._text,
277
- index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart,
278
- _char = text[index],
279
- // wrong
280
- reNonWord = fabric.reNonWord;
281
-
282
- while (!reNonWord.test(_char) && index > 0 && index < text.length) {
283
- index += direction;
284
- _char = text[index];
285
- }
286
- if (reNonWord.test(_char)) {
287
- index += direction === 1 ? 0 : 1;
288
- }
289
- return index;
290
- },
291
-
292
- /**
293
- * Selects a word based on the index
294
- * @param {Number} selectionStart Index of a character
295
- */
296
- selectWord: function(selectionStart) {
297
- selectionStart = selectionStart || this.selectionStart;
298
- var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */
299
- newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */
300
-
301
- this.selectionStart = newSelectionStart;
302
- this.selectionEnd = newSelectionEnd;
303
- this._fireSelectionChanged();
304
- this._updateTextarea();
305
- this.renderCursorOrSelection();
306
- },
307
-
308
- /**
309
- * Selects a line based on the index
310
- * @param {Number} selectionStart Index of a character
311
- * @return {fabric.IText} thisArg
312
- * @chainable
313
- */
314
- selectLine: function(selectionStart) {
315
- selectionStart = selectionStart || this.selectionStart;
316
- var newSelectionStart = this.findLineBoundaryLeft(selectionStart),
317
- newSelectionEnd = this.findLineBoundaryRight(selectionStart);
318
-
319
- this.selectionStart = newSelectionStart;
320
- this.selectionEnd = newSelectionEnd;
321
- this._fireSelectionChanged();
322
- this._updateTextarea();
323
- return this;
324
- },
325
-
326
- /**
327
- * Enters editing state
328
- * @return {fabric.IText} thisArg
329
- * @chainable
330
- */
331
- enterEditing: function(e) {
332
- if (this.isEditing || !this.editable) {
333
- return;
334
- }
335
-
336
- if (this.canvas) {
337
- this.canvas.calcOffset();
338
- this.exitEditingOnOthers(this.canvas);
339
- }
340
-
341
- this.isEditing = true;
342
-
343
- this.initHiddenTextarea(e);
344
- this.hiddenTextarea.focus();
345
- this.hiddenTextarea.value = this.text;
346
- this._updateTextarea();
347
- this._saveEditingProps();
348
- this._setEditingProps();
349
- this._textBeforeEdit = this.text;
350
-
351
- this._tick();
352
- this.fire('editing:entered');
353
- this._fireSelectionChanged();
354
- if (!this.canvas) {
355
- return this;
356
- }
357
- this.canvas.fire('text:editing:entered', { target: this });
358
- this.initMouseMoveHandler();
359
- this.canvas.requestRenderAll();
360
- return this;
361
- },
362
-
363
- exitEditingOnOthers: function(canvas) {
364
- if (canvas._iTextInstances) {
365
- canvas._iTextInstances.forEach(function(obj) {
366
- obj.selected = false;
367
- if (obj.isEditing) {
368
- obj.exitEditing();
369
- }
370
- });
371
- }
372
- },
373
-
374
- /**
375
- * Initializes "mousemove" event handler
376
- */
377
- initMouseMoveHandler: function() {
378
- this.canvas.on('mouse:move', this.mouseMoveHandler);
379
- },
380
-
381
- /**
382
- * @private
383
- */
384
- mouseMoveHandler: function(options) {
385
- if (!this.__isMousedown || !this.isEditing) {
386
- return;
387
- }
388
-
389
- // regain focus
390
- document.activeElement !== this.hiddenTextarea && this.hiddenTextarea.focus();
391
-
392
- var newSelectionStart = this.getSelectionStartFromPointer(options.e),
393
- currentStart = this.selectionStart,
394
- currentEnd = this.selectionEnd;
395
- if (
396
- (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd)
397
- &&
398
- (currentStart === newSelectionStart || currentEnd === newSelectionStart)
399
- ) {
400
- return;
401
- }
402
- if (newSelectionStart > this.__selectionStartOnMouseDown) {
403
- this.selectionStart = this.__selectionStartOnMouseDown;
404
- this.selectionEnd = newSelectionStart;
405
- }
406
- else {
407
- this.selectionStart = newSelectionStart;
408
- this.selectionEnd = this.__selectionStartOnMouseDown;
409
- }
410
- if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) {
411
- this.restartCursorIfNeeded();
412
- this._fireSelectionChanged();
413
- this._updateTextarea();
414
- this.renderCursorOrSelection();
415
- }
416
- },
417
-
418
- /**
419
- * @private
420
- */
421
- _setEditingProps: function() {
422
- this.hoverCursor = 'text';
423
-
424
- if (this.canvas) {
425
- this.canvas.defaultCursor = this.canvas.moveCursor = 'text';
426
- }
427
-
428
- this.borderColor = this.editingBorderColor;
429
- this.hasControls = this.selectable = false;
430
- this.lockMovementX = this.lockMovementY = true;
431
- },
432
-
433
- /**
434
- * convert from textarea to grapheme indexes
435
- */
436
- fromStringToGraphemeSelection: function(start, end, text) {
437
- var smallerTextStart = text.slice(0, start),
438
- graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length;
439
- if (start === end) {
440
- return { selectionStart: graphemeStart, selectionEnd: graphemeStart };
441
- }
442
- var smallerTextEnd = text.slice(start, end),
443
- graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length;
444
- return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };
445
- },
446
-
447
- /**
448
- * convert from fabric to textarea values
449
- */
450
- fromGraphemeToStringSelection: function(start, end, _text) {
451
- var smallerTextStart = _text.slice(0, start),
452
- graphemeStart = smallerTextStart.join('').length;
453
- if (start === end) {
454
- return { selectionStart: graphemeStart, selectionEnd: graphemeStart };
455
- }
456
- var smallerTextEnd = _text.slice(start, end),
457
- graphemeEnd = smallerTextEnd.join('').length;
458
- return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };
459
- },
460
-
461
- /**
462
- * @private
463
- */
464
- _updateTextarea: function() {
465
- this.cursorOffsetCache = { };
466
- if (!this.hiddenTextarea) {
467
- return;
468
- }
469
- if (!this.inCompositionMode) {
470
- var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text);
471
- this.hiddenTextarea.selectionStart = newSelection.selectionStart;
472
- this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;
473
- }
474
- this.updateTextareaPosition();
475
- },
476
-
477
- /**
478
- * @private
479
- */
480
- updateFromTextArea: function() {
481
- if (!this.hiddenTextarea) {
482
- return;
483
- }
484
- this.cursorOffsetCache = { };
485
- this.text = this.hiddenTextarea.value;
486
- if (this._shouldClearDimensionCache()) {
487
- this.initDimensions();
488
- this.setCoords();
489
- }
490
- var newSelection = this.fromStringToGraphemeSelection(
491
- this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value);
492
- this.selectionEnd = this.selectionStart = newSelection.selectionEnd;
493
- if (!this.inCompositionMode) {
494
- this.selectionStart = newSelection.selectionStart;
495
- }
496
- this.updateTextareaPosition();
497
- },
498
-
499
- /**
500
- * @private
501
- */
502
- updateTextareaPosition: function() {
503
- if (this.selectionStart === this.selectionEnd) {
504
- var style = this._calcTextareaPosition();
505
- this.hiddenTextarea.style.left = style.left;
506
- this.hiddenTextarea.style.top = style.top;
507
- }
508
- },
509
-
510
- /**
511
- * @private
512
- * @return {Object} style contains style for hiddenTextarea
513
- */
514
- _calcTextareaPosition: function() {
515
- if (!this.canvas) {
516
- return { x: 1, y: 1 };
517
- }
518
- var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart,
519
- boundaries = this._getCursorBoundaries(desiredPosition),
520
- cursorLocation = this.get2DCursorLocation(desiredPosition),
521
- lineIndex = cursorLocation.lineIndex,
522
- charIndex = cursorLocation.charIndex,
523
- charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight,
524
- leftOffset = boundaries.leftOffset,
525
- m = this.calcTransformMatrix(),
526
- p = {
527
- x: boundaries.left + leftOffset,
528
- y: boundaries.top + boundaries.topOffset + charHeight
529
- },
530
- retinaScaling = this.canvas.getRetinaScaling(),
531
- upperCanvas = this.canvas.upperCanvasEl,
532
- upperCanvasWidth = upperCanvas.width / retinaScaling,
533
- upperCanvasHeight = upperCanvas.height / retinaScaling,
534
- maxWidth = upperCanvasWidth - charHeight,
535
- maxHeight = upperCanvasHeight - charHeight,
536
- scaleX = upperCanvas.clientWidth / upperCanvasWidth,
537
- scaleY = upperCanvas.clientHeight / upperCanvasHeight;
538
-
539
- p = fabric.util.transformPoint(p, m);
540
- p = fabric.util.transformPoint(p, this.canvas.viewportTransform);
541
- p.x *= scaleX;
542
- p.y *= scaleY;
543
- if (p.x < 0) {
544
- p.x = 0;
545
- }
546
- if (p.x > maxWidth) {
547
- p.x = maxWidth;
548
- }
549
- if (p.y < 0) {
550
- p.y = 0;
551
- }
552
- if (p.y > maxHeight) {
553
- p.y = maxHeight;
554
- }
555
-
556
- // add canvas offset on document
557
- p.x += this.canvas._offset.left;
558
- p.y += this.canvas._offset.top;
559
-
560
- return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight };
561
- },
562
-
563
- /**
564
- * @private
565
- */
566
- _saveEditingProps: function() {
567
- this._savedProps = {
568
- hasControls: this.hasControls,
569
- borderColor: this.borderColor,
570
- lockMovementX: this.lockMovementX,
571
- lockMovementY: this.lockMovementY,
572
- hoverCursor: this.hoverCursor,
573
- selectable: this.selectable,
574
- defaultCursor: this.canvas && this.canvas.defaultCursor,
575
- moveCursor: this.canvas && this.canvas.moveCursor
576
- };
577
- },
578
-
579
- /**
580
- * @private
581
- */
582
- _restoreEditingProps: function() {
583
- if (!this._savedProps) {
584
- return;
585
- }
586
-
587
- this.hoverCursor = this._savedProps.hoverCursor;
588
- this.hasControls = this._savedProps.hasControls;
589
- this.borderColor = this._savedProps.borderColor;
590
- this.selectable = this._savedProps.selectable;
591
- this.lockMovementX = this._savedProps.lockMovementX;
592
- this.lockMovementY = this._savedProps.lockMovementY;
593
-
594
- if (this.canvas) {
595
- this.canvas.defaultCursor = this._savedProps.defaultCursor;
596
- this.canvas.moveCursor = this._savedProps.moveCursor;
597
- }
598
- },
599
-
600
- /**
601
- * Exits from editing state
602
- * @return {fabric.IText} thisArg
603
- * @chainable
604
- */
605
- exitEditing: function() {
606
- var isTextChanged = (this._textBeforeEdit !== this.text);
607
- var hiddenTextarea = this.hiddenTextarea;
608
- this.selected = false;
609
- this.isEditing = false;
610
-
611
- this.selectionEnd = this.selectionStart;
612
-
613
- if (hiddenTextarea) {
614
- hiddenTextarea.blur && hiddenTextarea.blur();
615
- hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);
616
- }
617
- this.hiddenTextarea = null;
618
- this.abortCursorAnimation();
619
- this._restoreEditingProps();
620
- this._currentCursorOpacity = 0;
621
- if (this._shouldClearDimensionCache()) {
622
- this.initDimensions();
623
- this.setCoords();
624
- }
625
- this.fire('editing:exited');
626
- isTextChanged && this.fire('modified');
627
- if (this.canvas) {
628
- this.canvas.off('mouse:move', this.mouseMoveHandler);
629
- this.canvas.fire('text:editing:exited', { target: this });
630
- isTextChanged && this.canvas.fire('object:modified', { target: this });
631
- }
632
- return this;
633
- },
634
-
635
- /**
636
- * @private
637
- */
638
- _removeExtraneousStyles: function() {
639
- for (var prop in this.styles) {
640
- if (!this._textLines[prop]) {
641
- delete this.styles[prop];
642
- }
643
- }
644
- },
645
-
646
- /**
647
- * remove and reflow a style block from start to end.
648
- * @param {Number} start linear start position for removal (included in removal)
649
- * @param {Number} end linear end position for removal ( excluded from removal )
650
- */
651
- removeStyleFromTo: function(start, end) {
652
- var cursorStart = this.get2DCursorLocation(start, true),
653
- cursorEnd = this.get2DCursorLocation(end, true),
654
- lineStart = cursorStart.lineIndex,
655
- charStart = cursorStart.charIndex,
656
- lineEnd = cursorEnd.lineIndex,
657
- charEnd = cursorEnd.charIndex,
658
- i, styleObj;
659
- if (lineStart !== lineEnd) {
660
- // step1 remove the trailing of lineStart
661
- if (this.styles[lineStart]) {
662
- for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) {
663
- delete this.styles[lineStart][i];
664
- }
665
- }
666
- // step2 move the trailing of lineEnd to lineStart if needed
667
- if (this.styles[lineEnd]) {
668
- for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) {
669
- styleObj = this.styles[lineEnd][i];
670
- if (styleObj) {
671
- this.styles[lineStart] || (this.styles[lineStart] = { });
672
- this.styles[lineStart][charStart + i - charEnd] = styleObj;
673
- }
674
- }
675
- }
676
- // step3 detects lines will be completely removed.
677
- for (i = lineStart + 1; i <= lineEnd; i++) {
678
- delete this.styles[i];
679
- }
680
- // step4 shift remaining lines.
681
- this.shiftLineStyles(lineEnd, lineStart - lineEnd);
682
- }
683
- else {
684
- // remove and shift left on the same line
685
- if (this.styles[lineStart]) {
686
- styleObj = this.styles[lineStart];
687
- var diff = charEnd - charStart, numericChar, _char;
688
- for (i = charStart; i < charEnd; i++) {
689
- delete styleObj[i];
690
- }
691
- for (_char in this.styles[lineStart]) {
692
- numericChar = parseInt(_char, 10);
693
- if (numericChar >= charEnd) {
694
- styleObj[numericChar - diff] = styleObj[_char];
695
- delete styleObj[_char];
696
- }
697
- }
698
- }
699
- }
700
- },
701
-
702
- /**
703
- * Shifts line styles up or down
704
- * @param {Number} lineIndex Index of a line
705
- * @param {Number} offset Can any number?
706
- */
707
- shiftLineStyles: function(lineIndex, offset) {
708
- // shift all line styles by offset upward or downward
709
- // do not clone deep. we need new array, not new style objects
710
- var clonedStyles = clone(this.styles);
711
- for (var line in this.styles) {
712
- var numericLine = parseInt(line, 10);
713
- if (numericLine > lineIndex) {
714
- this.styles[numericLine + offset] = clonedStyles[numericLine];
715
- if (!clonedStyles[numericLine - offset]) {
716
- delete this.styles[numericLine];
717
- }
718
- }
719
- }
720
- },
721
-
722
- restartCursorIfNeeded: function() {
723
- if (!this._currentTickState || this._currentTickState.isAborted
724
- || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted
725
- ) {
726
- this.initDelayedCursor();
727
- }
728
- },
729
-
730
- /**
731
- * Handle insertion of more consecutive style lines for when one or more
732
- * newlines gets added to the text. Since current style needs to be shifted
733
- * first we shift the current style of the number lines needed, then we add
734
- * new lines from the last to the first.
735
- * @param {Number} lineIndex Index of a line
736
- * @param {Number} charIndex Index of a char
737
- * @param {Number} qty number of lines to add
738
- * @param {Array} copiedStyle Array of objects styles
739
- */
740
- insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) {
741
- var currentCharStyle,
742
- newLineStyles = {},
743
- somethingAdded = false,
744
- isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex;
745
-
746
- qty || (qty = 1);
747
- this.shiftLineStyles(lineIndex, qty);
748
- if (this.styles[lineIndex]) {
749
- currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1];
750
- }
751
- // we clone styles of all chars
752
- // after cursor onto the current line
753
- for (var index in this.styles[lineIndex]) {
754
- var numIndex = parseInt(index, 10);
755
- if (numIndex >= charIndex) {
756
- somethingAdded = true;
757
- newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];
758
- // remove lines from the previous line since they're on a new line now
759
- if (!(isEndOfLine && charIndex === 0)) {
760
- delete this.styles[lineIndex][index];
761
- }
762
- }
763
- }
764
- var styleCarriedOver = false;
765
- if (somethingAdded && !isEndOfLine) {
766
- // if is end of line, the extra style we copied
767
- // is probably not something we want
768
- this.styles[lineIndex + qty] = newLineStyles;
769
- styleCarriedOver = true;
770
- }
771
- if (styleCarriedOver) {
772
- // skip the last line of since we already prepared it.
773
- qty--;
774
- }
775
- // for the all the lines or all the other lines
776
- // we clone current char style onto the next (otherwise empty) line
777
- while (qty > 0) {
778
- if (copiedStyle && copiedStyle[qty - 1]) {
779
- this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) };
780
- }
781
- else if (currentCharStyle) {
782
- this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) };
783
- }
784
- else {
785
- delete this.styles[lineIndex + qty];
786
- }
787
- qty--;
788
- }
789
- this._forceClearCache = true;
790
- },
791
-
792
- /**
793
- * Inserts style object for a given line/char index
794
- * @param {Number} lineIndex Index of a line
795
- * @param {Number} charIndex Index of a char
796
- * @param {Number} quantity number Style object to insert, if given
797
- * @param {Array} copiedStyle array of style objects
798
- */
799
- insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) {
800
- if (!this.styles) {
801
- this.styles = {};
802
- }
803
- var currentLineStyles = this.styles[lineIndex],
804
- currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {};
805
-
806
- quantity || (quantity = 1);
807
- // shift all char styles by quantity forward
808
- // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4
809
- for (var index in currentLineStylesCloned) {
810
- var numericIndex = parseInt(index, 10);
811
- if (numericIndex >= charIndex) {
812
- currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex];
813
- // only delete the style if there was nothing moved there
814
- if (!currentLineStylesCloned[numericIndex - quantity]) {
815
- delete currentLineStyles[numericIndex];
816
- }
817
- }
818
- }
819
- this._forceClearCache = true;
820
- if (copiedStyle) {
821
- while (quantity--) {
822
- if (!Object.keys(copiedStyle[quantity]).length) {
823
- continue;
824
- }
825
- if (!this.styles[lineIndex]) {
826
- this.styles[lineIndex] = {};
827
- }
828
- this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]);
829
- }
830
- return;
831
- }
832
- if (!currentLineStyles) {
833
- return;
834
- }
835
- var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];
836
- while (newStyle && quantity--) {
837
- this.styles[lineIndex][charIndex + quantity] = clone(newStyle);
838
- }
839
- },
840
-
841
- /**
842
- * Inserts style object(s)
843
- * @param {Array} insertedText Characters at the location where style is inserted
844
- * @param {Number} start cursor index for inserting style
845
- * @param {Array} [copiedStyle] array of style objects to insert.
846
- */
847
- insertNewStyleBlock: function(insertedText, start, copiedStyle) {
848
- var cursorLoc = this.get2DCursorLocation(start, true),
849
- addedLines = [0], linesLength = 0;
850
- // get an array of how many char per lines are being added.
851
- for (var i = 0; i < insertedText.length; i++) {
852
- if (insertedText[i] === '\n') {
853
- linesLength++;
854
- addedLines[linesLength] = 0;
855
- }
856
- else {
857
- addedLines[linesLength]++;
858
- }
859
- }
860
- // for the first line copy the style from the current char position.
861
- if (addedLines[0] > 0) {
862
- this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle);
863
- copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);
864
- }
865
- linesLength && this.insertNewlineStyleObject(
866
- cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength);
867
- for (var i = 1; i < linesLength; i++) {
868
- if (addedLines[i] > 0) {
869
- this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);
870
- }
871
- else if (copiedStyle) {
872
- // this test is required in order to close #6841
873
- // when a pasted buffer begins with a newline then
874
- // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]
875
- // may be undefined for some reason
876
- if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {
877
- this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];
878
- }
879
- }
880
- copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);
881
- }
882
- // we use i outside the loop to get it like linesLength
883
- if (addedLines[i] > 0) {
884
- this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);
885
- }
886
- },
887
-
888
- /**
889
- * Set the selectionStart and selectionEnd according to the new position of cursor
890
- * mimic the key - mouse navigation when shift is pressed.
891
- */
892
- setSelectionStartEndWithShift: function(start, end, newSelection) {
893
- if (newSelection <= start) {
894
- if (end === start) {
895
- this._selectionDirection = 'left';
896
- }
897
- else if (this._selectionDirection === 'right') {
898
- this._selectionDirection = 'left';
899
- this.selectionEnd = start;
900
- }
901
- this.selectionStart = newSelection;
902
- }
903
- else if (newSelection > start && newSelection < end) {
904
- if (this._selectionDirection === 'right') {
905
- this.selectionEnd = newSelection;
906
- }
907
- else {
908
- this.selectionStart = newSelection;
909
- }
910
- }
911
- else {
912
- // newSelection is > selection start and end
913
- if (end === start) {
914
- this._selectionDirection = 'right';
915
- }
916
- else if (this._selectionDirection === 'left') {
917
- this._selectionDirection = 'right';
918
- this.selectionStart = end;
919
- }
920
- this.selectionEnd = newSelection;
921
- }
922
- },
923
-
924
- setSelectionInBoundaries: function() {
925
- var length = this.text.length;
926
- if (this.selectionStart > length) {
927
- this.selectionStart = length;
928
- }
929
- else if (this.selectionStart < 0) {
930
- this.selectionStart = 0;
931
- }
932
- if (this.selectionEnd > length) {
933
- this.selectionEnd = length;
934
- }
935
- else if (this.selectionEnd < 0) {
936
- this.selectionEnd = 0;
937
- }
938
- }
939
- });
940
- })();