fabric 7.1.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 (253) hide show
  1. package/.husky/pre-commit +1 -0
  2. package/CHANGELOG.md +13 -0
  3. package/dist/extensions/cropping_controls/croppingControls.d.ts +12 -8
  4. package/dist/extensions/cropping_controls/croppingControls.d.ts.map +1 -1
  5. package/dist/extensions/cropping_controls/croppingHandlers.d.ts +19 -1
  6. package/dist/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -1
  7. package/dist/extensions/cropping_controls/enterCropMode.d.ts.map +1 -1
  8. package/dist/index.js +189 -160
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.min.js +1 -1
  11. package/dist/index.min.js.map +1 -1
  12. package/dist/index.min.mjs +1 -1
  13. package/dist/index.min.mjs.map +1 -1
  14. package/dist/index.mjs +189 -160
  15. package/dist/index.mjs.map +1 -1
  16. package/dist/index.node.cjs +189 -160
  17. package/dist/index.node.cjs.map +1 -1
  18. package/dist/index.node.mjs +189 -160
  19. package/dist/index.node.mjs.map +1 -1
  20. package/dist/package.json.min.mjs +1 -1
  21. package/dist/package.json.mjs +1 -1
  22. package/dist/src/EventTypeDefs.d.ts +3 -0
  23. package/dist/src/EventTypeDefs.d.ts.map +1 -1
  24. package/dist/src/Pattern/Pattern.d.ts.map +1 -1
  25. package/dist/src/Pattern/Pattern.min.mjs +1 -1
  26. package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
  27. package/dist/src/Pattern/Pattern.mjs +2 -1
  28. package/dist/src/Pattern/Pattern.mjs.map +1 -1
  29. package/dist/src/Shadow.d.ts +1 -1
  30. package/dist/src/Shadow.d.ts.map +1 -1
  31. package/dist/src/Shadow.min.mjs +1 -1
  32. package/dist/src/Shadow.min.mjs.map +1 -1
  33. package/dist/src/Shadow.mjs +5 -4
  34. package/dist/src/Shadow.mjs.map +1 -1
  35. package/dist/src/canvas/CanvasOptions.d.ts.map +1 -1
  36. package/dist/src/canvas/CanvasOptions.min.mjs.map +1 -1
  37. package/dist/src/canvas/CanvasOptions.mjs.map +1 -1
  38. package/dist/src/canvas/SelectableCanvas.d.ts +2 -0
  39. package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
  40. package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
  41. package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
  42. package/dist/src/canvas/SelectableCanvas.mjs +6 -1
  43. package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
  44. package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
  45. package/dist/src/canvas/StaticCanvas.min.mjs +1 -1
  46. package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
  47. package/dist/src/canvas/StaticCanvas.mjs +3 -1
  48. package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
  49. package/dist/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
  50. package/dist/src/canvas/StaticCanvasOptions.min.mjs.map +1 -1
  51. package/dist/src/canvas/StaticCanvasOptions.mjs.map +1 -1
  52. package/dist/src/controls/Control.d.ts +9 -1
  53. package/dist/src/controls/Control.d.ts.map +1 -1
  54. package/dist/src/controls/Control.min.mjs +1 -1
  55. package/dist/src/controls/Control.min.mjs.map +1 -1
  56. package/dist/src/controls/Control.mjs +8 -0
  57. package/dist/src/controls/Control.mjs.map +1 -1
  58. package/dist/src/gradient/Gradient.d.ts.map +1 -1
  59. package/dist/src/gradient/Gradient.min.mjs +1 -1
  60. package/dist/src/gradient/Gradient.min.mjs.map +1 -1
  61. package/dist/src/gradient/Gradient.mjs +19 -6
  62. package/dist/src/gradient/Gradient.mjs.map +1 -1
  63. package/dist/src/shapes/Circle.d.ts.map +1 -1
  64. package/dist/src/shapes/Circle.min.mjs +1 -1
  65. package/dist/src/shapes/Circle.min.mjs.map +1 -1
  66. package/dist/src/shapes/Circle.mjs +10 -7
  67. package/dist/src/shapes/Circle.mjs.map +1 -1
  68. package/dist/src/shapes/Ellipse.d.ts.map +1 -1
  69. package/dist/src/shapes/Ellipse.min.mjs +1 -1
  70. package/dist/src/shapes/Ellipse.min.mjs.map +1 -1
  71. package/dist/src/shapes/Ellipse.mjs +2 -1
  72. package/dist/src/shapes/Ellipse.mjs.map +1 -1
  73. package/dist/src/shapes/Group.d.ts.map +1 -1
  74. package/dist/src/shapes/Group.min.mjs +1 -1
  75. package/dist/src/shapes/Group.min.mjs.map +1 -1
  76. package/dist/src/shapes/Group.mjs +2 -1
  77. package/dist/src/shapes/Group.mjs.map +1 -1
  78. package/dist/src/shapes/IText/IText.d.ts.map +1 -1
  79. package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
  80. package/dist/src/shapes/IText/IText.mjs.map +1 -1
  81. package/dist/src/shapes/Image.d.ts +1 -1
  82. package/dist/src/shapes/Image.d.ts.map +1 -1
  83. package/dist/src/shapes/Image.min.mjs +1 -1
  84. package/dist/src/shapes/Image.min.mjs.map +1 -1
  85. package/dist/src/shapes/Image.mjs +4 -3
  86. package/dist/src/shapes/Image.mjs.map +1 -1
  87. package/dist/src/shapes/Line.d.ts.map +1 -1
  88. package/dist/src/shapes/Line.min.mjs +1 -1
  89. package/dist/src/shapes/Line.min.mjs.map +1 -1
  90. package/dist/src/shapes/Line.mjs +6 -10
  91. package/dist/src/shapes/Line.mjs.map +1 -1
  92. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  93. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs +1 -1
  94. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
  95. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +5 -4
  96. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
  97. package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  98. package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
  99. package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
  100. package/dist/src/shapes/Object/Object.d.ts.map +1 -1
  101. package/dist/src/shapes/Object/Object.min.mjs +1 -1
  102. package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
  103. package/dist/src/shapes/Object/Object.mjs +3 -0
  104. package/dist/src/shapes/Object/Object.mjs.map +1 -1
  105. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
  106. package/dist/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
  107. package/dist/src/shapes/Path.d.ts.map +1 -1
  108. package/dist/src/shapes/Path.min.mjs.map +1 -1
  109. package/dist/src/shapes/Path.mjs +1 -2
  110. package/dist/src/shapes/Path.mjs.map +1 -1
  111. package/dist/src/shapes/Polyline.d.ts.map +1 -1
  112. package/dist/src/shapes/Polyline.min.mjs +1 -1
  113. package/dist/src/shapes/Polyline.min.mjs.map +1 -1
  114. package/dist/src/shapes/Polyline.mjs +10 -6
  115. package/dist/src/shapes/Polyline.mjs.map +1 -1
  116. package/dist/src/shapes/Rect.d.ts.map +1 -1
  117. package/dist/src/shapes/Rect.min.mjs +1 -1
  118. package/dist/src/shapes/Rect.min.mjs.map +1 -1
  119. package/dist/src/shapes/Rect.mjs +2 -1
  120. package/dist/src/shapes/Rect.mjs.map +1 -1
  121. package/dist/src/shapes/Text/Text.d.ts.map +1 -1
  122. package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
  123. package/dist/src/shapes/Text/Text.mjs.map +1 -1
  124. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs +1 -1
  125. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
  126. package/dist/src/shapes/Text/TextSVGExportMixin.mjs +5 -5
  127. package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
  128. package/dist/src/shapes/Textbox.d.ts.map +1 -1
  129. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  130. package/dist/src/shapes/Textbox.mjs.map +1 -1
  131. package/dist/src/shapes/Triangle.d.ts.map +1 -1
  132. package/dist/src/shapes/Triangle.min.mjs.map +1 -1
  133. package/dist/src/shapes/Triangle.mjs.map +1 -1
  134. package/dist/src/util/lang_string.d.ts +1 -1
  135. package/dist/src/util/lang_string.d.ts.map +1 -1
  136. package/dist/src/util/lang_string.min.mjs +1 -1
  137. package/dist/src/util/lang_string.min.mjs.map +1 -1
  138. package/dist/src/util/lang_string.mjs +1 -1
  139. package/dist/src/util/lang_string.mjs.map +1 -1
  140. package/dist/src/util/misc/svgParsing.d.ts.map +1 -1
  141. package/dist/src/util/misc/svgParsing.min.mjs +1 -1
  142. package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
  143. package/dist/src/util/misc/svgParsing.mjs +2 -1
  144. package/dist/src/util/misc/svgParsing.mjs.map +1 -1
  145. package/dist-extensions/cropping_controls/croppingControls.mjs +39 -9
  146. package/dist-extensions/cropping_controls/croppingControls.mjs.map +1 -1
  147. package/dist-extensions/cropping_controls/croppingHandlers.mjs +84 -2
  148. package/dist-extensions/cropping_controls/croppingHandlers.mjs.map +1 -1
  149. package/dist-extensions/cropping_controls/enterCropMode.mjs +7 -2
  150. package/dist-extensions/cropping_controls/enterCropMode.mjs.map +1 -1
  151. package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts +12 -8
  152. package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts.map +1 -1
  153. package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts +19 -1
  154. package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -1
  155. package/dist-extensions/extensions/cropping_controls/enterCropMode.d.ts.map +1 -1
  156. package/dist-extensions/fabric-extensions.min.js +1 -1
  157. package/dist-extensions/fabric-extensions.min.js.map +1 -1
  158. package/dist-extensions/src/EventTypeDefs.d.ts +3 -0
  159. package/dist-extensions/src/EventTypeDefs.d.ts.map +1 -1
  160. package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -1
  161. package/dist-extensions/src/Shadow.d.ts +1 -1
  162. package/dist-extensions/src/Shadow.d.ts.map +1 -1
  163. package/dist-extensions/src/canvas/CanvasOptions.d.ts.map +1 -1
  164. package/dist-extensions/src/canvas/SelectableCanvas.d.ts +2 -0
  165. package/dist-extensions/src/canvas/SelectableCanvas.d.ts.map +1 -1
  166. package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +1 -1
  167. package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
  168. package/dist-extensions/src/controls/Control.d.ts +9 -1
  169. package/dist-extensions/src/controls/Control.d.ts.map +1 -1
  170. package/dist-extensions/src/gradient/Gradient.d.ts.map +1 -1
  171. package/dist-extensions/src/shapes/Circle.d.ts.map +1 -1
  172. package/dist-extensions/src/shapes/Ellipse.d.ts.map +1 -1
  173. package/dist-extensions/src/shapes/Group.d.ts.map +1 -1
  174. package/dist-extensions/src/shapes/IText/IText.d.ts.map +1 -1
  175. package/dist-extensions/src/shapes/Image.d.ts.map +1 -1
  176. package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
  177. package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  178. package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  179. package/dist-extensions/src/shapes/Object/Object.d.ts.map +1 -1
  180. package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
  181. package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
  182. package/dist-extensions/src/shapes/Path.d.ts +1 -1
  183. package/dist-extensions/src/shapes/Path.d.ts.map +1 -1
  184. package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -1
  185. package/dist-extensions/src/shapes/Rect.d.ts.map +1 -1
  186. package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
  187. package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
  188. package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -1
  189. package/dist-extensions/src/util/lang_string.d.ts +1 -1
  190. package/dist-extensions/src/util/lang_string.d.ts.map +1 -1
  191. package/dist-extensions/src/util/misc/svgParsing.d.ts.map +1 -1
  192. package/eslint.config.mjs +2 -0
  193. package/extensions/cropping_controls/croppingControls.spec.ts +65 -27
  194. package/extensions/cropping_controls/croppingControls.ts +40 -8
  195. package/extensions/cropping_controls/croppingHandlers.spec.ts +355 -46
  196. package/extensions/cropping_controls/croppingHandlers.ts +123 -0
  197. package/extensions/cropping_controls/enterCropMode.ts +6 -2
  198. package/package.json +17 -8
  199. package/src/ClassRegistry.spec.ts +18 -19
  200. package/src/EventTypeDefs.ts +13 -11
  201. package/src/Pattern/Pattern.spec.ts +12 -0
  202. package/src/Pattern/Pattern.ts +3 -2
  203. package/src/Shadow.ts +9 -8
  204. package/src/brushes/PencilBrush.spec.ts +11 -11
  205. package/src/canvas/Canvas-dispose.spec.ts +8 -7
  206. package/src/canvas/Canvas.spec.ts +27 -29
  207. package/src/canvas/CanvasOptions.ts +2 -1
  208. package/src/canvas/SelectableCanvas.ts +11 -4
  209. package/src/canvas/StaticCanvas.spec.ts +20 -0
  210. package/src/canvas/StaticCanvas.ts +7 -4
  211. package/src/canvas/StaticCanvasOptions.ts +1 -3
  212. package/src/controls/Control.ts +24 -1
  213. package/src/gradient/Gradient.spec.ts +101 -46
  214. package/src/gradient/Gradient.ts +27 -14
  215. package/src/shapes/Circle.spec.ts +10 -39
  216. package/src/shapes/Circle.ts +11 -11
  217. package/src/shapes/Ellipse.spec.ts +8 -37
  218. package/src/shapes/Ellipse.ts +7 -7
  219. package/src/shapes/Group.ts +3 -3
  220. package/src/shapes/IText/IText-click-behavior.spec.ts +36 -49
  221. package/src/shapes/IText/IText.ts +5 -6
  222. package/src/shapes/IText/__snapshots__/ITextBehavior.test.ts.snap +6 -6
  223. package/src/shapes/Image.spec.ts +17 -33
  224. package/src/shapes/Image.ts +15 -11
  225. package/src/shapes/Line.spec.ts +4 -30
  226. package/src/shapes/Line.ts +11 -16
  227. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +11 -4
  228. package/src/shapes/Object/InteractiveObject.ts +4 -4
  229. package/src/shapes/Object/Object.ts +6 -5
  230. package/src/shapes/Object/objectSvgExport.spec.ts +112 -0
  231. package/src/shapes/Object/types/FabricObjectProps.ts +1 -4
  232. package/src/shapes/Object/types/ObjectProps.ts +1 -3
  233. package/src/shapes/Path.spec.ts +4 -27
  234. package/src/shapes/Path.ts +2 -4
  235. package/src/shapes/Polygon.spec.ts +4 -31
  236. package/src/shapes/Polyline.spec.ts +4 -31
  237. package/src/shapes/Polyline.ts +11 -12
  238. package/src/shapes/Rect.spec.ts +25 -33
  239. package/src/shapes/Rect.ts +7 -7
  240. package/src/shapes/Text/Text.spec.ts +3 -32
  241. package/src/shapes/Text/Text.ts +5 -6
  242. package/src/shapes/Text/TextSVGExportMixin.ts +14 -14
  243. package/src/shapes/Text/__snapshots__/Text.spec.ts.snap +1 -1
  244. package/src/shapes/Textbox.spec.ts +5 -5
  245. package/src/shapes/Textbox.ts +6 -5
  246. package/src/shapes/Triangle.ts +4 -4
  247. package/src/shapes/__snapshots__/Image.spec.ts.snap +4 -4
  248. package/src/shapes/__snapshots__/Textbox.spec.ts.snap +5 -5
  249. package/src/util/lang_string.ts +3 -2
  250. package/src/util/misc/svgParsing.ts +2 -1
  251. package/tsconfig.spec.json +1 -0
  252. package/vitest.config.ts +12 -2
  253. package/vitest.extend.ts +6 -2
