fabric 7.0.0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/.husky/pre-commit +1 -0
  2. package/CHANGELOG.md +21 -0
  3. package/dist/extensions/cropping_controls/croppingControls.d.ts +16 -0
  4. package/dist/extensions/cropping_controls/croppingControls.d.ts.map +1 -0
  5. package/dist/extensions/cropping_controls/croppingHandlers.d.ts +39 -0
  6. package/dist/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -0
  7. package/dist/extensions/cropping_controls/enterCropMode.d.ts +7 -0
  8. package/dist/extensions/cropping_controls/enterCropMode.d.ts.map +1 -0
  9. package/dist/extensions/cropping_controls/renderCornerControl.d.ts +14 -0
  10. package/dist/extensions/cropping_controls/renderCornerControl.d.ts.map +1 -0
  11. package/dist/extensions/index.d.ts +3 -0
  12. package/dist/extensions/index.d.ts.map +1 -1
  13. package/dist/fabric.d.ts +1 -0
  14. package/dist/fabric.d.ts.map +1 -1
  15. package/dist/index.js +628 -537
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.min.js +1 -1
  18. package/dist/index.min.js.map +1 -1
  19. package/dist/index.min.mjs +1 -1
  20. package/dist/index.min.mjs.map +1 -1
  21. package/dist/index.mjs +628 -537
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/index.node.cjs +628 -537
  24. package/dist/index.node.cjs.map +1 -1
  25. package/dist/index.node.mjs +628 -537
  26. package/dist/index.node.mjs.map +1 -1
  27. package/dist/package.json.min.mjs +1 -1
  28. package/dist/package.json.mjs +1 -1
  29. package/dist/src/EventTypeDefs.d.ts +5 -0
  30. package/dist/src/EventTypeDefs.d.ts.map +1 -1
  31. package/dist/src/Pattern/Pattern.d.ts.map +1 -1
  32. package/dist/src/Pattern/Pattern.min.mjs +1 -1
  33. package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
  34. package/dist/src/Pattern/Pattern.mjs +2 -1
  35. package/dist/src/Pattern/Pattern.mjs.map +1 -1
  36. package/dist/src/Shadow.d.ts +1 -1
  37. package/dist/src/Shadow.d.ts.map +1 -1
  38. package/dist/src/Shadow.min.mjs +1 -1
  39. package/dist/src/Shadow.min.mjs.map +1 -1
  40. package/dist/src/Shadow.mjs +5 -4
  41. package/dist/src/Shadow.mjs.map +1 -1
  42. package/dist/src/canvas/CanvasOptions.d.ts.map +1 -1
  43. package/dist/src/canvas/CanvasOptions.min.mjs.map +1 -1
  44. package/dist/src/canvas/CanvasOptions.mjs.map +1 -1
  45. package/dist/src/canvas/SelectableCanvas.d.ts +2 -0
  46. package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
  47. package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
  48. package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
  49. package/dist/src/canvas/SelectableCanvas.mjs +33 -13
  50. package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
  51. package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
  52. package/dist/src/canvas/StaticCanvas.min.mjs +1 -1
  53. package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
  54. package/dist/src/canvas/StaticCanvas.mjs +3 -1
  55. package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
  56. package/dist/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
  57. package/dist/src/canvas/StaticCanvasOptions.min.mjs.map +1 -1
  58. package/dist/src/canvas/StaticCanvasOptions.mjs.map +1 -1
  59. package/dist/src/constants.d.ts +1 -0
  60. package/dist/src/constants.d.ts.map +1 -1
  61. package/dist/src/constants.min.mjs.map +1 -1
  62. package/dist/src/constants.mjs.map +1 -1
  63. package/dist/src/controls/Control.d.ts +22 -1
  64. package/dist/src/controls/Control.d.ts.map +1 -1
  65. package/dist/src/controls/Control.min.mjs +1 -1
  66. package/dist/src/controls/Control.min.mjs.map +1 -1
  67. package/dist/src/controls/Control.mjs +45 -1
  68. package/dist/src/controls/Control.mjs.map +1 -1
  69. package/dist/src/controls/changeWidth.d.ts +22 -0
  70. package/dist/src/controls/changeWidth.d.ts.map +1 -1
  71. package/dist/src/controls/changeWidth.min.mjs +1 -1
  72. package/dist/src/controls/changeWidth.min.mjs.map +1 -1
  73. package/dist/src/controls/changeWidth.mjs +46 -18
  74. package/dist/src/controls/changeWidth.mjs.map +1 -1
  75. package/dist/src/controls/controlRendering.d.ts.map +1 -1
  76. package/dist/src/controls/controlRendering.min.mjs +1 -1
  77. package/dist/src/controls/controlRendering.min.mjs.map +1 -1
  78. package/dist/src/controls/controlRendering.mjs +18 -34
  79. package/dist/src/controls/controlRendering.mjs.map +1 -1
  80. package/dist/src/controls/index.d.ts +2 -1
  81. package/dist/src/controls/index.d.ts.map +1 -1
  82. package/dist/src/controls/index.min.mjs +1 -1
  83. package/dist/src/controls/index.mjs +1 -1
  84. package/dist/src/gradient/Gradient.d.ts.map +1 -1
  85. package/dist/src/gradient/Gradient.min.mjs +1 -1
  86. package/dist/src/gradient/Gradient.min.mjs.map +1 -1
  87. package/dist/src/gradient/Gradient.mjs +19 -6
  88. package/dist/src/gradient/Gradient.mjs.map +1 -1
  89. package/dist/src/shapes/Circle.d.ts.map +1 -1
  90. package/dist/src/shapes/Circle.min.mjs +1 -1
  91. package/dist/src/shapes/Circle.min.mjs.map +1 -1
  92. package/dist/src/shapes/Circle.mjs +10 -7
  93. package/dist/src/shapes/Circle.mjs.map +1 -1
  94. package/dist/src/shapes/Ellipse.d.ts.map +1 -1
  95. package/dist/src/shapes/Ellipse.min.mjs +1 -1
  96. package/dist/src/shapes/Ellipse.min.mjs.map +1 -1
  97. package/dist/src/shapes/Ellipse.mjs +2 -1
  98. package/dist/src/shapes/Ellipse.mjs.map +1 -1
  99. package/dist/src/shapes/Group.d.ts.map +1 -1
  100. package/dist/src/shapes/Group.min.mjs +1 -1
  101. package/dist/src/shapes/Group.min.mjs.map +1 -1
  102. package/dist/src/shapes/Group.mjs +2 -1
  103. package/dist/src/shapes/Group.mjs.map +1 -1
  104. package/dist/src/shapes/IText/IText.d.ts.map +1 -1
  105. package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
  106. package/dist/src/shapes/IText/IText.mjs.map +1 -1
  107. package/dist/src/shapes/Image.d.ts +1 -1
  108. package/dist/src/shapes/Image.d.ts.map +1 -1
  109. package/dist/src/shapes/Image.min.mjs +1 -1
  110. package/dist/src/shapes/Image.min.mjs.map +1 -1
  111. package/dist/src/shapes/Image.mjs +4 -3
  112. package/dist/src/shapes/Image.mjs.map +1 -1
  113. package/dist/src/shapes/Line.d.ts.map +1 -1
  114. package/dist/src/shapes/Line.min.mjs +1 -1
  115. package/dist/src/shapes/Line.min.mjs.map +1 -1
  116. package/dist/src/shapes/Line.mjs +6 -10
  117. package/dist/src/shapes/Line.mjs.map +1 -1
  118. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  119. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs +1 -1
  120. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
  121. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +5 -4
  122. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
  123. package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  124. package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
  125. package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
  126. package/dist/src/shapes/Object/Object.d.ts.map +1 -1
  127. package/dist/src/shapes/Object/Object.min.mjs +1 -1
  128. package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
  129. package/dist/src/shapes/Object/Object.mjs +3 -0
  130. package/dist/src/shapes/Object/Object.mjs.map +1 -1
  131. package/dist/src/shapes/Object/ObjectGeometry.min.mjs +1 -1
  132. package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +1 -1
  133. package/dist/src/shapes/Object/ObjectGeometry.mjs +1 -1
  134. package/dist/src/shapes/Object/ObjectGeometry.mjs.map +1 -1
  135. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
  136. package/dist/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
  137. package/dist/src/shapes/Path.d.ts.map +1 -1
  138. package/dist/src/shapes/Path.min.mjs.map +1 -1
  139. package/dist/src/shapes/Path.mjs +1 -2
  140. package/dist/src/shapes/Path.mjs.map +1 -1
  141. package/dist/src/shapes/Polyline.d.ts.map +1 -1
  142. package/dist/src/shapes/Polyline.min.mjs +1 -1
  143. package/dist/src/shapes/Polyline.min.mjs.map +1 -1
  144. package/dist/src/shapes/Polyline.mjs +10 -6
  145. package/dist/src/shapes/Polyline.mjs.map +1 -1
  146. package/dist/src/shapes/Rect.d.ts.map +1 -1
  147. package/dist/src/shapes/Rect.min.mjs +1 -1
  148. package/dist/src/shapes/Rect.min.mjs.map +1 -1
  149. package/dist/src/shapes/Rect.mjs +2 -1
  150. package/dist/src/shapes/Rect.mjs.map +1 -1
  151. package/dist/src/shapes/Text/StyledText.d.ts.map +1 -1
  152. package/dist/src/shapes/Text/StyledText.min.mjs.map +1 -1
  153. package/dist/src/shapes/Text/StyledText.mjs +0 -3
  154. package/dist/src/shapes/Text/StyledText.mjs.map +1 -1
  155. package/dist/src/shapes/Text/Text.d.ts.map +1 -1
  156. package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
  157. package/dist/src/shapes/Text/Text.mjs.map +1 -1
  158. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  159. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs +1 -1
  160. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
  161. package/dist/src/shapes/Text/TextSVGExportMixin.mjs +5 -6
  162. package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
  163. package/dist/src/shapes/Textbox.d.ts.map +1 -1
  164. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  165. package/dist/src/shapes/Textbox.mjs.map +1 -1
  166. package/dist/src/shapes/Triangle.d.ts.map +1 -1
  167. package/dist/src/shapes/Triangle.min.mjs.map +1 -1
  168. package/dist/src/shapes/Triangle.mjs.map +1 -1
  169. package/dist/src/util/lang_string.d.ts +1 -1
  170. package/dist/src/util/lang_string.d.ts.map +1 -1
  171. package/dist/src/util/lang_string.min.mjs +1 -1
  172. package/dist/src/util/lang_string.min.mjs.map +1 -1
  173. package/dist/src/util/lang_string.mjs +1 -1
  174. package/dist/src/util/lang_string.mjs.map +1 -1
  175. package/dist/src/util/misc/svgParsing.d.ts.map +1 -1
  176. package/dist/src/util/misc/svgParsing.min.mjs +1 -1
  177. package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
  178. package/dist/src/util/misc/svgParsing.mjs +2 -1
  179. package/dist/src/util/misc/svgParsing.mjs.map +1 -1
  180. package/dist-extensions/cropping_controls/croppingControls.mjs +140 -0
  181. package/dist-extensions/cropping_controls/croppingControls.mjs.map +1 -0
  182. package/dist-extensions/cropping_controls/croppingHandlers.mjs +228 -0
  183. package/dist-extensions/cropping_controls/croppingHandlers.mjs.map +1 -0
  184. package/dist-extensions/cropping_controls/enterCropMode.mjs +38 -0
  185. package/dist-extensions/cropping_controls/enterCropMode.mjs.map +1 -0
  186. package/dist-extensions/cropping_controls/renderCornerControl.mjs +45 -0
  187. package/dist-extensions/cropping_controls/renderCornerControl.mjs.map +1 -0
  188. package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts +16 -0
  189. package/dist-extensions/extensions/cropping_controls/croppingControls.d.ts.map +1 -0
  190. package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts +39 -0
  191. package/dist-extensions/extensions/cropping_controls/croppingHandlers.d.ts.map +1 -0
  192. package/dist-extensions/extensions/cropping_controls/enterCropMode.d.ts +7 -0
  193. package/dist-extensions/extensions/cropping_controls/enterCropMode.d.ts.map +1 -0
  194. package/dist-extensions/extensions/cropping_controls/renderCornerControl.d.ts +14 -0
  195. package/dist-extensions/extensions/cropping_controls/renderCornerControl.d.ts.map +1 -0
  196. package/dist-extensions/extensions/index.d.ts +3 -0
  197. package/dist-extensions/extensions/index.d.ts.map +1 -1
  198. package/dist-extensions/fabric-extensions.min.js +1 -1
  199. package/dist-extensions/fabric-extensions.min.js.map +1 -1
  200. package/dist-extensions/fabric.d.ts +1 -0
  201. package/dist-extensions/fabric.d.ts.map +1 -1
  202. package/dist-extensions/index.mjs +3 -0
  203. package/dist-extensions/index.mjs.map +1 -1
  204. package/dist-extensions/src/EventTypeDefs.d.ts +5 -0
  205. package/dist-extensions/src/EventTypeDefs.d.ts.map +1 -1
  206. package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -1
  207. package/dist-extensions/src/Shadow.d.ts +1 -1
  208. package/dist-extensions/src/Shadow.d.ts.map +1 -1
  209. package/dist-extensions/src/canvas/CanvasOptions.d.ts.map +1 -1
  210. package/dist-extensions/src/canvas/SelectableCanvas.d.ts +2 -0
  211. package/dist-extensions/src/canvas/SelectableCanvas.d.ts.map +1 -1
  212. package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +1 -1
  213. package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
  214. package/dist-extensions/src/constants.d.ts +1 -0
  215. package/dist-extensions/src/constants.d.ts.map +1 -1
  216. package/dist-extensions/src/controls/Control.d.ts +22 -1
  217. package/dist-extensions/src/controls/Control.d.ts.map +1 -1
  218. package/dist-extensions/src/controls/changeWidth.d.ts +22 -0
  219. package/dist-extensions/src/controls/changeWidth.d.ts.map +1 -1
  220. package/dist-extensions/src/controls/controlRendering.d.ts.map +1 -1
  221. package/dist-extensions/src/controls/index.d.ts +2 -1
  222. package/dist-extensions/src/controls/index.d.ts.map +1 -1
  223. package/dist-extensions/src/gradient/Gradient.d.ts.map +1 -1
  224. package/dist-extensions/src/shapes/Circle.d.ts.map +1 -1
  225. package/dist-extensions/src/shapes/Ellipse.d.ts.map +1 -1
  226. package/dist-extensions/src/shapes/Group.d.ts.map +1 -1
  227. package/dist-extensions/src/shapes/IText/IText.d.ts.map +1 -1
  228. package/dist-extensions/src/shapes/Image.d.ts.map +1 -1
  229. package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
  230. package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
  231. package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  232. package/dist-extensions/src/shapes/Object/Object.d.ts.map +1 -1
  233. package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -1
  234. package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts.map +1 -1
  235. package/dist-extensions/src/shapes/Path.d.ts +1 -1
  236. package/dist-extensions/src/shapes/Path.d.ts.map +1 -1
  237. package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -1
  238. package/dist-extensions/src/shapes/Rect.d.ts.map +1 -1
  239. package/dist-extensions/src/shapes/Text/StyledText.d.ts.map +1 -1
  240. package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
  241. package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  242. package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
  243. package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -1
  244. package/dist-extensions/src/util/lang_string.d.ts +1 -1
  245. package/dist-extensions/src/util/lang_string.d.ts.map +1 -1
  246. package/dist-extensions/src/util/misc/svgParsing.d.ts.map +1 -1
  247. package/eslint.config.mjs +2 -0
  248. package/extensions/cropping_controls/croppingControls.spec.ts +115 -0
  249. package/extensions/cropping_controls/croppingControls.ts +150 -0
  250. package/extensions/cropping_controls/croppingHandlers.spec.ts +579 -0
  251. package/extensions/cropping_controls/croppingHandlers.ts +285 -0
  252. package/extensions/cropping_controls/enterCropMode.ts +30 -0
  253. package/extensions/cropping_controls/renderCornerControl.ts +53 -0
  254. package/extensions/index.ts +9 -0
  255. package/fabric.ts +1 -0
  256. package/package.json +17 -8
  257. package/src/ClassRegistry.spec.ts +18 -19
  258. package/src/EventTypeDefs.ts +15 -11
  259. package/src/Pattern/Pattern.spec.ts +12 -0
  260. package/src/Pattern/Pattern.ts +3 -2
  261. package/src/Shadow.ts +9 -8
  262. package/src/brushes/PencilBrush.spec.ts +11 -11
  263. package/src/canvas/Canvas-dispose.spec.ts +8 -7
  264. package/src/canvas/Canvas.spec.ts +27 -29
  265. package/src/canvas/CanvasOptions.ts +2 -1
  266. package/src/canvas/SelectableCanvas.ts +38 -15
  267. package/src/canvas/StaticCanvas.spec.ts +20 -0
  268. package/src/canvas/StaticCanvas.ts +7 -4
  269. package/src/canvas/StaticCanvasOptions.ts +1 -3
  270. package/src/constants.ts +1 -0
  271. package/src/controls/Control.spec.ts +102 -0
  272. package/src/controls/Control.ts +71 -2
  273. package/src/controls/changeHeight.spec.ts +147 -0
  274. package/src/controls/changeWidth.ts +68 -35
  275. package/src/controls/controlRendering.ts +20 -48
  276. package/src/controls/index.ts +7 -1
  277. package/src/gradient/Gradient.spec.ts +101 -46
  278. package/src/gradient/Gradient.ts +27 -14
  279. package/src/shapes/Circle.spec.ts +10 -39
  280. package/src/shapes/Circle.ts +11 -11
  281. package/src/shapes/Ellipse.spec.ts +8 -37
  282. package/src/shapes/Ellipse.ts +7 -7
  283. package/src/shapes/Group.ts +3 -3
  284. package/src/shapes/IText/IText-click-behavior.spec.ts +36 -49
  285. package/src/shapes/IText/IText.ts +5 -6
  286. package/src/shapes/IText/ITextKeyBehavior.test.ts +0 -1
  287. package/src/shapes/IText/__snapshots__/ITextBehavior.test.ts.snap +6 -6
  288. package/src/shapes/Image.spec.ts +17 -33
  289. package/src/shapes/Image.ts +15 -11
  290. package/src/shapes/Line.spec.ts +4 -30
  291. package/src/shapes/Line.ts +11 -16
  292. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +11 -4
  293. package/src/shapes/Object/InteractiveObject.ts +4 -4
  294. package/src/shapes/Object/Object.ts +6 -5
  295. package/src/shapes/Object/ObjectGeometry.spec.ts +15 -0
  296. package/src/shapes/Object/ObjectGeometry.ts +1 -1
  297. package/src/shapes/Object/objectSvgExport.spec.ts +112 -0
  298. package/src/shapes/Object/types/FabricObjectProps.ts +1 -4
  299. package/src/shapes/Object/types/ObjectProps.ts +1 -3
  300. package/src/shapes/Path.spec.ts +4 -27
  301. package/src/shapes/Path.ts +2 -4
  302. package/src/shapes/Polygon.spec.ts +4 -31
  303. package/src/shapes/Polyline.spec.ts +4 -31
  304. package/src/shapes/Polyline.ts +11 -12
  305. package/src/shapes/Rect.spec.ts +25 -33
  306. package/src/shapes/Rect.ts +7 -7
  307. package/src/shapes/Text/StyledText.ts +0 -3
  308. package/src/shapes/Text/Text.spec.ts +3 -32
  309. package/src/shapes/Text/Text.ts +5 -6
  310. package/src/shapes/Text/TextSVGExportMixin.spec.ts +9 -0
  311. package/src/shapes/Text/TextSVGExportMixin.ts +14 -16
  312. package/src/shapes/Text/__snapshots__/Text.spec.ts.snap +1 -1
  313. package/src/shapes/Text/__snapshots__/TextSVGExportMixin.spec.ts.snap +1 -1
  314. package/src/shapes/Textbox.spec.ts +5 -5
  315. package/src/shapes/Textbox.ts +6 -5
  316. package/src/shapes/Triangle.ts +4 -4
  317. package/src/shapes/__snapshots__/Image.spec.ts.snap +4 -4
  318. package/src/shapes/__snapshots__/Textbox.spec.ts.snap +5 -5
  319. package/src/util/lang_string.ts +3 -2
  320. package/src/util/misc/svgParsing.ts +2 -1
  321. package/tsconfig.spec.json +1 -0
  322. package/vitest.config.ts +12 -2
  323. package/vitest.extend.ts +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"IText.mjs","sources":["../../../../src/shapes/IText/IText.ts"],"sourcesContent":["import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT, RTL } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial<TClassProperties<IText>> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions<ITextProps> = Partial<ITextProps>,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior<Props, SProps, EventSpec>\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n const { textAlign, direction } = this;\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n let left = lineLeftOffset + (leftOffset > 0 ? leftOffset : 0);\n\n if (direction === RTL) {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n left *= -1;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return {\n top: topOffset,\n left,\n };\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const { textAlign, direction } = this;\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (direction === RTL) {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n"],"names":["protectedDefaultValues","_selectionDirection","_reSpace","inCompositionMode","iTextDefaultValues","selectionStart","selectionEnd","selectionColor","isEditing","editable","editingBorderColor","cursorWidth","cursorColor","cursorDelay","cursorDuration","caching","hiddenTextareaContainer","keysMap","keysMapRtl","ctrlKeysMapDown","ctrlKeysMapUp","IText","ITextClickBehavior","getDefaults","ownDefaults","type","constructor","text","options","initBehavior","_set","key","value","_savedProps","canvas","Canvas","textEditingManager","remove","add","setSelectionStart","index","Math","max","_updateAndFire","setSelectionEnd","min","length","property","_fireSelectionChanged","_updateTextarea","fire","target","initDimensions","initDelayedCursor","getSelectionStyles","startIndex","arguments","undefined","endIndex","complete","setSelectionStyles","styles","get2DCursorLocation","skipWrapping","render","ctx","cursorOffsetCache","renderCursorOrSelection","toCanvasElement","clearContextTop","boundaries","_getCursorBoundaries","ancestors","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCtx","drawingCanvas","createCanvasElementFor","getContext","applyCanvasTransform","m","calcTransformMatrix","transform","renderCursor","renderSelection","ancestor","clipPath","clippingCanvas","clippingCtx","absolutePositioned","drawObject","drawClipPathOnCache","setTransform","drawImage","contextTopDirty","restore","clipPathAncestors","obj","push","parent","skipCaching","left","_getLeftOffset","top","_getTopOffset","offsets","_getCursorBoundariesOffsets","leftOffset","topOffset","__getCursorBoundariesOffsets","charIndex","lineIndex","textAlign","direction","i","getHeightOfLine","lineLeftOffset","_getLineLeftOffset","bound","__charBounds","charSpacing","_textLines","_getWidthOfCharSpacing","RTL","RIGHT","JUSTIFY","JUSTIFY_RIGHT","LEFT","JUSTIFY_LEFT","CENTER","JUSTIFY_CENTER","renderCursorAt","_renderCursor","contextTop","getCursorRenderingData","cursorLocation","charHeight","getValueOfPropertyAt","multiplier","getObjectScaling","x","getZoom","dy","_fontSizeFraction","lineHeight","color","opacity","_currentCursorOpacity","width","height","fillStyle","globalAlpha","fillRect","selection","hiddenTextarea","_renderSelection","renderDragSourceEffect","dragStartSelection","draggableTextDelegate","getDragStartSelection","renderDropTargetEffect","e","dragSelection","getSelectionStartFromPointer","isJustify","includes","start","end","startLine","endLine","startChar","endChar","lineOffset","realLineHeight","boxStart","boxEnd","isEndOfWrapping","getLineWidth","drawStart","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","l","c","getCurrentCharColor","FILL","cursorPosition","dispose","exitEditingImpl","_defineProperty","classRegistry","setClass"],"mappings":";;;;;;;;;;AAwCA;AACA,MAAMA,sBAAsB,GAAG;AAC7BC,EAAAA,mBAAmB,EAAE,IAAI;AACzBC,EAAAA,QAAQ,EAAE,UAAU;AACpBC,EAAAA,iBAAiB,EAAE;AACrB,CAAC;AAEM,MAAMC,kBAAoD,GAAG;AAClEC,EAAAA,cAAc,EAAE,CAAC;AACjBC,EAAAA,YAAY,EAAE,CAAC;AACfC,EAAAA,cAAc,EAAE,sBAAsB;AACtCC,EAAAA,SAAS,EAAE,KAAK;AAChBC,EAAAA,QAAQ,EAAE,IAAI;AACdC,EAAAA,kBAAkB,EAAE,wBAAwB;AAC5CC,EAAAA,WAAW,EAAE,CAAC;AACdC,EAAAA,WAAW,EAAE,EAAE;AACfC,EAAAA,WAAW,EAAE,IAAI;AACjBC,EAAAA,cAAc,EAAE,GAAG;AACnBC,EAAAA,OAAO,EAAE,IAAI;AACbC,EAAAA,uBAAuB,EAAE,IAAI;EAC7BC,OAAO;EACPC,UAAU;EACVC,eAAe;EACfC,aAAa;EACb,GAAGpB;AACL;;AAEA;;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMqB,KAAK,SAKRC,kBAAkB,CAE5B;EA8EE,OAAOC,WAAWA,GAAwB;IACxC,OAAO;AAAE,MAAA,GAAG,KAAK,CAACA,WAAW,EAAE;AAAE,MAAA,GAAGF,KAAK,CAACG;KAAa;AACzD,EAAA;EAIA,IAAIC,IAAIA,GAAG;AACT,IAAA,MAAMA,IAAI,GAAG,KAAK,CAACA,IAAI;AACvB;AACA,IAAA,OAAOA,IAAI,KAAK,OAAO,GAAG,QAAQ,GAAGA,IAAI;AAC3C,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEC,EAAAA,WAAWA,CAACC,IAAY,EAAEC,OAAe,EAAE;IACzC,KAAK,CAACD,IAAI,EAAE;MAAE,GAAGN,KAAK,CAACG,WAAW;MAAE,GAAGI;AAAQ,KAAU,CAAC;IAC1D,IAAI,CAACC,YAAY,EAAE;AACrB,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEC,EAAAA,IAAIA,CAACC,GAAW,EAAEC,KAAU,EAAE;AAC5B,IAAA,IAAI,IAAI,CAACxB,SAAS,IAAI,IAAI,CAACyB,WAAW,IAAIF,GAAG,IAAI,IAAI,CAACE,WAAW,EAAE;AACjE;AACA,MAAA,IAAI,CAACA,WAAW,CAACF,GAAG,CAAC,GAAGC,KAAK;AAC7B,MAAA,OAAO,IAAI;AACb,IAAA;IACA,IAAID,GAAG,KAAK,QAAQ,EAAE;AACpB,MAAA,IAAI,CAACG,MAAM,YAAYC,MAAM,IAC3B,IAAI,CAACD,MAAM,CAACE,kBAAkB,CAACC,MAAM,CAAC,IAAI,CAAC;MAC7CL,KAAK,YAAYG,MAAM,IAAIH,KAAK,CAACI,kBAAkB,CAACE,GAAG,CAAC,IAAI,CAAC;AAC/D,IAAA;AACA,IAAA,OAAO,KAAK,CAACR,IAAI,CAACC,GAAG,EAAEC,KAAK,CAAC;AAC/B,EAAA;;AAEA;AACF;AACA;AACA;EACEO,iBAAiBA,CAACC,KAAa,EAAE;IAC/BA,KAAK,GAAGC,IAAI,CAACC,GAAG,CAACF,KAAK,EAAE,CAAC,CAAC;AAC1B,IAAA,IAAI,CAACG,cAAc,CAAC,gBAAgB,EAAEH,KAAK,CAAC;AAC9C,EAAA;;AAEA;AACF;AACA;AACA;EACEI,eAAeA,CAACJ,KAAa,EAAE;AAC7BA,IAAAA,KAAK,GAAGC,IAAI,CAACI,GAAG,CAACL,KAAK,EAAE,IAAI,CAACb,IAAI,CAACmB,MAAM,CAAC;AACzC,IAAA,IAAI,CAACH,cAAc,CAAC,cAAc,EAAEH,KAAK,CAAC;AAC5C,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACYG,EAAAA,cAAcA,CACtBI,QAA2C,EAC3CP,KAAa,EACb;AACA,IAAA,IAAI,IAAI,CAACO,QAAQ,CAAC,KAAKP,KAAK,EAAE;MAC5B,IAAI,CAACQ,qBAAqB,EAAE;AAC5B,MAAA,IAAI,CAACD,QAAQ,CAAC,GAAGP,KAAK;AACxB,IAAA;IACA,IAAI,CAACS,eAAe,EAAE;AACxB,EAAA;;AAEA;AACF;AACA;AACA;AACED,EAAAA,qBAAqBA,GAAG;AACtB,IAAA,IAAI,CAACE,IAAI,CAAC,mBAAmB,CAAC;IAC9B,IAAI,CAAChB,MAAM,IAAI,IAAI,CAACA,MAAM,CAACgB,IAAI,CAAC,wBAAwB,EAAE;AAAEC,MAAAA,MAAM,EAAE;AAAK,KAAC,CAAC;AAC7E,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,cAAcA,GAAG;AACf,IAAA,IAAI,CAAC5C,SAAS,IAAI,IAAI,CAAC6C,iBAAiB,EAAE;IAC1C,KAAK,CAACD,cAAc,EAAE;AACxB,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACEE,EAAAA,kBAAkBA,GAIhB;AAAA,IAAA,IAHAC,UAAkB,GAAAC,SAAA,CAAAV,MAAA,QAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc,IAAI,CAAC;AAAA,IAAA,IAC7CqD,QAAgB,GAAAF,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAAClD,YAAY;IAAA,IACpCqD,QAAkB,GAAAH,SAAA,CAAAV,MAAA,GAAA,CAAA,GAAAU,SAAA,MAAAC,SAAA;IAElB,OAAO,KAAK,CAACH,kBAAkB,CAACC,UAAU,EAAEG,QAAQ,EAAEC,QAAQ,CAAC;AACjE,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACEC,kBAAkBA,CAChBC,MAAc,EAGd;AAAA,IAAA,IAFAN,UAAkB,GAAAC,SAAA,CAAAV,MAAA,QAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc,IAAI,CAAC;AAAA,IAAA,IAC7CqD,QAAgB,GAAAF,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAAClD,YAAY;IAEpC,OAAO,KAAK,CAACsD,kBAAkB,CAACC,MAAM,EAAEN,UAAU,EAAEG,QAAQ,CAAC;AAC/D,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEI,EAAAA,mBAAmBA,GAGjB;AAAA,IAAA,IAFAzD,cAAc,GAAAmD,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc;IAAA,IACpC0D,YAAsB,GAAAP,SAAA,CAAAV,MAAA,GAAA,CAAA,GAAAU,SAAA,MAAAC,SAAA;AAEtB,IAAA,OAAO,KAAK,CAACK,mBAAmB,CAACzD,cAAc,EAAE0D,YAAY,CAAC;AAChE,EAAA;;AAEA;AACF;AACA;AACA;EACEC,MAAMA,CAACC,GAA6B,EAAE;AACpC,IAAA,KAAK,CAACD,MAAM,CAACC,GAAG,CAAC;AACjB;AACA;AACA,IAAA,IAAI,CAACC,iBAAiB,GAAG,EAAE;IAC3B,IAAI,CAACC,uBAAuB,EAAE;AAChC,EAAA;;AAEA;AACF;AACA;AACA;EACEC,eAAeA,CAACxC,OAAsC,EAAqB;AACzE,IAAA,MAAMpB,SAAS,GAAG,IAAI,CAACA,SAAS;IAChC,IAAI,CAACA,SAAS,GAAG,KAAK;AACtB,IAAA,MAAM0B,MAAM,GAAG,KAAK,CAACkC,eAAe,CAACxC,OAAO,CAAC;IAC7C,IAAI,CAACpB,SAAS,GAAGA,SAAS;AAC1B,IAAA,OAAO0B,MAAM;AACf,EAAA;;AAEA;AACF;AACA;AACA;AACEiC,EAAAA,uBAAuBA,GAAG;IACxB,IAAI,CAAC,IAAI,CAAC3D,SAAS,IAAI,CAAC,IAAI,CAAC0B,MAAM,EAAE;AACnC,MAAA;AACF,IAAA;AACA,IAAA,MAAM+B,GAAG,GAAG,IAAI,CAACI,eAAe,CAAC,IAAI,CAAC;IACtC,IAAI,CAACJ,GAAG,EAAE;AACR,MAAA;AACF,IAAA;AACA,IAAA,MAAMK,UAAU,GAAG,IAAI,CAACC,oBAAoB,EAAE;AAE9C,IAAA,MAAMC,SAAS,GAAG,IAAI,CAACC,yBAAyB,EAAE;AAClD,IAAA,MAAMC,wBAAwB,GAAGF,SAAS,CAAC1B,MAAM,GAAG,CAAC;IACrD,IAAI6B,UAAoC,GAAGV,GAAG;IAC9C,IAAIW,aAA4C,GAAGnB,SAAS;AAC5D,IAAA,IAAIiB,wBAAwB,EAAE;AAC5B;AACAE,MAAAA,aAAa,GAAGC,sBAAsB,CAACZ,GAAG,CAAC/B,MAAM,CAAC;AAClDyC,MAAAA,UAAU,GAAGC,aAAa,CAACE,UAAU,CAAC,IAAI,CAAE;AAC5CC,MAAAA,oBAAoB,CAACJ,UAAU,EAAE,IAAI,CAACzC,MAAM,CAAC;AAC7C,MAAA,MAAM8C,CAAC,GAAG,IAAI,CAACC,mBAAmB,EAAE;AACpCN,MAAAA,UAAU,CAACO,SAAS,CAACF,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,IAAA;AAEA,IAAA,IAAI,IAAI,CAAC3E,cAAc,KAAK,IAAI,CAACC,YAAY,IAAI,CAAC,IAAI,CAACH,iBAAiB,EAAE;AACxE,MAAA,IAAI,CAACgF,YAAY,CAACR,UAAU,EAAEL,UAAU,CAAC;AAC3C,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAACc,eAAe,CAACT,UAAU,EAAEL,UAAU,CAAC;AAC9C,IAAA;AAEA,IAAA,IAAII,wBAAwB,EAAE;AAC5B;AACA;AACA;AACA,MAAA,KAAK,MAAMW,QAAQ,IAAIb,SAAS,EAAE;AAChC,QAAA,MAAMc,QAAQ,GAAGD,QAAQ,CAACC,QAAS;AACnC,QAAA,MAAMC,cAAc,GAAGV,sBAAsB,CAACZ,GAAG,CAAC/B,MAAM,CAAC;AACzD,QAAA,MAAMsD,WAAW,GAAGD,cAAc,CAACT,UAAU,CAAC,IAAI,CAAE;AACpDC,QAAAA,oBAAoB,CAACS,WAAW,EAAE,IAAI,CAACtD,MAAM,CAAC;AAC9C;AACA,QAAA,IAAI,CAACoD,QAAQ,CAACG,kBAAkB,EAAE;AAChC,UAAA,MAAMT,CAAC,GAAGK,QAAQ,CAACJ,mBAAmB,EAAE;AACxCO,UAAAA,WAAW,CAACN,SAAS,CAACF,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,QAAA;AACAM,QAAAA,QAAQ,CAACJ,SAAS,CAACM,WAAW,CAAC;AAC/B;QACAF,QAAQ,CAACI,UAAU,CAACF,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1C,IAAI,CAACG,mBAAmB,CAAChB,UAAU,EAAEW,QAAQ,EAAEC,cAAc,CAAC;AAChE,MAAA;AACF,IAAA;AAEA,IAAA,IAAIb,wBAAwB,EAAE;AAC5BT,MAAAA,GAAG,CAAC2B,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MAClC3B,GAAG,CAAC4B,SAAS,CAACjB,aAAa,EAAG,CAAC,EAAE,CAAC,CAAC;AACrC,IAAA;AAEA,IAAA,IAAI,CAAC1C,MAAM,CAAC4D,eAAe,GAAG,IAAI;IAClC7B,GAAG,CAAC8B,OAAO,EAAE;AACf,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEtB,EAAAA,yBAAyBA,GAAmB;IAC1C,MAAMuB,iBAAiC,GAAG,EAAE;AAC5C;IACA,IAAIC,GAA6B,GAAG,IAAI;AACxC,IAAA,OAAOA,GAAG,EAAE;MACV,IAAIA,GAAG,CAACX,QAAQ,EAAE;AAChBU,QAAAA,iBAAiB,CAACE,IAAI,CAACD,GAAG,CAAC;AAC7B,MAAA;MACAA,GAAG,GAAGA,GAAG,CAACE,MAAM;AAClB,IAAA;AAEA,IAAA,OAAOH,iBAAiB;AAC1B,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACEzB,EAAAA,oBAAoBA,GAGA;AAAA,IAAA,IAFlB/B,KAAa,GAAAgB,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc;IAAA,IACnC+F,WAAqB,GAAA5C,SAAA,CAAAV,MAAA,GAAA,CAAA,GAAAU,SAAA,MAAAC,SAAA;AAErB,IAAA,MAAM4C,IAAI,GAAG,IAAI,CAACC,cAAc,EAAE;AAChCC,MAAAA,GAAG,GAAG,IAAI,CAACC,aAAa,EAAE;MAC1BC,OAAO,GAAG,IAAI,CAACC,2BAA2B,CAAClE,KAAK,EAAE4D,WAAW,CAAC;IAChE,OAAO;AACLC,MAAAA,IAAI,EAAEA,IAAI;AACVE,MAAAA,GAAG,EAAEA,GAAG;MACRI,UAAU,EAAEF,OAAO,CAACJ,IAAI;MACxBO,SAAS,EAAEH,OAAO,CAACF;KACpB;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEG,EAAAA,2BAA2BA,CACzBlE,KAAa,EACb4D,WAAqB,EACU;AAC/B,IAAA,IAAIA,WAAW,EAAE;AACf,MAAA,OAAO,IAAI,CAACS,4BAA4B,CAACrE,KAAK,CAAC;AACjD,IAAA;IACA,IAAI,IAAI,CAAC0B,iBAAiB,IAAI,KAAK,IAAI,IAAI,CAACA,iBAAiB,EAAE;MAC7D,OAAO,IAAI,CAACA,iBAAiB;AAC/B,IAAA;IACA,OAAQ,IAAI,CAACA,iBAAiB,GAAG,IAAI,CAAC2C,4BAA4B,CAACrE,KAAK,CAAC;AAC3E,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACEqE,4BAA4BA,CAACrE,KAAa,EAAE;IAC1C,IAAIoE,SAAS,GAAG,CAAC;AACfD,MAAAA,UAAU,GAAG,CAAC;IAChB,MAAM;MAAEG,SAAS;AAAEC,MAAAA;AAAU,KAAC,GAAG,IAAI,CAACjD,mBAAmB,CAACtB,KAAK,CAAC;IAChE,MAAM;MAAEwE,SAAS;AAAEC,MAAAA;AAAU,KAAC,GAAG,IAAI;IACrC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,SAAS,EAAEG,CAAC,EAAE,EAAE;AAClCN,MAAAA,SAAS,IAAI,IAAI,CAACO,eAAe,CAACD,CAAC,CAAC;AACtC,IAAA;AACA,IAAA,MAAME,cAAc,GAAG,IAAI,CAACC,kBAAkB,CAACN,SAAS,CAAC;IACzD,MAAMO,KAAK,GAAG,IAAI,CAACC,YAAY,CAACR,SAAS,CAAC,CAACD,SAAS,CAAC;AACrDQ,IAAAA,KAAK,KAAKX,UAAU,GAAGW,KAAK,CAACjB,IAAI,CAAC;AAClC,IAAA,IACE,IAAI,CAACmB,WAAW,KAAK,CAAC,IACtBV,SAAS,KAAK,IAAI,CAACW,UAAU,CAACV,SAAS,CAAC,CAACjE,MAAM,EAC/C;AACA6D,MAAAA,UAAU,IAAI,IAAI,CAACe,sBAAsB,EAAE;AAC7C,IAAA;IACA,IAAIrB,IAAI,GAAGe,cAAc,IAAIT,UAAU,GAAG,CAAC,GAAGA,UAAU,GAAG,CAAC,CAAC;IAE7D,IAAIM,SAAS,KAAKU,GAAG,EAAE;MACrB,IACEX,SAAS,KAAKY,KAAK,IACnBZ,SAAS,KAAKa,OAAO,IACrBb,SAAS,KAAKc,aAAa,EAC3B;QACAzB,IAAI,IAAI,EAAE;MACZ,CAAC,MAAM,IAAIW,SAAS,KAAKe,IAAI,IAAIf,SAAS,KAAKgB,YAAY,EAAE;QAC3D3B,IAAI,GAAGe,cAAc,IAAIT,UAAU,GAAG,CAAC,GAAGA,UAAU,GAAG,CAAC,CAAC;MAC3D,CAAC,MAAM,IAAIK,SAAS,KAAKiB,MAAM,IAAIjB,SAAS,KAAKkB,cAAc,EAAE;QAC/D7B,IAAI,GAAGe,cAAc,IAAIT,UAAU,GAAG,CAAC,GAAGA,UAAU,GAAG,CAAC,CAAC;AAC3D,MAAA;AACF,IAAA;IACA,OAAO;AACLJ,MAAAA,GAAG,EAAEK,SAAS;AACdP,MAAAA;KACD;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACE8B,cAAcA,CAAC9H,cAAsB,EAAE;AACrC,IAAA,IAAI,CAAC+H,aAAa,CAChB,IAAI,CAAClG,MAAM,CAAEmG,UAAU,EACvB,IAAI,CAAC9D,oBAAoB,CAAClE,cAAc,EAAE,IAAI,CAAC,EAC/CA,cACF,CAAC;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACE8E,EAAAA,YAAYA,CAAClB,GAA6B,EAAEK,UAA4B,EAAE;IACxE,IAAI,CAAC8D,aAAa,CAACnE,GAAG,EAAEK,UAAU,EAAE,IAAI,CAACjE,cAAc,CAAC;AAC1D,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEiI,EAAAA,sBAAsBA,GAGC;AAAA,IAAA,IAFrBjI,cAAsB,GAAAmD,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc;AAAA,IAAA,IAC5CiE,UAA4B,GAAAd,SAAA,CAAAV,MAAA,QAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACe,oBAAoB,CAAClE,cAAc,CAAC;AAExE,IAAA,MAAMkI,cAAc,GAAG,IAAI,CAACzE,mBAAmB,CAACzD,cAAc,CAAC;MAC7D0G,SAAS,GAAGwB,cAAc,CAACxB,SAAS;AACpCD,MAAAA,SAAS,GACPyB,cAAc,CAACzB,SAAS,GAAG,CAAC,GAAGyB,cAAc,CAACzB,SAAS,GAAG,CAAC,GAAG,CAAC;MACjE0B,UAAU,GAAG,IAAI,CAACC,oBAAoB,CAAC1B,SAAS,EAAED,SAAS,EAAE,UAAU,CAAC;AACxE4B,MAAAA,UAAU,GAAG,IAAI,CAACC,gBAAgB,EAAE,CAACC,CAAC,GAAG,IAAI,CAAC1G,MAAM,CAAE2G,OAAO,EAAE;AAC/DlI,MAAAA,WAAW,GAAG,IAAI,CAACA,WAAW,GAAG+H,UAAU;MAC3CI,EAAE,GAAG,IAAI,CAACL,oBAAoB,CAAC1B,SAAS,EAAED,SAAS,EAAE,QAAQ,CAAC;AAC9DF,MAAAA,SAAS,GACPtC,UAAU,CAACsC,SAAS,GACnB,CAAC,CAAC,GAAG,IAAI,CAACmC,iBAAiB,IAAI,IAAI,CAAC5B,eAAe,CAACJ,SAAS,CAAC,GAC7D,IAAI,CAACiC,UAAU,GACjBR,UAAU,IAAI,CAAC,GAAG,IAAI,CAACO,iBAAiB,CAAC;IAE7C,OAAO;AACLE,MAAAA,KAAK,EACH,IAAI,CAACrI,WAAW,IACf,IAAI,CAAC6H,oBAAoB,CAAC1B,SAAS,EAAED,SAAS,EAAE,MAAM,CAAY;MACrEoC,OAAO,EAAE,IAAI,CAACC,qBAAqB;MACnC9C,IAAI,EAAE/B,UAAU,CAAC+B,IAAI,GAAG/B,UAAU,CAACqC,UAAU,GAAGhG,WAAW,GAAG,CAAC;AAC/D4F,MAAAA,GAAG,EAAEK,SAAS,GAAGtC,UAAU,CAACiC,GAAG,GAAGuC,EAAE;AACpCM,MAAAA,KAAK,EAAEzI,WAAW;AAClB0I,MAAAA,MAAM,EAAEb;KACT;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACEJ,EAAAA,aAAaA,CACXnE,GAA6B,EAC7BK,UAA4B,EAC5BjE,cAAsB,EACtB;IACA,MAAM;MAAE4I,KAAK;MAAEC,OAAO;MAAE7C,IAAI;MAAEE,GAAG;MAAE6C,KAAK;AAAEC,MAAAA;KAAQ,GAChD,IAAI,CAACf,sBAAsB,CAACjI,cAAc,EAAEiE,UAAU,CAAC;IACzDL,GAAG,CAACqF,SAAS,GAAGL,KAAK;IACrBhF,GAAG,CAACsF,WAAW,GAAGL,OAAO;IACzBjF,GAAG,CAACuF,QAAQ,CAACnD,IAAI,EAAEE,GAAG,EAAE6C,KAAK,EAAEC,MAAM,CAAC;AACxC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEjE,EAAAA,eAAeA,CAACnB,GAA6B,EAAEK,UAA4B,EAAE;AAC3E,IAAA,MAAMmF,SAAS,GAAG;AAChBpJ,MAAAA,cAAc,EAAE,IAAI,CAACF,iBAAiB,GAClC,IAAI,CAACuJ,cAAc,CAAErJ,cAAc,GACnC,IAAI,CAACA,cAAc;AACvBC,MAAAA,YAAY,EAAE,IAAI,CAACH,iBAAiB,GAChC,IAAI,CAACuJ,cAAc,CAAEpJ,YAAY,GACjC,IAAI,CAACA;KACV;IACD,IAAI,CAACqJ,gBAAgB,CAAC1F,GAAG,EAAEwF,SAAS,EAAEnF,UAAU,CAAC;AACnD,EAAA;;AAEA;AACF;AACA;AACEsF,EAAAA,sBAAsBA,GAAG;IACvB,MAAMC,kBAAkB,GACtB,IAAI,CAACC,qBAAqB,CAACC,qBAAqB,EAAG;IACrD,IAAI,CAACJ,gBAAgB,CACnB,IAAI,CAACzH,MAAM,CAAEmG,UAAU,EACvBwB,kBAAkB,EAClB,IAAI,CAACtF,oBAAoB,CAACsF,kBAAkB,CAACxJ,cAAc,EAAE,IAAI,CACnE,CAAC;AACH,EAAA;EAEA2J,sBAAsBA,CAACC,CAAY,EAAE;AACnC,IAAA,MAAMC,aAAa,GAAG,IAAI,CAACC,4BAA4B,CAACF,CAAC,CAAC;AAC1D,IAAA,IAAI,CAAC9B,cAAc,CAAC+B,aAAa,CAAC;AACpC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEP,EAAAA,gBAAgBA,CACd1F,GAA6B,EAC7BwF,SAA2D,EAC3DnF,UAA4B,EAC5B;IACA,MAAM;MAAE0C,SAAS;AAAEC,MAAAA;AAAU,KAAC,GAAG,IAAI;AACrC,IAAA,MAAM5G,cAAc,GAAGoJ,SAAS,CAACpJ,cAAc;MAC7CC,YAAY,GAAGmJ,SAAS,CAACnJ,YAAY;AACrC8J,MAAAA,SAAS,GAAGpD,SAAS,CAACqD,QAAQ,CAACxC,OAAO,CAAC;AACvCyC,MAAAA,KAAK,GAAG,IAAI,CAACxG,mBAAmB,CAACzD,cAAc,CAAC;AAChDkK,MAAAA,GAAG,GAAG,IAAI,CAACzG,mBAAmB,CAACxD,YAAY,CAAC;MAC5CkK,SAAS,GAAGF,KAAK,CAACvD,SAAS;MAC3B0D,OAAO,GAAGF,GAAG,CAACxD,SAAS;MACvB2D,SAAS,GAAGJ,KAAK,CAACxD,SAAS,GAAG,CAAC,GAAG,CAAC,GAAGwD,KAAK,CAACxD,SAAS;MACrD6D,OAAO,GAAGJ,GAAG,CAACzD,SAAS,GAAG,CAAC,GAAG,CAAC,GAAGyD,GAAG,CAACzD,SAAS;IAEjD,KAAK,IAAII,CAAC,GAAGsD,SAAS,EAAEtD,CAAC,IAAIuD,OAAO,EAAEvD,CAAC,EAAE,EAAE;MACzC,MAAM0D,UAAU,GAAG,IAAI,CAACvD,kBAAkB,CAACH,CAAC,CAAC,IAAI,CAAC;AAClD,MAAA,IAAI8B,UAAU,GAAG,IAAI,CAAC7B,eAAe,CAACD,CAAC,CAAC;AACtC2D,QAAAA,cAAc,GAAG,CAAC;AAClBC,QAAAA,QAAQ,GAAG,CAAC;AACZC,QAAAA,MAAM,GAAG,CAAC;MAEZ,IAAI7D,CAAC,KAAKsD,SAAS,EAAE;QACnBM,QAAQ,GAAG,IAAI,CAACvD,YAAY,CAACiD,SAAS,CAAC,CAACE,SAAS,CAAC,CAACrE,IAAI;AACzD,MAAA;AACA,MAAA,IAAIa,CAAC,IAAIsD,SAAS,IAAItD,CAAC,GAAGuD,OAAO,EAAE;QACjCM,MAAM,GACJX,SAAS,IAAI,CAAC,IAAI,CAACY,eAAe,CAAC9D,CAAC,CAAC,GACjC,IAAI,CAACkC,KAAK,GACV,IAAI,CAAC6B,YAAY,CAAC/D,CAAC,CAAC,IAAI,CAAC,CAAC;AAClC,MAAA,CAAC,MAAM,IAAIA,CAAC,KAAKuD,OAAO,EAAE;QACxB,IAAIE,OAAO,KAAK,CAAC,EAAE;UACjBI,MAAM,GAAG,IAAI,CAACxD,YAAY,CAACkD,OAAO,CAAC,CAACE,OAAO,CAAC,CAACtE,IAAI;AACnD,QAAA,CAAC,MAAM;AACL,UAAA,MAAMmB,WAAW,GAAG,IAAI,CAACE,sBAAsB,EAAE;AACjDqD,UAAAA,MAAM,GACJ,IAAI,CAACxD,YAAY,CAACkD,OAAO,CAAC,CAACE,OAAO,GAAG,CAAC,CAAC,CAACtE,IAAI,GAC5C,IAAI,CAACkB,YAAY,CAACkD,OAAO,CAAC,CAACE,OAAO,GAAG,CAAC,CAAC,CAACvB,KAAK,GAC7C5B,WAAW;AACf,QAAA;AACF,MAAA;AACAqD,MAAAA,cAAc,GAAG7B,UAAU;AAC3B,MAAA,IAAI,IAAI,CAACA,UAAU,GAAG,CAAC,IAAK9B,CAAC,KAAKuD,OAAO,IAAI,IAAI,CAACzB,UAAU,GAAG,CAAE,EAAE;QACjEA,UAAU,IAAI,IAAI,CAACA,UAAU;AAC/B,MAAA;MACA,IAAIkC,SAAS,GAAG5G,UAAU,CAAC+B,IAAI,GAAGuE,UAAU,GAAGE,QAAQ;AACrDK,QAAAA,UAAU,GAAGnC,UAAU;AACvBoC,QAAAA,QAAQ,GAAG,CAAC;AACd,MAAA,MAAMC,SAAS,GAAGN,MAAM,GAAGD,QAAQ;MACnC,IAAI,IAAI,CAAC3K,iBAAiB,EAAE;AAC1B8D,QAAAA,GAAG,CAACqF,SAAS,GAAG,IAAI,CAACgC,gBAAgB,IAAI,OAAO;AAChDH,QAAAA,UAAU,GAAG,CAAC;AACdC,QAAAA,QAAQ,GAAGpC,UAAU;AACvB,MAAA,CAAC,MAAM;AACL/E,QAAAA,GAAG,CAACqF,SAAS,GAAG,IAAI,CAAC/I,cAAc;AACrC,MAAA;MACA,IAAI0G,SAAS,KAAKU,GAAG,EAAE;QACrB,IACEX,SAAS,KAAKY,KAAK,IACnBZ,SAAS,KAAKa,OAAO,IACrBb,SAAS,KAAKc,aAAa,EAC3B;AACAoD,UAAAA,SAAS,GAAG,IAAI,CAAC9B,KAAK,GAAG8B,SAAS,GAAGG,SAAS;QAChD,CAAC,MAAM,IAAIrE,SAAS,KAAKe,IAAI,IAAIf,SAAS,KAAKgB,YAAY,EAAE;AAC3DkD,UAAAA,SAAS,GAAG5G,UAAU,CAAC+B,IAAI,GAAGuE,UAAU,GAAGG,MAAM;QACnD,CAAC,MAAM,IAAI/D,SAAS,KAAKiB,MAAM,IAAIjB,SAAS,KAAKkB,cAAc,EAAE;AAC/DgD,UAAAA,SAAS,GAAG5G,UAAU,CAAC+B,IAAI,GAAGuE,UAAU,GAAGG,MAAM;AACnD,QAAA;AACF,MAAA;AACA9G,MAAAA,GAAG,CAACuF,QAAQ,CACV0B,SAAS,EACT5G,UAAU,CAACiC,GAAG,GAAGjC,UAAU,CAACsC,SAAS,GAAGwE,QAAQ,EAChDC,SAAS,EACTF,UACF,CAAC;MACD7G,UAAU,CAACsC,SAAS,IAAIiE,cAAc;AACxC,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEU,EAAAA,sBAAsBA,GAAW;AAC/B,IAAA,MAAMC,EAAE,GAAG,IAAI,CAACC,oBAAoB,EAAE;AACtC,IAAA,OAAO,IAAI,CAAChD,oBAAoB,CAAC+C,EAAE,CAACE,CAAC,EAAEF,EAAE,CAACG,CAAC,EAAE,UAAU,CAAC;AAC1D,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,mBAAmBA,GAA4B;AAC7C,IAAA,MAAMJ,EAAE,GAAG,IAAI,CAACC,oBAAoB,EAAE;AACtC,IAAA,OAAO,IAAI,CAAChD,oBAAoB,CAAC+C,EAAE,CAACE,CAAC,EAAEF,EAAE,CAACG,CAAC,EAAEE,IAAI,CAAC;AACpD,EAAA;;AAEA;AACF;AACA;AACA;AACEJ,EAAAA,oBAAoBA,GAAG;IACrB,MAAMK,cAAc,GAAG,IAAI,CAAChI,mBAAmB,CAAC,IAAI,CAACzD,cAAc,EAAE,IAAI,CAAC;AACxEyG,MAAAA,SAAS,GACPgF,cAAc,CAAChF,SAAS,GAAG,CAAC,GAAGgF,cAAc,CAAChF,SAAS,GAAG,CAAC,GAAG,CAAC;IACnE,OAAO;MAAE4E,CAAC,EAAEI,cAAc,CAAC/E,SAAS;AAAE4E,MAAAA,CAAC,EAAE7E;KAAW;AACtD,EAAA;AAEAiF,EAAAA,OAAOA,GAAG;IACR,IAAI,CAACC,eAAe,EAAE;AACtB,IAAA,IAAI,CAAClC,qBAAqB,CAACiC,OAAO,EAAE;IACpC,KAAK,CAACA,OAAO,EAAE;AACjB,EAAA;AACF;AAtoBE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAOE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAKE;AACF;AACA;AACA;AAHEE,eAAA,CA7EW5K,KAAK,EAAA,aAAA,EAmFKjB,kBAAkB,CAAA;AAAA6L,eAAA,CAnF5B5K,KAAK,EAAA,MAAA,EAyFF,OAAO,CAAA;AAujBvB6K,aAAa,CAACC,QAAQ,CAAC9K,KAAK,CAAC;AAC7B;AACA6K,aAAa,CAACC,QAAQ,CAAC9K,KAAK,EAAE,QAAQ,CAAC;;;;"}
