fabric 7.0.0 → 7.2.0

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 (323) hide show
  1. package/.husky/pre-commit +1 -0
  2. package/CHANGELOG.md +21 -0
  3. package/dist/extensions/cropping_controls/croppingControls.d.ts +16 -0
  4. package/dist/extensions/cropping_controls/croppingControls.d.ts.map +1 -0
  5. package/dist/extensions/cropping_controls/croppingHandlers.d.ts +39 -0
  6. package/dist/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -0
  7. package/dist/extensions/cropping_controls/enterCropMode.d.ts +7 -0
  8. package/dist/extensions/cropping_controls/enterCropMode.d.ts.map +1 -0
  9. package/dist/extensions/cropping_controls/renderCornerControl.d.ts +14 -0
  10. package/dist/extensions/cropping_controls/renderCornerControl.d.ts.map +1 -0
  11. package/dist/extensions/index.d.ts +3 -0
  12. package/dist/extensions/index.d.ts.map +1 -1
  13. package/dist/fabric.d.ts +1 -0
  14. package/dist/fabric.d.ts.map +1 -1
  15. package/dist/index.js +628 -537
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.min.js +1 -1
  18. package/dist/index.min.js.map +1 -1
  19. package/dist/index.min.mjs +1 -1
  20. package/dist/index.min.mjs.map +1 -1
  21. package/dist/index.mjs +628 -537
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/index.node.cjs +628 -537
  24. package/dist/index.node.cjs.map +1 -1
  25. package/dist/index.node.mjs +628 -537
  26. package/dist/index.node.mjs.map +1 -1
  27. package/dist/package.json.min.mjs +1 -1
  28. package/dist/package.json.mjs +1 -1
  29. package/dist/src/EventTypeDefs.d.ts +5 -0
  30. package/dist/src/EventTypeDefs.d.ts.map +1 -1
  31. package/dist/src/Pattern/Pattern.d.ts.map +1 -1
  32. package/dist/src/Pattern/Pattern.min.mjs +1 -1
  33. package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
  34. package/dist/src/Pattern/Pattern.mjs +2 -1
  35. package/dist/src/Pattern/Pattern.mjs.map +1 -1
  36. package/dist/src/Shadow.d.ts +1 -1
  37. package/dist/src/Shadow.d.ts.map +1 -1
  38. package/dist/src/Shadow.min.mjs +1 -1
  39. package/dist/src/Shadow.min.mjs.map +1 -1
  40. package/dist/src/Shadow.mjs +5 -4
  41. package/dist/src/Shadow.mjs.map +1 -1
  42. package/dist/src/canvas/CanvasOptions.d.ts.map +1 -1
  43. package/dist/src/canvas/CanvasOptions.min.mjs.map +1 -1
  44. package/dist/src/canvas/CanvasOptions.mjs.map +1 -1
  45. package/dist/src/canvas/SelectableCanvas.d.ts +2 -0
  46. package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
  47. package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
  48. package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
  49. package/dist/src/canvas/SelectableCanvas.mjs +33 -13
  50. package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
  51. package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
  52. package/dist/src/canvas/StaticCanvas.min.mjs +1 -1
  53. package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
  54. package/dist/src/canvas/StaticCanvas.mjs +3 -1
  55. package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
  56. package/dist/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
  57. package/dist/src/canvas/StaticCanvasOptions.min.mjs.map +1 -1
  58. package/dist/src/canvas/StaticCanvasOptions.mjs.map +1 -1
  59. package/dist/src/constants.d.ts +1 -0
  60. package/dist/src/constants.d.ts.map +1 -1
  61. package/dist/src/constants.min.mjs.map +1 -1
  62. package/dist/src/constants.mjs.map +1 -1
  63. package/dist/src/controls/Control.d.ts +22 -1
  64. package/dist/src/controls/Control.d.ts.map +1 -1
  65. package/dist/src/controls/Control.min.mjs +1 -1
  66. package/dist/src/controls/Control.min.mjs.map +1 -1
  67. package/dist/src/controls/Control.mjs +45 -1
  68. package/dist/src/controls/Control.mjs.map +1 -1
  69. package/dist/src/controls/changeWidth.d.ts +22 -0
  70. package/dist/src/controls/changeWidth.d.ts.map +1 -1
  71. package/dist/src/controls/changeWidth.min.mjs +1 -1
  72. package/dist/src/controls/changeWidth.min.mjs.map +1 -1
  73. package/dist/src/controls/changeWidth.mjs +46 -18
  74. package/dist/src/controls/changeWidth.mjs.map +1 -1
  75. package/dist/src/controls/controlRendering.d.ts.map +1 -1
  76. package/dist/src/controls/controlRendering.min.mjs +1 -1
  77. package/dist/src/controls/controlRendering.min.mjs.map +1 -1
  78. package/dist/src/controls/controlRendering.mjs +18 -34
  79. package/dist/src/controls/controlRendering.mjs.map +1 -1
  80. package/dist/src/controls/index.d.ts +2 -1
  81. package/dist/src/controls/index.d.ts.map +1 -1
  82. package/dist/src/controls/index.min.mjs +1 -1
  83. package/dist/src/controls/index.mjs +1 -1
  84. package/dist/src/gradient/Gradient.d.ts.map +1 -1
  85. package/dist/src/gradient/Gradient.min.mjs +1 -1
  86. package/dist/src/gradient/Gradient.min.mjs.map +1 -1
  87. package/dist/src/gradient/Gradient.mjs +19 -6
  88. package/dist/src/gradient/Gradient.mjs.map +1 -1
  89. package/dist/src/shapes/Circle.d.ts.map +1 -1
  90. package/dist/src/shapes/Circle.min.mjs +1 -1
  91. package/dist/src/shapes/Circle.min.mjs.map +1 -1
  92. package/dist/src/shapes/Circle.mjs +10 -7
  93. package/dist/src/shapes/Circle.mjs.map +1 -1
  94. package/dist/src/shapes/Ellipse.d.ts.map +1 -1
  95. package/dist/src/shapes/Ellipse.min.mjs +1 -1
  96. package/dist/src/shapes/Ellipse.min.mjs.map +1 -1
  97. package/dist/src/shapes/Ellipse.mjs +2 -1
  98. package/dist/src/shapes/Ellipse.mjs.map +1 -1
  99. package/dist/src/shapes/Group.d.ts.map +1 -1
  100. package/dist/src/shapes/Group.min.mjs +1 -1
  101. package/dist/src/shapes/Group.min.mjs.map +1 -1
  102. package/dist/src/shapes/Group.mjs +2 -1
  103. package/dist/src/shapes/Group.mjs.map +1 -1
  104. package/dist/src/shapes/IText/IText.d.ts.map +1 -1
  105. package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
  106. package/dist/src/shapes/IText/IText.mjs.map +1 -1
  107. package/dist/src/shapes/Image.d.ts +1 -1
  108. package/dist/src/shapes/Image.d.ts.map +1 -1
  109. package/dist/src/shapes/Image.min.mjs +1 -1
  110. package/dist/src/shapes/Image.min.mjs.map +1 -1
  111. package/dist/src/shapes/Image.mjs +4 -3
  112. package/dist/src/shapes/Image.mjs.map +1 -1
  113. package/dist/src/shapes/Line.d.ts.map +1 -1
  114. package/dist/src/shapes/Line.min.mjs +1 -1
  115. package/dist/src/shapes/Line.min.mjs.map +1 -1
  116. package/dist/src/shapes/Line.mjs +6 -10
  117. package/dist/src/shapes/Line.mjs.map +1 -1
  118. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  119. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs +1 -1
  120. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
  121. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +5 -4
  122. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
  123. package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  124. package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
  125. package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
  126. package/dist/src/shapes/Object/Object.d.ts.map +1 -1
  127. package/dist/src/shapes/Object/Object.min.mjs +1 -1
  128. package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
  129. package/dist/src/shapes/Object/Object.mjs +3 -0
  130. package/dist/src/shapes/Object/Object.mjs.map +1 -1
  131. package/dist/src/shapes/Object/ObjectGeometry.min.mjs +1 -1
  132. package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +1 -1
  133. package/dist/src/shapes/Object/ObjectGeometry.mjs +1 -1
  134. package/dist/src/shapes/Object/ObjectGeometry.mjs.map +1 -1
  135. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
  136. package/dist/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
  137. package/dist/src/shapes/Path.d.ts.map +1 -1
  138. package/dist/src/shapes/Path.min.mjs.map +1 -1
  139. package/dist/src/shapes/Path.mjs +1 -2
  140. package/dist/src/shapes/Path.mjs.map +1 -1
  141. package/dist/src/shapes/Polyline.d.ts.map +1 -1
  142. package/dist/src/shapes/Polyline.min.mjs +1 -1
  143. package/dist/src/shapes/Polyline.min.mjs.map +1 -1
  144. package/dist/src/shapes/Polyline.mjs +10 -6
  145. package/dist/src/shapes/Polyline.mjs.map +1 -1
  146. package/dist/src/shapes/Rect.d.ts.map +1 -1
  147. package/dist/src/shapes/Rect.min.mjs +1 -1
  148. package/dist/src/shapes/Rect.min.mjs.map +1 -1
  149. package/dist/src/shapes/Rect.mjs +2 -1
  150. package/dist/src/shapes/Rect.mjs.map +1 -1
  151. package/dist/src/shapes/Text/StyledText.d.ts.map +1 -1
  152. package/dist/src/shapes/Text/StyledText.min.mjs.map +1 -1
  153. package/dist/src/shapes/Text/StyledText.mjs +0 -3
  154. package/dist/src/shapes/Text/StyledText.mjs.map +1 -1
  155. package/dist/src/shapes/Text/Text.d.ts.map +1 -1
  156. package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
  157. package/dist/src/shapes/Text/Text.mjs.map +1 -1
  158. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  159. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs +1 -1
  160. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
  161. package/dist/src/shapes/Text/TextSVGExportMixin.mjs +5 -6
  162. package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
  163. package/dist/src/shapes/Textbox.d.ts.map +1 -1
  164. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  165. package/dist/src/shapes/Textbox.mjs.map +1 -1
  166. package/dist/src/shapes/Triangle.d.ts.map +1 -1
  167. package/dist/src/shapes/Triangle.min.mjs.map +1 -1
  168. package/dist/src/shapes/Triangle.mjs.map +1 -1
  169. package/dist/src/util/lang_string.d.ts +1 -1
  170. package/dist/src/util/lang_string.d.ts.map +1 -1
  171. package/dist/src/util/lang_string.min.mjs +1 -1
  172. package/dist/src/util/lang_string.min.mjs.map +1 -1
  173. package/dist/src/util/lang_string.mjs +1 -1
  174. package/dist/src/util/lang_string.mjs.map +1 -1
  175. package/dist/src/util/misc/svgParsing.d.ts.map +1 -1
  176. package/dist/src/util/misc/svgParsing.min.mjs +1 -1
  177. package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
  178. package/dist/src/util/misc/svgParsing.mjs +2 -1
  179. package/dist/src/util/misc/svgParsing.mjs.map +1 -1
  180. package/dist-extensions/cropping_controls/croppingControls.mjs +140 -0
  181. package/dist-extensions/cropping_controls/croppingControls.mjs.map +1 -0
  182. package/dist-extensions/cropping_controls/croppingHandlers.mjs +228 -0
  183. package/dist-extensions/cropping_controls/croppingHandlers.mjs.map +1 -0
  184. package/dist-extensions/cropping_controls/enterCropMode.mjs +38 -0
  185. package/dist-extensions/cropping_controls/enterCropMode.mjs.map +1 -0
  186. package/dist-extensions/cropping_controls/renderCornerControl.mjs +45 -0
  187. package/dist-extensions/cropping_controls/renderCornerControl.mjs.map +1 -0
  188. package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts +16 -0
  189. package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts.map +1 -0
  190. package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts +39 -0
  191. package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -0
  192. package/dist-extensions/extensions/cropping_controls/enterCropMode.d.ts +7 -0
  193. package/dist-extensions/extensions/cropping_controls/enterCropMode.d.ts.map +1 -0
  194. package/dist-extensions/extensions/cropping_controls/renderCornerControl.d.ts +14 -0
  195. package/dist-extensions/extensions/cropping_controls/renderCornerControl.d.ts.map +1 -0
  196. package/dist-extensions/extensions/index.d.ts +3 -0
  197. package/dist-extensions/extensions/index.d.ts.map +1 -1
  198. package/dist-extensions/fabric-extensions.min.js +1 -1
  199. package/dist-extensions/fabric-extensions.min.js.map +1 -1
  200. package/dist-extensions/fabric.d.ts +1 -0
  201. package/dist-extensions/fabric.d.ts.map +1 -1
  202. package/dist-extensions/index.mjs +3 -0
  203. package/dist-extensions/index.mjs.map +1 -1
  204. package/dist-extensions/src/EventTypeDefs.d.ts +5 -0
  205. package/dist-extensions/src/EventTypeDefs.d.ts.map +1 -1
  206. package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -1
  207. package/dist-extensions/src/Shadow.d.ts +1 -1
  208. package/dist-extensions/src/Shadow.d.ts.map +1 -1
  209. package/dist-extensions/src/canvas/CanvasOptions.d.ts.map +1 -1
  210. package/dist-extensions/src/canvas/SelectableCanvas.d.ts +2 -0
  211. package/dist-extensions/src/canvas/SelectableCanvas.d.ts.map +1 -1
  212. package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +1 -1
  213. package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
  214. package/dist-extensions/src/constants.d.ts +1 -0
  215. package/dist-extensions/src/constants.d.ts.map +1 -1
  216. package/dist-extensions/src/controls/Control.d.ts +22 -1
  217. package/dist-extensions/src/controls/Control.d.ts.map +1 -1
  218. package/dist-extensions/src/controls/changeWidth.d.ts +22 -0
  219. package/dist-extensions/src/controls/changeWidth.d.ts.map +1 -1
  220. package/dist-extensions/src/controls/controlRendering.d.ts.map +1 -1
  221. package/dist-extensions/src/controls/index.d.ts +2 -1
  222. package/dist-extensions/src/controls/index.d.ts.map +1 -1
  223. package/dist-extensions/src/gradient/Gradient.d.ts.map +1 -1
  224. package/dist-extensions/src/shapes/Circle.d.ts.map +1 -1
  225. package/dist-extensions/src/shapes/Ellipse.d.ts.map +1 -1
  226. package/dist-extensions/src/shapes/Group.d.ts.map +1 -1
  227. package/dist-extensions/src/shapes/IText/IText.d.ts.map +1 -1
  228. package/dist-extensions/src/shapes/Image.d.ts.map +1 -1
  229. package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
  230. package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  231. package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  232. package/dist-extensions/src/shapes/Object/Object.d.ts.map +1 -1
  233. package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
  234. package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
  235. package/dist-extensions/src/shapes/Path.d.ts +1 -1
  236. package/dist-extensions/src/shapes/Path.d.ts.map +1 -1
  237. package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -1
  238. package/dist-extensions/src/shapes/Rect.d.ts.map +1 -1
  239. package/dist-extensions/src/shapes/Text/StyledText.d.ts.map +1 -1
  240. package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
  241. package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  242. package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
  243. package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -1
  244. package/dist-extensions/src/util/lang_string.d.ts +1 -1
  245. package/dist-extensions/src/util/lang_string.d.ts.map +1 -1
  246. package/dist-extensions/src/util/misc/svgParsing.d.ts.map +1 -1
  247. package/eslint.config.mjs +2 -0
  248. package/extensions/cropping_controls/croppingControls.spec.ts +115 -0
  249. package/extensions/cropping_controls/croppingControls.ts +150 -0
  250. package/extensions/cropping_controls/croppingHandlers.spec.ts +579 -0
  251. package/extensions/cropping_controls/croppingHandlers.ts +285 -0
  252. package/extensions/cropping_controls/enterCropMode.ts +30 -0
  253. package/extensions/cropping_controls/renderCornerControl.ts +53 -0
  254. package/extensions/index.ts +9 -0
  255. package/fabric.ts +1 -0
  256. package/package.json +17 -8
  257. package/src/ClassRegistry.spec.ts +18 -19
  258. package/src/EventTypeDefs.ts +15 -11
  259. package/src/Pattern/Pattern.spec.ts +12 -0
  260. package/src/Pattern/Pattern.ts +3 -2
  261. package/src/Shadow.ts +9 -8
  262. package/src/brushes/PencilBrush.spec.ts +11 -11
  263. package/src/canvas/Canvas-dispose.spec.ts +8 -7
  264. package/src/canvas/Canvas.spec.ts +27 -29
  265. package/src/canvas/CanvasOptions.ts +2 -1
  266. package/src/canvas/SelectableCanvas.ts +38 -15
  267. package/src/canvas/StaticCanvas.spec.ts +20 -0
  268. package/src/canvas/StaticCanvas.ts +7 -4
  269. package/src/canvas/StaticCanvasOptions.ts +1 -3
  270. package/src/constants.ts +1 -0
  271. package/src/controls/Control.spec.ts +102 -0
  272. package/src/controls/Control.ts +71 -2
  273. package/src/controls/changeHeight.spec.ts +147 -0
  274. package/src/controls/changeWidth.ts +68 -35
  275. package/src/controls/controlRendering.ts +20 -48
  276. package/src/controls/index.ts +7 -1
  277. package/src/gradient/Gradient.spec.ts +101 -46
  278. package/src/gradient/Gradient.ts +27 -14
  279. package/src/shapes/Circle.spec.ts +10 -39
  280. package/src/shapes/Circle.ts +11 -11
  281. package/src/shapes/Ellipse.spec.ts +8 -37
  282. package/src/shapes/Ellipse.ts +7 -7
  283. package/src/shapes/Group.ts +3 -3
  284. package/src/shapes/IText/IText-click-behavior.spec.ts +36 -49
  285. package/src/shapes/IText/IText.ts +5 -6
  286. package/src/shapes/IText/ITextKeyBehavior.test.ts +0 -1
  287. package/src/shapes/IText/__snapshots__/ITextBehavior.test.ts.snap +6 -6
  288. package/src/shapes/Image.spec.ts +17 -33
  289. package/src/shapes/Image.ts +15 -11
  290. package/src/shapes/Line.spec.ts +4 -30
  291. package/src/shapes/Line.ts +11 -16
  292. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +11 -4
  293. package/src/shapes/Object/InteractiveObject.ts +4 -4
  294. package/src/shapes/Object/Object.ts +6 -5
  295. package/src/shapes/Object/ObjectGeometry.spec.ts +15 -0
  296. package/src/shapes/Object/ObjectGeometry.ts +1 -1
  297. package/src/shapes/Object/objectSvgExport.spec.ts +112 -0
  298. package/src/shapes/Object/types/FabricObjectProps.ts +1 -4
  299. package/src/shapes/Object/types/ObjectProps.ts +1 -3
  300. package/src/shapes/Path.spec.ts +4 -27
  301. package/src/shapes/Path.ts +2 -4
  302. package/src/shapes/Polygon.spec.ts +4 -31
  303. package/src/shapes/Polyline.spec.ts +4 -31
  304. package/src/shapes/Polyline.ts +11 -12
  305. package/src/shapes/Rect.spec.ts +25 -33
  306. package/src/shapes/Rect.ts +7 -7
  307. package/src/shapes/Text/StyledText.ts +0 -3
  308. package/src/shapes/Text/Text.spec.ts +3 -32
  309. package/src/shapes/Text/Text.ts +5 -6
  310. package/src/shapes/Text/TextSVGExportMixin.spec.ts +9 -0
  311. package/src/shapes/Text/TextSVGExportMixin.ts +14 -16
  312. package/src/shapes/Text/__snapshots__/Text.spec.ts.snap +1 -1
  313. package/src/shapes/Text/__snapshots__/TextSVGExportMixin.spec.ts.snap +1 -1
  314. package/src/shapes/Textbox.spec.ts +5 -5
  315. package/src/shapes/Textbox.ts +6 -5
  316. package/src/shapes/Triangle.ts +4 -4
  317. package/src/shapes/__snapshots__/Image.spec.ts.snap +4 -4
  318. package/src/shapes/__snapshots__/Textbox.spec.ts.snap +5 -5
  319. package/src/util/lang_string.ts +3 -2
  320. package/src/util/misc/svgParsing.ts +2 -1
  321. package/tsconfig.spec.json +1 -0
  322. package/vitest.config.ts +12 -2
  323. package/vitest.extend.ts +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"Triangle.d.ts","sourceRoot":"","sources":["../../../src/shapes/Triangle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAGrE,CAAC;AAEF,qBAAa,QAAQ,CACjB,KAAK,SAAS,QAAQ,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACtE,MAAM,SAAS,qBAAqB,GAAG,qBAAqB,EAC5D,SAAS,SAAS,YAAY,GAAG,YAAY,CAE/C,SAAQ,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAC7C,YAAW,iBAAiB;IAE5B,MAAM,CAAC,IAAI,SAAc;IAEzB,MAAM,CAAC,WAAW,uGAAyB;IAE3C,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIzC;;;OAGG;gBACS,OAAO,CAAC,EAAE,KAAK;IAM3B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,wBAAwB;IAarC;;;;OAIG;IACH,MAAM;CAMP"}