@@ -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":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,UAAU,GAAG,UAACC,MAAc,EAAA;AAAA,EAAA,IAAEC,eAAe,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,KAAK;AAAA,EAAA,OAChE,CAAA,EAAGF,MAAM,CAACK,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,EAAE,CAAA,EAC/BL,eAAe,GAAGD,MAAM,CAACO,KAAK,CAAC,CAAC,CAAC,GAAGP,MAAM,CAACO,KAAK,CAAC,CAAC,CAAC,CAACC,WAAW,EAAE,CAAA,CACjE;AAAA;;AAEJ;AACA;AACA;AACA;AACA;AACO,MAAMC,SAAS,GAAIC,cAA+B,IACvDA,cAAc,CACXC,QAAQ,EAAE,CACVC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CACtBA,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CACvBA,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CACvBA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CACrBA,OAAO,CAAC,IAAI,EAAE,MAAM;AAEzB,IAAIC,SAAiC;AAErC,MAAMC,YAAY,GAAGA,MAAM;EACzB,IAAI,CAACD,SAAS,EAAE;AACdA,IAAAA,SAAS,GACP,MAAM,IAAIE,eAAe,EAAE,IAC3B,WAAW,IAAIC,IAAI,IACnB,IAAIA,IAAI,CAACC,SAAS,CAACb,SAAS,EAAE;AAC5Bc,MAAAA,WAAW,EAAE;AACf,KAAC,CAAC;AACN,EAAA;AACA,EAAA,OAAOL,SAAS;AAClB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,MAAMM,aAAa,GAAIC,UAAkB,IAAe;EAC7DP,SAAS,IAAIC,YAAY,EAAE;AAC3B,EAAA,IAAID,SAAS,EAAE;AACb,IAAA,MAAMQ,QAAQ,GAAGR,SAAS,CAACS,OAAO,CAACF,UAAU,CAAC;IAC9C,OAAOG,KAAK,CAACC,IAAI,CAACH,QAAQ,CAAC,CAACI,GAAG,CAACC,IAAA,IAAA;MAAA,IAAC;AAAEJ,QAAAA;AAAQ,OAAC,GAAAI,IAAA;AAAA,MAAA,OAAKJ,OAAO;IAAA,CAAA,CAAC;AAC3D,EAAA;;AAEA;EACA,OAAOK,iBAAiB,CAACP,UAAU,CAAC;AACtC;AAEA,MAAMO,iBAAiB,GAAIP,UAAkB,IAAe;EAC1D,MAAMQ,SAAmB,GAAG,EAAE;AAC9B,EAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEC,GAAG,EAAED,CAAC,GAAGT,UAAU,CAACjB,MAAM,EAAE0B,CAAC,EAAE,EAAE;IAC/C,IAAI,CAACC,GAAG,GAAGC,YAAY,CAACX,UAAU,EAAES,CAAC,CAAC,MAAM,KAAK,EAAE;AACjD,MAAA;AACF,IAAA;AACAD,IAAAA,SAAS,CAACI,IAAI,CAACF,GAAG,CAAC;AACrB,EAAA;AACA,EAAA,OAAOF,SAAS;AAClB,CAAC;;AAED;AACA,MAAMG,YAAY,GAAGA,CAACE,GAAW,EAAEJ,CAAS,KAAqB;AAC/D,EAAA,MAAMK,IAAI,GAAGD,GAAG,CAACE,UAAU,CAACN,CAAC,CAAC;AAC9B,EAAA,IAAIO,KAAK,CAACF,IAAI,CAAC,EAAE;IACf,OAAO,EAAE,CAAC;AACZ,EAAA;AACA,EAAA,IAAIA,IAAI,GAAG,MAAM,IAAIA,IAAI,GAAG,MAAM,EAAE;AAClC,IAAA,OAAOD,GAAG,CAAC5B,MAAM,CAACwB,CAAC,CAAC;AACtB,EAAA;;AAEA;AACA;AACA,EAAA,IAAI,MAAM,IAAIK,IAAI,IAAIA,IAAI,IAAI,MAAM,EAAE;AACpC,IAAA,IAAID,GAAG,CAAC9B,MAAM,IAAI0B,CAAC,GAAG,CAAC,EAAE;AACvB,MAAA,MAAM,gDAAgD;AACxD,IAAA;IACA,MAAMQ,IAAI,GAAGJ,GAAG,CAACE,UAAU,CAACN,CAAC,GAAG,CAAC,CAAC;AAClC,IAAA,IAAI,MAAM,GAAGQ,IAAI,IAAIA,IAAI,GAAG,MAAM,EAAE;AAClC,MAAA,MAAM,gDAAgD;AACxD,IAAA;AACA,IAAA,OAAOJ,GAAG,CAAC5B,MAAM,CAACwB,CAAC,CAAC,GAAGI,GAAG,CAAC5B,MAAM,CAACwB,CAAC,GAAG,CAAC,CAAC;AAC1C,EAAA;AACA;EACA,IAAIA,CAAC,KAAK,CAAC,EAAE;AACX,IAAA,MAAM,gDAAgD;AACxD,EAAA;EACA,MAAMS,IAAI,GAAGL,GAAG,CAACE,UAAU,CAACN,CAAC,GAAG,CAAC,CAAC;;AAElC;AACA;AACA,EAAA,IAAI,MAAM,GAAGS,IAAI,IAAIA,IAAI,GAAG,MAAM,EAAE;AAClC,IAAA,MAAM,gDAAgD;AACxD,EAAA;AACA;AACA;AACA,EAAA,OAAO,KAAK;AACd,CAAC;;;;"}
@@ -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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"}
@@ -1,5 +1,5 @@
1
1
  import { controlsUtils, Control } from 'fabric';
