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,1053 @@
1
+ // @ts-nocheck
2
+ import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';
3
+ import { createCollectionMixin } from '../Collection';
4
+ import { resolveOrigin } from '../util/misc/resolveOrigin';
5
+ import { Point } from '../Point';
6
+ import type { TClassProperties } from '../typedefs';
7
+ import { cos } from '../util/misc/cos';
8
+ import {
9
+ invertTransform,
10
+ multiplyTransformMatrices,
11
+ transformPoint,
12
+ } from '../util/misc/matrix';
13
+ import {
14
+ enlivenObjectEnlivables,
15
+ enlivenObjects,
16
+ } from '../util/misc/objectEnlive';
17
+ import { applyTransformToObject } from '../util/misc/objectTransforms';
18
+ import { degreesToRadians } from '../util/misc/radiansDegreesConversion';
19
+ import { sin } from '../util/misc/sin';
20
+ import { FabricObject, stateProperties } from './Object/FabricObject';
21
+ import { Rect } from './Rect';
22
+ import { classRegistry } from '../util/class_registry';
23
+
24
+ export type LayoutContextType =
25
+ | 'initialization'
26
+ | 'object_modified'
27
+ | 'added'
28
+ | 'removed'
29
+ | 'layout_change'
30
+ | 'imperative';
31
+
32
+ export type LayoutContext = {
33
+ type: LayoutContextType;
34
+ /**
35
+ * array of objects starting from the object that triggered the call to the current one
36
+ */
37
+ path?: Group[];
38
+ [key: string]: any;
39
+ };
40
+
41
+ export type GroupEvents = ObjectEvents &
42
+ CollectionEvents & {
43
+ layout: {
44
+ context: LayoutContext;
45
+ result: LayoutResult;
46
+ diff: Point;
47
+ };
48
+ };
49
+
50
+ export type LayoutStrategy =
51
+ | 'fit-content'
52
+ | 'fit-content-lazy'
53
+ | 'fixed'
54
+ | 'clip-path';
55
+
56
+ /**
57
+ * positioning and layout data **relative** to instance's parent
58
+ */
59
+ export type LayoutResult = {
60
+ /**
61
+ * new centerX as measured by the containing plane (same as `left` with `originX` set to `center`)
62
+ */
63
+ centerX: number;
64
+ /**
65
+ * new centerY as measured by the containing plane (same as `top` with `originY` set to `center`)
66
+ */
67
+ centerY: number;
68
+ /**
69
+ * correctionX to translate objects by, measured as `centerX`
70
+ */
71
+ correctionX?: number;
72
+ /**
73
+ * correctionY to translate objects by, measured as `centerY`
74
+ */
75
+ correctionY?: number;
76
+ width: number;
77
+ height: number;
78
+ };
79
+
80
+ /**
81
+ * @fires object:added
82
+ * @fires object:removed
83
+ * @fires layout once layout completes
84
+ */
85
+ export class Group extends createCollectionMixin(FabricObject<GroupEvents>) {
86
+ /**
87
+ * Specifies the **layout strategy** for instance
88
+ * Used by `getLayoutStrategyResult` to calculate layout
89
+ * `fit-content`, `fit-content-lazy`, `fixed`, `clip-path` are supported out of the box
90
+ * @type LayoutStrategy
91
+ * @default
92
+ */
93
+ declare layout: LayoutStrategy;
94
+
95
+ /**
96
+ * Used to optimize performance
97
+ * set to `false` if you don't need contained objects to be targets of events
98
+ * @default
99
+ * @type boolean
100
+ */
101
+ declare subTargetCheck: boolean;
102
+
103
+ /**
104
+ * Used to allow targeting of object inside groups.
105
+ * set to true if you want to select an object inside a group.\
106
+ * **REQUIRES** `subTargetCheck` set to true
107
+ * @default
108
+ * @type boolean
109
+ */
110
+ declare interactive: boolean;
111
+
112
+ /**
113
+ * Used internally to optimize performance
114
+ * Once an object is selected, instance is rendered without the selected object.
115
+ * This way instance is cached only once for the entire interaction with the selected object.
116
+ * @private
117
+ */
118
+ protected _activeObjects: FabricObject[] = [];
119
+
120
+ /**
121
+ * Constructor
122
+ *
123
+ * @param {FabricObject[]} [objects] instance objects
124
+ * @param {Object} [options] Options object
125
+ * @param {boolean} [objectsRelativeToGroup] true if objects exist in group coordinate plane
126
+ */
127
+ constructor(
128
+ objects: FabricObject[] = [],
129
+ options: any = {},
130
+ objectsRelativeToGroup?: boolean
131
+ ) {
132
+ super();
133
+ this._objects = objects;
134
+ this.__objectMonitor = this.__objectMonitor.bind(this);
135
+ this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(
136
+ this,
137
+ true
138
+ );
139
+ this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(
140
+ this,
141
+ false
142
+ );
143
+ this._firstLayoutDone = false;
144
+ // setting angle, skewX, skewY must occur after initial layout
145
+ this.set({ ...options, angle: 0, skewX: 0, skewY: 0 });
146
+ this.forEachObject((object) => {
147
+ this.enterGroup(object, false);
148
+ });
149
+ this._applyLayoutStrategy({
150
+ type: 'initialization',
151
+ options,
152
+ objectsRelativeToGroup,
153
+ });
154
+ }
155
+
156
+ /**
157
+ * Checks if object can enter group and logs relevant warnings
158
+ * @private
159
+ * @param {FabricObject} object
160
+ * @returns
161
+ */
162
+ canEnterGroup(object: FabricObject) {
163
+ if (object === this || this.isDescendantOf(object)) {
164
+ // prevent circular object tree
165
+ /* _DEV_MODE_START_ */
166
+ console.error(
167
+ 'fabric.Group: circular object trees are not supported, this call has no effect'
168
+ );
169
+ /* _DEV_MODE_END_ */
170
+ return false;
171
+ } else if (this._objects.indexOf(object) !== -1) {
172
+ // is already in the objects array
173
+ /* _DEV_MODE_START_ */
174
+ console.error(
175
+ 'fabric.Group: duplicate objects are not supported inside group, this call has no effect'
176
+ );
177
+ /* _DEV_MODE_END_ */
178
+ return false;
179
+ }
180
+ return true;
181
+ }
182
+
183
+ /**
184
+ * Override this method to enhance performance (for groups with a lot of objects).
185
+ * If Overriding, be sure not pass illegal objects to group - it will break your app.
186
+ * @private
187
+ */
188
+ protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {
189
+ return objects.filter((object, index, array) => {
190
+ // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)
191
+ return this.canEnterGroup(object) && array.indexOf(object) === index;
192
+ });
193
+ }
194
+
195
+ /**
196
+ * Add objects
197
+ * @param {...FabricObject[]} objects
198
+ */
199
+ add(...objects: FabricObject[]) {
200
+ const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);
201
+ const size = super.add(...allowedObjects);
202
+ this._onAfterObjectsChange('added', allowedObjects);
203
+ return size;
204
+ }
205
+
206
+ /**
207
+ * Inserts an object into collection at specified index
208
+ * @param {FabricObject[]} objects Object to insert
209
+ * @param {Number} index Index to insert object at
210
+ */
211
+ insertAt(index: number, ...objects: FabricObject[]) {
212
+ const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);
213
+ const size = super.insertAt(index, ...allowedObjects);
214
+ this._onAfterObjectsChange('added', allowedObjects);
215
+ return size;
216
+ }
217
+
218
+ /**
219
+ * Remove objects
220
+ * @param {...FabricObject[]} objects
221
+ * @returns {FabricObject[]} removed objects
222
+ */
223
+ remove(...objects: FabricObject[]) {
224
+ const removed = super.remove(...objects);
225
+ this._onAfterObjectsChange('removed', removed);
226
+ return removed;
227
+ }
228
+
229
+ _onObjectAdded(object: FabricObject) {
230
+ this.enterGroup(object, true);
231
+ this.fire('object:added', { target: object });
232
+ object.fire('added', { target: this });
233
+ }
234
+
235
+ _onRelativeObjectAdded(object: FabricObject) {
236
+ this.enterGroup(object, false);
237
+ this.fire('object:added', { target: object });
238
+ object.fire('added', { target: this });
239
+ }
240
+
241
+ /**
242
+ * @private
243
+ * @param {FabricObject} object
244
+ * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it
245
+ */
246
+ _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {
247
+ this.exitGroup(object, removeParentTransform);
248
+ this.fire('object:removed', { target: object });
249
+ object.fire('removed', { target: this });
250
+ }
251
+
252
+ /**
253
+ * @private
254
+ * @param {'added'|'removed'} type
255
+ * @param {FabricObject[]} targets
256
+ */
257
+ _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {
258
+ this._applyLayoutStrategy({
259
+ type: type,
260
+ targets: targets,
261
+ });
262
+ this._set('dirty', true);
263
+ }
264
+
265
+ _onStackOrderChanged() {
266
+ this._set('dirty', true);
267
+ }
268
+
269
+ /**
270
+ * @private
271
+ * @param {string} key
272
+ * @param {*} value
273
+ */
274
+ _set(key: string, value: any) {
275
+ const prev = this[key];
276
+ super._set(key, value);
277
+ if (key === 'canvas' && prev !== value) {
278
+ this.forEachObject((object) => {
279
+ object._set(key, value);
280
+ });
281
+ }
282
+ if (key === 'layout' && prev !== value) {
283
+ this._applyLayoutStrategy({
284
+ type: 'layout_change',
285
+ layout: value,
286
+ prevLayout: prev,
287
+ });
288
+ }
289
+ if (key === 'interactive') {
290
+ this.forEachObject((object) => this._watchObject(value, object));
291
+ }
292
+ return this;
293
+ }
294
+
295
+ /**
296
+ * @private
297
+ */
298
+ _shouldSetNestedCoords() {
299
+ return this.subTargetCheck;
300
+ }
301
+
302
+ /**
303
+ * Remove all objects
304
+ * @returns {FabricObject[]} removed objects
305
+ */
306
+ removeAll() {
307
+ this._activeObjects = [];
308
+ return this.remove(...this._objects);
309
+ }
310
+
311
+ /**
312
+ * invalidates layout on object modified
313
+ * @private
314
+ */
315
+ __objectMonitor(opt) {
316
+ this._applyLayoutStrategy({ ...opt, type: 'object_modified' });
317
+ this._set('dirty', true);
318
+ }
319
+
320
+ /**
321
+ * keeps track of the selected objects
322
+ * @private
323
+ */
324
+ __objectSelectionMonitor(selected: boolean, opt) {
325
+ const object = opt.target;
326
+ if (selected) {
327
+ this._activeObjects.push(object);
328
+ this._set('dirty', true);
329
+ } else if (this._activeObjects.length > 0) {
330
+ const index = this._activeObjects.indexOf(object);
331
+ if (index > -1) {
332
+ this._activeObjects.splice(index, 1);
333
+ this._set('dirty', true);
334
+ }
335
+ }
336
+ }
337
+
338
+ /**
339
+ * @private
340
+ * @param {boolean} watch
341
+ * @param {FabricObject} object
342
+ */
343
+ _watchObject(watch: boolean, object: FabricObject) {
344
+ const directive = watch ? 'on' : 'off';
345
+ // make sure we listen only once
346
+ watch && this._watchObject(false, object);
347
+ object[directive]('changed', this.__objectMonitor);
348
+ object[directive]('modified', this.__objectMonitor);
349
+ object[directive]('selected', this.__objectSelectionTracker);
350
+ object[directive]('deselected', this.__objectSelectionDisposer);
351
+ }
352
+
353
+ /**
354
+ * @private
355
+ * @param {FabricObject} object
356
+ * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane
357
+ * @returns {boolean} true if object entered group
358
+ */
359
+ enterGroup(object: FabricObject, removeParentTransform?: boolean) {
360
+ if (object.group) {
361
+ object.group.remove(object);
362
+ }
363
+ this._enterGroup(object, removeParentTransform);
364
+ return true;
365
+ }
366
+
367
+ /**
368
+ * @private
369
+ * @param {FabricObject} object
370
+ * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane
371
+ */
372
+ _enterGroup(object: FabricObject, removeParentTransform?: boolean) {
373
+ if (removeParentTransform) {
374
+ // can this be converted to utils (sendObjectToPlane)?
375
+ applyTransformToObject(
376
+ object,
377
+ multiplyTransformMatrices(
378
+ invertTransform(this.calcTransformMatrix()),
379
+ object.calcTransformMatrix()
380
+ )
381
+ );
382
+ }
383
+ this._shouldSetNestedCoords() && object.setCoords();
384
+ object._set('group', this);
385
+ object._set('canvas', this.canvas);
386
+ this.interactive && this._watchObject(true, object);
387
+ const activeObject =
388
+ this.canvas &&
389
+ this.canvas.getActiveObject &&
390
+ this.canvas.getActiveObject();
391
+ // if we are adding the activeObject in a group
392
+ if (
393
+ activeObject &&
394
+ (activeObject === object || object.isDescendantOf(activeObject))
395
+ ) {
396
+ this._activeObjects.push(object);
397
+ }
398
+ }
399
+
400
+ /**
401
+ * @private
402
+ * @param {FabricObject} object
403
+ * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it
404
+ */
405
+ exitGroup(object: FabricObject, removeParentTransform?: boolean) {
406
+ this._exitGroup(object, removeParentTransform);
407
+ object._set('canvas', undefined);
408
+ }
409
+
410
+ /**
411
+ * @private
412
+ * @param {FabricObject} object
413
+ * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it
414
+ */
415
+ _exitGroup(object: FabricObject, removeParentTransform?: boolean) {
416
+ object._set('group', undefined);
417
+ if (!removeParentTransform) {
418
+ applyTransformToObject(
419
+ object,
420
+ multiplyTransformMatrices(
421
+ this.calcTransformMatrix(),
422
+ object.calcTransformMatrix()
423
+ )
424
+ );
425
+ object.setCoords();
426
+ }
427
+ this._watchObject(false, object);
428
+ const index =
429
+ this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;
430
+ if (index > -1) {
431
+ this._activeObjects.splice(index, 1);
432
+ }
433
+ }
434
+
435
+ /**
436
+ * Decide if the object should cache or not. Create its own cache level
437
+ * needsItsOwnCache should be used when the object drawing method requires
438
+ * a cache step. None of the fabric classes requires it.
439
+ * Generally you do not cache objects in groups because the group is already cached.
440
+ * @return {Boolean}
441
+ */
442
+ shouldCache() {
443
+ const ownCache = FabricObject.prototype.shouldCache.call(this);
444
+ if (ownCache) {
445
+ for (let i = 0; i < this._objects.length; i++) {
446
+ if (this._objects[i].willDrawShadow()) {
447
+ this.ownCaching = false;
448
+ return false;
449
+ }
450
+ }
451
+ }
452
+ return ownCache;
453
+ }
454
+
455
+ /**
456
+ * Check if this object or a child object will cast a shadow
457
+ * @return {Boolean}
458
+ */
459
+ willDrawShadow() {
460
+ if (FabricObject.prototype.willDrawShadow.call(this)) {
461
+ return true;
462
+ }
463
+ for (let i = 0; i < this._objects.length; i++) {
464
+ if (this._objects[i].willDrawShadow()) {
465
+ return true;
466
+ }
467
+ }
468
+ return false;
469
+ }
470
+
471
+ /**
472
+ * Check if instance or its group are caching, recursively up
473
+ * @return {Boolean}
474
+ */
475
+ isOnACache(): boolean {
476
+ return this.ownCaching || (!!this.group && this.group.isOnACache());
477
+ }
478
+
479
+ /**
480
+ * Execute the drawing operation for an object on a specified context
481
+ * @param {CanvasRenderingContext2D} ctx Context to render on
482
+ */
483
+ drawObject(ctx: CanvasRenderingContext2D) {
484
+ this._renderBackground(ctx);
485
+ for (let i = 0; i < this._objects.length; i++) {
486
+ this._objects[i].render(ctx);
487
+ }
488
+ this._drawClipPath(ctx, this.clipPath);
489
+ }
490
+
491
+ /**
492
+ * @override
493
+ * @return {Boolean}
494
+ */
495
+ setCoords() {
496
+ super.setCoords();
497
+ this._shouldSetNestedCoords() &&
498
+ this.forEachObject((object) => object.setCoords());
499
+ }
500
+
501
+ /**
502
+ * Renders instance on a given context
503
+ * @param {CanvasRenderingContext2D} ctx context to render instance on
504
+ */
505
+ render(ctx: CanvasRenderingContext2D) {
506
+ this._transformDone = true;
507
+ super.render(ctx);
508
+ this._transformDone = false;
509
+ }
510
+
511
+ /**
512
+ * @public
513
+ * @param {Partial<LayoutResult> & { layout?: string }} [context] pass values to use for layout calculations
514
+ */
515
+ triggerLayout(context) {
516
+ if (context && context.layout) {
517
+ context.prevLayout = this.layout;
518
+ this.layout = context.layout;
519
+ }
520
+ this._applyLayoutStrategy({ type: 'imperative', context });
521
+ }
522
+
523
+ /**
524
+ * @private
525
+ * @param {FabricObject} object
526
+ * @param {Point} diff
527
+ */
528
+ _adjustObjectPosition(object: FabricObject, diff: Point) {
529
+ object.set({
530
+ left: object.left + diff.x,
531
+ top: object.top + diff.y,
532
+ });
533
+ }
534
+
535
+ /**
536
+ * initial layout logic:
537
+ * calculate bbox of objects (if necessary) and translate it according to options received from the constructor (left, top, width, height)
538
+ * so it is placed in the center of the bbox received from the constructor
539
+ *
540
+ * @private
541
+ * @param {LayoutContext} context
542
+ */
543
+ _applyLayoutStrategy(context) {
544
+ const isFirstLayout = context.type === 'initialization';
545
+ if (!isFirstLayout && !this._firstLayoutDone) {
546
+ // reject layout requests before initialization layout
547
+ return;
548
+ }
549
+ const options = isFirstLayout && context.options;
550
+ const initialTransform = options && {
551
+ angle: options.angle || 0,
552
+ skewX: options.skewX || 0,
553
+ skewY: options.skewY || 0,
554
+ };
555
+ const center = this.getRelativeCenterPoint();
556
+ let result = this.getLayoutStrategyResult(
557
+ this.layout,
558
+ this._objects.concat(),
559
+ context
560
+ );
561
+ let diff: Point;
562
+ if (result) {
563
+ // handle positioning
564
+ const newCenter = new Point(result.centerX, result.centerY);
565
+ const vector = center
566
+ .subtract(newCenter)
567
+ .add(new Point(result.correctionX || 0, result.correctionY || 0));
568
+ diff = vector.transform(invertTransform(this.calcOwnMatrix()), true);
569
+ // set dimensions
570
+ this.set({ width: result.width, height: result.height });
571
+ // adjust objects to account for new center
572
+ !context.objectsRelativeToGroup &&
573
+ this.forEachObject((object) => {
574
+ this._adjustObjectPosition(object, diff);
575
+ });
576
+ // clip path as well
577
+ !isFirstLayout &&
578
+ this.layout !== 'clip-path' &&
579
+ this.clipPath &&
580
+ !this.clipPath.absolutePositioned &&
581
+ this._adjustObjectPosition(this.clipPath, diff);
582
+ if (!newCenter.eq(center) || initialTransform) {
583
+ // set position
584
+ this.setPositionByOrigin(newCenter, 'center', 'center');
585
+ initialTransform && this.set(initialTransform);
586
+ this.setCoords();
587
+ }
588
+ } else if (isFirstLayout) {
589
+ // fill `result` with initial values for the layout hook
590
+ result = {
591
+ centerX: center.x,
592
+ centerY: center.y,
593
+ width: this.width,
594
+ height: this.height,
595
+ };
596
+ initialTransform && this.set(initialTransform);
597
+ } else {
598
+ // no `result` so we return
599
+ return;
600
+ }
601
+ // flag for next layouts
602
+ this._firstLayoutDone = true;
603
+ // fire layout hook and event (event will fire only for layouts after initialization layout)
604
+ this.onLayout(context, result);
605
+ this.fire('layout', {
606
+ context,
607
+ result,
608
+ diff,
609
+ });
610
+ // recursive up
611
+ if (this.group && this.group._applyLayoutStrategy) {
612
+ // append the path recursion to context
613
+ if (!context.path) {
614
+ context.path = [];
615
+ }
616
+ context.path.push(this);
617
+ // all parents should invalidate their layout
618
+ this.group._applyLayoutStrategy(context);
619
+ }
620
+ }
621
+
622
+ /**
623
+ * Override this method to customize layout.
624
+ * If you need to run logic once layout completes use `onLayout`
625
+ * @public
626
+ * @param {string} layoutDirective
627
+ * @param {FabricObject[]} objects
628
+ * @param {LayoutContext} context
629
+ * @returns {LayoutResult | undefined}
630
+ */
631
+ getLayoutStrategyResult(
632
+ layoutDirective: LayoutStrategy,
633
+ objects: FabricObject[],
634
+ context: LayoutContext
635
+ ) {
636
+ if (
637
+ layoutDirective === 'fit-content-lazy' &&
638
+ context.type === 'added' &&
639
+ objects.length > context.targets.length
640
+ ) {
641
+ // calculate added objects' bbox with existing bbox
642
+ const addedObjects = context.targets.concat(this);
643
+ return this.prepareBoundingBox(layoutDirective, addedObjects, context);
644
+ } else if (
645
+ layoutDirective === 'fit-content' ||
646
+ layoutDirective === 'fit-content-lazy' ||
647
+ (layoutDirective === 'fixed' &&
648
+ (context.type === 'initialization' || context.type === 'imperative'))
649
+ ) {
650
+ return this.prepareBoundingBox(layoutDirective, objects, context);
651
+ } else if (layoutDirective === 'clip-path' && this.clipPath) {
652
+ const clipPath = this.clipPath;
653
+ const clipPathSizeAfter = clipPath._getTransformedDimensions();
654
+ if (
655
+ clipPath.absolutePositioned &&
656
+ (context.type === 'initialization' || context.type === 'layout_change')
657
+ ) {
658
+ // we want the center point to exist in group's containing plane
659
+ let clipPathCenter = clipPath.getCenterPoint();
660
+ if (this.group) {
661
+ // send point from canvas plane to group's containing plane
662
+ const inv = invertTransform(this.group.calcTransformMatrix());
663
+ clipPathCenter = transformPoint(clipPathCenter, inv);
664
+ }
665
+ return {
666
+ centerX: clipPathCenter.x,
667
+ centerY: clipPathCenter.y,
668
+ width: clipPathSizeAfter.x,
669
+ height: clipPathSizeAfter.y,
670
+ };
671
+ } else if (!clipPath.absolutePositioned) {
672
+ let center;
673
+ const clipPathRelativeCenter = clipPath.getRelativeCenterPoint(),
674
+ // we want the center point to exist in group's containing plane, so we send it upwards
675
+ clipPathCenter = transformPoint(
676
+ clipPathRelativeCenter,
677
+ this.calcOwnMatrix(),
678
+ true
679
+ );
680
+ if (
681
+ context.type === 'initialization' ||
682
+ context.type === 'layout_change'
683
+ ) {
684
+ const bbox =
685
+ this.prepareBoundingBox(layoutDirective, objects, context) || {};
686
+ center = new Point(bbox.centerX || 0, bbox.centerY || 0);
687
+ return {
688
+ centerX: center.x + clipPathCenter.x,
689
+ centerY: center.y + clipPathCenter.y,
690
+ correctionX: bbox.correctionX - clipPathCenter.x,
691
+ correctionY: bbox.correctionY - clipPathCenter.y,
692
+ width: clipPath.width,
693
+ height: clipPath.height,
694
+ };
695
+ } else {
696
+ center = this.getRelativeCenterPoint();
697
+ return {
698
+ centerX: center.x + clipPathCenter.x,
699
+ centerY: center.y + clipPathCenter.y,
700
+ width: clipPathSizeAfter.x,
701
+ height: clipPathSizeAfter.y,
702
+ };
703
+ }
704
+ }
705
+ } else if (layoutDirective === 'svg' && context.type === 'initialization') {
706
+ const bbox = this.getObjectsBoundingBox(objects, true) || {};
707
+ return Object.assign(bbox, {
708
+ correctionX: -bbox.offsetX || 0,
709
+ correctionY: -bbox.offsetY || 0,
710
+ });
711
+ }
712
+ }
713
+
714
+ /**
715
+ * Override this method to customize layout.
716
+ * A wrapper around {@link Group#getObjectsBoundingBox}
717
+ * @public
718
+ * @param {string} layoutDirective
719
+ * @param {FabricObject[]} objects
720
+ * @param {LayoutContext} context
721
+ * @returns {LayoutResult | undefined}
722
+ */
723
+ prepareBoundingBox(
724
+ layoutDirective: LayoutStrategy,
725
+ objects: FabricObject[],
726
+ context: LayoutContext
727
+ ) {
728
+ if (context.type === 'initialization') {
729
+ return this.prepareInitialBoundingBox(layoutDirective, objects, context);
730
+ } else if (context.type === 'imperative' && context.context) {
731
+ return Object.assign(
732
+ this.getObjectsBoundingBox(objects) || {},
733
+ context.context
734
+ );
735
+ } else {
736
+ return this.getObjectsBoundingBox(objects);
737
+ }
738
+ }
739
+
740
+ /**
741
+ * Calculates center taking into account originX, originY while not being sure that width/height are initialized
742
+ * @public
743
+ * @param {string} layoutDirective
744
+ * @param {FabricObject[]} objects
745
+ * @param {LayoutContext} context
746
+ * @returns {LayoutResult | undefined}
747
+ */
748
+ prepareInitialBoundingBox(
749
+ layoutDirective: LayoutStrategy,
750
+ objects: FabricObject[],
751
+ context: LayoutContext
752
+ ) {
753
+ const options = context.options || {},
754
+ hasX = typeof options.left === 'number',
755
+ hasY = typeof options.top === 'number',
756
+ hasWidth = typeof options.width === 'number',
757
+ hasHeight = typeof options.height === 'number';
758
+
759
+ // performance enhancement
760
+ // skip layout calculation if bbox is defined
761
+ if (
762
+ (hasX &&
763
+ hasY &&
764
+ hasWidth &&
765
+ hasHeight &&
766
+ context.objectsRelativeToGroup) ||
767
+ objects.length === 0
768
+ ) {
769
+ // return nothing to skip layout
770
+ return;
771
+ }
772
+
773
+ const bbox = this.getObjectsBoundingBox(objects) || {};
774
+ const width = hasWidth ? this.width : bbox.width || 0,
775
+ height = hasHeight ? this.height : bbox.height || 0,
776
+ calculatedCenter = new Point(bbox.centerX || 0, bbox.centerY || 0),
777
+ origin = new Point(
778
+ resolveOrigin(this.originX),
779
+ resolveOrigin(this.originY)
780
+ ),
781
+ size = new Point(width, height),
782
+ strokeWidthVector = this._getTransformedDimensions({
783
+ width: 0,
784
+ height: 0,
785
+ }),
786
+ sizeAfter = this._getTransformedDimensions({
787
+ width: width,
788
+ height: height,
789
+ strokeWidth: 0,
790
+ }),
791
+ bboxSizeAfter = this._getTransformedDimensions({
792
+ width: bbox.width,
793
+ height: bbox.height,
794
+ strokeWidth: 0,
795
+ }),
796
+ rotationCorrection = new Point(0, 0);
797
+
798
+ // calculate center and correction
799
+ const originT = origin.scalarAdd(0.5);
800
+ const originCorrection = sizeAfter.multiply(originT);
801
+ const centerCorrection = new Point(
802
+ hasWidth ? bboxSizeAfter.x / 2 : originCorrection.x,
803
+ hasHeight ? bboxSizeAfter.y / 2 : originCorrection.y
804
+ );
805
+ const center = new Point(
806
+ hasX
807
+ ? this.left - (sizeAfter.x + strokeWidthVector.x) * origin.x
808
+ : calculatedCenter.x - centerCorrection.x,
809
+ hasY
810
+ ? this.top - (sizeAfter.y + strokeWidthVector.y) * origin.y
811
+ : calculatedCenter.y - centerCorrection.y
812
+ );
813
+ const offsetCorrection = new Point(
814
+ hasX
815
+ ? center.x - calculatedCenter.x + bboxSizeAfter.x * (hasWidth ? 0.5 : 0)
816
+ : -(hasWidth
817
+ ? (sizeAfter.x - strokeWidthVector.x) * 0.5
818
+ : sizeAfter.x * originT.x),
819
+ hasY
820
+ ? center.y -
821
+ calculatedCenter.y +
822
+ bboxSizeAfter.y * (hasHeight ? 0.5 : 0)
823
+ : -(hasHeight
824
+ ? (sizeAfter.y - strokeWidthVector.y) * 0.5
825
+ : sizeAfter.y * originT.y)
826
+ ).add(rotationCorrection);
827
+ const correction = new Point(
828
+ hasWidth ? -sizeAfter.x / 2 : 0,
829
+ hasHeight ? -sizeAfter.y / 2 : 0
830
+ ).add(offsetCorrection);
831
+
832
+ return {
833
+ centerX: center.x,
834
+ centerY: center.y,
835
+ correctionX: correction.x,
836
+ correctionY: correction.y,
837
+ width: size.x,
838
+ height: size.y,
839
+ };
840
+ }
841
+
842
+ /**
843
+ * Calculate the bbox of objects relative to instance's containing plane
844
+ * @public
845
+ * @param {FabricObject[]} objects
846
+ * @returns {LayoutResult | null} bounding box
847
+ */
848
+ getObjectsBoundingBox(
849
+ objects: FabricObject[],
850
+ ignoreOffset?: boolean
851
+ ): LayoutResult | null {
852
+ if (objects.length === 0) {
853
+ return null;
854
+ }
855
+ let min: Point, max: Point;
856
+ objects.forEach((object, i) => {
857
+ const objCenter = object.getRelativeCenterPoint();
858
+ let sizeVector = object._getTransformedDimensions().scalarDivide(2);
859
+ if (object.angle) {
860
+ const rad = degreesToRadians(object.angle),
861
+ sine = Math.abs(sin(rad)),
862
+ cosine = Math.abs(cos(rad)),
863
+ rx = sizeVector.x * cosine + sizeVector.y * sine,
864
+ ry = sizeVector.x * sine + sizeVector.y * cosine;
865
+ sizeVector = new Point(rx, ry);
866
+ }
867
+ const a = objCenter.subtract(sizeVector);
868
+ const b = objCenter.add(sizeVector);
869
+ if (i === 0) {
870
+ min = new Point(Math.min(a.x, b.x), Math.min(a.y, b.y));
871
+ max = new Point(Math.max(a.x, b.x), Math.max(a.y, b.y));
872
+ } else {
873
+ min.setXY(Math.min(min.x, a.x, b.x), Math.min(min.y, a.y, b.y));
874
+ max.setXY(Math.max(max.x, a.x, b.x), Math.max(max.y, a.y, b.y));
875
+ }
876
+ });
877
+
878
+ const size = max.subtract(min),
879
+ relativeCenter = ignoreOffset
880
+ ? size.scalarDivide(2)
881
+ : min.midPointFrom(max),
882
+ // we send `relativeCenter` up to group's containing plane
883
+ offset = min.transform(this.calcOwnMatrix()),
884
+ center = relativeCenter.transform(this.calcOwnMatrix());
885
+
886
+ return {
887
+ offsetX: offset.x,
888
+ offsetY: offset.y,
889
+ centerX: center.x,
890
+ centerY: center.y,
891
+ width: size.x,
892
+ height: size.y,
893
+ };
894
+ }
895
+
896
+ /**
897
+ * Hook that is called once layout has completed.
898
+ * Provided for layout customization, override if necessary.
899
+ * Complements `getLayoutStrategyResult`, which is called at the beginning of layout.
900
+ * @public
901
+ * @param {LayoutContext} context layout context
902
+ * @param {LayoutResult} result layout result
903
+ */
904
+ // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
905
+ onLayout(context: LayoutContext, result: LayoutResult) {}
906
+
907
+ /**
908
+ *
909
+ * @private
910
+ * @param {'toObject'|'toDatalessObject'} [method]
911
+ * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output
912
+ * @returns {FabricObject[]} serialized objects
913
+ */
914
+ __serializeObjects(
915
+ method: 'toObject' | 'toDatalessObject',
916
+ propertiesToInclude?: string[]
917
+ ) {
918
+ const _includeDefaultValues = this.includeDefaultValues;
919
+ return this._objects
920
+ .filter(function (obj) {
921
+ return !obj.excludeFromExport;
922
+ })
923
+ .map(function (obj) {
924
+ const originalDefaults = obj.includeDefaultValues;
925
+ obj.includeDefaultValues = _includeDefaultValues;
926
+ const data = obj[method || 'toObject'](propertiesToInclude);
927
+ obj.includeDefaultValues = originalDefaults;
928
+ //delete data.version;
929
+ return data;
930
+ });
931
+ }
932
+
933
+ /**
934
+ * Returns object representation of an instance
935
+ * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output
936
+ * @return {Object} object representation of an instance
937
+ */
938
+ toObject(propertiesToInclude: (keyof this)[] = []) {
939
+ const obj = super.toObject([
940
+ 'layout',
941
+ 'subTargetCheck',
942
+ 'interactive',
943
+ ...propertiesToInclude,
944
+ ]);
945
+ obj.objects = this.__serializeObjects('toObject', propertiesToInclude);
946
+ return obj;
947
+ }
948
+
949
+ toString() {
950
+ return `#<Group: (${this.complexity()})>`;
951
+ }
952
+
953
+ dispose() {
954
+ this._activeObjects = [];
955
+ this.forEachObject((object) => {
956
+ this._watchObject(false, object);
957
+ object.dispose();
958
+ });
959
+ super.dispose();
960
+ }
961
+
962
+ /**
963
+ * @private
964
+ */
965
+ _createSVGBgRect(reviver?: (markup: string) => any) {
966
+ if (!this.backgroundColor) {
967
+ return '';
968
+ }
969
+ const fillStroke = Rect.prototype._toSVG.call(this, reviver);
970
+ const commons = fillStroke.indexOf('COMMON_PARTS');
971
+ fillStroke[commons] = 'for="group" ';
972
+ return fillStroke.join('');
973
+ }
974
+
975
+ /**
976
+ * Returns svg representation of an instance
977
+ * @param {Function} [reviver] Method for further parsing of svg representation.
978
+ * @return {String} svg representation of an instance
979
+ */
980
+ _toSVG(reviver?: (markup: string) => any) {
981
+ const svgString = ['<g ', 'COMMON_PARTS', ' >\n'];
982
+ const bg = this._createSVGBgRect(reviver);
983
+ bg && svgString.push('\t\t', bg);
984
+ for (let i = 0; i < this._objects.length; i++) {
985
+ svgString.push('\t\t', this._objects[i].toSVG(reviver));
986
+ }
987
+ svgString.push('</g>\n');
988
+ return svgString;
989
+ }
990
+
991
+ /**
992
+ * Returns styles-string for svg-export, specific version for group
993
+ * @return {String}
994
+ */
995
+ getSvgStyles() {
996
+ const opacity =
997
+ typeof this.opacity !== 'undefined' && this.opacity !== 1
998
+ ? `opacity: ${this.opacity};`
999
+ : '',
1000
+ visibility = this.visible ? '' : ' visibility: hidden;';
1001
+ return [opacity, this.getSvgFilter(), visibility].join('');
1002
+ }
1003
+
1004
+ /**
1005
+ * Returns svg clipPath representation of an instance
1006
+ * @param {Function} [reviver] Method for further parsing of svg representation.
1007
+ * @return {String} svg representation of an instance
1008
+ */
1009
+ toClipPathSVG(reviver?: (markup: string) => any) {
1010
+ const svgString = [];
1011
+ const bg = this._createSVGBgRect(reviver);
1012
+ bg && svgString.push('\t', bg);
1013
+ for (let i = 0; i < this._objects.length; i++) {
1014
+ svgString.push('\t', this._objects[i].toClipPathSVG(reviver));
1015
+ }
1016
+ return this._createBaseClipPathSVGMarkup(svgString, {
1017
+ reviver,
1018
+ });
1019
+ }
1020
+
1021
+ /**
1022
+ * @todo support loading from svg
1023
+ * @private
1024
+ * @static
1025
+ * @memberOf Group
1026
+ * @param {Object} object Object to create a group from
1027
+ * @returns {Promise<Group>}
1028
+ */
1029
+ static fromObject({ objects = [], ...options }) {
1030
+ return Promise.all([
1031
+ enlivenObjects(objects),
1032
+ enlivenObjectEnlivables(options),
1033
+ ]).then(
1034
+ ([objects, hydratedOptions]) =>
1035
+ new this(objects, { ...options, ...hydratedOptions }, true)
1036
+ );
1037
+ }
1038
+ }
1039
+
1040
+ export const groupDefaultValues: Partial<TClassProperties<Group>> = {
1041
+ type: 'group',
1042
+ layout: 'fit-content',
1043
+ strokeWidth: 0,
1044
+ subTargetCheck: false,
1045
+ interactive: false,
1046
+ };
1047
+
1048
+ Object.assign(Group.prototype, {
1049
+ ...groupDefaultValues,
1050
+ stateProperties: [...stateProperties, 'layout'],
1051
+ });
1052
+
1053
+ classRegistry.setClass(Group);