1
+ {"version":3,"file":"IText.mjs","sources":["../../../../src/shapes/IText/IText.ts"],"sourcesContent":["import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT, RTL } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial<TClassProperties<IText>> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps, UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions<ITextProps> = Partial<ITextProps>,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n>\n extends ITextClickBehavior<Props, SProps, EventSpec>\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n const { textAlign, direction } = this;\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n let left = lineLeftOffset + (leftOffset > 0 ? leftOffset : 0);\n\n if (direction === RTL) {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n left *= -1;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return {\n top: topOffset,\n left,\n };\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const { textAlign, direction } = this;\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (direction === RTL) {\n if (\n textAlign === RIGHT ||\n textAlign === JUSTIFY ||\n textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (textAlign === LEFT || textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (textAlign === CENTER || textAlign === JUSTIFY_CENTER) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n"],"names":["protectedDefaultValues","_selectionDirection","_reSpace","inCompositionMode","iTextDefaultValues","selectionStart","selectionEnd","selectionColor","isEditing","editable","editingBorderColor","cursorWidth","cursorColor","cursorDelay","cursorDuration","caching","hiddenTextareaContainer","keysMap","keysMapRtl","ctrlKeysMapDown","ctrlKeysMapUp","IText","ITextClickBehavior","getDefaults","ownDefaults","type","constructor","text","options","initBehavior","_set","key","value","_savedProps","canvas","Canvas","textEditingManager","remove","add","setSelectionStart","index","Math","max","_updateAndFire","setSelectionEnd","min","length","property","_fireSelectionChanged","_updateTextarea","fire","target","initDimensions","initDelayedCursor","getSelectionStyles","startIndex","arguments","undefined","endIndex","complete","setSelectionStyles","styles","get2DCursorLocation","skipWrapping","render","ctx","cursorOffsetCache","renderCursorOrSelection","toCanvasElement","clearContextTop","boundaries","_getCursorBoundaries","ancestors","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCtx","drawingCanvas","createCanvasElementFor","getContext","applyCanvasTransform","m","calcTransformMatrix","transform","renderCursor","renderSelection","ancestor","clipPath","clippingCanvas","clippingCtx","absolutePositioned","drawObject","drawClipPathOnCache","setTransform","drawImage","contextTopDirty","restore","clipPathAncestors","obj","push","parent","skipCaching","left","_getLeftOffset","top","_getTopOffset","offsets","_getCursorBoundariesOffsets","leftOffset","topOffset","__getCursorBoundariesOffsets","charIndex","lineIndex","textAlign","direction","i","getHeightOfLine","lineLeftOffset","_getLineLeftOffset","bound","__charBounds","charSpacing","_textLines","_getWidthOfCharSpacing","RTL","RIGHT","JUSTIFY","JUSTIFY_RIGHT","LEFT","JUSTIFY_LEFT","CENTER","JUSTIFY_CENTER","renderCursorAt","_renderCursor","contextTop","getCursorRenderingData","cursorLocation","charHeight","getValueOfPropertyAt","multiplier","getObjectScaling","x","getZoom","dy","_fontSizeFraction","lineHeight","color","opacity","_currentCursorOpacity","width","height","fillStyle","globalAlpha","fillRect","selection","hiddenTextarea","_renderSelection","renderDragSourceEffect","dragStartSelection","draggableTextDelegate","getDragStartSelection","renderDropTargetEffect","e","dragSelection","getSelectionStartFromPointer","isJustify","includes","start","end","startLine","endLine","startChar","endChar","lineOffset","realLineHeight","boxStart","boxEnd","isEndOfWrapping","getLineWidth","drawStart","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","l","c","getCurrentCharColor","FILL","cursorPosition","dispose","exitEditingImpl","_defineProperty","classRegistry","setClass"],"mappings":";;;;;;;;;;AAwCA;AACA,MAAMA,sBAAsB,GAAG;AAC7BC,EAAAA,mBAAmB,EAAE,IAAI;AACzBC,EAAAA,QAAQ,EAAE,UAAU;AACpBC,EAAAA,iBAAiB,EAAE;AACrB,CAAC;AAEM,MAAMC,kBAAoD,GAAG;AAClEC,EAAAA,cAAc,EAAE,CAAC;AACjBC,EAAAA,YAAY,EAAE,CAAC;AACfC,EAAAA,cAAc,EAAE,sBAAsB;AACtCC,EAAAA,SAAS,EAAE,KAAK;AAChBC,EAAAA,QAAQ,EAAE,IAAI;AACdC,EAAAA,kBAAkB,EAAE,wBAAwB;AAC5CC,EAAAA,WAAW,EAAE,CAAC;AACdC,EAAAA,WAAW,EAAE,EAAE;AACfC,EAAAA,WAAW,EAAE,IAAI;AACjBC,EAAAA,cAAc,EAAE,GAAG;AACnBC,EAAAA,OAAO,EAAE,IAAI;AACbC,EAAAA,uBAAuB,EAAE,IAAI;EAC7BC,OAAO;EACPC,UAAU;EACVC,eAAe;EACfC,aAAa;EACb,GAAGpB;AACL;;AAEA;;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMqB,KAAK,SAKRC,kBAAkB,CAE5B;EA8EE,OAAOC,WAAWA,GAAwB;IACxC,OAAO;AAAE,MAAA,GAAG,KAAK,CAACA,WAAW,EAAE;AAAE,MAAA,GAAGF,KAAK,CAACG;KAAa;AACzD,EAAA;EAIA,IAAIC,IAAIA,GAAG;AACT,IAAA,MAAMA,IAAI,GAAG,KAAK,CAACA,IAAI;AACvB;AACA,IAAA,OAAOA,IAAI,KAAK,OAAO,GAAG,QAAQ,GAAGA,IAAI;AAC3C,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEC,EAAAA,WAAWA,CAACC,IAAY,EAAEC,OAAe,EAAE;IACzC,KAAK,CAACD,IAAI,EAAE;MAAE,GAAGN,KAAK,CAACG,WAAW;MAAE,GAAGI;AAAQ,KAAU,CAAC;IAC1D,IAAI,CAACC,YAAY,EAAE;AACrB,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEC,EAAAA,IAAIA,CAACC,GAAW,EAAEC,KAAU,EAAE;AAC5B,IAAA,IAAI,IAAI,CAACxB,SAAS,IAAI,IAAI,CAACyB,WAAW,IAAIF,GAAG,IAAI,IAAI,CAACE,WAAW,EAAE;AACjE;AACA,MAAA,IAAI,CAACA,WAAW,CAACF,GAAG,CAAC,GAAGC,KAAK;AAC7B,MAAA,OAAO,IAAI;AACb,IAAA;IACA,IAAID,GAAG,KAAK,QAAQ,EAAE;AACpB,MAAA,IAAI,CAACG,MAAM,YAAYC,MAAM,IAC3B,IAAI,CAACD,MAAM,CAACE,kBAAkB,CAACC,MAAM,CAAC,IAAI,CAAC;MAC7CL,KAAK,YAAYG,MAAM,IAAIH,KAAK,CAACI,kBAAkB,CAACE,GAAG,CAAC,IAAI,CAAC;AAC/D,IAAA;AACA,IAAA,OAAO,KAAK,CAACR,IAAI,CAACC,GAAG,EAAEC,KAAK,CAAC;AAC/B,EAAA;;AAEA;AACF;AACA;AACA;EACEO,iBAAiBA,CAACC,KAAa,EAAE;IAC/BA,KAAK,GAAGC,IAAI,CAACC,GAAG,CAACF,KAAK,EAAE,CAAC,CAAC;AAC1B,IAAA,IAAI,CAACG,cAAc,CAAC,gBAAgB,EAAEH,KAAK,CAAC;AAC9C,EAAA;;AAEA;AACF;AACA;AACA;EACEI,eAAeA,CAACJ,KAAa,EAAE;AAC7BA,IAAAA,KAAK,GAAGC,IAAI,CAACI,GAAG,CAACL,KAAK,EAAE,IAAI,CAACb,IAAI,CAACmB,MAAM,CAAC;AACzC,IAAA,IAAI,CAACH,cAAc,CAAC,cAAc,EAAEH,KAAK,CAAC;AAC5C,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACYG,EAAAA,cAAcA,CACtBI,QAA2C,EAC3CP,KAAa,EACb;AACA,IAAA,IAAI,IAAI,CAACO,QAAQ,CAAC,KAAKP,KAAK,EAAE;MAC5B,IAAI,CAACQ,qBAAqB,EAAE;AAC5B,MAAA,IAAI,CAACD,QAAQ,CAAC,GAAGP,KAAK;AACxB,IAAA;IACA,IAAI,CAACS,eAAe,EAAE;AACxB,EAAA;;AAEA;AACF;AACA;AACA;AACED,EAAAA,qBAAqBA,GAAG;AACtB,IAAA,IAAI,CAACE,IAAI,CAAC,mBAAmB,CAAC;IAC9B,IAAI,CAAChB,MAAM,IAAI,IAAI,CAACA,MAAM,CAACgB,IAAI,CAAC,wBAAwB,EAAE;AAAEC,MAAAA,MAAM,EAAE;AAAK,KAAC,CAAC;AAC7E,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,cAAcA,GAAG;AACf,IAAA,IAAI,CAAC5C,SAAS,IAAI,IAAI,CAAC6C,iBAAiB,EAAE;IAC1C,KAAK,CAACD,cAAc,EAAE;AACxB,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACEE,EAAAA,kBAAkBA,GAIhB;AAAA,IAAA,IAHAC,UAAkB,GAAAC,SAAA,CAAAV,MAAA,QAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc,IAAI,CAAC;AAAA,IAAA,IAC7CqD,QAAgB,GAAAF,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAAClD,YAAY;IAAA,IACpCqD,QAAkB,GAAAH,SAAA,CAAAV,MAAA,GAAA,CAAA,GAAAU,SAAA,MAAAC,SAAA;IAElB,OAAO,KAAK,CAACH,kBAAkB,CAACC,UAAU,EAAEG,QAAQ,EAAEC,QAAQ,CAAC;AACjE,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACEC,kBAAkBA,CAChBC,MAAc,EAGd;AAAA,IAAA,IAFAN,UAAkB,GAAAC,SAAA,CAAAV,MAAA,QAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc,IAAI,CAAC;AAAA,IAAA,IAC7CqD,QAAgB,GAAAF,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAAClD,YAAY;IAEpC,OAAO,KAAK,CAACsD,kBAAkB,CAACC,MAAM,EAAEN,UAAU,EAAEG,QAAQ,CAAC;AAC/D,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEI,EAAAA,mBAAmBA,GAGjB;AAAA,IAAA,IAFAzD,cAAc,GAAAmD,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc;IAAA,IACpC0D,YAAsB,GAAAP,SAAA,CAAAV,MAAA,GAAA,CAAA,GAAAU,SAAA,MAAAC,SAAA;AAEtB,IAAA,OAAO,KAAK,CAACK,mBAAmB,CAACzD,cAAc,EAAE0D,YAAY,CAAC;AAChE,EAAA;;AAEA;AACF;AACA;AACA;EACEC,MAAMA,CAACC,GAA6B,EAAE;AACpC,IAAA,KAAK,CAACD,MAAM,CAACC,GAAG,CAAC;AACjB;AACA;AACA,IAAA,IAAI,CAACC,iBAAiB,GAAG,EAAE;IAC3B,IAAI,CAACC,uBAAuB,EAAE;AAChC,EAAA;;AAEA;AACF;AACA;AACA;EACEC,eAAeA,CAACxC,OAAsC,EAAqB;AACzE,IAAA,MAAMpB,SAAS,GAAG,IAAI,CAACA,SAAS;IAChC,IAAI,CAACA,SAAS,GAAG,KAAK;AACtB,IAAA,MAAM0B,MAAM,GAAG,KAAK,CAACkC,eAAe,CAACxC,OAAO,CAAC;IAC7C,IAAI,CAACpB,SAAS,GAAGA,SAAS;AAC1B,IAAA,OAAO0B,MAAM;AACf,EAAA;;AAEA;AACF;AACA;AACA;AACEiC,EAAAA,uBAAuBA,GAAG;IACxB,IAAI,CAAC,IAAI,CAAC3D,SAAS,IAAI,CAAC,IAAI,CAAC0B,MAAM,EAAE;AACnC,MAAA;AACF,IAAA;AACA,IAAA,MAAM+B,GAAG,GAAG,IAAI,CAACI,eAAe,CAAC,IAAI,CAAC;IACtC,IAAI,CAACJ,GAAG,EAAE;AACR,MAAA;AACF,IAAA;AACA,IAAA,MAAMK,UAAU,GAAG,IAAI,CAACC,oBAAoB,EAAE;AAE9C,IAAA,MAAMC,SAAS,GAAG,IAAI,CAACC,yBAAyB,EAAE;AAClD,IAAA,MAAMC,wBAAwB,GAAGF,SAAS,CAAC1B,MAAM,GAAG,CAAC;IACrD,IAAI6B,UAAoC,GAAGV,GAAG;IAC9C,IAAIW,aAA4C,GAAGnB,SAAS;AAC5D,IAAA,IAAIiB,wBAAwB,EAAE;AAC5B;AACAE,MAAAA,aAAa,GAAGC,sBAAsB,CAACZ,GAAG,CAAC/B,MAAM,CAAC;AAClDyC,MAAAA,UAAU,GAAGC,aAAa,CAACE,UAAU,CAAC,IAAI,CAAE;AAC5CC,MAAAA,oBAAoB,CAACJ,UAAU,EAAE,IAAI,CAACzC,MAAM,CAAC;AAC7C,MAAA,MAAM8C,CAAC,GAAG,IAAI,CAACC,mBAAmB,EAAE;AACpCN,MAAAA,UAAU,CAACO,SAAS,CAACF,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,IAAA;AAEA,IAAA,IAAI,IAAI,CAAC3E,cAAc,KAAK,IAAI,CAACC,YAAY,IAAI,CAAC,IAAI,CAACH,iBAAiB,EAAE;AACxE,MAAA,IAAI,CAACgF,YAAY,CAACR,UAAU,EAAEL,UAAU,CAAC;AAC3C,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAACc,eAAe,CAACT,UAAU,EAAEL,UAAU,CAAC;AAC9C,IAAA;AAEA,IAAA,IAAII,wBAAwB,EAAE;AAC5B;AACA;AACA;AACA,MAAA,KAAK,MAAMW,QAAQ,IAAIb,SAAS,EAAE;AAChC,QAAA,MAAMc,QAAQ,GAAGD,QAAQ,CAACC,QAAS;AACnC,QAAA,MAAMC,cAAc,GAAGV,sBAAsB,CAACZ,GAAG,CAAC/B,MAAM,CAAC;AACzD,QAAA,MAAMsD,WAAW,GAAGD,cAAc,CAACT,UAAU,CAAC,IAAI,CAAE;AACpDC,QAAAA,oBAAoB,CAACS,WAAW,EAAE,IAAI,CAACtD,MAAM,CAAC;AAC9C;AACA,QAAA,IAAI,CAACoD,QAAQ,CAACG,kBAAkB,EAAE;AAChC,UAAA,MAAMT,CAAC,GAAGK,QAAQ,CAACJ,mBAAmB,EAAE;AACxCO,UAAAA,WAAW,CAACN,SAAS,CAACF,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,QAAA;AACAM,QAAAA,QAAQ,CAACJ,SAAS,CAACM,WAAW,CAAC;AAC/B;QACAF,QAAQ,CAACI,UAAU,CAACF,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1C,IAAI,CAACG,mBAAmB,CAAChB,UAAU,EAAEW,QAAQ,EAAEC,cAAc,CAAC;AAChE,MAAA;AACF,IAAA;AAEA,IAAA,IAAIb,wBAAwB,EAAE;AAC5BT,MAAAA,GAAG,CAAC2B,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MAClC3B,GAAG,CAAC4B,SAAS,CAACjB,aAAa,EAAG,CAAC,EAAE,CAAC,CAAC;AACrC,IAAA;AAEA,IAAA,IAAI,CAAC1C,MAAM,CAAC4D,eAAe,GAAG,IAAI;IAClC7B,GAAG,CAAC8B,OAAO,EAAE;AACf,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEtB,EAAAA,yBAAyBA,GAAmB;IAC1C,MAAMuB,iBAAiC,GAAG,EAAE;AAC5C;IACA,IAAIC,GAA6B,GAAG,IAAI;AACxC,IAAA,OAAOA,GAAG,EAAE;MACV,IAAIA,GAAG,CAACX,QAAQ,EAAE;AAChBU,QAAAA,iBAAiB,CAACE,IAAI,CAACD,GAAG,CAAC;AAC7B,MAAA;MACAA,GAAG,GAAGA,GAAG,CAACE,MAAM;AAClB,IAAA;AAEA,IAAA,OAAOH,iBAAiB;AAC1B,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACEzB,EAAAA,oBAAoBA,GAGA;AAAA,IAAA,IAFlB/B,KAAa,GAAAgB,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc;IAAA,IACnC+F,WAAqB,GAAA5C,SAAA,CAAAV,MAAA,GAAA,CAAA,GAAAU,SAAA,MAAAC,SAAA;AAErB,IAAA,MAAM4C,IAAI,GAAG,IAAI,CAACC,cAAc,EAAE;AAChCC,MAAAA,GAAG,GAAG,IAAI,CAACC,aAAa,EAAE;MAC1BC,OAAO,GAAG,IAAI,CAACC,2BAA2B,CAAClE,KAAK,EAAE4D,WAAW,CAAC;IAChE,OAAO;AACLC,MAAAA,IAAI,EAAEA,IAAI;AACVE,MAAAA,GAAG,EAAEA,GAAG;MACRI,UAAU,EAAEF,OAAO,CAACJ,IAAI;MACxBO,SAAS,EAAEH,OAAO,CAACF;KACpB;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEG,EAAAA,2BAA2BA,CACzBlE,KAAa,EACb4D,WAAqB,EACU;AAC/B,IAAA,IAAIA,WAAW,EAAE;AACf,MAAA,OAAO,IAAI,CAACS,4BAA4B,CAACrE,KAAK,CAAC;AACjD,IAAA;IACA,IAAI,IAAI,CAAC0B,iBAAiB,IAAI,KAAK,IAAI,IAAI,CAACA,iBAAiB,EAAE;MAC7D,OAAO,IAAI,CAACA,iBAAiB;AAC/B,IAAA;IACA,OAAQ,IAAI,CAACA,iBAAiB,GAAG,IAAI,CAAC2C,4BAA4B,CAACrE,KAAK,CAAC;AAC3E,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACEqE,4BAA4BA,CAACrE,KAAa,EAAE;IAC1C,IAAIoE,SAAS,GAAG,CAAC;AACfD,MAAAA,UAAU,GAAG,CAAC;IAChB,MAAM;MAAEG,SAAS;AAAEC,MAAAA;AAAU,KAAC,GAAG,IAAI,CAACjD,mBAAmB,CAACtB,KAAK,CAAC;IAChE,MAAM;MAAEwE,SAAS;AAAEC,MAAAA;AAAU,KAAC,GAAG,IAAI;IACrC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,SAAS,EAAEG,CAAC,EAAE,EAAE;AAClCN,MAAAA,SAAS,IAAI,IAAI,CAACO,eAAe,CAACD,CAAC,CAAC;AACtC,IAAA;AACA,IAAA,MAAME,cAAc,GAAG,IAAI,CAACC,kBAAkB,CAACN,SAAS,CAAC;IACzD,MAAMO,KAAK,GAAG,IAAI,CAACC,YAAY,CAACR,SAAS,CAAC,CAACD,SAAS,CAAC;AACrDQ,IAAAA,KAAK,KAAKX,UAAU,GAAGW,KAAK,CAACjB,IAAI,CAAC;AAClC,IAAA,IACE,IAAI,CAACmB,WAAW,KAAK,CAAC,IACtBV,SAAS,KAAK,IAAI,CAACW,UAAU,CAACV,SAAS,CAAC,CAACjE,MAAM,EAC/C;AACA6D,MAAAA,UAAU,IAAI,IAAI,CAACe,sBAAsB,EAAE;AAC7C,IAAA;IACA,IAAIrB,IAAI,GAAGe,cAAc,IAAIT,UAAU,GAAG,CAAC,GAAGA,UAAU,GAAG,CAAC,CAAC;IAE7D,IAAIM,SAAS,KAAKU,GAAG,EAAE;MACrB,IACEX,SAAS,KAAKY,KAAK,IACnBZ,SAAS,KAAKa,OAAO,IACrBb,SAAS,KAAKc,aAAa,EAC3B;QACAzB,IAAI,IAAI,EAAE;MACZ,CAAC,MAAM,IAAIW,SAAS,KAAKe,IAAI,IAAIf,SAAS,KAAKgB,YAAY,EAAE;QAC3D3B,IAAI,GAAGe,cAAc,IAAIT,UAAU,GAAG,CAAC,GAAGA,UAAU,GAAG,CAAC,CAAC;MAC3D,CAAC,MAAM,IAAIK,SAAS,KAAKiB,MAAM,IAAIjB,SAAS,KAAKkB,cAAc,EAAE;QAC/D7B,IAAI,GAAGe,cAAc,IAAIT,UAAU,GAAG,CAAC,GAAGA,UAAU,GAAG,CAAC,CAAC;AAC3D,MAAA;AACF,IAAA;IACA,OAAO;AACLJ,MAAAA,GAAG,EAAEK,SAAS;AACdP,MAAAA;KACD;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACE8B,cAAcA,CAAC9H,cAAsB,EAAE;AACrC,IAAA,IAAI,CAAC+H,aAAa,CAChB,IAAI,CAAClG,MAAM,CAAEmG,UAAU,EACvB,IAAI,CAAC9D,oBAAoB,CAAClE,cAAc,EAAE,IAAI,CAAC,EAC/CA,cACF,CAAC;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACE8E,EAAAA,YAAYA,CAAClB,GAA6B,EAAEK,UAA4B,EAAE;IACxE,IAAI,CAAC8D,aAAa,CAACnE,GAAG,EAAEK,UAAU,EAAE,IAAI,CAACjE,cAAc,CAAC;AAC1D,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEiI,EAAAA,sBAAsBA,GAGC;AAAA,IAAA,IAFrBjI,cAAsB,GAAAmD,SAAA,CAAAV,MAAA,GAAA,CAAA,IAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACnD,cAAc;AAAA,IAAA,IAC5CiE,UAA4B,GAAAd,SAAA,CAAAV,MAAA,QAAAU,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAACe,oBAAoB,CAAClE,cAAc,CAAC;AAExE,IAAA,MAAMkI,cAAc,GAAG,IAAI,CAACzE,mBAAmB,CAACzD,cAAc,CAAC;MAC7D0G,SAAS,GAAGwB,cAAc,CAACxB,SAAS;AACpCD,MAAAA,SAAS,GACPyB,cAAc,CAACzB,SAAS,GAAG,CAAC,GAAGyB,cAAc,CAACzB,SAAS,GAAG,CAAC,GAAG,CAAC;MACjE0B,UAAU,GAAG,IAAI,CAACC,oBAAoB,CAAC1B,SAAS,EAAED,SAAS,EAAE,UAAU,CAAC;AACxE4B,MAAAA,UAAU,GAAG,IAAI,CAACC,gBAAgB,EAAE,CAACC,CAAC,GAAG,IAAI,CAAC1G,MAAM,CAAE2G,OAAO,EAAE;AAC/DlI,MAAAA,WAAW,GAAG,IAAI,CAACA,WAAW,GAAG+H,UAAU;MAC3CI,EAAE,GAAG,IAAI,CAACL,oBAAoB,CAAC1B,SAAS,EAAED,SAAS,EAAE,QAAQ,CAAC;AAC9DF,MAAAA,SAAS,GACPtC,UAAU,CAACsC,SAAS,GACnB,CAAC,CAAC,GAAG,IAAI,CAACmC,iBAAiB,IAAI,IAAI,CAAC5B,eAAe,CAACJ,SAAS,CAAC,GAC7D,IAAI,CAACiC,UAAU,GACjBR,UAAU,IAAI,CAAC,GAAG,IAAI,CAACO,iBAAiB,CAAC;IAE7C,OAAO;AACLE,MAAAA,KAAK,EACH,IAAI,CAACrI,WAAW,IACf,IAAI,CAAC6H,oBAAoB,CAAC1B,SAAS,EAAED,SAAS,EAAE,MAAM,CAAY;MACrEoC,OAAO,EAAE,IAAI,CAACC,qBAAqB;MACnC9C,IAAI,EAAE/B,UAAU,CAAC+B,IAAI,GAAG/B,UAAU,CAACqC,UAAU,GAAGhG,WAAW,GAAG,CAAC;AAC/D4F,MAAAA,GAAG,EAAEK,SAAS,GAAGtC,UAAU,CAACiC,GAAG,GAAGuC,EAAE;AACpCM,MAAAA,KAAK,EAAEzI,WAAW;AAClB0I,MAAAA,MAAM,EAAEb;KACT;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACEJ,EAAAA,aAAaA,CACXnE,GAA6B,EAC7BK,UAA4B,EAC5BjE,cAAsB,EACtB;IACA,MAAM;MAAE4I,KAAK;MAAEC,OAAO;MAAE7C,IAAI;MAAEE,GAAG;MAAE6C,KAAK;AAAEC,MAAAA;KAAQ,GAChD,IAAI,CAACf,sBAAsB,CAACjI,cAAc,EAAEiE,UAAU,CAAC;IACzDL,GAAG,CAACqF,SAAS,GAAGL,KAAK;IACrBhF,GAAG,CAACsF,WAAW,GAAGL,OAAO;IACzBjF,GAAG,CAACuF,QAAQ,CAACnD,IAAI,EAAEE,GAAG,EAAE6C,KAAK,EAAEC,MAAM,CAAC;AACxC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEjE,EAAAA,eAAeA,CAACnB,GAA6B,EAAEK,UAA4B,EAAE;AAC3E,IAAA,MAAMmF,SAAS,GAAG;AAChBpJ,MAAAA,cAAc,EAAE,IAAI,CAACF,iBAAiB,GAClC,IAAI,CAACuJ,cAAc,CAAErJ,cAAc,GACnC,IAAI,CAACA,cAAc;AACvBC,MAAAA,YAAY,EAAE,IAAI,CAACH,iBAAiB,GAChC,IAAI,CAACuJ,cAAc,CAAEpJ,YAAY,GACjC,IAAI,CAACA;KACV;IACD,IAAI,CAACqJ,gBAAgB,CAAC1F,GAAG,EAAEwF,SAAS,EAAEnF,UAAU,CAAC;AACnD,EAAA;;AAEA;AACF;AACA;AACEsF,EAAAA,sBAAsBA,GAAG;IACvB,MAAMC,kBAAkB,GACtB,IAAI,CAACC,qBAAqB,CAACC,qBAAqB,EAAG;IACrD,IAAI,CAACJ,gBAAgB,CACnB,IAAI,CAACzH,MAAM,CAAEmG,UAAU,EACvBwB,kBAAkB,EAClB,IAAI,CAACtF,oBAAoB,CAACsF,kBAAkB,CAACxJ,cAAc,EAAE,IAAI,CACnE,CAAC;AACH,EAAA;EAEA2J,sBAAsBA,CAACC,CAAY,EAAE;AACnC,IAAA,MAAMC,aAAa,GAAG,IAAI,CAACC,4BAA4B,CAACF,CAAC,CAAC;AAC1D,IAAA,IAAI,CAAC9B,cAAc,CAAC+B,aAAa,CAAC;AACpC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEP,EAAAA,gBAAgBA,CACd1F,GAA6B,EAC7BwF,SAA2D,EAC3DnF,UAA4B,EAC5B;IACA,MAAM;MAAE0C,SAAS;AAAEC,MAAAA;AAAU,KAAC,GAAG,IAAI;AACrC,IAAA,MAAM5G,cAAc,GAAGoJ,SAAS,CAACpJ,cAAc;MAC7CC,YAAY,GAAGmJ,SAAS,CAACnJ,YAAY;AACrC8J,MAAAA,SAAS,GAAGpD,SAAS,CAACqD,QAAQ,CAACxC,OAAO,CAAC;AACvCyC,MAAAA,KAAK,GAAG,IAAI,CAACxG,mBAAmB,CAACzD,cAAc,CAAC;AAChDkK,MAAAA,GAAG,GAAG,IAAI,CAACzG,mBAAmB,CAACxD,YAAY,CAAC;MAC5CkK,SAAS,GAAGF,KAAK,CAACvD,SAAS;MAC3B0D,OAAO,GAAGF,GAAG,CAACxD,SAAS;MACvB2D,SAAS,GAAGJ,KAAK,CAACxD,SAAS,GAAG,CAAC,GAAG,CAAC,GAAGwD,KAAK,CAACxD,SAAS;MACrD6D,OAAO,GAAGJ,GAAG,CAACzD,SAAS,GAAG,CAAC,GAAG,CAAC,GAAGyD,GAAG,CAACzD,SAAS;IAEjD,KAAK,IAAII,CAAC,GAAGsD,SAAS,EAAEtD,CAAC,IAAIuD,OAAO,EAAEvD,CAAC,EAAE,EAAE;MACzC,MAAM0D,UAAU,GAAG,IAAI,CAACvD,kBAAkB,CAACH,CAAC,CAAC,IAAI,CAAC;AAClD,MAAA,IAAI8B,UAAU,GAAG,IAAI,CAAC7B,eAAe,CAACD,CAAC,CAAC;AACtC2D,QAAAA,cAAc,GAAG,CAAC;AAClBC,QAAAA,QAAQ,GAAG,CAAC;AACZC,QAAAA,MAAM,GAAG,CAAC;MAEZ,IAAI7D,CAAC,KAAKsD,SAAS,EAAE;QACnBM,QAAQ,GAAG,IAAI,CAACvD,YAAY,CAACiD,SAAS,CAAC,CAACE,SAAS,CAAC,CAACrE,IAAI;AACzD,MAAA;AACA,MAAA,IAAIa,CAAC,IAAIsD,SAAS,IAAItD,CAAC,GAAGuD,OAAO,EAAE;QACjCM,MAAM,GACJX,SAAS,IAAI,CAAC,IAAI,CAACY,eAAe,CAAC9D,CAAC,CAAC,GACjC,IAAI,CAACkC,KAAK,GACV,IAAI,CAAC6B,YAAY,CAAC/D,CAAC,CAAC,IAAI,CAAC,CAAC;AAClC,MAAA,CAAC,MAAM,IAAIA,CAAC,KAAKuD,OAAO,EAAE;QACxB,IAAIE,OAAO,KAAK,CAAC,EAAE;UACjBI,MAAM,GAAG,IAAI,CAACxD,YAAY,CAACkD,OAAO,CAAC,CAACE,OAAO,CAAC,CAACtE,IAAI;AACnD,QAAA,CAAC,MAAM;AACL,UAAA,MAAMmB,WAAW,GAAG,IAAI,CAACE,sBAAsB,EAAE;AACjDqD,UAAAA,MAAM,GACJ,IAAI,CAACxD,YAAY,CAACkD,OAAO,CAAC,CAACE,OAAO,GAAG,CAAC,CAAC,CAACtE,IAAI,GAC5C,IAAI,CAACkB,YAAY,CAACkD,OAAO,CAAC,CAACE,OAAO,GAAG,CAAC,CAAC,CAACvB,KAAK,GAC7C5B,WAAW;AACf,QAAA;AACF,MAAA;AACAqD,MAAAA,cAAc,GAAG7B,UAAU;AAC3B,MAAA,IAAI,IAAI,CAACA,UAAU,GAAG,CAAC,IAAK9B,CAAC,KAAKuD,OAAO,IAAI,IAAI,CAACzB,UAAU,GAAG,CAAE,EAAE;QACjEA,UAAU,IAAI,IAAI,CAACA,UAAU;AAC/B,MAAA;MACA,IAAIkC,SAAS,GAAG5G,UAAU,CAAC+B,IAAI,GAAGuE,UAAU,GAAGE,QAAQ;AACrDK,QAAAA,UAAU,GAAGnC,UAAU;AACvBoC,QAAAA,QAAQ,GAAG,CAAC;AACd,MAAA,MAAMC,SAAS,GAAGN,MAAM,GAAGD,QAAQ;MACnC,IAAI,IAAI,CAAC3K,iBAAiB,EAAE;AAC1B8D,QAAAA,GAAG,CAACqF,SAAS,GAAG,IAAI,CAACgC,gBAAgB,IAAI,OAAO;AAChDH,QAAAA,UAAU,GAAG,CAAC;AACdC,QAAAA,QAAQ,GAAGpC,UAAU;AACvB,MAAA,CAAC,MAAM;AACL/E,QAAAA,GAAG,CAACqF,SAAS,GAAG,IAAI,CAAC/I,cAAc;AACrC,MAAA;MACA,IAAI0G,SAAS,KAAKU,GAAG,EAAE;QACrB,IACEX,SAAS,KAAKY,KAAK,IACnBZ,SAAS,KAAKa,OAAO,IACrBb,SAAS,KAAKc,aAAa,EAC3B;AACAoD,UAAAA,SAAS,GAAG,IAAI,CAAC9B,KAAK,GAAG8B,SAAS,GAAGG,SAAS;QAChD,CAAC,MAAM,IAAIrE,SAAS,KAAKe,IAAI,IAAIf,SAAS,KAAKgB,YAAY,EAAE;AAC3DkD,UAAAA,SAAS,GAAG5G,UAAU,CAAC+B,IAAI,GAAGuE,UAAU,GAAGG,MAAM;QACnD,CAAC,MAAM,IAAI/D,SAAS,KAAKiB,MAAM,IAAIjB,SAAS,KAAKkB,cAAc,EAAE;AAC/DgD,UAAAA,SAAS,GAAG5G,UAAU,CAAC+B,IAAI,GAAGuE,UAAU,GAAGG,MAAM;AACnD,QAAA;AACF,MAAA;AACA9G,MAAAA,GAAG,CAACuF,QAAQ,CACV0B,SAAS,EACT5G,UAAU,CAACiC,GAAG,GAAGjC,UAAU,CAACsC,SAAS,GAAGwE,QAAQ,EAChDC,SAAS,EACTF,UACF,CAAC;MACD7G,UAAU,CAACsC,SAAS,IAAIiE,cAAc;AACxC,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEU,EAAAA,sBAAsBA,GAAW;AAC/B,IAAA,MAAMC,EAAE,GAAG,IAAI,CAACC,oBAAoB,EAAE;AACtC,IAAA,OAAO,IAAI,CAAChD,oBAAoB,CAAC+C,EAAE,CAACE,CAAC,EAAEF,EAAE,CAACG,CAAC,EAAE,UAAU,CAAC;AAC1D,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,mBAAmBA,GAA4B;AAC7C,IAAA,MAAMJ,EAAE,GAAG,IAAI,CAACC,oBAAoB,EAAE;AACtC,IAAA,OAAO,IAAI,CAAChD,oBAAoB,CAAC+C,EAAE,CAACE,CAAC,EAAEF,EAAE,CAACG,CAAC,EAAEE,IAAI,CAAC;AACpD,EAAA;;AAEA;AACF;AACA;AACA;AACEJ,EAAAA,oBAAoBA,GAAG;IACrB,MAAMK,cAAc,GAAG,IAAI,CAAChI,mBAAmB,CAAC,IAAI,CAACzD,cAAc,EAAE,IAAI,CAAC;AACxEyG,MAAAA,SAAS,GACPgF,cAAc,CAAChF,SAAS,GAAG,CAAC,GAAGgF,cAAc,CAAChF,SAAS,GAAG,CAAC,GAAG,CAAC;IACnE,OAAO;MAAE4E,CAAC,EAAEI,cAAc,CAAC/E,SAAS;AAAE4E,MAAAA,CAAC,EAAE7E;KAAW;AACtD,EAAA;AAEAiF,EAAAA,OAAOA,GAAG;IACR,IAAI,CAACC,eAAe,EAAE;AACtB,IAAA,IAAI,CAAClC,qBAAqB,CAACiC,OAAO,EAAE;IACpC,KAAK,CAACA,OAAO,EAAE;AACjB,EAAA;AACF;AAtoBE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAOE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AAKE;AACF;AACA;AACA;AAHEE,eAAA,CA7EW5K,KAAK,EAAA,aAAA,EAmFKjB,kBAAkB,CAAA;AAAA6L,eAAA,CAnF5B5K,KAAK,EAAA,MAAA,EAyFF,OAAO,CAAA;AAujBvB6K,aAAa,CAACC,QAAQ,CAAC9K,KAAK,CAAC;AAC7B;AACA6K,aAAa,CAACC,QAAQ,CAAC9K,KAAK,EAAE,QAAQ,CAAC;;;;"}
@@ -272,7 +272,7 @@ export declare class FabricImage<Props extends TOptions<ImageProps> = Partial<Im
272
272
  * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