2
- import { changeCropHeight, changeCropWidth, changeCropX, changeCropY } from './croppingHandlers.mjs';
2
+ import { changeCropHeight, changeCropWidth, changeCropX, changeCropY, scaleEquallyCropGenerator, ghostScalePositionHandler } from './croppingHandlers.mjs';
3
3
  import { renderCornerControl } from './renderCornerControl.mjs';
4
4
 
5
5
  const {
@@ -8,7 +8,37 @@ const {
8
8
  const cropActionName = () => 'crop';
9
9
  // use this function if you want to generate new controls for every instance
10
10
  const createImageCroppingControls = () => ({
11
- ml: new Control({
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({
12
42
  x: -0.5,
13
43
  y: 0,
14
44
  sizeX: 4,
@@ -17,7 +47,7 @@ const createImageCroppingControls = () => ({
17
47
  actionHandler: changeCropX,
18
48
  getActionName: cropActionName
19
49
  }),
20
- mr: new Control({
50
+ mrc: new Control({
21
51
  x: 0.5,
22
52
  y: 0,
23
53
  sizeX: 4,
@@ -26,7 +56,7 @@ const createImageCroppingControls = () => ({
26
56
  actionHandler: changeCropWidth,
27
57
  getActionName: cropActionName
28
58
  }),
29
- mb: new Control({
59
+ mbc: new Control({
30
60
  x: 0,
31
61
  y: 0.5,
32
62
  sizeX: 20,
@@ -35,7 +65,7 @@ const createImageCroppingControls = () => ({
35
65
  actionHandler: changeCropHeight,
36
66
  getActionName: cropActionName
37
67
  }),
38
- mt: new Control({
68
+ mtc: new Control({
39
69
  x: 0,
40
70
  y: -0.5,
41
71
  sizeX: 20,
@@ -44,7 +74,7 @@ const createImageCroppingControls = () => ({
44
74
  actionHandler: changeCropY,
45
75
  getActionName: cropActionName
46
76
  }),
47
- tl: new Control({
77
+ tlc: new Control({
48
78
  angle: 0,
49
79
  x: -0.5,
50
80
  y: -0.5,
@@ -59,7 +89,7 @@ const createImageCroppingControls = () => ({
59
89
  },
60
90
  getActionName: cropActionName
61
91
  }),
62
- tr: new Control({
92
+ trc: new Control({
63
93
  angle: 90,
64
94
  x: 0.5,
65
95
  y: -0.5,
@@ -74,7 +104,7 @@ const createImageCroppingControls = () => ({
74
104
  },
75
105
  getActionName: cropActionName
76
106
  }),
77
- bl: new Control({
107
+ blc: new Control({
78
108
  angle: 270,
79
109
  x: -0.5,
80
110
  y: 0.5,
@@ -89,7 +119,7 @@ const createImageCroppingControls = () => ({
89
119
  },
90
120
  getActionName: cropActionName
91
121
  }),
92
- br: new Control({
122
+ brc: new Control({
93
123
  angle: 180,
94
124
  x: 0.5,
95
125
  y: 0.5,
@@ -1 +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} 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 ml: 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 mr: 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 mb: 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 mt: 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 tl: 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 tr: 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 bl: 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 br: 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","ml","Control","x","y","sizeX","sizeY","cursorStyleHandler","actionHandler","changeCropX","getActionName","mr","changeCropWidth","mb","changeCropHeight","mt","changeCropY","tl","angle","render","renderCornerControl","cropX","arguments","cropY","tr","width","bl","height","br"],"mappings":"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"}
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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"}
@@ -1,4 +1,4 @@
1
- import { controlsUtils, Point, util } from 'fabric';
1
+ import { controlsUtils, util, Point } from 'fabric';
2
2
 
3
3
  const {
4
4
  wrapWithFixedAnchor,
@@ -142,5 +142,87 @@ const cropPanMoveHandler = _ref => {
142
142
  fabricImage.top = original.top;
143
143
  };
144
144
 
145
- export { changeCropHeight, changeCropWidth, changeCropX, changeCropY, changeImageCropX, changeImageCropY, changeImageHeight, changeImageWidth, cropPanMoveHandler };
145
+ /**
146
+ * This position handler works only for this specific use case.
147
+ * It does not support padding nor offset, and it reduces all possible positions
148
+ * to the main 4 corners only.
149
+ * Any position that is < 0 is the extreme left/top, the rest are right/bottom
150
+ */
151
+ function ghostScalePositionHandler(dim,
152
+ // currentDimension
153
+ finalMatrix, fabricObject
154
+ // currentControl: Control,
155
+ ) {
156
+ const matrix = fabricObject.calcTransformMatrix();
157
+ const vpt = fabricObject.getViewportTransform();
158
+ const _finalMatrix = util.multiplyTransformMatrices(vpt, matrix);
159
+ let x = 0;
160
+ let y = 0;
161
+ if (this.x < 0) {
162
+ x = -fabricObject.width / 2 - fabricObject.cropX;
163
+ } else {
164
+ x = fabricObject.getElement().width - fabricObject.width / 2 - fabricObject.cropX;
165
+ }
166
+ if (this.y < 0) {
167
+ y = -fabricObject.height / 2 - fabricObject.cropY;
168
+ } else {
169
+ y = fabricObject.getElement().height - fabricObject.height / 2 - fabricObject.cropY;
170
+ }
171
+ return new Point(x, y).transform(_finalMatrix);
172
+ }
173
+ const calcScale = (currentPoint, height, width) => Math.min(Math.abs(currentPoint.x / width), Math.abs(currentPoint.y / height));
174
+
175
+ /**
176
+ * Action handler generator that handles scaling of an image in crop mode.
177
+ * The goal is to keep the current bounding box steady.
178
+ * So this action handler has its own calculations for a dynamic anchor point
179
+ */
180
+ const scaleEquallyCropGenerator = (cx, cy) => (eventData, transform, x, y) => {
181
+ const {
182
+ target
183
+ } = transform;
184
+ const {
185
+ width: fullWidth,
186
+ height: fullHeight
187
+ } = target.getElement();
188
+ const remainderX = fullWidth - target.width - target.cropX;
189
+ const remainderY = fullHeight - target.height - target.cropY;
190
+ const anchorOriginX = cx < 0 ? 1 + remainderX / target.width : -target.cropX / target.width;
191
+ const anchorOriginY = cy < 0 ? 1 + remainderY / target.height : -target.cropY / target.height;
192
+ const constraint = target.translateToOriginPoint(target.getCenterPoint(), anchorOriginX, anchorOriginY);
193
+ const newPoint = controlsUtils.getLocalPoint(transform, anchorOriginX, anchorOriginY, x, y);
194
+ const scale = calcScale(newPoint, fullHeight, fullWidth);
195
+ const scaleChangeX = scale / target.scaleX;
196
+ const scaleChangeY = scale / target.scaleY;
197
+ const scaledRemainderX = remainderX / scaleChangeX;
198
+ const scaledRemainderY = remainderY / scaleChangeY;
199
+ const newWidth = target.width / scaleChangeX;
200
+ const newHeight = target.height / scaleChangeY;
201
+ const newCropX = cx < 0 ? fullWidth - newWidth - scaledRemainderX : target.cropX / scaleChangeX;
202
+ const newCropY = cy < 0 ? fullHeight - newHeight - scaledRemainderY : target.cropY / scaleChangeY;
203
+ if ((cx < 0 ? scaledRemainderX : newCropX) + newWidth > fullWidth || (cy < 0 ? scaledRemainderY : newCropY) + newHeight > fullHeight) {
204
+ return false;
205
+ }
206
+ target.scaleX = scale;
207
+ target.scaleY = scale;
208
+ target.width = newWidth;
209
+ target.height = newHeight;
210
+ target.cropX = newCropX;
211
+ target.cropY = newCropY;
212
+ const newAnchorOriginX = cx < 0 ? 1 + scaledRemainderX / newWidth : -newCropX / newWidth;
213
+ const newAnchorOriginY = cy < 0 ? 1 + scaledRemainderY / newHeight : -newCropY / newHeight;
214
+ target.setPositionByOrigin(constraint, newAnchorOriginX, newAnchorOriginY);
215
+ return true;
216
+ };
217
+ function renderGhostImage(_ref2) {
218
+ let {
219
+ ctx
220
+ } = _ref2;
221
+ const alpha = ctx.globalAlpha;
222
+ ctx.globalAlpha *= 0.5;
223
+ ctx.drawImage(this._element, -this.width / 2 - this.cropX, -this.height / 2 - this.cropY);
224
+ ctx.globalAlpha = alpha;
225
+ }
226
+
227
+ export { changeCropHeight, changeCropWidth, changeCropX, changeCropY, changeImageCropX, changeImageCropY, changeImageHeight, changeImageWidth, cropPanMoveHandler, ghostScalePositionHandler, renderGhostImage, scaleEquallyCropGenerator };
146
228
  //# sourceMappingURL=croppingHandlers.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"croppingHandlers.mjs","sources":["../../extensions/cropping_controls/croppingHandlers.ts"],"sourcesContent":["import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n FabricImage,\n ObjectEvents,\n} from 'fabric';\nimport { controlsUtils, Point, util } from 'fabric';\n\nconst { wrapWithFixedAnchor, wrapWithFireEvent } = controlsUtils;\n\n/**\n * Wrap controlsUtils.changeObjectWidth with image constrains\n */\nexport const changeImageWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { width } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n const availableWidth = image._element.width - image.cropX;\n if (modified) {\n if (image.width > availableWidth) {\n image.width = availableWidth;\n }\n if (image.width < 1) {\n image.width = 1;\n }\n }\n return width !== image.width;\n};\n\nexport const changeCropWidth = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageWidth),\n);\n\n/**\n * Wrap controlsUtils.changeObjectHeight with image constrains\n */\nexport const changeImageHeight: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { height } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n const availableHeight = image._element.height - image.cropY;\n if (modified) {\n if (image.height > availableHeight) {\n image.height = availableHeight;\n }\n if (image.height < 1) {\n image.height = 1;\n }\n }\n return height !== image.height;\n};\n\nexport const changeCropHeight = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageHeight),\n);\n\nexport const changeImageCropX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { width, cropX } = image;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n let newCropX = cropX + width - image.width;\n image.width = width;\n if (modified) {\n if (newCropX < 0) {\n newCropX = 0;\n }\n image.cropX = newCropX;\n // calculate new width on the base of how much crop we have now\n image.width += cropX - newCropX;\n }\n return newCropX !== cropX;\n};\n\nexport const changeImageCropY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { height, cropY } = image;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n let newCropY = cropY + height - image.height;\n image.height = height;\n if (modified) {\n if (newCropY < 0) {\n newCropY = 0;\n }\n image.cropY = newCropY;\n image.height += cropY - newCropY;\n }\n return newCropY !== cropY;\n};\n\nexport const changeCropX = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropX),\n);\n\nexport const changeCropY = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropY),\n);\n\n/**\n * A function to counter the move action and change cropX/cropY of an image\n * Keep the image steady, but moves it inside its own cropping rectangle\n */\nexport const cropPanMoveHandler = ({ transform }: ObjectEvents['moving']) => {\n // this makes the image pan too fast.\n const { target, original } = transform as Transform;\n const fabricImage = target as FabricImage;\n const p = new Point(\n target.left - original.left,\n target.top - original.top,\n ).transform(\n util.invertTransform(\n util.createRotateMatrix({ angle: fabricImage.getTotalAngle() }),\n ),\n );\n let cropX = original.cropX! - p.x / fabricImage.scaleX;\n let cropY = original.cropY! - p.y / fabricImage.scaleY;\n const { width, height, _element } = fabricImage;\n if (cropX < 0) {\n cropX = 0;\n }\n if (cropY < 0) {\n cropY = 0;\n }\n if (cropX + width > _element.width) {\n cropX = _element.width - width;\n }\n if (cropY + height > _element.height) {\n cropY = _element.height - height;\n }\n fabricImage.cropX = cropX;\n fabricImage.cropY = cropY;\n fabricImage.left = original.left;\n fabricImage.top = original.top;\n};\n"],"names":["wrapWithFixedAnchor","wrapWithFireEvent","controlsUtils","changeImageWidth","eventData","transform","x","y","target","width","image","modified","changeObjectWidth","availableWidth","_element","cropX","changeCropWidth","changeImageHeight","height","changeObjectHeight","availableHeight","cropY","changeCropHeight","changeImageCropX","newCropX","changeImageCropY","newCropY","changeCropX","changeCropY","cropPanMoveHandler","_ref","original","fabricImage","p","Point","left","top","util","invertTransform","createRotateMatrix","angle","getTotalAngle","scaleX","scaleY"],"mappings":"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"}
1
+ {"version":3,"file":"croppingHandlers.mjs","sources":["../../extensions/cropping_controls/croppingHandlers.ts"],"sourcesContent":["import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n FabricImage,\n ObjectEvents,\n Control,\n TMat2D,\n} from 'fabric';\nimport { controlsUtils, Point, util } from 'fabric';\n\nconst { wrapWithFixedAnchor, wrapWithFireEvent } = controlsUtils;\n\n/**\n * Wrap controlsUtils.changeObjectWidth with image constrains\n */\nexport const changeImageWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { width } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n const availableWidth = image._element.width - image.cropX;\n if (modified) {\n if (image.width > availableWidth) {\n image.width = availableWidth;\n }\n if (image.width < 1) {\n image.width = 1;\n }\n }\n return width !== image.width;\n};\n\nexport const changeCropWidth = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageWidth),\n);\n\n/**\n * Wrap controlsUtils.changeObjectHeight with image constrains\n */\nexport const changeImageHeight: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { height } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n const availableHeight = image._element.height - image.cropY;\n if (modified) {\n if (image.height > availableHeight) {\n image.height = availableHeight;\n }\n if (image.height < 1) {\n image.height = 1;\n }\n }\n return height !== image.height;\n};\n\nexport const changeCropHeight = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageHeight),\n);\n\nexport const changeImageCropX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { width, cropX } = image;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n let newCropX = cropX + width - image.width;\n image.width = width;\n if (modified) {\n if (newCropX < 0) {\n newCropX = 0;\n }\n image.cropX = newCropX;\n // calculate new width on the base of how much crop we have now\n image.width += cropX - newCropX;\n }\n return newCropX !== cropX;\n};\n\nexport const changeImageCropY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { height, cropY } = image;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n let newCropY = cropY + height - image.height;\n image.height = height;\n if (modified) {\n if (newCropY < 0) {\n newCropY = 0;\n }\n image.cropY = newCropY;\n image.height += cropY - newCropY;\n }\n return newCropY !== cropY;\n};\n\nexport const changeCropX = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropX),\n);\n\nexport const changeCropY = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropY),\n);\n\n/**\n * A function to counter the move action and change cropX/cropY of an image\n * Keep the image steady, but moves it inside its own cropping rectangle\n */\nexport const cropPanMoveHandler = ({ transform }: ObjectEvents['moving']) => {\n // this makes the image pan too fast.\n const { target, original } = transform as Transform;\n const fabricImage = target as FabricImage;\n const p = new Point(\n target.left - original.left,\n target.top - original.top,\n ).transform(\n util.invertTransform(\n util.createRotateMatrix({ angle: fabricImage.getTotalAngle() }),\n ),\n );\n let cropX = original.cropX! - p.x / fabricImage.scaleX;\n let cropY = original.cropY! - p.y / fabricImage.scaleY;\n const { width, height, _element } = fabricImage;\n if (cropX < 0) {\n cropX = 0;\n }\n if (cropY < 0) {\n cropY = 0;\n }\n if (cropX + width > _element.width) {\n cropX = _element.width - width;\n }\n if (cropY + height > _element.height) {\n cropY = _element.height - height;\n }\n fabricImage.cropX = cropX;\n fabricImage.cropY = cropY;\n fabricImage.left = original.left;\n fabricImage.top = original.top;\n};\n\n/**\n * This position handler works only for this specific use case.\n * It does not support padding nor offset, and it reduces all possible positions\n * to the main 4 corners only.\n * Any position that is < 0 is the extreme left/top, the rest are right/bottom\n */\nexport function ghostScalePositionHandler(\n this: Control,\n dim: Point, // currentDimension\n finalMatrix: TMat2D,\n fabricObject: FabricImage,\n // currentControl: Control,\n) {\n const matrix = fabricObject.calcTransformMatrix();\n const vpt = fabricObject.getViewportTransform();\n const _finalMatrix = util.multiplyTransformMatrices(vpt, matrix);\n\n let x = 0;\n let y = 0;\n if (this.x < 0) {\n x = -fabricObject.width / 2 - fabricObject.cropX;\n } else {\n x =\n fabricObject.getElement().width -\n fabricObject.width / 2 -\n fabricObject.cropX;\n }\n\n if (this.y < 0) {\n y = -fabricObject.height / 2 - fabricObject.cropY;\n } else {\n y =\n fabricObject.getElement().height -\n fabricObject.height / 2 -\n fabricObject.cropY;\n }\n return new Point(x, y).transform(_finalMatrix);\n}\n\nconst calcScale = (currentPoint: Point, height: number, width: number) =>\n Math.min(Math.abs(currentPoint.x / width), Math.abs(currentPoint.y / height));\n\n/**\n * Action handler generator that handles scaling of an image in crop mode.\n * The goal is to keep the current bounding box steady.\n * So this action handler has its own calculations for a dynamic anchor point\n */\nexport const scaleEquallyCropGenerator =\n (cx: number, cy: number): TransformActionHandler =>\n (eventData, transform, x, y) => {\n const { target } = transform as unknown as { target: FabricImage };\n const { width: fullWidth, height: fullHeight } = target.getElement();\n const remainderX = fullWidth - target.width - target.cropX;\n const remainderY = fullHeight - target.height - target.cropY;\n const anchorOriginX =\n cx < 0 ? 1 + remainderX / target.width : -target.cropX / target.width;\n const anchorOriginY =\n cy < 0 ? 1 + remainderY / target.height : -target.cropY / target.height;\n const constraint = target.translateToOriginPoint(\n target.getCenterPoint(),\n anchorOriginX,\n anchorOriginY,\n );\n const newPoint = controlsUtils.getLocalPoint(\n transform,\n anchorOriginX,\n anchorOriginY,\n x,\n y,\n );\n const scale = calcScale(newPoint, fullHeight, fullWidth);\n const scaleChangeX = scale / target.scaleX;\n const scaleChangeY = scale / target.scaleY;\n const scaledRemainderX = remainderX / scaleChangeX;\n const scaledRemainderY = remainderY / scaleChangeY;\n const newWidth = target.width / scaleChangeX;\n const newHeight = target.height / scaleChangeY;\n const newCropX =\n cx < 0\n ? fullWidth - newWidth - scaledRemainderX\n : target.cropX / scaleChangeX;\n const newCropY =\n cy < 0\n ? fullHeight - newHeight - scaledRemainderY\n : target.cropY / scaleChangeY;\n\n if (\n (cx < 0 ? scaledRemainderX : newCropX) + newWidth > fullWidth ||\n (cy < 0 ? scaledRemainderY : newCropY) + newHeight > fullHeight\n ) {\n return false;\n }\n\n target.scaleX = scale;\n target.scaleY = scale;\n target.width = newWidth;\n target.height = newHeight;\n target.cropX = newCropX;\n target.cropY = newCropY;\n const newAnchorOriginX =\n cx < 0 ? 1 + scaledRemainderX / newWidth : -newCropX / newWidth;\n const newAnchorOriginY =\n cy < 0 ? 1 + scaledRemainderY / newHeight : -newCropY / newHeight;\n target.setPositionByOrigin(constraint, newAnchorOriginX, newAnchorOriginY);\n return true;\n };\n\nexport function renderGhostImage(\n this: FabricImage,\n { ctx }: { ctx: CanvasRenderingContext2D },\n) {\n const alpha = ctx.globalAlpha;\n ctx.globalAlpha *= 0.5;\n ctx.drawImage(\n this._element,\n -this.width / 2 - this.cropX,\n -this.height / 2 - this.cropY,\n );\n ctx.globalAlpha = alpha;\n}\n"],"names":["wrapWithFixedAnchor","wrapWithFireEvent","controlsUtils","changeImageWidth","eventData","transform","x","y","target","width","image","modified","changeObjectWidth","availableWidth","_element","cropX","changeCropWidth","changeImageHeight","height","changeObjectHeight","availableHeight","cropY","changeCropHeight","changeImageCropX","newCropX","changeImageCropY","newCropY","changeCropX","changeCropY","cropPanMoveHandler","_ref","original","fabricImage","p","Point","left","top","util","invertTransform","createRotateMatrix","angle","getTotalAngle","scaleX","scaleY","ghostScalePositionHandler","dim","finalMatrix","fabricObject","matrix","calcTransformMatrix","vpt","getViewportTransform","_finalMatrix","multiplyTransformMatrices","getElement","calcScale","currentPoint","Math","min","abs","scaleEquallyCropGenerator","cx","cy","fullWidth","fullHeight","remainderX","remainderY","anchorOriginX","anchorOriginY","constraint","translateToOriginPoint","getCenterPoint","newPoint","getLocalPoint","scale","scaleChangeX","scaleChangeY","scaledRemainderX","scaledRemainderY","newWidth","newHeight","newAnchorOriginX","newAnchorOriginY","setPositionByOrigin","renderGhostImage","_ref2","ctx","alpha","globalAlpha","drawImage"],"mappings":"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"}