1
+ {"version":3,"file":"Triangle.d.ts","sourceRoot":"","sources":["../../../src/shapes/Triangle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAGrE,CAAC;AAEF,qBAAa,QAAQ,CACnB,KAAK,SAAS,QAAQ,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,EACtE,MAAM,SAAS,qBAAqB,GAAG,qBAAqB,EAC5D,SAAS,SAAS,YAAY,GAAG,YAAY,CAE7C,SAAQ,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAC7C,YAAW,iBAAiB;IAE5B,MAAM,CAAC,IAAI,SAAc;IAEzB,MAAM,CAAC,WAAW,uGAAyB;IAE3C,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIzC;;;OAGG;gBACS,OAAO,CAAC,EAAE,KAAK;IAM3B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,wBAAwB;IAarC;;;;OAIG;IACH,MAAM;CAMP"}
@@ -1 +1 @@
1
- {"version":3,"file":"Triangle.min.mjs","sources":["../../../src/shapes/Triangle.ts"],"sourcesContent":["import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial<TClassProperties<Triangle>> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return ['<polygon ', 'COMMON_PARTS', 'points=\"', points, '\" />'];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n"],"names":["triangleDefaultValues","width","height","Triangle","FabricObject","getDefaults","super","ownDefaults","constructor","options","Object","assign","this","setOptions","_render","ctx","widthBy2","heightBy2","beginPath","moveTo","lineTo","closePath","_renderPaintInOrder","_toSVG","_defineProperty","classRegistry","setClass","setSVGClass"],"mappings":"wMAMO,MAAMA,EAA6D,CACxEC,MAAO,IACPC,OAAQ,KAGH,MAAMC,UAKHC,EAOR,kBAAOC,GACL,MAAO,IAAKC,MAAMD,iBAAkBF,EAASI,YAC/C,CAMAC,WAAAA,CAAYC,GACVH,QACAI,OAAOC,OAAOC,KAAMT,EAASI,aAC7BK,KAAKC,WAAWJ,EAClB,CAMAK,OAAAA,CAAQC,GACN,MAAMC,EAAWJ,KAAKX,MAAQ,EAC5BgB,EAAYL,KAAKV,OAAS,EAE5Ba,EAAIG,YACJH,EAAII,QAAQH,EAAUC,GACtBF,EAAIK,OAAO,GAAIH,GACfF,EAAIK,OAAOJ,EAAUC,GACrBF,EAAIM,YAEJT,KAAKU,oBAAoBP,EAC3B,CAOAQ,MAAAA,GACE,MAAMP,EAAWJ,KAAKX,MAAQ,EAC5BgB,EAAYL,KAAKV,OAAS,EAE5B,MAAO,CAAC,YAAa,eAAgB,WAD1B,IAAIc,KAAYC,QAAgBA,KAAaD,KAAYC,IACX,OAC3D,EACDO,EAtDYrB,EAAQ,OAQL,YAAUqB,EARbrB,EAAQ,cAUEH,GA8CvByB,EAAcC,SAASvB,GACvBsB,EAAcE,YAAYxB"}
1
+ {"version":3,"file":"Triangle.min.mjs","sources":["../../../src/shapes/Triangle.ts"],"sourcesContent":["import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial<TClassProperties<Triangle>> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return ['<polygon ', 'COMMON_PARTS', 'points=\"', points, '\" />'];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n"],"names":["triangleDefaultValues","width","height","Triangle","FabricObject","getDefaults","super","ownDefaults","constructor","options","Object","assign","this","setOptions","_render","ctx","widthBy2","heightBy2","beginPath","moveTo","lineTo","closePath","_renderPaintInOrder","_toSVG","_defineProperty","classRegistry","setClass","setSVGClass"],"mappings":"wMAMO,MAAMA,EAA6D,CACxEC,MAAO,IACPC,OAAQ,KAGH,MAAMC,UAKHC,EAOR,kBAAOC,GACL,MAAO,IAAKC,MAAMD,iBAAkBF,EAASI,YAC/C,CAMAC,WAAAA,CAAYC,GACVH,QACAI,OAAOC,OAAOC,KAAMT,EAASI,aAC7BK,KAAKC,WAAWJ,EAClB,CAMAK,OAAAA,CAAQC,GACN,MAAMC,EAAWJ,KAAKX,MAAQ,EAC5BgB,EAAYL,KAAKV,OAAS,EAE5Ba,EAAIG,YACJH,EAAII,QAAQH,EAAUC,GACtBF,EAAIK,OAAO,GAAIH,GACfF,EAAIK,OAAOJ,EAAUC,GACrBF,EAAIM,YAEJT,KAAKU,oBAAoBP,EAC3B,CAOAQ,MAAAA,GACE,MAAMP,EAAWJ,KAAKX,MAAQ,EAC5BgB,EAAYL,KAAKV,OAAS,EAE5B,MAAO,CAAC,YAAa,eAAgB,WAD1B,IAAIc,KAAYC,QAAgBA,KAAaD,KAAYC,IACX,OAC3D,EACDO,EAtDYrB,EAAQ,OAQL,YAAUqB,EARbrB,EAAQ,cAUEH,GA8CvByB,EAAcC,SAASvB,GACvBsB,EAAcE,YAAYxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"Triangle.mjs","sources":["../../../src/shapes/Triangle.ts"],"sourcesContent":["import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial<TClassProperties<Triangle>> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return ['<polygon ', 'COMMON_PARTS', 'points=\"', points, '\" />'];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n"],"names":["triangleDefaultValues","width","height","Triangle","FabricObject","getDefaults","ownDefaults","constructor","options","Object","assign","setOptions","_render","ctx","widthBy2","heightBy2","beginPath","moveTo","lineTo","closePath","_renderPaintInOrder","_toSVG","points","_defineProperty","classRegistry","setClass","setSVGClass"],"mappings":";;;;AAMO,MAAMA,qBAA0D,GAAG;AACxEC,EAAAA,KAAK,EAAE,GAAG;AACVC,EAAAA,MAAM,EAAE;AACV;AAEO,MAAMC,QAAQ,SAKXC,YAAY,CAEtB;EAKE,OAAOC,WAAWA,GAAwB;IACxC,OAAO;AAAE,MAAA,GAAG,KAAK,CAACA,WAAW,EAAE;AAAE,MAAA,GAAGF,QAAQ,CAACG;KAAa;AAC5D,EAAA;;AAEA;AACF;AACA;AACA;EACEC,WAAWA,CAACC,OAAe,EAAE;AAC3B,IAAA,KAAK,EAAE;IACPC,MAAM,CAACC,MAAM,CAAC,IAAI,EAAEP,QAAQ,CAACG,WAAW,CAAC;AACzC,IAAA,IAAI,CAACK,UAAU,CAACH,OAAO,CAAC;AAC1B,EAAA;;AAEA;AACF;AACA;AACA;EACEI,OAAOA,CAACC,GAA6B,EAAE;AACrC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACb,KAAK,GAAG,CAAC;AAC7Bc,MAAAA,SAAS,GAAG,IAAI,CAACb,MAAM,GAAG,CAAC;IAE7BW,GAAG,CAACG,SAAS,EAAE;AACfH,IAAAA,GAAG,CAACI,MAAM,CAAC,CAACH,QAAQ,EAAEC,SAAS,CAAC;AAChCF,IAAAA,GAAG,CAACK,MAAM,CAAC,CAAC,EAAE,CAACH,SAAS,CAAC;AACzBF,IAAAA,GAAG,CAACK,MAAM,CAACJ,QAAQ,EAAEC,SAAS,CAAC;IAC/BF,GAAG,CAACM,SAAS,EAAE;AAEf,IAAA,IAAI,CAACC,mBAAmB,CAACP,GAAG,CAAC;AAC/B,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEQ,EAAAA,MAAMA,GAAG;AACP,IAAA,MAAMP,QAAQ,GAAG,IAAI,CAACb,KAAK,GAAG,CAAC;AAC7Bc,MAAAA,SAAS,GAAG,IAAI,CAACb,MAAM,GAAG,CAAC;AAC3BoB,MAAAA,MAAM,GAAG,CAAA,EAAG,CAACR,QAAQ,CAAA,CAAA,EAAIC,SAAS,CAAA,GAAA,EAAM,CAACA,SAAS,CAAA,CAAA,EAAID,QAAQ,CAAA,CAAA,EAAIC,SAAS,CAAA,CAAE;IAC/E,OAAO,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,EAAEO,MAAM,EAAE,MAAM,CAAC;AAClE,EAAA;AACF;AAACC,eAAA,CAtDYpB,QAAQ,EAAA,MAAA,EAQL,UAAU,CAAA;AAAAoB,eAAA,CARbpB,QAAQ,EAAA,aAAA,EAUEH,qBAAqB,CAAA;AA8C5CwB,aAAa,CAACC,QAAQ,CAACtB,QAAQ,CAAC;AAChCqB,aAAa,CAACE,WAAW,CAACvB,QAAQ,CAAC;;;;"}
1
+ {"version":3,"file":"Triangle.mjs","sources":["../../../src/shapes/Triangle.ts"],"sourcesContent":["import { classRegistry } from '../ClassRegistry';\nimport { FabricObject } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { TClassProperties, TOptions } from '../typedefs';\nimport type { ObjectEvents } from '../EventTypeDefs';\n\nexport const triangleDefaultValues: Partial<TClassProperties<Triangle>> = {\n width: 100,\n height: 100,\n};\n\nexport class Triangle<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedObjectProps = SerializedObjectProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements FabricObjectProps\n{\n static type = 'Triangle';\n\n static ownDefaults = triangleDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...Triangle.ownDefaults };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Triangle.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = `${-widthBy2} ${heightBy2},0 ${-heightBy2},${widthBy2} ${heightBy2}`;\n return ['<polygon ', 'COMMON_PARTS', 'points=\"', points, '\" />'];\n }\n}\n\nclassRegistry.setClass(Triangle);\nclassRegistry.setSVGClass(Triangle);\n"],"names":["triangleDefaultValues","width","height","Triangle","FabricObject","getDefaults","ownDefaults","constructor","options","Object","assign","setOptions","_render","ctx","widthBy2","heightBy2","beginPath","moveTo","lineTo","closePath","_renderPaintInOrder","_toSVG","points","_defineProperty","classRegistry","setClass","setSVGClass"],"mappings":";;;;AAMO,MAAMA,qBAA0D,GAAG;AACxEC,EAAAA,KAAK,EAAE,GAAG;AACVC,EAAAA,MAAM,EAAE;AACV;AAEO,MAAMC,QAAQ,SAKXC,YAAY,CAEtB;EAKE,OAAOC,WAAWA,GAAwB;IACxC,OAAO;AAAE,MAAA,GAAG,KAAK,CAACA,WAAW,EAAE;AAAE,MAAA,GAAGF,QAAQ,CAACG;KAAa;AAC5D,EAAA;;AAEA;AACF;AACA;AACA;EACEC,WAAWA,CAACC,OAAe,EAAE;AAC3B,IAAA,KAAK,EAAE;IACPC,MAAM,CAACC,MAAM,CAAC,IAAI,EAAEP,QAAQ,CAACG,WAAW,CAAC;AACzC,IAAA,IAAI,CAACK,UAAU,CAACH,OAAO,CAAC;AAC1B,EAAA;;AAEA;AACF;AACA;AACA;EACEI,OAAOA,CAACC,GAA6B,EAAE;AACrC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACb,KAAK,GAAG,CAAC;AAC7Bc,MAAAA,SAAS,GAAG,IAAI,CAACb,MAAM,GAAG,CAAC;IAE7BW,GAAG,CAACG,SAAS,EAAE;AACfH,IAAAA,GAAG,CAACI,MAAM,CAAC,CAACH,QAAQ,EAAEC,SAAS,CAAC;AAChCF,IAAAA,GAAG,CAACK,MAAM,CAAC,CAAC,EAAE,CAACH,SAAS,CAAC;AACzBF,IAAAA,GAAG,CAACK,MAAM,CAACJ,QAAQ,EAAEC,SAAS,CAAC;IAC/BF,GAAG,CAACM,SAAS,EAAE;AAEf,IAAA,IAAI,CAACC,mBAAmB,CAACP,GAAG,CAAC;AAC/B,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEQ,EAAAA,MAAMA,GAAG;AACP,IAAA,MAAMP,QAAQ,GAAG,IAAI,CAACb,KAAK,GAAG,CAAC;AAC7Bc,MAAAA,SAAS,GAAG,IAAI,CAACb,MAAM,GAAG,CAAC;AAC3BoB,MAAAA,MAAM,GAAG,CAAA,EAAG,CAACR,QAAQ,CAAA,CAAA,EAAIC,SAAS,CAAA,GAAA,EAAM,CAACA,SAAS,CAAA,CAAA,EAAID,QAAQ,CAAA,CAAA,EAAIC,SAAS,CAAA,CAAE;IAC/E,OAAO,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,EAAEO,MAAM,EAAE,MAAM,CAAC;AAClE,EAAA;AACF;AAACC,eAAA,CAtDYpB,QAAQ,EAAA,MAAA,EAQL,UAAU,CAAA;AAAAoB,eAAA,CARbpB,QAAQ,EAAA,aAAA,EAUEH,qBAAqB,CAAA;AA8C5CwB,aAAa,CAACC,QAAQ,CAACtB,QAAQ,CAAC;AAChCqB,aAAa,CAACE,WAAW,CAACvB,QAAQ,CAAC;;;;"}
@@ -12,7 +12,7 @@ export declare const capitalize: (string: string, firstLetterOnly?: boolean) =>
12
12
  * @param {String} string String to escape
13
13
  * @return {String} Escaped version of a string
14
14
  */
15
- export declare const escapeXml: (string: string) => string;
15
+ export declare const escapeXml: (stringOrNumber: string | number) => string;
16
16
  /**
17
17
  * Divide a string in the user perceived single units
18
18
  * @param {String} textstring String to escape
@@ -1 +1 @@
1
- {"version":3,"file":"lang_string.d.ts","sourceRoot":"","sources":["../../../src/util/lang_string.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,yBAAuB,KAAG,MAGjE,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,KAAG,MAMjB,CAAC;AAgB3B;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,YAAY,MAAM,KAAG,MAAM,EASxD,CAAC"}
1
+ {"version":3,"file":"lang_string.d.ts","sourceRoot":"","sources":["../../../src/util/lang_string.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,yBAAuB,KAAG,MAGjE,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,gBAAgB,MAAM,GAAG,MAAM,KAAG,MAOlC,CAAC;AAgB3B;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,YAAY,MAAM,KAAG,MAAM,EASxD,CAAC"}
@@ -1,2 +1,2 @@
1
- import{getFabricWindow as r}from"../env/index.min.mjs";const t=function(r){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return`${r.charAt(0).toUpperCase()}${t?r.slice(1):r.slice(1).toLowerCase()}`},e=r=>r.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;");let o;const n=t=>{if(o||o||(o="Intl"in r()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),o){const r=o.segment(t);return Array.from(r).map(r=>{let{segment:t}=r;return t})}return i(t)},i=r=>{const t=[];for(let e,o=0;o<r.length;o++)!1!==(e=g(r,o))&&t.push(e);return t},g=(r,t)=>{const e=r.charCodeAt(t);if(isNaN(e))return"";if(e<55296||e>57343)return r.charAt(t);if(55296<=e&&e<=56319){if(r.length<=t+1)throw"High surrogate without following low surrogate";const e=r.charCodeAt(t+1);if(56320>e||e>57343)throw"High surrogate without following low surrogate";return r.charAt(t)+r.charAt(t+1)}if(0===t)throw"Low surrogate without preceding high surrogate";const o=r.charCodeAt(t-1);if(55296>o||o>56319)throw"Low surrogate without preceding high surrogate";return!1};export{t as capitalize,e as escapeXml,n as graphemeSplit};
1
+ import{getFabricWindow as t}from"../env/index.min.mjs";const r=function(t){let r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return`${t.charAt(0).toUpperCase()}${r?t.slice(1):t.slice(1).toLowerCase()}`},e=t=>t.toString().replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;");let o;const n=r=>{if(o||o||(o="Intl"in t()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),o){const t=o.segment(r);return Array.from(t).map(t=>{let{segment:r}=t;return r})}return i(r)},i=t=>{const r=[];for(let e,o=0;o<t.length;o++)!1!==(e=g(t,o))&&r.push(e);return r},g=(t,r)=>{const e=t.charCodeAt(r);if(isNaN(e))return"";if(e<55296||e>57343)return t.charAt(r);if(55296<=e&&e<=56319){if(t.length<=r+1)throw"High surrogate without following low surrogate";const e=t.charCodeAt(r+1);if(56320>e||e>57343)throw"High surrogate without following low surrogate";return t.charAt(r)+t.charAt(r+1)}if(0===r)throw"Low surrogate without preceding high surrogate";const o=t.charCodeAt(r-1);if(55296>o||o>56319)throw"Low surrogate without preceding high surrogate";return!1};export{r as capitalize,e as escapeXml,n as graphemeSplit};
2
2
  //# sourceMappingURL=lang_string.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"lang_string.min.mjs","sources":["../../../src/util/lang_string.ts"],"sourcesContent":["import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n"],"names":["capitalize","string","firstLetterOnly","arguments","length","undefined","charAt","toUpperCase","slice","toLowerCase","escapeXml","replace","segmenter","graphemeSplit","textstring","getFabricWindow","Intl","Segmenter","granularity","segments","segment","Array","from","map","_ref","graphemeSplitImpl","graphemes","chr","i","getWholeChar","push","str","code","charCodeAt","isNaN","next","prev"],"mappings":"uDAUO,MAAMA,EAAa,SAACC,GAAc,IAAEC,EAAeC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAAQ,MAChE,GAAGF,EAAOK,OAAO,GAAGC,gBAClBL,EAAkBD,EAAOO,MAAM,GAAKP,EAAOO,MAAM,GAAGC,eACpD,EAOSC,EAAaT,GACxBA,EACGU,QAAQ,KAAM,SACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QAEnB,IAAIC,EAEJ,MAiBaC,EAAiBC,IAE5B,GADAF,GAjBKA,IACHA,EACE,SAAUG,KACV,cAAeC,MACf,IAAIA,KAAKC,eAAUZ,EAAW,CAC5Ba,YAAa,cAafN,EAAW,CACb,MAAMO,EAAWP,EAAUQ,QAAQN,GACnC,OAAOO,MAAMC,KAAKH,GAAUI,IAAIC,IAAA,IAACJ,QAAEA,GAASI,EAAA,OAAKJ,GACnD,CAGA,OAAOK,EAAkBX,IAGrBW,EAAqBX,IACzB,MAAMY,EAAsB,GAC5B,IAAK,IAAWC,EAAPC,EAAI,EAAQA,EAAId,EAAWV,OAAQwB,KACE,KAAvCD,EAAME,EAAaf,EAAYc,KAGpCF,EAAUI,KAAKH,GAEjB,OAAOD,GAIHG,EAAeA,CAACE,EAAaH,KACjC,MAAMI,EAAOD,EAAIE,WAAWL,GAC5B,GAAIM,MAAMF,GACR,MAAO,GAET,GAAIA,EAAO,OAAUA,EAAO,MAC1B,OAAOD,EAAIzB,OAAOsB,GAKpB,GAAI,OAAUI,GAAQA,GAAQ,MAAQ,CACpC,GAAID,EAAI3B,QAAUwB,EAAI,EACpB,KAAM,iDAER,MAAMO,EAAOJ,EAAIE,WAAWL,EAAI,GAChC,GAAI,MAASO,GAAQA,EAAO,MAC1B,KAAM,iDAER,OAAOJ,EAAIzB,OAAOsB,GAAKG,EAAIzB,OAAOsB,EAAI,EACxC,CAEA,GAAU,IAANA,EACF,KAAM,iDAER,MAAMQ,EAAOL,EAAIE,WAAWL,EAAI,GAIhC,GAAI,MAASQ,GAAQA,EAAO,MAC1B,KAAM,iDAIR,OAAO"}
1
+ {"version":3,"file":"lang_string.min.mjs","sources":["../../../src/util/lang_string.ts"],"sourcesContent":["import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (stringOrNumber: string | number): string =>\n stringOrNumber\n .toString()\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n"],"names":["capitalize","string","firstLetterOnly","arguments","length","undefined","charAt","toUpperCase","slice","toLowerCase","escapeXml","stringOrNumber","toString","replace","segmenter","graphemeSplit","textstring","getFabricWindow","Intl","Segmenter","granularity","segments","segment","Array","from","map","_ref","graphemeSplitImpl","graphemes","chr","i","getWholeChar","push","str","code","charCodeAt","isNaN","next","prev"],"mappings":"uDAUO,MAAMA,EAAa,SAACC,GAAc,IAAEC,EAAeC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAAQ,MAChE,GAAGF,EAAOK,OAAO,GAAGC,gBAClBL,EAAkBD,EAAOO,MAAM,GAAKP,EAAOO,MAAM,GAAGC,eACpD,EAOSC,EAAaC,GACxBA,EACGC,WACAC,QAAQ,KAAM,SACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QAEnB,IAAIC,EAEJ,MAiBaC,EAAiBC,IAE5B,GADAF,GAjBKA,IACHA,EACE,SAAUG,KACV,cAAeC,MACf,IAAIA,KAAKC,eAAUd,EAAW,CAC5Be,YAAa,cAafN,EAAW,CACb,MAAMO,EAAWP,EAAUQ,QAAQN,GACnC,OAAOO,MAAMC,KAAKH,GAAUI,IAAIC,IAAA,IAACJ,QAAEA,GAASI,EAAA,OAAKJ,GACnD,CAGA,OAAOK,EAAkBX,IAGrBW,EAAqBX,IACzB,MAAMY,EAAsB,GAC5B,IAAK,IAAWC,EAAPC,EAAI,EAAQA,EAAId,EAAWZ,OAAQ0B,KACE,KAAvCD,EAAME,EAAaf,EAAYc,KAGpCF,EAAUI,KAAKH,GAEjB,OAAOD,GAIHG,EAAeA,CAACE,EAAaH,KACjC,MAAMI,EAAOD,EAAIE,WAAWL,GAC5B,GAAIM,MAAMF,GACR,MAAO,GAET,GAAIA,EAAO,OAAUA,EAAO,MAC1B,OAAOD,EAAI3B,OAAOwB,GAKpB,GAAI,OAAUI,GAAQA,GAAQ,MAAQ,CACpC,GAAID,EAAI7B,QAAU0B,EAAI,EACpB,KAAM,iDAER,MAAMO,EAAOJ,EAAIE,WAAWL,EAAI,GAChC,GAAI,MAASO,GAAQA,EAAO,MAC1B,KAAM,iDAER,OAAOJ,EAAI3B,OAAOwB,GAAKG,EAAI3B,OAAOwB,EAAI,EACxC,CAEA,GAAU,IAANA,EACF,KAAM,iDAER,MAAMQ,EAAOL,EAAIE,WAAWL,EAAI,GAIhC,GAAI,MAASQ,GAAQA,EAAO,MAC1B,KAAM,iDAIR,OAAO"}
@@ -18,7 +18,7 @@ const capitalize = function (string) {
18
18
  * @param {String} string String to escape
19
19
  * @return {String} Escaped version of a string
20
20
  */
21
- const escapeXml = string => string.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&apos;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
21
+ const escapeXml = stringOrNumber => stringOrNumber.toString().replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&apos;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
22
22
  let segmenter;
23
23
  const getSegmenter = () => {
24
24
  if (!segmenter) {
@@ -1 +1 @@
1
- {"version":3,"file":"lang_string.mjs","sources":["../../../src/util/lang_string.ts"],"sourcesContent":["import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (string: string): string =>\n string\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n"],"names":["capitalize","string","firstLetterOnly","arguments","length","undefined","charAt","toUpperCase","slice","toLowerCase","escapeXml","replace","segmenter","getSegmenter","getFabricWindow","Intl","Segmenter","granularity","graphemeSplit","textstring","segments","segment","Array","from","map","_ref","graphemeSplitImpl","graphemes","i","chr","getWholeChar","push","str","code","charCodeAt","isNaN","next","prev"],"mappings":"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"}
1
+ {"version":3,"file":"lang_string.mjs","sources":["../../../src/util/lang_string.ts"],"sourcesContent":["import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (stringOrNumber: string | number): string =>\n stringOrNumber\n .toString()\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n"],"names":["capitalize","string","firstLetterOnly","arguments","length","undefined","charAt","toUpperCase","slice","toLowerCase","escapeXml","stringOrNumber","toString","replace","segmenter","getSegmenter","getFabricWindow","Intl","Segmenter","granularity","graphemeSplit","textstring","segments","segment","Array","from","map","_ref","graphemeSplitImpl","graphemes","i","chr","getWholeChar","push","str","code","charCodeAt","isNaN","next","prev"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"svgParsing.d.ts","sourceRoot":"","sources":["../../../../src/util/misc/svgParsing.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAoB,MAAM,gBAAgB,CAAC;AAG9E;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,cAAc,aA2BpD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,iBAAgC,WA0BxE,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAaF;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,GAC5C,WAAW,MAAM,KAChB,iBAWF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,QAAQ,GAAG,EACX,qBAAkB,WA0BnB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,EACb,8BAA8B,KAAK,EACnC,kBAAsC,WAOvC,CAAC"}
1
+ {"version":3,"file":"svgParsing.d.ts","sourceRoot":"","sources":["../../../../src/util/misc/svgParsing.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAoB,MAAM,gBAAgB,CAAC;AAI9E;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,cAAc,aA2BpD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,iBAAgC,WA0BxE,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAaF;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,GAC5C,WAAW,MAAM,KAChB,iBAWF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,QAAQ,GAAG,EACX,qBAAkB,WA0BnB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,EACb,8BAA8B,KAAK,EACnC,kBAAsC,WAOvC,CAAC"}
@@ -1,2 +1,2 @@
1
- import{Color as t}from"../../color/Color.min.mjs";import{config as e}from"../../config.min.mjs";import{DEFAULT_SVG_FONT_SIZE as r,FILL as n,NONE as i}from"../../constants.min.mjs";import{toFixed as o}from"./toFixed.min.mjs";const c=t=>{const e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},s=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r;const i=/\D{0,2}$/.exec(t),o=parseFloat(t),c=e.DPI;switch(null==i?void 0:i[0]){case"mm":return o*c/25.4;case"cm":return o*c/2.54;case"in":return o*c;case"pt":return o*c/72;case"pc":return o*c/72*12;case"em":return o*n;default:return o}},a=t=>{const[e,r]=t.trim().split(" "),[n,o]=(c=e)&&c!==i?[c.slice(1,4),c.slice(5,8)]:c===i?[c,c]:["Mid","Mid"];var c;return{meetOrSlice:r||"meet",alignX:n,alignY:o}},l=function(e,r){let n,i,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(r)if(r.toLive)n=`url(#SVGID_${r.id})`;else{const e=new t(r),o=e.getAlpha();n=e.toRgb(),1!==o&&(i=o.toString())}else n="none";return o?`${e}: ${n}; ${i?`${e}-opacity: ${i}; `:""}`:`${e}="${n}" ${i?`${e}-opacity="${i}" `:""}`},m=function(t,r){let{left:i,top:c,width:s,height:a}=r,m=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.NUM_FRACTION_DIGITS;const u=l(n,t,!1),[d,f,p,$]=[i,c,s,a].map(t=>o(t,m));return`<rect ${u} x="${d}" y="${f}" width="${p}" height="${$}"></rect>`};export{l as colorPropToSVG,m as createSVGRect,c as getSvgAttributes,a as parsePreserveAspectRatioAttribute,s as parseUnit};
1
+ import{Color as t}from"../../color/Color.min.mjs";import{config as e}from"../../config.min.mjs";import{DEFAULT_SVG_FONT_SIZE as r,FILL as n,NONE as i}from"../../constants.min.mjs";import{escapeXml as o}from"../lang_string.min.mjs";import{toFixed as c}from"./toFixed.min.mjs";const s=t=>{const e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},a=function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r;const i=/\D{0,2}$/.exec(t),o=parseFloat(t),c=e.DPI;switch(null==i?void 0:i[0]){case"mm":return o*c/25.4;case"cm":return o*c/2.54;case"in":return o*c;case"pt":return o*c/72;case"pc":return o*c/72*12;case"em":return o*n;default:return o}},m=t=>{const[e,r]=t.trim().split(" "),[n,o]=(c=e)&&c!==i?[c.slice(1,4),c.slice(5,8)]:c===i?[c,c]:["Mid","Mid"];var c;return{meetOrSlice:r||"meet",alignX:n,alignY:o}},l=function(e,r){let n,i,c=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(r)if(r.toLive)n=`url(#SVGID_${o(r.id)})`;else{const e=new t(r),o=e.getAlpha();n=e.toRgb(),1!==o&&(i=o.toString())}else n="none";return c?`${e}: ${n}; ${i?`${e}-opacity: ${i}; `:""}`:`${e}="${n}" ${i?`${e}-opacity="${i}" `:""}`},u=function(t,r){let{left:i,top:o,width:s,height:a}=r,m=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.NUM_FRACTION_DIGITS;const u=l(n,t,!1),[d,f,p,g]=[i,o,s,a].map(t=>c(t,m));return`<rect ${u} x="${d}" y="${f}" width="${p}" height="${g}"></rect>`};export{l as colorPropToSVG,u as createSVGRect,s as getSvgAttributes,m as parsePreserveAspectRatioAttribute,a as parseUnit};
2
2
  //# sourceMappingURL=svgParsing.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"svgParsing.min.mjs","sources":["../../../../src/util/misc/svgParsing.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return `<rect ${svgColor} x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"></rect>`;\n};\n"],"names":["getSvgAttributes","type","commonAttributes","concat","parseUnit","value","fontSize","arguments","length","undefined","DEFAULT_SVG_FONT_SIZE","unit","exec","number","parseFloat","dpi","config","DPI","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","split","alignX","alignY","align","NONE","slice","meetOrSlice","colorPropToSVG","prop","colorValue","opacityValue","inlineStyle","toLive","id","color","Color","opacity","getAlpha","toRgb","toString","createSVGRect","_ref","left","top","width","height","precision","NUM_FRACTION_DIGITS","svgColor","FILL","x","y","w","h","map","toFixed"],"mappings":"gOAWO,MAAMA,EAAoBC,IAC/B,MAAMC,EAAmB,CAAC,sBAAuB,QAAS,KAAM,SAChE,OAAQD,GACN,IAAK,iBACH,OAAOC,EAAiBC,OAAO,CAC7B,KACA,KACA,KACA,KACA,gBACA,sBAEJ,IAAK,iBACH,OAAOD,EAAiBC,OAAO,CAC7B,gBACA,oBACA,KACA,KACA,IACA,KACA,KACA,OAEJ,IAAK,OACH,OAAOD,EAAiBC,OAAO,CAAC,SAAU,aAAc,iBAE5D,OAAOD,GAUIE,EAAY,SAACC,GAAoD,IAArCC,EAAQC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,EAClD,MAAMC,EAAO,WAAWC,KAAKP,GAC3BQ,EAASC,WAAWT,GAChBU,EAAMC,EAAOC,IACnB,OAAQN,eAAAA,EAAO,IACb,IAAK,KACH,OAAQE,EAASE,EAAO,KAE1B,IAAK,KACH,OAAQF,EAASE,EAAO,KAE1B,IAAK,KACH,OAAOF,EAASE,EAElB,IAAK,KACH,OAAQF,EAASE,EAAO,GAE1B,IAAK,KACH,OAASF,EAASE,EAAO,GAAM,GAEjC,IAAK,KACH,OAAOF,EAASP,EAElB,QACE,OAAOO,EAEb,EA6BaK,EACXC,IAEA,MAAOC,EAAWC,GAAcF,EAAUG,OAAOC,MAAM,MAIhDC,EAAQC,IAvBGC,EAuBkBN,IArBvBM,IAAUC,EACd,CAACD,EAAME,MAAM,EAAG,GAAiBF,EAAME,MAAM,EAAG,IAC9CF,IAAUC,EACZ,CAACD,EAAOA,GAEV,CAAC,MAAO,OAPGA,MAwBlB,MAAO,CACLG,YAAaR,GAAc,OAC3BG,SACAC,WAYSK,EAAiB,SAC5BC,EACA1B,GAEG,IACC2B,EACAC,EAHJC,IAAW3B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAIX,GAAKF,EAEE,GAAIA,EAAM8B,OACfH,EAAa,cAAc3B,EAAM+B,UAC5B,CACL,MAAMC,EAAQ,IAAIC,EAAMjC,GACtBkC,EAAUF,EAAMG,WAElBR,EAAaK,EAAMI,QACH,IAAZF,IACFN,EAAeM,EAAQG,WAE3B,MAXEV,EAAa,OAYf,OAAIE,EACK,GAAGH,MAASC,MACjBC,EAAe,GAAGF,cAAiBE,MAAmB,KAGjD,GAAGF,MAASC,MACjBC,EAAe,GAAGF,cAAiBE,MAAmB,IAG5D,EAEaU,EAAgB,SAC3BN,EAAaO,GAGV,IAFHC,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,GAAeJ,EACnCK,EAAS1C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGS,EAAOkC,oBAEnB,MAAMC,EAAWrB,EAAesB,EAAMf,GAAO,IACtCgB,EAAGC,EAAGC,EAAGC,GAAK,CAACX,EAAMC,EAAKC,EAAOC,GAAQS,IAAKpD,GACnDqD,EAAQrD,EAAO4C,IAEjB,MAAO,SAASE,QAAeE,SAASC,aAAaC,cAAcC,YACrE"}
1
+ {"version":3,"file":"svgParsing.min.mjs","sources":["../../../../src/util/misc/svgParsing.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { escapeXml } from '../lang_string';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${escapeXml(value.id)})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return `<rect ${svgColor} x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"></rect>`;\n};\n"],"names":["getSvgAttributes","type","commonAttributes","concat","parseUnit","value","fontSize","arguments","length","undefined","DEFAULT_SVG_FONT_SIZE","unit","exec","number","parseFloat","dpi","config","DPI","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","split","alignX","alignY","align","NONE","slice","meetOrSlice","colorPropToSVG","prop","colorValue","opacityValue","inlineStyle","toLive","escapeXml","id","color","Color","opacity","getAlpha","toRgb","toString","createSVGRect","_ref","left","top","width","height","precision","NUM_FRACTION_DIGITS","svgColor","FILL","x","y","w","h","map","toFixed"],"mappings":"mRAYO,MAAMA,EAAoBC,IAC/B,MAAMC,EAAmB,CAAC,sBAAuB,QAAS,KAAM,SAChE,OAAQD,GACN,IAAK,iBACH,OAAOC,EAAiBC,OAAO,CAC7B,KACA,KACA,KACA,KACA,gBACA,sBAEJ,IAAK,iBACH,OAAOD,EAAiBC,OAAO,CAC7B,gBACA,oBACA,KACA,KACA,IACA,KACA,KACA,OAEJ,IAAK,OACH,OAAOD,EAAiBC,OAAO,CAAC,SAAU,aAAc,iBAE5D,OAAOD,GAUIE,EAAY,SAACC,GAAoD,IAArCC,EAAQC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,EAClD,MAAMC,EAAO,WAAWC,KAAKP,GAC3BQ,EAASC,WAAWT,GAChBU,EAAMC,EAAOC,IACnB,OAAQN,eAAAA,EAAO,IACb,IAAK,KACH,OAAQE,EAASE,EAAO,KAE1B,IAAK,KACH,OAAQF,EAASE,EAAO,KAE1B,IAAK,KACH,OAAOF,EAASE,EAElB,IAAK,KACH,OAAQF,EAASE,EAAO,GAE1B,IAAK,KACH,OAASF,EAASE,EAAO,GAAM,GAEjC,IAAK,KACH,OAAOF,EAASP,EAElB,QACE,OAAOO,EAEb,EA6BaK,EACXC,IAEA,MAAOC,EAAWC,GAAcF,EAAUG,OAAOC,MAAM,MAIhDC,EAAQC,IAvBGC,EAuBkBN,IArBvBM,IAAUC,EACd,CAACD,EAAME,MAAM,EAAG,GAAiBF,EAAME,MAAM,EAAG,IAC9CF,IAAUC,EACZ,CAACD,EAAOA,GAEV,CAAC,MAAO,OAPGA,MAwBlB,MAAO,CACLG,YAAaR,GAAc,OAC3BG,SACAC,WAYSK,EAAiB,SAC5BC,EACA1B,GAEG,IACC2B,EACAC,EAHJC,IAAW3B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAIX,GAAKF,EAEE,GAAIA,EAAM8B,OACfH,EAAa,cAAcI,EAAU/B,EAAMgC,WACtC,CACL,MAAMC,EAAQ,IAAIC,EAAMlC,GACtBmC,EAAUF,EAAMG,WAElBT,EAAaM,EAAMI,QACH,IAAZF,IACFP,EAAeO,EAAQG,WAE3B,MAXEX,EAAa,OAYf,OAAIE,EACK,GAAGH,MAASC,MACjBC,EAAe,GAAGF,cAAiBE,MAAmB,KAGjD,GAAGF,MAASC,MACjBC,EAAe,GAAGF,cAAiBE,MAAmB,IAG5D,EAEaW,EAAgB,SAC3BN,EAAaO,GAGV,IAFHC,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,GAAeJ,EACnCK,EAAS3C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGS,EAAOmC,oBAEnB,MAAMC,EAAWtB,EAAeuB,EAAMf,GAAO,IACtCgB,EAAGC,EAAGC,EAAGC,GAAK,CAACX,EAAMC,EAAKC,EAAOC,GAAQS,IAAKrD,GACnDsD,EAAQtD,EAAO6C,IAEjB,MAAO,SAASE,QAAeE,SAASC,aAAaC,cAAcC,YACrE"}
@@ -1,6 +1,7 @@
1
1
  import { Color } from '../../color/Color.mjs';
2
2
  import { config } from '../../config.mjs';
3
3
  import { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants.mjs';
4
+ import { escapeXml } from '../lang_string.mjs';
4
5
  import { toFixed } from './toFixed.mjs';
5
6
 
6
7
  /**
@@ -96,7 +97,7 @@ const colorPropToSVG = function (prop, value) {
96
97
  if (!value) {
97
98
  colorValue = 'none';
98
99
  } else if (value.toLive) {
99
- colorValue = `url(#SVGID_${value.id})`;
100
+ colorValue = `url(#SVGID_${escapeXml(value.id)})`;
100
101
  } else {
101
102
  const color = new Color(value),
102
103
  opacity = color.getAlpha();
@@ -1 +1 @@
1
- {"version":3,"file":"svgParsing.mjs","sources":["../../../../src/util/misc/svgParsing.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return `<rect ${svgColor} x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"></rect>`;\n};\n"],"names":["getSvgAttributes","type","commonAttributes","concat","parseUnit","value","fontSize","arguments","length","undefined","DEFAULT_SVG_FONT_SIZE","unit","exec","number","parseFloat","dpi","config","DPI","parseAlign","align","NONE","slice","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","split","alignX","alignY","meetOrSlice","colorPropToSVG","prop","inlineStyle","colorValue","opacityValue","toLive","id","color","Color","opacity","getAlpha","toRgb","toString","createSVGRect","_ref","left","top","width","height","precision","NUM_FRACTION_DIGITS","svgColor","FILL","x","y","w","h","map","toFixed"],"mappings":"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"}
1
+ {"version":3,"file":"svgParsing.mjs","sources":["../../../../src/util/misc/svgParsing.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type { TBBox, SVGElementName, SupportedSVGUnit } from '../../typedefs';\nimport { escapeXml } from '../lang_string';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${escapeXml(value.id)})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return `<rect ${svgColor} x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"></rect>`;\n};\n"],"names":["getSvgAttributes","type","commonAttributes","concat","parseUnit","value","fontSize","arguments","length","undefined","DEFAULT_SVG_FONT_SIZE","unit","exec","number","parseFloat","dpi","config","DPI","parseAlign","align","NONE","slice","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","split","alignX","alignY","meetOrSlice","colorPropToSVG","prop","inlineStyle","colorValue","opacityValue","toLive","escapeXml","id","color","Color","opacity","getAlpha","toRgb","toString","createSVGRect","_ref","left","top","width","height","precision","NUM_FRACTION_DIGITS","svgColor","FILL","x","y","w","h","map","toFixed"],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import { controlsUtils, Control } from 'fabric';
2
+ import { changeCropHeight, changeCropWidth, changeCropX, changeCropY, scaleEquallyCropGenerator, ghostScalePositionHandler } from './croppingHandlers.mjs';
3
+ import { renderCornerControl } from './renderCornerControl.mjs';
4
+
5
+ const {
6
+ scaleCursorStyleHandler
7
+ } = controlsUtils;
8
+ const cropActionName = () => 'crop';
9
+ // use this function if you want to generate new controls for every instance
10
+ const createImageCroppingControls = () => ({
11
+ // scaling image
12
+ tls: new Control({
13
+ x: -0.5,
14
+ y: -0.5,
15
+ cursorStyleHandler: scaleCursorStyleHandler,
16
+ positionHandler: ghostScalePositionHandler,
17
+ actionHandler: scaleEquallyCropGenerator(-0.5, -0.5)
18
+ }),
19
+ brs: new Control({
20
+ x: 0.5,
21
+ y: 0.5,
22
+ cursorStyleHandler: scaleCursorStyleHandler,
23
+ positionHandler: ghostScalePositionHandler,
24
+ actionHandler: scaleEquallyCropGenerator(0.5, 0.5)
25
+ }),
26
+ trs: new Control({
27
+ x: 0.5,
28
+ y: -0.5,
29
+ cursorStyleHandler: scaleCursorStyleHandler,
30
+ positionHandler: ghostScalePositionHandler,
31
+ actionHandler: scaleEquallyCropGenerator(0.5, -0.5)
32
+ }),
33
+ bls: new Control({
34
+ x: -0.5,
35
+ y: 0.5,
36
+ cursorStyleHandler: scaleCursorStyleHandler,
37
+ positionHandler: ghostScalePositionHandler,
38
+ actionHandler: scaleEquallyCropGenerator(-0.5, 0.5)
39
+ }),
40
+ // cropping image
41
+ mlc: new Control({
42
+ x: -0.5,
43
+ y: 0,
44
+ sizeX: 4,
45
+ sizeY: 20,
46
+ cursorStyleHandler: scaleCursorStyleHandler,
47
+ actionHandler: changeCropX,
48
+ getActionName: cropActionName
49
+ }),
50
+ mrc: new Control({
51
+ x: 0.5,
52
+ y: 0,
53
+ sizeX: 4,
54
+ sizeY: 20,
55
+ cursorStyleHandler: scaleCursorStyleHandler,
56
+ actionHandler: changeCropWidth,
57
+ getActionName: cropActionName
58
+ }),
59
+ mbc: new Control({
60
+ x: 0,
61
+ y: 0.5,
62
+ sizeX: 20,
63
+ sizeY: 4,
64
+ cursorStyleHandler: scaleCursorStyleHandler,
65
+ actionHandler: changeCropHeight,
66
+ getActionName: cropActionName
67
+ }),
68
+ mtc: new Control({
69
+ x: 0,
70
+ y: -0.5,
71
+ sizeX: 20,
72
+ sizeY: 4,
73
+ cursorStyleHandler: scaleCursorStyleHandler,
74
+ actionHandler: changeCropY,
75
+ getActionName: cropActionName
76
+ }),
77
+ tlc: new Control({
78
+ angle: 0,
79
+ x: -0.5,
80
+ y: -0.5,
81
+ sizeX: 20,
82
+ sizeY: 4,
83
+ render: renderCornerControl,
84
+ cursorStyleHandler: scaleCursorStyleHandler,
85
+ actionHandler: function () {
86
+ const cropX = changeCropX(...arguments);
87
+ const cropY = changeCropY(...arguments);
88
+ return cropX || cropY;
89
+ },
90
+ getActionName: cropActionName
91
+ }),
92
+ trc: new Control({
93
+ angle: 90,
94
+ x: 0.5,
95
+ y: -0.5,
96
+ sizeX: 20,
97
+ sizeY: 4,
98
+ render: renderCornerControl,
99
+ cursorStyleHandler: scaleCursorStyleHandler,
100
+ actionHandler: function () {
101
+ const width = changeCropWidth(...arguments);
102
+ const cropY = changeCropY(...arguments);
103
+ return width || cropY;
104
+ },
105
+ getActionName: cropActionName
106
+ }),
107
+ blc: new Control({
108
+ angle: 270,
109
+ x: -0.5,
110
+ y: 0.5,
111
+ sizeX: 20,
112
+ sizeY: 4,
113
+ render: renderCornerControl,
114
+ cursorStyleHandler: scaleCursorStyleHandler,
115
+ actionHandler: function () {
116
+ const height = changeCropHeight(...arguments);
117
+ const cropX = changeCropX(...arguments);
118
+ return height || cropX;
119
+ },
120
+ getActionName: cropActionName
121
+ }),
122
+ brc: new Control({
123
+ angle: 180,
124
+ x: 0.5,
125
+ y: 0.5,
126
+ sizeX: 20,
127
+ sizeY: 4,
128
+ render: renderCornerControl,
129
+ cursorStyleHandler: scaleCursorStyleHandler,
130
+ actionHandler: function () {
131
+ const height = changeCropHeight(...arguments);
132
+ const width = changeCropWidth(...arguments);
133
+ return height || width;
134
+ },
135
+ getActionName: cropActionName
136
+ })
137
+ });
138
+
139
+ export { createImageCroppingControls };
140
+ //# sourceMappingURL=croppingControls.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"croppingControls.mjs","sources":["../../extensions/cropping_controls/croppingControls.ts"],"sourcesContent":["import { Control, controlsUtils } from 'fabric';\nimport {\n changeCropHeight,\n changeCropWidth,\n changeCropX,\n changeCropY,\n ghostScalePositionHandler,\n scaleEquallyCropGenerator,\n} from './croppingHandlers';\nimport { renderCornerControl } from './renderCornerControl';\n\nconst { scaleCursorStyleHandler } = controlsUtils;\n\nconst cropActionName = () => 'crop';\n// use this function if you want to generate new controls for every instance\nexport const createImageCroppingControls = () => ({\n // scaling image\n tls: new Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n positionHandler: ghostScalePositionHandler,\n actionHandler: scaleEquallyCropGenerator(-0.5, -0.5),\n }),\n brs: new Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n positionHandler: ghostScalePositionHandler,\n actionHandler: scaleEquallyCropGenerator(0.5, 0.5),\n }),\n trs: new Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n positionHandler: ghostScalePositionHandler,\n actionHandler: scaleEquallyCropGenerator(0.5, -0.5),\n }),\n bls: new Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleCursorStyleHandler,\n positionHandler: ghostScalePositionHandler,\n actionHandler: scaleEquallyCropGenerator(-0.5, 0.5),\n }),\n // cropping image\n mlc: new Control({\n x: -0.5,\n y: 0,\n sizeX: 4,\n sizeY: 20,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: changeCropX,\n getActionName: cropActionName,\n }),\n\n mrc: new Control({\n x: 0.5,\n y: 0,\n sizeX: 4,\n sizeY: 20,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: changeCropWidth,\n getActionName: cropActionName,\n }),\n\n mbc: new Control({\n x: 0,\n y: 0.5,\n sizeX: 20,\n sizeY: 4,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: changeCropHeight,\n getActionName: cropActionName,\n }),\n\n mtc: new Control({\n x: 0,\n y: -0.5,\n sizeX: 20,\n sizeY: 4,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: changeCropY,\n getActionName: cropActionName,\n }),\n\n tlc: new Control({\n angle: 0,\n x: -0.5,\n y: -0.5,\n sizeX: 20,\n sizeY: 4,\n render: renderCornerControl,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: (...args) => {\n const cropX = changeCropX(...args);\n const cropY = changeCropY(...args);\n return cropX || cropY;\n },\n getActionName: cropActionName,\n }),\n\n trc: new Control({\n angle: 90,\n x: 0.5,\n y: -0.5,\n sizeX: 20,\n sizeY: 4,\n render: renderCornerControl,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: (...args) => {\n const width = changeCropWidth(...args);\n const cropY = changeCropY(...args);\n return width || cropY;\n },\n getActionName: cropActionName,\n }),\n\n blc: new Control({\n angle: 270,\n x: -0.5,\n y: 0.5,\n sizeX: 20,\n sizeY: 4,\n render: renderCornerControl,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: (...args) => {\n const height = changeCropHeight(...args);\n const cropX = changeCropX(...args);\n return height || cropX;\n },\n getActionName: cropActionName,\n }),\n\n brc: new Control({\n angle: 180,\n x: 0.5,\n y: 0.5,\n sizeX: 20,\n sizeY: 4,\n render: renderCornerControl,\n cursorStyleHandler: scaleCursorStyleHandler,\n actionHandler: (...args) => {\n const height = changeCropHeight(...args);\n const width = changeCropWidth(...args);\n return height || width;\n },\n getActionName: cropActionName,\n }),\n});\n"],"names":["scaleCursorStyleHandler","controlsUtils","cropActionName","createImageCroppingControls","tls","Control","x","y","cursorStyleHandler","positionHandler","ghostScalePositionHandler","actionHandler","scaleEquallyCropGenerator","brs","trs","bls","mlc","sizeX","sizeY","changeCropX","getActionName","mrc","changeCropWidth","mbc","changeCropHeight","mtc","changeCropY","tlc","angle","render","renderCornerControl","cropX","arguments","cropY","trc","width","blc","height","brc"],"mappings":"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"}