273
273
  * @returns {Promise<FabricImage>}
274
274
  */
275
- static fromObject<T extends TOptions<SerializedImageProps>>({ filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T, options?: Abortable): Promise<FabricImage<Omit<T, "type" | "filters" | "resizeFilter" | "src" | "crossOrigin"> & {
275
+ static fromObject<T extends TOptions<SerializedImageProps>>({ filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T, options?: Abortable): Promise<FabricImage<Omit<T, "type" | "crossOrigin" | "filters" | "resizeFilter" | "src"> & {
276
276
  src: string | undefined;
277
277
  filters: BaseFilter<string, object, object>[];
278
278
  resizeFilter: Resize;
@@ -1 +1 @@
1
- {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../../src/shapes/Image.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../../src/shapes/Image.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{getFabricDocument as i,getEnv as e}from"../env/index.min.mjs";import{getFilterBackend as s}from"../filters/FilterBackend.min.mjs";import{SHARED_ATTRIBUTES as h}from"../parser/attributes.min.mjs";import{parseAttributes as r}from"../parser/parseAttributes.min.mjs";import{uid as l}from"../util/internals/uid.min.mjs";import{createCanvasElementFor as n}from"../util/misc/dom.min.mjs";import{findScaleToFit as a,findScaleToCover as o}from"../util/misc/findScaleTo.min.mjs";import{loadImage as m,enlivenObjects as g,enlivenObjectEnlivables as c}from"../util/misc/objectEnlive.min.mjs";import{parsePreserveAspectRatioAttribute as d}from"../util/misc/svgParsing.min.mjs";import{classRegistry as _}from"../ClassRegistry.min.mjs";import{FabricObject as f}from"./Object/FabricObject.min.mjs";import{WebGLFilterBackend as p}from"../filters/WebGLFilterBackend.min.mjs";import{FILL as u,NONE as S}from"../constants.min.mjs";import{getDocumentFromElement as w}from"../util/dom_misc.min.mjs";import{log as E}from"../util/internals/console.min.mjs";import{cacheProperties as v}from"./Object/defaultValues.min.mjs";const O={strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0},y=["cropX","cropY"];class j extends f{static getDefaults(){return{...super.getDefaults(),...j.ownDefaults}}constructor(e,s){super(),t(this,"_lastScaleX",1),t(this,"_lastScaleY",1),t(this,"_filterScalingX",1),t(this,"_filterScalingY",1),this.filters=[],Object.assign(this,j.ownDefaults),this.setOptions(s),this.cacheKey=`texture${l()}`,this.setElement("string"==typeof e?(this.canvas&&w(this.canvas.getElement())||i()).getElementById(e):e,s)}getElement(){return this._element}setElement(t){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(i),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){const i=s(!1);i instanceof p&&i.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{const i=this[t];i&&e().dispose(i),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){const t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;const i=this.width/2,e=this.height/2;t.beginPath(),t.moveTo(-i,-e),t.lineTo(i,-e),t.lineTo(i,e),t.lineTo(-i,e),t.lineTo(-i,-e),t.closePath()}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const i=[];return this.filters.forEach(t=>{t&&i.push(t.toObject())}),{...super.toObject([...y,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:i,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width<this._element.width||this.height<this._element.height}_toSVG(){const t=[],i=this._element,e=-this.width/2,s=-this.height/2;let h=[],r=[],n="",a="";if(!i)return[];if(this.hasCrop()){const t=l();h.push('<clipPath id="imageCrop_'+t+'">\n','\t<rect x="'+e+'" y="'+s+'" width="'+this.width+'" height="'+this.height+'" />\n',"</clipPath>\n"),n=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t<image ","COMMON_PARTS",`xlink:href="${this.getSvgSrc(!0)}" x="${e-this.cropX}" y="${s-this.cropY}" width="${i.width||i.naturalWidth}" height="${i.height||i.naturalHeight}"${a}${n}></image>\n`),this.stroke||this.strokeDashArray){const t=this.fill;this.fill=null,r=[`\t<rect x="${e}" y="${s}" width="${this.width}" height="${this.height}" style="${this.getSvgStyles()}" />\n`],this.fill=t}return h=this.paintFirst!==u?h.concat(r,t):h.concat(t,r),h}getSrc(t){const i=t?this._element:this._originalElement;return i?i.toDataURL?i.toDataURL():this.srcFromAttribute?i.getAttribute("src")||"":i.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t){let{crossOrigin:i,signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return m(t,{crossOrigin:i,signal:e}).then(t=>{void 0!==i&&this.set({crossOrigin:i}),this.setElement(t)})}toString(){return`#<Image: { src: "${this.getSrc()}" }>`}applyResizeFilters(){const t=this.resizeFilter,i=this.minimumScaleTrigger,e=this.getTotalObjectScaling(),h=e.x,r=e.y,l=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||h>i&&r>i)return this._element=l,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=h,void(this._lastScaleY=r);const a=n(l),{width:o,height:m}=l;this._element=a,this._lastScaleX=t.scaleX=h,this._lastScaleY=t.scaleY=r,s().applyFilters([t],l,o,m,this._element),this._filterScalingX=a.width/this._originalElement.width,this._filterScalingY=a.height/this._originalElement.height}applyFilters(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.filters||[];if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);const i=this._originalElement,e=i.naturalWidth||i.width,h=i.naturalHeight||i.height;if(this._element===this._originalElement){const t=n({width:e,height:h});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,e,h),this._lastScaleX=1,this._lastScaleY=1);s().applyFilters(t,this._originalElement,e,h,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){const i=this._element;if(!i)return;const e=this._filterScalingX,s=this._filterScalingY,h=this.width,r=this.height,l=Math.max(this.cropX,0),n=Math.max(this.cropY,0),a=i.naturalWidth||i.width,o=i.naturalHeight||i.height,m=l*e,g=n*s,c=Math.min(h*e,a-m),d=Math.min(r*s,o-g),_=-h/2,f=-r/2,p=Math.min(h,a/e-l),u=Math.min(r,o/s-n);i&&t.drawImage(i,m,g,c,d,_,f,p,u)}_needsResize(){const t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight(){let{width:t,height:i}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e=this.getOriginalSize();this.width=t||e.width,this.height=i||e.height}parsePreserveAspectRatioAttribute(){const t=d(this.preserveAspectRatio||""),i=this.width,e=this.height,s={width:i,height:e};let h,r=this._element.width,l=this._element.height,n=1,m=1,g=0,c=0,_=0,f=0;return!t||t.alignX===S&&t.alignY===S?(n=i/r,m=e/l):("meet"===t.meetOrSlice&&(n=m=a(this._element,s),h=(i-r*n)/2,"Min"===t.alignX&&(g=-h),"Max"===t.alignX&&(g=h),h=(e-l*m)/2,"Min"===t.alignY&&(c=-h),"Max"===t.alignY&&(c=h)),"slice"===t.meetOrSlice&&(n=m=o(this._element,s),h=r-i/n,"Mid"===t.alignX&&(_=h/2),"Max"===t.alignX&&(_=h),h=l-e/m,"Mid"===t.alignY&&(f=h/2),"Max"===t.alignY&&(f=h),r=i/n,l=e/m)),{width:r,height:l,scaleX:n,scaleY:m,offsetLeft:g,offsetTop:c,cropX:_,cropY:f}}static fromObject(t,i){let{filters:e,resizeFilter:s,src:h,crossOrigin:r,type:l,...n}=t;return Promise.all([m(h,{...i,crossOrigin:r}),e&&g(e,i),s?g([s],i):[],c(n,i)]).then(t=>{let[i,e=[],[s],r={}]=t;return new this(i,{...n,src:h,filters:e,resizeFilter:s,...r})})}static fromURL(t){let{crossOrigin:i=null,signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=arguments.length>2?arguments[2]:void 0;return m(t,{crossOrigin:i,signal:e}).then(t=>new this(t,s))}static async fromElement(t){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2?arguments[2]:void 0;const s=r(t,this.ATTRIBUTE_NAMES,e);return this.fromURL(s["xlink:href"]||s.href,i,s).catch(t=>(E("log","Unable to parse Image",t),null))}}t(j,"type","Image"),t(j,"cacheProperties",[...v,...y]),t(j,"ownDefaults",O),t(j,"ATTRIBUTE_NAMES",[...h,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),_.setClass(j),_.setSVGClass(j);export{j as FabricImage,O as imageDefaultValues};
1
+ import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{getFabricDocument as i,getEnv as e}from"../env/index.min.mjs";import{getFilterBackend as s}from"../filters/FilterBackend.min.mjs";import{SHARED_ATTRIBUTES as h}from"../parser/attributes.min.mjs";import{parseAttributes as r}from"../parser/parseAttributes.min.mjs";import{uid as l}from"../util/internals/uid.min.mjs";import{createCanvasElementFor as n}from"../util/misc/dom.min.mjs";import{findScaleToFit as a,findScaleToCover as o}from"../util/misc/findScaleTo.min.mjs";import{loadImage as m,enlivenObjects as g,enlivenObjectEnlivables as c}from"../util/misc/objectEnlive.min.mjs";import{parsePreserveAspectRatioAttribute as d}from"../util/misc/svgParsing.min.mjs";import{classRegistry as _}from"../ClassRegistry.min.mjs";import{FabricObject as f}from"./Object/FabricObject.min.mjs";import{WebGLFilterBackend as p}from"../filters/WebGLFilterBackend.min.mjs";import{FILL as u,NONE as S}from"../constants.min.mjs";import{getDocumentFromElement as w}from"../util/dom_misc.min.mjs";import{log as E}from"../util/internals/console.min.mjs";import{escapeXml as v}from"../util/lang_string.min.mjs";import{cacheProperties as O}from"./Object/defaultValues.min.mjs";const y={strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0},j=["cropX","cropY"];class x extends f{static getDefaults(){return{...super.getDefaults(),...x.ownDefaults}}constructor(e,s){super(),t(this,"_lastScaleX",1),t(this,"_lastScaleY",1),t(this,"_filterScalingX",1),t(this,"_filterScalingY",1),this.filters=[],Object.assign(this,x.ownDefaults),this.setOptions(s),this.cacheKey=`texture${l()}`,this.setElement("string"==typeof e?(this.canvas&&w(this.canvas.getElement())||i()).getElementById(e):e,s)}getElement(){return this._element}setElement(t){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(i),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){const i=s(!1);i instanceof p&&i.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{const i=this[t];i&&e().dispose(i),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){const t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;const i=this.width/2,e=this.height/2;t.beginPath(),t.moveTo(-i,-e),t.lineTo(i,-e),t.lineTo(i,e),t.lineTo(-i,e),t.lineTo(-i,-e),t.closePath()}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const i=[];return this.filters.forEach(t=>{t&&i.push(t.toObject())}),{...super.toObject([...j,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:i,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width<this._element.width||this.height<this._element.height}_toSVG(){const t=[],i=this._element,e=-this.width/2,s=-this.height/2;let h=[],r=[],n="",a="";if(!i)return[];if(this.hasCrop()){const t=l();h.push('<clipPath id="imageCrop_'+t+'">\n','\t<rect x="'+e+'" y="'+s+'" width="'+v(this.width)+'" height="'+v(this.height)+'" />\n',"</clipPath>\n"),n=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t<image ","COMMON_PARTS",`xlink:href="${v(this.getSrc(!0))}" x="${e-this.cropX}" y="${s-this.cropY}" width="${i.width||i.naturalWidth}" height="${i.height||i.naturalHeight}"${a}${n}></image>\n`),this.stroke||this.strokeDashArray){const t=this.fill;this.fill=null,r=[`\t<rect x="${e}" y="${s}" width="${v(this.width)}" height="${v(this.height)}" style="${this.getSvgStyles()}" />\n`],this.fill=t}return h=this.paintFirst!==u?h.concat(r,t):h.concat(t,r),h}getSrc(t){const i=t?this._element:this._originalElement;return i?i.toDataURL?i.toDataURL():this.srcFromAttribute?i.getAttribute("src")||"":i.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t){let{crossOrigin:i,signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return m(t,{crossOrigin:i,signal:e}).then(t=>{void 0!==i&&this.set({crossOrigin:i}),this.setElement(t)})}toString(){return`#<Image: { src: "${this.getSrc()}" }>`}applyResizeFilters(){const t=this.resizeFilter,i=this.minimumScaleTrigger,e=this.getTotalObjectScaling(),h=e.x,r=e.y,l=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||h>i&&r>i)return this._element=l,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=h,void(this._lastScaleY=r);const a=n(l),{width:o,height:m}=l;this._element=a,this._lastScaleX=t.scaleX=h,this._lastScaleY=t.scaleY=r,s().applyFilters([t],l,o,m,this._element),this._filterScalingX=a.width/this._originalElement.width,this._filterScalingY=a.height/this._originalElement.height}applyFilters(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.filters||[];if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);const i=this._originalElement,e=i.naturalWidth||i.width,h=i.naturalHeight||i.height;if(this._element===this._originalElement){const t=n({width:e,height:h});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,e,h),this._lastScaleX=1,this._lastScaleY=1);s().applyFilters(t,this._originalElement,e,h,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){const i=this._element;if(!i)return;const e=this._filterScalingX,s=this._filterScalingY,h=this.width,r=this.height,l=Math.max(this.cropX,0),n=Math.max(this.cropY,0),a=i.naturalWidth||i.width,o=i.naturalHeight||i.height,m=l*e,g=n*s,c=Math.min(h*e,a-m),d=Math.min(r*s,o-g),_=-h/2,f=-r/2,p=Math.min(h,a/e-l),u=Math.min(r,o/s-n);i&&t.drawImage(i,m,g,c,d,_,f,p,u)}_needsResize(){const t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight(){let{width:t,height:i}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const e=this.getOriginalSize();this.width=t||e.width,this.height=i||e.height}parsePreserveAspectRatioAttribute(){const t=d(this.preserveAspectRatio||""),i=this.width,e=this.height,s={width:i,height:e};let h,r=this._element.width,l=this._element.height,n=1,m=1,g=0,c=0,_=0,f=0;return!t||t.alignX===S&&t.alignY===S?(n=i/r,m=e/l):("meet"===t.meetOrSlice&&(n=m=a(this._element,s),h=(i-r*n)/2,"Min"===t.alignX&&(g=-h),"Max"===t.alignX&&(g=h),h=(e-l*m)/2,"Min"===t.alignY&&(c=-h),"Max"===t.alignY&&(c=h)),"slice"===t.meetOrSlice&&(n=m=o(this._element,s),h=r-i/n,"Mid"===t.alignX&&(_=h/2),"Max"===t.alignX&&(_=h),h=l-e/m,"Mid"===t.alignY&&(f=h/2),"Max"===t.alignY&&(f=h),r=i/n,l=e/m)),{width:r,height:l,scaleX:n,scaleY:m,offsetLeft:g,offsetTop:c,cropX:_,cropY:f}}static fromObject(t,i){let{filters:e,resizeFilter:s,src:h,crossOrigin:r,type:l,...n}=t;return Promise.all([m(h,{...i,crossOrigin:r}),e&&g(e,i),s?g([s],i):[],c(n,i)]).then(t=>{let[i,e=[],[s],r={}]=t;return new this(i,{...n,src:h,filters:e,resizeFilter:s,...r})})}static fromURL(t){let{crossOrigin:i=null,signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=arguments.length>2?arguments[2]:void 0;return m(t,{crossOrigin:i,signal:e}).then(t=>new this(t,s))}static async fromElement(t){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2?arguments[2]:void 0;const s=r(t,this.ATTRIBUTE_NAMES,e);return this.fromURL(s["xlink:href"]||s.href,i,s).catch(t=>(E("log","Unable to parse Image",t),null))}}t(x,"type","Image"),t(x,"cacheProperties",[...O,...j]),t(x,"ownDefaults",y),t(x,"ATTRIBUTE_NAMES",[...h,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),_.setClass(x),_.setSVGClass(x);export{x as FabricImage,y as imageDefaultValues};
2
2
  //# sourceMappingURL=Image.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Image.min.mjs","sources":["../../../src/shapes/Image.ts"],"sourcesContent":["import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\nexport type ParsedPAROffsets = {\n width: number;\n height: number;\n scaleX: number;\n scaleY: number;\n offsetLeft: number;\n offsetTop: number;\n cropX: number;\n cropY: number;\n};\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter<string, Record<string, any>>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial<TClassProperties<FabricImage>> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions<ImageProps> = Partial<ImageProps>,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter<string, Record<string, any>>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial<TSize>} [size] Options object\n */\n setElement(element: ImageSource, size: Partial<TSize> = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const filters: Record<string, any>[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '<clipPath id=\"imageCrop_' + clipPathId + '\">\\n',\n '\\t<rect x=\"' +\n x +\n '\" y=\"' +\n y +\n '\" width=\"' +\n this.width +\n '\" height=\"' +\n this.height +\n '\" />\\n',\n '</clipPath>\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t<image ',\n 'COMMON_PARTS',\n `xlink:href=\"${this.getSvgSrc(true)}\" x=\"${x - this.cropX}\" y=\"${\n y - this.cropY\n // we're essentially moving origin of transformation from top/left corner to the center of the shape\n // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}></image>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t<rect x=\"${x}\" y=\"${y}\" width=\"${this.width}\" height=\"${\n this.height\n }\" style=\"${this.getSvgStyles()}\" />\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(src: string, { crossOrigin, signal }: LoadImageOptions = {}) {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#<Image: { src: \"${this.getSrc()}\" }>`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter<string, Record<string, any>>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject<FabricImage>,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial<TSize> = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute(): ParsedPAROffsets {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<FabricImage>}\n */\n static fromObject<T extends TOptions<SerializedImageProps>>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects<BaseFilter<string>>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects<Resize>([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise<FabricImage>}\n */\n static fromURL<T extends TOptions<ImageProps>>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise<FabricImage> {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n"],"names":["imageDefaultValues","strokeWidth","srcFromAttribute","minimumScaleTrigger","cropX","cropY","imageSmoothing","IMAGE_PROPS","FabricImage","FabricObject","getDefaults","super","ownDefaults","constructor","arg0","options","_defineProperty","this","filters","Object","assign","setOptions","cacheKey","uid","setElement","canvas","getDocumentFromElement","getElement","getFabricDocument","getElementById","_element","element","size","arguments","length","undefined","removeTexture","_originalElement","_setWidthHeight","applyFilters","resizeFilter","applyResizeFilters","key","backend","getFilterBackend","WebGLFilterBackend","evictCachesForKey","dispose","_cacheContext","forEach","elementKey","el","getEnv","getCrossOrigin","crossOrigin","getOriginalSize","width","naturalWidth","height","naturalHeight","_stroke","ctx","stroke","w","h","beginPath","moveTo","lineTo","closePath","toObject","propertiesToInclude","filterObj","push","src","getSrc","hasCrop","_toSVG","imageMarkup","x","y","svgString","strokeSvg","clipPath","imageRendering","clipPathId","getSvgSrc","strokeDashArray","origFill","fill","getSvgStyles","paintFirst","FILL","concat","filtered","toDataURL","getAttribute","setSrc","signal","loadImage","then","img","set","toString","filter","minimumScale","objectScale","getTotalObjectScaling","scaleX","scaleY","elementToFilter","_filteredEl","group","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","canvasEl","createCanvasElementFor","isNeutralState","imgElement","sourceWidth","sourceHeight","getContext","clearRect","_render","imageSmoothingEnabled","isMoving","_needsResize","_renderPaintInOrder","drawCacheOnCanvas","shouldCache","needsItsOwnCache","_renderFill","elementToDraw","Math","max","elWidth","elHeight","sX","sY","sW","min","sH","maxDestW","maxDestH","drawImage","scale","_resetWidthHeight","parsePreserveAspectRatioAttribute","pAR","preserveAspectRatio","pWidth","pHeight","parsedAttributes","offset","rWidth","rHeight","offsetLeft","offsetTop","alignX","NONE","alignY","meetOrSlice","findScaleToFit","findScaleToCover","fromObject","_ref","f","rf","type","object","Promise","all","enlivenObjects","enlivenObjectEnlivables","_ref2","hydratedProps","fromURL","url","imageOptions","fromElement","cssRules","parseAttributes","ATTRIBUTE_NAMES","catch","err","log","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
1
+ {"version":3,"file":"Image.min.mjs","sources":["../../../src/shapes/Image.ts"],"sourcesContent":["import { getFabricDocument, getEnv } from '../env';\nimport type { BaseFilter } from '../filters/BaseFilter';\nimport { getFilterBackend } from '../filters/FilterBackend';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type {\n TClassProperties,\n TCrossOrigin,\n TSize,\n Abortable,\n TOptions,\n} from '../typedefs';\nimport { uid } from '../util/internals/uid';\nimport { createCanvasElementFor } from '../util/misc/dom';\nimport { findScaleToCover, findScaleToFit } from '../util/misc/findScaleTo';\nimport type { LoadImageOptions } from '../util/misc/objectEnlive';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n loadImage,\n} from '../util/misc/objectEnlive';\nimport { parsePreserveAspectRatioAttribute } from '../util/misc/svgParsing';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { WebGLFilterBackend } from '../filters/WebGLFilterBackend';\nimport { FILL, NONE } from '../constants';\nimport { getDocumentFromElement } from '../util/dom_misc';\nimport type { CSSRules } from '../parser/typedefs';\nimport type { Resize, ResizeSerializedProps } from '../filters/Resize';\nimport type { TCachedFabricObject } from './Object/Object';\nimport { log } from '../util/internals/console';\nimport { escapeXml } from '../util/lang_string';\n\n// @todo Would be nice to have filtering code not imported directly.\n\nexport type ImageSource =\n | HTMLImageElement\n | HTMLVideoElement\n | HTMLCanvasElement;\n\nexport type ParsedPAROffsets = {\n width: number;\n height: number;\n scaleX: number;\n scaleY: number;\n offsetLeft: number;\n offsetTop: number;\n cropX: number;\n cropY: number;\n};\n\ninterface UniqueImageProps {\n srcFromAttribute: boolean;\n minimumScaleTrigger: number;\n cropX: number;\n cropY: number;\n imageSmoothing: boolean;\n filters: BaseFilter<string, Record<string, any>>[];\n resizeFilter?: Resize;\n}\n\nexport const imageDefaultValues: Partial<TClassProperties<FabricImage>> = {\n strokeWidth: 0,\n srcFromAttribute: false,\n minimumScaleTrigger: 0.5,\n cropX: 0,\n cropY: 0,\n imageSmoothing: true,\n};\n\nexport interface SerializedImageProps extends SerializedObjectProps {\n src: string;\n crossOrigin: TCrossOrigin;\n filters: any[];\n resizeFilter?: ResizeSerializedProps;\n cropX: number;\n cropY: number;\n}\n\nexport interface ImageProps extends FabricObjectProps, UniqueImageProps {}\n\nconst IMAGE_PROPS = ['cropX', 'cropY'] as const;\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-1#images}\n */\nexport class FabricImage<\n Props extends TOptions<ImageProps> = Partial<ImageProps>,\n SProps extends SerializedImageProps = SerializedImageProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n>\n extends FabricObject<Props, SProps, EventSpec>\n implements ImageProps\n{\n /**\n * When calling {@link FabricImage.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default false\n */\n declare srcFromAttribute: boolean;\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleX = 1;\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n protected _lastScaleY = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingX = 1;\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n protected _filterScalingY = 1;\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n declare minimumScaleTrigger: number;\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n */\n declare cacheKey: string;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropX: number;\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n */\n declare cropY: number;\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n */\n declare imageSmoothing: boolean;\n\n declare preserveAspectRatio: string;\n\n declare protected src: string;\n\n declare filters: BaseFilter<string, Record<string, any>>[];\n declare resizeFilter: Resize;\n\n declare _element: ImageSource;\n declare _filteredEl?: HTMLCanvasElement;\n declare _originalElement: ImageSource;\n\n static type = 'Image';\n\n static cacheProperties = [...cacheProperties, ...IMAGE_PROPS];\n\n static ownDefaults = imageDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...FabricImage.ownDefaults,\n };\n }\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {ImageSource | string} element Image element\n * @param {Object} [options] Options object\n */\n constructor(elementId: string, options?: Props);\n constructor(element: ImageSource, options?: Props);\n constructor(arg0: ImageSource | string, options?: Props) {\n super();\n this.filters = [];\n Object.assign(this, FabricImage.ownDefaults);\n this.setOptions(options);\n this.cacheKey = `texture${uid()}`;\n this.setElement(\n typeof arg0 === 'string'\n ? ((\n (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n getFabricDocument()\n ).getElementById(arg0) as ImageSource)\n : arg0,\n options,\n );\n }\n\n /**\n * Returns image element which this instance if based on\n */\n getElement() {\n return this._element;\n }\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Partial<TSize>} [size] Options object\n */\n setElement(element: ImageSource, size: Partial<TSize> = {}) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._element = element;\n this._originalElement = element;\n this._setWidthHeight(size);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n }\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture(key: string) {\n const backend = getFilterBackend(false);\n if (backend instanceof WebGLFilterBackend) {\n backend.evictCachesForKey(key);\n }\n }\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose() {\n super.dispose();\n this.removeTexture(this.cacheKey);\n this.removeTexture(`${this.cacheKey}_filtered`);\n this._cacheContext = null;\n (\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'] as const\n ).forEach((elementKey) => {\n const el = this[elementKey];\n el && getEnv().dispose(el);\n // @ts-expect-error disposing\n this[elementKey] = undefined;\n });\n }\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin(): string | null {\n return (\n this._originalElement &&\n ((this._originalElement as any).crossOrigin || null)\n );\n }\n\n /**\n * Returns original size of an image\n */\n getOriginalSize() {\n const element = this.getElement() as any;\n if (!element) {\n return {\n width: 0,\n height: 0,\n };\n }\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke(ctx: CanvasRenderingContext2D) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n const w = this.width / 2,\n h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n const filters: Record<string, any>[] = [];\n this.filters.forEach((filterObj) => {\n filterObj && filters.push(filterObj.toObject());\n });\n return {\n ...super.toObject([...IMAGE_PROPS, ...propertiesToInclude]),\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters,\n ...(this.resizeFilter\n ? { resizeFilter: this.resizeFilter.toObject() }\n : {}),\n };\n }\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop() {\n return (\n !!this.cropX ||\n !!this.cropY ||\n this.width < this._element.width ||\n this.height < this._element.height\n );\n }\n\n /**\n * Returns svg representation of an instance\n * @return {string[]} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const imageMarkup: string[] = [],\n element = this._element,\n x = -this.width / 2,\n y = -this.height / 2;\n let svgString: string[] = [],\n strokeSvg: string[] = [],\n clipPath = '',\n imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n const clipPathId = uid();\n svgString.push(\n '<clipPath id=\"imageCrop_' + clipPathId + '\">\\n',\n '\\t<rect x=\"' +\n x +\n '\" y=\"' +\n y +\n '\" width=\"' +\n escapeXml(this.width) +\n '\" height=\"' +\n escapeXml(this.height) +\n '\" />\\n',\n '</clipPath>\\n',\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = ' image-rendering=\"optimizeSpeed\"';\n }\n imageMarkup.push(\n '\\t<image ',\n 'COMMON_PARTS',\n `xlink:href=\"${escapeXml(this.getSrc(true))}\" x=\"${x - this.cropX}\" y=\"${\n y - this.cropY\n // we're essentially moving origin of transformation from top/left corner to the center of the shape\n // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n }\" width=\"${\n element.width || (element as HTMLImageElement).naturalWidth\n }\" height=\"${\n element.height || (element as HTMLImageElement).naturalHeight\n }\"${imageRendering}${clipPath}></image>\\n`,\n );\n\n if (this.stroke || this.strokeDashArray) {\n const origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n `\\t<rect x=\"${x}\" y=\"${y}\" width=\"${escapeXml(this.width)}\" height=\"${escapeXml(\n this.height,\n )}\" style=\"${this.getSvgStyles()}\" />\\n`,\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== FILL) {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n } else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n }\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc(filtered?: boolean): string {\n const element = filtered ? this._element : this._originalElement;\n if (element) {\n if ((element as HTMLCanvasElement).toDataURL) {\n return (element as HTMLCanvasElement).toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src') || '';\n } else {\n return (element as HTMLImageElement).src;\n }\n } else {\n return this.src || '';\n }\n }\n\n /**\n * Alias for getSrc\n * @param filtered\n * @deprecated\n */\n getSvgSrc(filtered?: boolean) {\n return this.getSrc(filtered);\n }\n\n /**\n * Loads and sets source of an image\\\n * **IMPORTANT**: It is recommended to abort loading tasks before calling this method to prevent race conditions and unnecessary networking\n * @param {String} src Source string (URL)\n * @param {LoadImageOptions} [options] Options object\n */\n setSrc(\n src: string,\n { crossOrigin, signal }: LoadImageOptions = {},\n ): Promise<void> {\n return loadImage(src, { crossOrigin, signal }).then((img) => {\n typeof crossOrigin !== 'undefined' && this.set({ crossOrigin });\n this.setElement(img);\n });\n }\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString() {\n return `#<Image: { src: \"${this.getSrc()}\" }>`;\n }\n\n applyResizeFilters() {\n const filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.x,\n scaleY = objectScale.y,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n const canvasEl = createCanvasElementFor(elementToFilter),\n { width, height } = elementToFilter;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n getFilterBackend().applyFilters(\n [filter],\n elementToFilter,\n width,\n height,\n this._element,\n );\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n }\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n */\n applyFilters(\n filters: BaseFilter<string, Record<string, any>>[] = this.filters || [],\n ) {\n filters = filters.filter((filter) => filter && !filter.isNeutralState());\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(`${this.cacheKey}_filtered`);\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n // this is unsafe and needs to be rethinkend\n this._filteredEl = undefined;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return;\n }\n\n const imgElement = this._originalElement,\n sourceWidth =\n (imgElement as HTMLImageElement).naturalWidth || imgElement.width,\n sourceHeight =\n (imgElement as HTMLImageElement).naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the _element a reference to _originalElement\n // we need to create a new element to host the filtered pixels\n const canvasEl = createCanvasElementFor({\n width: sourceWidth,\n height: sourceHeight,\n });\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n } else if (this._filteredEl) {\n // if the _element is it own element,\n // and we also have a _filteredEl, then we clean up _filteredEl\n // and we assign it to _element.\n // in this way we invalidate the eventual old resize filtered element\n this._element = this._filteredEl;\n this._filteredEl\n .getContext('2d')!\n .clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n getFilterBackend().applyFilters(\n filters,\n this._originalElement,\n sourceWidth,\n sourceHeight,\n this._element as HTMLCanvasElement,\n this.cacheKey,\n );\n if (\n this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height\n ) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY =\n this._element.height / this._originalElement.height;\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas(\n this: TCachedFabricObject<FabricImage>,\n ctx: CanvasRenderingContext2D,\n ) {\n ctx.imageSmoothingEnabled = this.imageSmoothing;\n super.drawCacheOnCanvas(ctx);\n }\n\n /**\n * Decide if the FabricImage should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special Image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache() {\n return this.needsItsOwnCache();\n }\n\n _renderFill(ctx: CanvasRenderingContext2D) {\n const elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n const scaleX = this._filterScalingX,\n scaleY = this._filterScalingY,\n w = this.width,\n h = this.height,\n // crop values cannot be lesser than 0.\n cropX = Math.max(this.cropX, 0),\n cropY = Math.max(this.cropY, 0),\n elWidth =\n (elementToDraw as HTMLImageElement).naturalWidth || elementToDraw.width,\n elHeight =\n (elementToDraw as HTMLImageElement).naturalHeight ||\n elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = Math.min(w * scaleX, elWidth - sX),\n sH = Math.min(h * scaleY, elHeight - sY),\n x = -w / 2,\n y = -h / 2,\n maxDestW = Math.min(w, elWidth / scaleX - cropX),\n maxDestH = Math.min(h, elHeight / scaleY - cropY);\n\n elementToDraw &&\n ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n }\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize() {\n const scale = this.getTotalObjectScaling();\n return scale.x !== this._lastScaleX || scale.y !== this._lastScaleY;\n }\n\n /**\n * @private\n * @deprecated unused\n */\n _resetWidthHeight() {\n this.set(this.getOriginalSize());\n }\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n */\n _setWidthHeight({ width, height }: Partial<TSize> = {}) {\n const size = this.getOriginalSize();\n this.width = width || size.width;\n this.height = height || size.height;\n }\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n */\n parsePreserveAspectRatioAttribute(): ParsedPAROffsets {\n const pAR = parsePreserveAspectRatioAttribute(\n this.preserveAspectRatio || '',\n ),\n pWidth = this.width,\n pHeight = this.height,\n parsedAttributes = { width: pWidth, height: pHeight };\n let rWidth = this._element.width,\n rHeight = this._element.height,\n scaleX = 1,\n scaleY = 1,\n offsetLeft = 0,\n offsetTop = 0,\n cropX = 0,\n cropY = 0,\n offset;\n\n if (pAR && (pAR.alignX !== NONE || pAR.alignY !== NONE)) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n } else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX,\n scaleY,\n offsetLeft,\n offsetTop,\n cropX,\n cropY,\n };\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link FabricImage.fromElement})\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n static ATTRIBUTE_NAMES = [\n ...SHARED_ATTRIBUTES,\n 'x',\n 'y',\n 'width',\n 'height',\n 'preserveAspectRatio',\n 'xlink:href',\n 'href',\n 'crossOrigin',\n 'image-rendering',\n ];\n\n /**\n * Creates an instance of FabricImage from its object representation\n * @param {Object} object Object to create an instance from\n * @param {object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<FabricImage>}\n */\n static fromObject<T extends TOptions<SerializedImageProps>>(\n { filters: f, resizeFilter: rf, src, crossOrigin, type, ...object }: T,\n options?: Abortable,\n ) {\n return Promise.all([\n loadImage(src!, { ...options, crossOrigin }),\n f && enlivenObjects<BaseFilter<string>>(f, options),\n // redundant - handled by enlivenObjectEnlivables, but nicely explicit\n rf ? enlivenObjects<Resize>([rf], options) : [],\n enlivenObjectEnlivables(object, options),\n ]).then(([el, filters = [], [resizeFilter], hydratedProps = {}]) => {\n return new this(el, {\n ...object,\n // TODO: passing src creates a difference between image creation and restoring from JSON\n src,\n filters,\n resizeFilter,\n ...hydratedProps,\n });\n });\n }\n\n /**\n * Creates an instance of Image from an URL string\n * @param {String} url URL to create an image from\n * @param {LoadImageOptions} [options] Options object\n * @returns {Promise<FabricImage>}\n */\n static fromURL<T extends TOptions<ImageProps>>(\n url: string,\n { crossOrigin = null, signal }: LoadImageOptions = {},\n imageOptions?: T,\n ): Promise<FabricImage> {\n return loadImage(url, { crossOrigin, signal }).then(\n (img) => new this(img, imageOptions),\n );\n }\n\n /**\n * Returns {@link FabricImage} instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @param {Function} callback Callback to execute when Image object is created\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable = {},\n cssRules?: CSSRules,\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return this.fromURL(\n parsedAttributes['xlink:href'] || parsedAttributes['href'],\n options,\n parsedAttributes,\n ).catch((err) => {\n log('log', 'Unable to parse Image', err);\n return null;\n });\n }\n}\n\nclassRegistry.setClass(FabricImage);\nclassRegistry.setSVGClass(FabricImage);\n"],"names":["imageDefaultValues","strokeWidth","srcFromAttribute","minimumScaleTrigger","cropX","cropY","imageSmoothing","IMAGE_PROPS","FabricImage","FabricObject","getDefaults","super","ownDefaults","constructor","arg0","options","_defineProperty","this","filters","Object","assign","setOptions","cacheKey","uid","setElement","canvas","getDocumentFromElement","getElement","getFabricDocument","getElementById","_element","element","size","arguments","length","undefined","removeTexture","_originalElement","_setWidthHeight","applyFilters","resizeFilter","applyResizeFilters","key","backend","getFilterBackend","WebGLFilterBackend","evictCachesForKey","dispose","_cacheContext","forEach","elementKey","el","getEnv","getCrossOrigin","crossOrigin","getOriginalSize","width","naturalWidth","height","naturalHeight","_stroke","ctx","stroke","w","h","beginPath","moveTo","lineTo","closePath","toObject","propertiesToInclude","filterObj","push","src","getSrc","hasCrop","_toSVG","imageMarkup","x","y","svgString","strokeSvg","clipPath","imageRendering","clipPathId","escapeXml","strokeDashArray","origFill","fill","getSvgStyles","paintFirst","FILL","concat","filtered","toDataURL","getAttribute","getSvgSrc","setSrc","signal","loadImage","then","img","set","toString","filter","minimumScale","objectScale","getTotalObjectScaling","scaleX","scaleY","elementToFilter","_filteredEl","group","_filterScalingX","_filterScalingY","_lastScaleX","_lastScaleY","canvasEl","createCanvasElementFor","isNeutralState","imgElement","sourceWidth","sourceHeight","getContext","clearRect","_render","imageSmoothingEnabled","isMoving","_needsResize","_renderPaintInOrder","drawCacheOnCanvas","shouldCache","needsItsOwnCache","_renderFill","elementToDraw","Math","max","elWidth","elHeight","sX","sY","sW","min","sH","maxDestW","maxDestH","drawImage","scale","_resetWidthHeight","parsePreserveAspectRatioAttribute","pAR","preserveAspectRatio","pWidth","pHeight","parsedAttributes","offset","rWidth","rHeight","offsetLeft","offsetTop","alignX","NONE","alignY","meetOrSlice","findScaleToFit","findScaleToCover","fromObject","_ref","f","rf","type","object","Promise","all","enlivenObjects","enlivenObjectEnlivables","_ref2","hydratedProps","fromURL","url","imageOptions","fromElement","cssRules","parseAttributes","ATTRIBUTE_NAMES","catch","err","log","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
@@ -14,6 +14,7 @@ import { WebGLFilterBackend } from '../filters/WebGLFilterBackend.mjs';
14
14
  import { FILL, NONE } from '../constants.mjs';
15
15
  import { getDocumentFromElement } from '../util/dom_misc.mjs';
16
16
  import { log } from '../util/internals/console.mjs';
17
+ import { escapeXml } from '../util/lang_string.mjs';
17
18
  import { cacheProperties } from './Object/defaultValues.mjs';
18
19
 
19
20
  // @todo Would be nice to have filtering code not imported directly.
@@ -241,13 +242,13 @@ class FabricImage extends FabricObject {
241
242
  }
242
243
  if (this.hasCrop()) {
243
244
  const clipPathId = uid();
244
- svgString.push('<clipPath id="imageCrop_' + clipPathId + '">\n', '\t<rect x="' + x + '" y="' + y + '" width="' + this.width + '" height="' + this.height + '" />\n', '</clipPath>\n');
245
+ svgString.push('<clipPath id="imageCrop_' + clipPathId + '">\n', '\t<rect x="' + x + '" y="' + y + '" width="' + escapeXml(this.width) + '" height="' + escapeXml(this.height) + '" />\n', '</clipPath>\n');
245
246
  clipPath = ' clip-path="url(#imageCrop_' + clipPathId + ')" ';
246
247
  }
247
248
  if (!this.imageSmoothing) {
248
249
  imageRendering = ' image-rendering="optimizeSpeed"';
249
250
  }
250
- imageMarkup.push('\t<image ', 'COMMON_PARTS', `xlink:href="${this.getSvgSrc(true)}" x="${x - this.cropX}" y="${y - this.cropY
251
+ imageMarkup.push('\t<image ', 'COMMON_PARTS', `xlink:href="${escapeXml(this.getSrc(true))}" x="${x - this.cropX}" y="${y - this.cropY
251
252
  // we're essentially moving origin of transformation from top/left corner to the center of the shape
252
253
  // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left
253
254
  // so that object's center aligns with container's left/top
@@ -255,7 +256,7 @@ class FabricImage extends FabricObject {
255
256
  if (this.stroke || this.strokeDashArray) {
256
257
  const origFill = this.fill;
257
258
  this.fill = null;
258
- strokeSvg = [`\t<rect x="${x}" y="${y}" width="${this.width}" height="${this.height}" style="${this.getSvgStyles()}" />\n`];
259
+ strokeSvg = [`\t<rect x="${x}" y="${y}" width="${escapeXml(this.width)}" height="${escapeXml(this.height)}" style="${this.getSvgStyles()}" />\n`];
259
260
  this.fill = origFill;
260
261
  }
261
262
  if (this.paintFirst !== FILL) {