@bensitu/image-editor 2.0.0 → 2.1.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 (83) hide show
  1. package/README.md +118 -16
  2. package/dist/cjs/index.cjs +1800 -330
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/esm/animation/animation-queue.js +16 -9
  5. package/dist/esm/animation/animation-queue.js.map +1 -1
  6. package/dist/esm/core/default-options.js +216 -9
  7. package/dist/esm/core/default-options.js.map +1 -1
  8. package/dist/esm/core/operation-guard.js +28 -0
  9. package/dist/esm/core/operation-guard.js.map +1 -1
  10. package/dist/esm/core/public-types.js.map +1 -1
  11. package/dist/esm/core/state-serializer.js +5 -4
  12. package/dist/esm/core/state-serializer.js.map +1 -1
  13. package/dist/esm/crop/crop-controller.js +4 -2
  14. package/dist/esm/crop/crop-controller.js.map +1 -1
  15. package/dist/esm/export/export-service.js +21 -10
  16. package/dist/esm/export/export-service.js.map +1 -1
  17. package/dist/esm/fabric/fabric-animation.js +56 -4
  18. package/dist/esm/fabric/fabric-animation.js.map +1 -1
  19. package/dist/esm/image/image-loader.js +9 -16
  20. package/dist/esm/image/image-loader.js.map +1 -1
  21. package/dist/esm/image/image-resampler.js +7 -2
  22. package/dist/esm/image/image-resampler.js.map +1 -1
  23. package/dist/esm/image/layout-manager.js +2 -20
  24. package/dist/esm/image/layout-manager.js.map +1 -1
  25. package/dist/esm/image/transform-controller.js.map +1 -1
  26. package/dist/esm/image-editor.js +383 -47
  27. package/dist/esm/image-editor.js.map +1 -1
  28. package/dist/esm/mask/mask-factory.js +53 -29
  29. package/dist/esm/mask/mask-factory.js.map +1 -1
  30. package/dist/esm/mask/mask-list.js +9 -3
  31. package/dist/esm/mask/mask-list.js.map +1 -1
  32. package/dist/esm/mosaic/mosaic-controller.js +670 -0
  33. package/dist/esm/mosaic/mosaic-controller.js.map +1 -0
  34. package/dist/esm/mosaic/mosaic-geometry.js +81 -0
  35. package/dist/esm/mosaic/mosaic-geometry.js.map +1 -0
  36. package/dist/esm/mosaic/mosaic-pixelate.js +71 -0
  37. package/dist/esm/mosaic/mosaic-pixelate.js.map +1 -0
  38. package/dist/esm/ui/dom-bindings.js +10 -3
  39. package/dist/esm/ui/dom-bindings.js.map +1 -1
  40. package/dist/esm/utils/number.js.map +1 -1
  41. package/dist/types/animation/animation-queue.d.ts.map +1 -1
  42. package/dist/types/core/default-options.d.ts +34 -6
  43. package/dist/types/core/default-options.d.ts.map +1 -1
  44. package/dist/types/core/errors.d.ts +1 -1
  45. package/dist/types/core/operation-guard.d.ts +2 -0
  46. package/dist/types/core/operation-guard.d.ts.map +1 -1
  47. package/dist/types/core/public-types.d.ts +123 -13
  48. package/dist/types/core/public-types.d.ts.map +1 -1
  49. package/dist/types/core/state-serializer.d.ts +3 -1
  50. package/dist/types/core/state-serializer.d.ts.map +1 -1
  51. package/dist/types/crop/crop-controller.d.ts.map +1 -1
  52. package/dist/types/export/export-service.d.ts.map +1 -1
  53. package/dist/types/fabric/fabric-animation.d.ts.map +1 -1
  54. package/dist/types/image/image-loader.d.ts +2 -4
  55. package/dist/types/image/image-loader.d.ts.map +1 -1
  56. package/dist/types/image/image-resampler.d.ts +1 -1
  57. package/dist/types/image/image-resampler.d.ts.map +1 -1
  58. package/dist/types/image/layout-manager.d.ts +5 -49
  59. package/dist/types/image/layout-manager.d.ts.map +1 -1
  60. package/dist/types/image/transform-controller.d.ts +1 -2
  61. package/dist/types/image/transform-controller.d.ts.map +1 -1
  62. package/dist/types/image-editor.d.ts +20 -9
  63. package/dist/types/image-editor.d.ts.map +1 -1
  64. package/dist/types/index.d.cts +1 -1
  65. package/dist/types/index.d.cts.map +1 -1
  66. package/dist/types/index.d.ts +1 -1
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/mask/mask-factory.d.ts +24 -21
  69. package/dist/types/mask/mask-factory.d.ts.map +1 -1
  70. package/dist/types/mask/mask-list.d.ts.map +1 -1
  71. package/dist/types/mosaic/mosaic-controller.d.ts +82 -0
  72. package/dist/types/mosaic/mosaic-controller.d.ts.map +1 -0
  73. package/dist/types/mosaic/mosaic-geometry.d.ts +29 -0
  74. package/dist/types/mosaic/mosaic-geometry.d.ts.map +1 -0
  75. package/dist/types/mosaic/mosaic-pixelate.d.ts +23 -0
  76. package/dist/types/mosaic/mosaic-pixelate.d.ts.map +1 -0
  77. package/dist/types/ui/dom-bindings.d.ts +3 -1
  78. package/dist/types/ui/dom-bindings.d.ts.map +1 -1
  79. package/dist/types/utils/number.d.ts +1 -2
  80. package/dist/types/utils/number.d.ts.map +1 -1
  81. package/dist/umd/image-editor.umd.js +1 -1
  82. package/dist/umd/image-editor.umd.js.map +1 -1
  83. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ImageEditor={})}(this,function(e){"use strict";class t{constructor(){Object.defineProperty(this,"queue",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"running",{enumerable:!0,configurable:!0,writable:!0,value:!1})}add(e){return new Promise((t,i)=>{this.queue.push({run:e,resolve:t,reject:i}),this.running||this.drainQueue()})}clear(e){const t=this.queue;if(this.queue=[],void 0!==e)for(const i of t)i.reject(e);else for(const e of t)e.resolve()}isRunning(){return this.running}isBusy(){return this.running||this.queue.length>0}waitForIdle(){return this.running||0!==this.queue.length?this.add(()=>Promise.resolve()).then(()=>{},()=>{}):Promise.resolve()}async drainQueue(){if(0===this.queue.length)return void(this.running=!1);this.running=!0;const e=this.queue.shift();try{await e.run(),e.resolve()}catch(t){e.reject(t)}this.drainQueue()}}function i(e,t,i){const a=e.onWarning;if("function"==typeof a)try{a(t,i)}catch(e){console.warn("[ImageEditor] onWarning callback threw",e)}}function a(e,t,i){const a=e.onError;if("function"==typeof a)try{a(t,i)}catch(e){console.error("[ImageEditor] onError callback threw",e)}}const n={canvasWidth:800,canvasHeight:600,backgroundColor:"transparent",animationDuration:300,minScale:.1,maxScale:5,scaleStep:.05,rotationStep:90,expandCanvasToImage:!0,fitImageToCanvas:!1,coverImageToCanvas:!1,downsampleOnLoad:!0,downsampleMaxWidth:4e3,downsampleMaxHeight:3e3,downsampleQuality:.92,preserveSourceFormat:!0,downsampleMimeType:null,imageLoadTimeoutMs:3e4,maxHistorySize:50,exportMultiplier:1,maxExportPixels:5e7,exportAreaByDefault:"image",mergeMaskByDefault:!0,defaultMaskWidth:50,defaultMaskHeight:80,maskRotatable:!1,maskLabelOnSelect:!0,maskLabelOffset:3,maskName:"mask",groupSelection:!1,showPlaceholder:!0,initialImageBase64:null,defaultDownloadFileName:"edited_image.jpg",onImageLoadStart:null,onImageLoaded:null,onImageCleared:null,onImageChanged:null,onBusyChange:null,onEditorDisposed:null,onMasksChanged:null,onSelectionChange:null,onError:null,onWarning:null},o={fontSize:12,fill:"#fff",backgroundColor:"rgba(0,0,0,0.7)",padding:2,fontFamily:"monospace",fontWeight:"bold",selectable:!1,evented:!1,originX:"left",originY:"top"},r={getText:e=>e.maskName},s=100,l=100,c=10,u=!0,h=!1,d=!1,m="source",g=new Set(["canvasWidth","canvasHeight","backgroundColor","animationDuration","minScale","maxScale","scaleStep","rotationStep","expandCanvasToImage","fitImageToCanvas","coverImageToCanvas","downsampleOnLoad","downsampleMaxWidth","downsampleMaxHeight","downsampleQuality","preserveSourceFormat","downsampleMimeType","imageLoadTimeoutMs","maxHistorySize","exportMultiplier","maxExportPixels","exportAreaByDefault","mergeMaskByDefault","defaultMaskWidth","defaultMaskHeight","maskRotatable","maskLabelOnSelect","maskLabelOffset","maskName","groupSelection","showPlaceholder","initialImageBase64","defaultDownloadFileName","onImageLoadStart","onImageLoaded","onImageCleared","onImageChanged","onBusyChange","onEditorDisposed","onMasksChanged","onSelectionChange","onError","onWarning","label","crop"]);function p(e){return"function"==typeof e?e:null}function f(e,t){const i=Number(e);return!Number.isFinite(i)||i<=0?t:Math.max(1,Math.floor(i))}function b(e,t){const i=Number(e);return!Number.isFinite(i)||i<=0?t:i}function v(e,t){const i=Number(e);return!Number.isFinite(i)||i<0?t:i}function y(e,t){const i=Number(e);return Number.isFinite(i)?i:t}function I(e){if(null==e)return n.downsampleQuality;const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.min(1,t)):n.downsampleQuality}function C(e){const t=Number(e);return!Number.isFinite(t)||t<=0?n.maxExportPixels:Math.max(1,Math.floor(t))}function k(e){return"canvas"===e||"image"===e?e:n.exportAreaByDefault}function M(e){if(null==e)return;const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.min(1,t)):void 0}function w(e){var t,i,a,w;const x=null!=e?e:{},S={...n};for(const e of Object.keys(x)){if(!g.has(e))continue;if("label"===e||"crop"===e)continue;if("onImageLoadStart"===e||"onImageLoaded"===e||"onImageCleared"===e||"onImageChanged"===e||"onBusyChange"===e||"onEditorDisposed"===e||"onMasksChanged"===e||"onSelectionChange"===e||"onError"===e||"onWarning"===e)continue;const t=x[e];void 0!==t&&("downsampleQuality"!==e?"maxExportPixels"!==e?"exportAreaByDefault"!==e?"canvasWidth"!==e?"canvasHeight"!==e?"animationDuration"!==e?"minScale"!==e?"maxScale"!==e?"scaleStep"!==e?"rotationStep"!==e?"downsampleMaxWidth"!==e?"downsampleMaxHeight"!==e?"imageLoadTimeoutMs"!==e?"exportMultiplier"!==e?"defaultMaskWidth"!==e?"defaultMaskHeight"!==e?"maskLabelOffset"!==e?S[e]=t:S.maskLabelOffset=v(t,n.maskLabelOffset):S.defaultMaskHeight=b(t,n.defaultMaskHeight):S.defaultMaskWidth=b(t,n.defaultMaskWidth):S.exportMultiplier=b(t,n.exportMultiplier):S.imageLoadTimeoutMs=f(t,n.imageLoadTimeoutMs):S.downsampleMaxHeight=f(t,n.downsampleMaxHeight):S.downsampleMaxWidth=f(t,n.downsampleMaxWidth):S.rotationStep=y(t,n.rotationStep):S.scaleStep=b(t,n.scaleStep):S.maxScale=b(t,n.maxScale):S.minScale=b(t,n.minScale):S.animationDuration=v(t,n.animationDuration):S.canvasHeight=f(t,n.canvasHeight):S.canvasWidth=f(t,n.canvasWidth):S.exportAreaByDefault=k(t):S.maxExportPixels=C(t):S.downsampleQuality=I(t))}if(S.onImageLoadStart=p(x.onImageLoadStart),S.onImageLoaded=p(x.onImageLoaded),S.onImageCleared=p(x.onImageCleared),S.onImageChanged=p(x.onImageChanged),S.onBusyChange=p(x.onBusyChange),S.onEditorDisposed=p(x.onEditorDisposed),S.onMasksChanged=p(x.onMasksChanged),S.onSelectionChange=p(x.onSelectionChange),S.onError=p(x.onError),S.onWarning=p(x.onWarning),S.maxHistorySize=function(e){const t=Number(e);return Number.isFinite(t)?Math.max(1,Math.floor(t)):n.maxHistorySize}(S.maxHistorySize),S.maxExportPixels=C(S.maxExportPixels),S.minScale>S.maxScale){const e=S.minScale;S.minScale=S.maxScale,S.maxScale=e}const O=x.label&&"object"==typeof x.label?x.label:{},E={...o,...O.textOptions&&"object"==typeof O.textOptions?O.textOptions:{}},L={getText:"function"==typeof O.getText?O.getText:r.getText,textOptions:E};"function"==typeof O.create&&(L.create=O.create),Object.freeze(L.textOptions),Object.freeze(L);const B=x.crop&&"object"==typeof x.crop?x.crop:{},j={minWidth:b(B.minWidth,s),minHeight:b(B.minHeight,l),padding:v(B.padding,c),hideMasksDuringCrop:null!==(t=B.hideMasksDuringCrop)&&void 0!==t?t:u,preserveMasksAfterCrop:null!==(i=B.preserveMasksAfterCrop)&&void 0!==i?i:h,allowRotationOfCropRect:null!==(a=B.allowRotationOfCropRect)&&void 0!==a?a:d,exportFileType:null!==(w=B.exportFileType)&&void 0!==w?w:m,exportQuality:M(B.exportQuality)};return Object.freeze(j),{...S,label:L,crop:j}}class x{constructor(){Object.defineProperty(this,"isAnimationActive",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"isDisposedFlag",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"isLoadingActive",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"currentOperationName",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"currentOperationToken",{enumerable:!0,configurable:!0,writable:!0,value:null})}isAnimating(){return this.isAnimationActive}isDisposed(){return this.isDisposedFlag}isLoading(){return this.isLoadingActive}activeOperationName(){return this.currentOperationName}isBusy(){return this.isAnimationActive||this.isLoadingActive||null!==this.currentOperationToken}beginAnimation(){this.isAnimationActive=!0}endAnimation(){this.isAnimationActive=!1}markDisposed(){this.isDisposedFlag=!0,this.isAnimationActive=!1,this.isLoadingActive=!1,this.currentOperationName=null,this.currentOperationToken=null}beginLoading(){this.isLoadingActive=!0}endLoading(){this.isLoadingActive=!1}beginBusyOperation(e){const t=Symbol(e);return this.currentOperationName=e,this.currentOperationToken=t,t}endBusyOperation(e){e&&e===this.currentOperationToken&&(this.currentOperationName=null,this.currentOperationToken=null)}isOwnOperation(e){return!!e&&e===this.currentOperationToken}async runAnimation(e){this.beginAnimation();try{return await e()}finally{this.endAnimation()}}assertNotAnimating(e){if(this.isAnimationActive)throw new Error(`[ImageEditor] Cannot run "${e}" while an animation is in progress.`)}assertIdleForOperation(e,t){var i;if(this.isDisposedFlag)throw new Error(`[ImageEditor] Cannot run "${e}" after dispose.`);const a=this.isOwnOperation(t);if(this.isAnimationActive)throw new Error(`[ImageEditor] Cannot run "${e}" while an animation is in progress.`);if(this.isLoadingActive&&!a)throw new Error(`[ImageEditor] Cannot run "${e}" while an image is loading.`);if(this.currentOperationToken&&!a)throw new Error(`[ImageEditor] Cannot run "${e}" while ${null!==(i=this.currentOperationName)&&void 0!==i?i:"another operation"} is running.`)}assertCanQueueAnimation(e,t){var i;if(this.isDisposedFlag)throw new Error(`[ImageEditor] Cannot run "${e}" after dispose.`);const a=this.isOwnOperation(t);if(this.isLoadingActive&&!a)throw new Error(`[ImageEditor] Cannot run "${e}" while an image is loading.`);if(this.currentOperationToken&&!a)throw new Error(`[ImageEditor] Cannot run "${e}" while ${null!==(i=this.currentOperationName)&&void 0!==i?i:"another operation"} is running.`)}}function S(e){return"maskId"in e&&"number"==typeof e.maskId}const O=["maskId","maskUid","maskName","isCropRect","maskLabel","originalAlpha","originalStroke","originalStrokeWidth","hasControls","selectable","strokeUniform","lockRotation","transparentCorners","borderColor","cornerColor","cornerSize"];function E(e){var t,i,a;const{canvas:n,currentScale:o,currentRotation:r,baseImageScale:s}=e,l=null===(i=(t=n).getActiveObject)||void 0===i?void 0:i.call(t),c=l&&S(l)?l.maskId:"number"==typeof e.activeMaskId?e.activeMaskId:null;(function(e){if(!e)return!1;if("activeselection"===("string"==typeof e.type?e.type.toLowerCase():""))return!0;const t=e.isType;return"function"==typeof t&&(t.call(e,"ActiveSelection")||t.call(e,"activeSelection")||t.call(e,"activeselection"))})(l)&&n.discardActiveObject();const u=n.toJSON(O);return function(e,t){if(Array.isArray(t))for(let i=0;i<t.length;i+=1){const a=e[i],n=t[i];a&&n&&("number"==typeof a.maskId&&(n.maskId=a.maskId),"string"==typeof a.maskUid&&(n.maskUid=a.maskUid),"string"==typeof a.maskName&&(n.maskName=a.maskName),"number"==typeof a.originalAlpha&&(n.originalAlpha=a.originalAlpha),"originalStroke"in a&&(n.originalStroke=a.originalStroke),"number"==typeof a.originalStrokeWidth&&(n.originalStrokeWidth=a.originalStrokeWidth),"boolean"==typeof a.hasControls&&(n.hasControls=a.hasControls),"boolean"==typeof a.selectable&&(n.selectable=a.selectable),"boolean"==typeof a.strokeUniform&&(n.strokeUniform=a.strokeUniform),"boolean"==typeof a.lockRotation&&(n.lockRotation=a.lockRotation),"boolean"==typeof a.transparentCorners&&(n.transparentCorners=a.transparentCorners),"string"==typeof a.borderColor&&(n.borderColor=a.borderColor),"string"==typeof a.cornerColor&&(n.cornerColor=a.cornerColor),"number"==typeof a.cornerSize&&(n.cornerSize=a.cornerSize),!0===a.isCropRect&&(n.isCropRect=!0),!0===a.maskLabel&&(n.maskLabel=!0))}}(n.getObjects(),u.objects),Array.isArray(u.objects)&&(u.objects=u.objects.filter(e=>!0!==e.isCropRect&&!0!==e.maskLabel)),u._editorState={currentScale:o,currentRotation:r,baseImageScale:s,currentImageMimeType:null!==(a=e.currentImageMimeType)&&void 0!==a?a:null},null!==c&&(u._editorState.activeMaskId=c),JSON.stringify(u)}async function L(e){var t,i;const{canvas:a,jsonString:n,setCanvasSize:o}=e,r="string"==typeof n?n:JSON.stringify(n),s=JSON.parse(r);"number"==typeof s.width&&s.width>0&&"number"==typeof s.height&&s.height>0&&o(s.width,s.height),await a.loadFromJSON(s);const l=a.getObjects();!function(e,t){var i,a,n,o,r;const s=new Set;for(const l of t){if("number"!=typeof l.maskId)continue;const t=String(null!==(i=l.type)&&void 0!==i?i:""),c=Number(null!==(a=l.left)&&void 0!==a?a:0),u=Number(null!==(n=l.top)&&void 0!==n?n:0),h="string"==typeof l.maskUid?l.maskUid:null;let d=-1;if(h&&(d=e.findIndex((e,t)=>!s.has(t)&&e.maskUid===h)),d<0&&(d=e.findIndex((e,i)=>{var a,n;return!s.has(i)&&((!t||e.type===t)&&(Math.abs((null!==(a=e.left)&&void 0!==a?a:0)-c)<.5&&Math.abs((null!==(n=e.top)&&void 0!==n?n:0)-u)<.5))})),d<0)continue;s.add(d);const m=e[d];m.maskId=l.maskId,"string"==typeof l.maskUid&&(m.maskUid=l.maskUid),m.maskName=String(null!==(o=l.maskName)&&void 0!==o?o:""),m.originalAlpha="number"==typeof l.originalAlpha?l.originalAlpha:null!==(r=m.opacity)&&void 0!==r?r:.5,"originalStroke"in l&&(m.originalStroke=l.originalStroke),"number"==typeof l.originalStrokeWidth&&(m.originalStrokeWidth=l.originalStrokeWidth),"boolean"==typeof l.hasControls&&(m.hasControls=l.hasControls),"boolean"==typeof l.selectable&&(m.selectable=l.selectable),"boolean"==typeof l.strokeUniform&&(m.strokeUniform=l.strokeUniform),"boolean"==typeof l.lockRotation&&(m.lockRotation=l.lockRotation),"boolean"==typeof l.transparentCorners&&(m.transparentCorners=l.transparentCorners),"string"==typeof l.borderColor&&(m.borderColor=l.borderColor),"string"==typeof l.cornerColor&&(m.cornerColor=l.cornerColor),"number"==typeof l.cornerSize&&(m.cornerSize=l.cornerSize)}t.forEach((t,i)=>{if(!0!==t.maskLabel)return;const a=e[i];a&&(a.maskLabel=!0)})}(l,null!==(t=s.objects)&&void 0!==t?t:[]);const c=s._editorState&&"object"==typeof s._editorState?{currentScale:"number"==typeof s._editorState.currentScale?s._editorState.currentScale:1,currentRotation:"number"==typeof s._editorState.currentRotation?s._editorState.currentRotation:0,baseImageScale:"number"==typeof s._editorState.baseImageScale?s._editorState.baseImageScale:1}:null;if(c&&s._editorState&&"number"==typeof s._editorState.activeMaskId&&(c.activeMaskId=s._editorState.activeMaskId),c&&s._editorState&&"currentImageMimeType"in s._editorState){const e=s._editorState.currentImageMimeType;c.currentImageMimeType="image/jpeg"===e||"image/png"===e||"image/webp"===e?e:null}return{editorState:c,maxMaskId:l.filter(S).reduce((e,t)=>Math.max(e,t.maskId),0),originalImage:null!==(i=l.find(B))&&void 0!==i?i:null,objects:l,jsonString:r}}function B(e){if(S(e))return!1;if("image"===("string"==typeof e.type?e.type.toLowerCase():""))return!0;const t=e.isType;return"function"==typeof t&&t.call(e,"image")}class j{constructor(e,t){Object.defineProperty(this,"execute",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"undo",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.execute=e,this.undo=t}}class A{constructor(e=50){Object.defineProperty(this,"history",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"currentIndex",{enumerable:!0,configurable:!0,writable:!0,value:-1}),Object.defineProperty(this,"isProcessing",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"maxSize",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.maxSize=e}execute(e){e.execute(),this.pushAndTrim(e)}push(e){this.pushAndTrim(e)}canUndo(){return this.currentIndex>=0}canRedo(){return this.currentIndex<this.history.length-1}async undo(){if(!this.isProcessing&&this.canUndo()){this.isProcessing=!0;try{const e=this.history[this.currentIndex];if(!e)return;await e.undo(),this.currentIndex--}finally{this.isProcessing=!1}}}async redo(){if(!this.isProcessing&&this.canRedo()){this.isProcessing=!0;try{const e=this.history[this.currentIndex+1];if(!e)return;await e.execute(),this.currentIndex++}finally{this.isProcessing=!1}}}pushAndTrim(e){this.currentIndex<this.history.length-1&&(this.history=this.history.slice(0,this.currentIndex+1)),this.history.push(e),this.history.length>this.maxSize?this.history.shift():this.currentIndex++}}function N(e){if(null===e||"object"!=typeof e)return!1;return"function"==typeof e.Canvas}function T(e,t){Object.setPrototypeOf(e,t.prototype)}class F extends Error{constructor(e="Failed to decode image data URL.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ImageDecodeError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,T(this,F)}}class R extends Error{constructor(e,t){super(`Image load timed out after ${t}ms during ${e}`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ImageLoadTimeoutError"}),Object.defineProperty(this,"label",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"elapsedMs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.label=e,this.elapsedMs=t,T(this,R)}}class P extends Error{constructor(e="Failed to obtain a 2D context for downsampling.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"DownsampleError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,T(this,P)}}class D extends Error{constructor(e="Failed to merge masks into the image.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"MergeMasksError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,T(this,D)}}class W extends Error{constructor(e="Failed to apply crop to the image.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"CropApplyError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,T(this,W)}}class H extends Error{constructor(e="exportImageFile"){super(`Cannot ${e}: no image is loaded on the canvas.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ExportNotReadyError"}),Object.defineProperty(this,"operation",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.operation=e,T(this,H)}}class U extends Error{constructor(e="Failed to export image.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ExportError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,T(this,U)}}const z="#ccc";function Q(e){var t;const i=Number(e.originalStrokeWidth);e.set({stroke:null!==(t=e.originalStroke)&&void 0!==t?t:z,strokeWidth:Number.isFinite(i)?i:1})}function $(e){const t=e,i=()=>{var e;t.set(function(e){const t=Number(e.originalAlpha),i=Number.isFinite(t)?t:.5;return{stroke:"#ff5500",strokeWidth:2,opacity:Math.min(i+.2,1)}}(t)),null===(e=t.canvas)||void 0===e||e.requestRenderAll()},a=()=>{var e;t.set(function(e){var t;const i=Number(e.originalStrokeWidth),a=Number(e.originalAlpha);return{stroke:null!==(t=e.originalStroke)&&void 0!==t?t:z,strokeWidth:Number.isFinite(i)?i:1,opacity:Number.isFinite(a)?a:.5}}(t)),null===(e=t.canvas)||void 0===e||e.requestRenderAll()};t.on("mouseover",i),t.on("mouseout",a),t.imageEditorMaskHandlers={mouseover:i,mouseout:a}}function q(e){var t;const i=e;if(i.imageEditorMaskHandlers){try{i.off("mouseover",i.imageEditorMaskHandlers.mouseover),i.off("mouseout",i.imageEditorMaskHandlers.mouseout)}catch{}delete i.imageEditorMaskHandlers}const a={};if(!Number.isFinite(Number(i.originalAlpha))){const e=Number(i.opacity);a.originalAlpha=Number.isFinite(e)?e:.5}if(null==i.originalStroke&&(a.originalStroke=null!==(t=i.stroke)&&void 0!==t?t:z),!Number.isFinite(Number(i.originalStrokeWidth))){const e=Number(i.strokeWidth);a.originalStrokeWidth=Number.isFinite(e)?e:1}Object.keys(a).length>0&&i.set(a),$(i)}function G(e){const t=e;if(t.imageEditorMaskHandlers){try{t.off("mouseover",t.imageEditorMaskHandlers.mouseover),t.off("mouseout",t.imageEditorMaskHandlers.mouseout)}catch{}delete t.imageEditorMaskHandlers}}function Y(e){var t,i,a,n,o,r,s;return{object:e,opacity:null!==(t=e.opacity)&&void 0!==t?t:1,fill:null!==(i=e.fill)&&void 0!==i?i:null,strokeWidth:null!==(a=e.strokeWidth)&&void 0!==a?a:0,stroke:null!==(n=e.stroke)&&void 0!==n?n:null,selectable:null===(o=e.selectable)||void 0===o||o,evented:null===(r=e.evented)||void 0===r||r,lockRotation:null!==(s=e.lockRotation)&&void 0!==s&&s}}function X(e){try{e.object.set({opacity:e.opacity,fill:e.fill,strokeWidth:e.strokeWidth,stroke:e.stroke,selectable:e.selectable,evented:e.evented,lockRotation:e.lockRotation}),"function"==typeof e.object.setCoords&&e.object.setCoords()}catch{}}function _(e){try{e.set({opacity:0,evented:!1,selectable:!1})}catch{}}function V(e,t,i){const a=Number(e.left),n=Number(e.top),o=Number(e.width),r=Number(e.height);if(!Number.isFinite(a)||!Number.isFinite(n)||!Number.isFinite(o)||!Number.isFinite(r)||o<=0||r<=0)return!1;const s=a+o,l=n+r;if(!Number.isFinite(s)||!Number.isFinite(l))return!1;const c=Number(t),u=Number(i);if(!Number.isFinite(c)||!Number.isFinite(u)||c<=0||u<=0)return!0;const h=Math.min(s,c)-Math.max(a,0),d=Math.min(l,u)-Math.max(n,0);return h>0&&d>0}function J(e,t,i,a={}){const n=Number.isFinite(e.left)?e.left:0,o=Number.isFinite(e.top)?e.top:0,r=Math.max(0,Number.isFinite(e.width)?e.width:0),s=Math.max(0,Number.isFinite(e.height)?e.height:0),l=!1!==a.includePartialPixels?Math.ceil:Math.floor,c=Number.isFinite(t),u=Number.isFinite(i),h=c?Math.max(1,Math.round(Number(t))):Number.POSITIVE_INFINITY,d=u?Math.max(1,Math.round(Number(i))):Number.POSITIVE_INFINITY,m=Math.min(h-1,Math.max(0,Math.floor(n))),g=Math.min(d-1,Math.max(0,Math.floor(o))),p=Math.min(h,Math.max(m+1,l(n+r))),f=Math.min(d,Math.max(g+1,l(o+s)));return{left:m,top:g,width:Math.max(1,p-m),height:Math.max(1,f-g)}}function K(e){const t=Number(e);return!!Number.isFinite(t)&&Math.abs(t-Math.round(t))>.01}function Z(e,t=0){if(!e)return null;const i=Math.abs((Number(t)||0)%90);if(!(i<.01||Math.abs(i-90)<.01))return null;const a=Number(e.left)||0,n=Number(e.top)||0;return{left:K(a),top:K(n),right:K(a+(Number(e.width)||0)),bottom:K(n+(Number(e.height)||0))}}function ee(e){e.setCoords();const t=e.getBoundingRect();return{left:t.left,top:t.top,width:t.width,height:t.height}}const te=Object.freeze({jpeg:"jpeg",jpg:"jpeg","image/jpeg":"jpeg",png:"png","image/png":"png",webp:"webp","image/webp":"webp"}),ie=Object.freeze({jpeg:"image/jpeg",png:"image/png",webp:"image/webp"});function ae(e){var t;if(!e)return null;const i=String(e).toLowerCase();return Object.prototype.hasOwnProperty.call(te,i)&&null!==(t=te[i])&&void 0!==t?t:null}function ne(e){return ie[e]}function oe(e,t){const i=Number(e);return Number.isFinite(i)?Math.max(0,Math.min(1,i)):t}function re(e,t){var i;const a=null!=e?e:{},n=a.fileType,o=a.format,r=function(e){var t;return null!==(t=ae(e))&&void 0!==t?t:"jpeg"}(n||o),s=ne(r);if("png"===r)return{format:r,mimeType:s,quality:void 0};return{format:r,mimeType:s,quality:oe(null!==(i=a.quality)&&void 0!==i?i:t,t)}}const se=[6,4],le=.92;function ce(e,t){const i=Number(e);return Number.isFinite(i)?i:t}function ue(e,t){const i=Number(e);if(Number.isFinite(i))return oe(i,le);const a=Number(t);return Number.isFinite(a)?oe(a,le):le}function he(e,t){for(const e of t.handlers)for(const t of e.handlers)try{e.target.off(t.eventName,t.callback)}catch{}if(t.handlers=[],t.cropRect){try{e.canvas.remove(t.cropRect)}catch{}t.cropRect=null}}function de(e){for(const t of e.prevEvented)try{t.object.set({evented:t.evented,selectable:t.selectable})}catch{}e.prevEvented=[]}function me(e,t){he(e,t),de(t),function(e){for(const t of e.maskBackups)X(t);e.maskBackups=[]}(t);try{e.canvas.selection=!!t.prevSelection}catch{}}function ge(e,t){const i=ee(e);return i.left<t.left+t.width&&i.left+i.width>t.left&&i.top<t.top+t.height&&i.top+i.height>t.top}function pe(e){const t=e.getCropSession();if(t){e.canvas.discardActiveObject(),me(e,t),e.setCropSession(null);try{e.canvas.renderAll()}catch{}}}async function fe(e){var t,i;const a=e.getCropSession();if(!a||!a.cropRect)return;const{canvas:n}=e;n.discardActiveObject();const o=a.beforeJson,r=a.cropRect,s=!!e.options.crop.preserveMasksAfterCrop;try{r.setCoords();const l=Number(r.angle)||0;if(!e.options.crop.allowRotationOfCropRect&&Math.abs(l%360)>.01)throw new W("applyCrop failed: rotated crop rectangles are disabled.");const c=function(e){const t=Number(e.angle)||0,i=Math.abs(t%360);return i>.01&&Math.abs(i-360)>.01?ee(e):{left:Number(e.left)||0,top:Number(e.top)||0,width:Math.max(0,(Number(e.width)||0)*Math.abs(Number(e.scaleX)||1)),height:Math.max(0,(Number(e.height)||0)*Math.abs(Number(e.scaleY)||1))}}(r);if(!V(c,n.getWidth(),n.getHeight()))throw new W("applyCrop failed: crop region is empty or outside the canvas.");const u=J(c,n.getWidth(),n.getHeight(),{includePartialPixels:!1}),h=s?function(e,t,i=[]){var a;const n=[],o=new Map(i.map(e=>[e.object,e])),r=e.getObjects().filter(S);for(const i of r)try{if(i.setCoords(),ge(i,t)){const e=null!==(a=o.get(i))&&void 0!==a?a:Y(i);n.push({mask:i,left:ce(i.left,0),top:ce(i.top,0),angle:ce(i.angle,0),scaleX:ce(i.scaleX,1),scaleY:ce(i.scaleY,1),styleBackup:e})}e.remove(i)}catch{}return n}(n,u,a.maskBackups):[];de(a),he(e,a),n.selection=!!a.prevSelection;const d=function(e){var t,i;const a=e.cropExportFileType,n=null==a||"source"===a?null!==(t=function(e){return"image/jpeg"===e?"jpeg":"image/png"===e?"png":"image/webp"===e?"webp":null}(e.currentImageMimeType))&&void 0!==t?t:"png":null!==(i=ae(String(a)))&&void 0!==i?i:"png",o=ne(n);return"png"===n?{format:n,mimeType:o}:{format:n,mimeType:o,quality:ue(e.cropExportQuality,e.downsampleQuality)}}({cropExportFileType:e.options.crop.exportFileType,currentImageMimeType:null!==(i=null===(t=e.getCurrentImageMimeType)||void 0===t?void 0:t.call(e))&&void 0!==i?i:null,cropExportQuality:e.options.crop.exportQuality,downsampleQuality:e.options.downsampleQuality}),m={format:d.format,multiplier:1,left:u.left,top:u.top,width:u.width,height:u.height};void 0!==d.quality&&(m.quality=d.quality);const g=n.toDataURL(m);await e.loadImage(g),h.length>0&&(!function(e,t,i){var a;if(0===i.length)return;const{canvas:n}=e;let o=0;for(const e of i)try{X(e.styleBackup),e.mask.set({left:e.left-t.left,top:e.top-t.top,angle:e.angle,scaleX:e.scaleX,scaleY:e.scaleY,visible:!0}),e.mask.setCoords(),n.add(e.mask),n.bringObjectToFront(e.mask),q(e.mask);const i=Number(e.mask.maskId);Number.isFinite(i)&&i>o&&(o=i)}catch{}if("function"==typeof e.getMaskCounter&&"function"==typeof e.setMaskCounter){const t=Number(e.getMaskCounter()),i=Number.isFinite(t)?t:0;e.setMaskCounter(Math.max(i,o))}try{null===(a=e.updateMaskList)||void 0===a||a.call(e)}catch{}}(e,u,h),n.renderAll());const p=e.saveState();e.setCropSession(null),o&&p&&o!==p&&e.historyManager.push(new j(()=>e.loadFromState(p),()=>e.loadFromState(o)))}catch(t){me(e,a),e.setCropSession(null);try{await e.loadFromState(o)}catch(e){console.warn("[ImageEditor] applyCrop: rollback failed",e)}if(t instanceof W)throw t;const i=t instanceof Error?`applyCrop failed: ${t.message}`:"applyCrop failed";throw new W(i,t)}}function be(e,t){const i=Number(e);if(Number.isFinite(i)&&i>0)return i;const a=Number(t);return Number.isFinite(a)&&a>0?a:1}function ve(e,t,i){const a=e,n=a[t],o="function"==typeof n?n.call(a):a[i];return Math.max(1,Math.ceil(Number.isFinite(o)?Number(o):1))}async function ye(e,t,i){return t?async function(e,t,i){if(!e.canvas)return await i();const a=e.canvas.getObjects().filter(S),n=a.map(Y);try{return a.forEach((e,i)=>t(e,i)),await i()}finally{for(const e of n)X(e)}}({canvas:e.canvas,options:e.options},ke,i):async function(e,t){const i=Ie(e.canvas).filter(S).map(e=>({mask:e,visible:e.visible}));for(const e of i)try{"function"==typeof e.mask.set?e.mask.set({visible:!1}):e.mask.visible=!1}catch{}try{return await t()}finally{for(const e of i)try{"function"==typeof e.mask.set?e.mask.set({visible:e.visible}):e.mask.visible=e.visible}catch{}}}(e,i)}function Ie(e){try{return e.getObjects()}catch{return[]}}function Ce(e,t){return Ie(e).includes(t)}function ke(e){try{e.set({opacity:1,fill:"#000",strokeWidth:0,stroke:null,selectable:!1}),"function"==typeof e.setCoords&&e.setCoords()}catch{}}function Me(e){return{width:Math.max(1,e.naturalWidth||e.width||1),height:Math.max(1,e.naturalHeight||e.height||1)}}function we(e){return new Promise((t,i)=>{const a=new Image;a.crossOrigin="anonymous";const n=()=>{"function"==typeof a.removeEventListener?(a.removeEventListener("load",o),a.removeEventListener("error",r)):(a.onload=null,a.onerror=null)},o=()=>{n(),t(a)},r=()=>{n(),i(new Error("Failed to decode export data URL"))};"function"==typeof a.addEventListener?(a.addEventListener("load",o,{once:!0}),a.addEventListener("error",r,{once:!0})):(a.onload=o,a.onerror=r),a.src=e})}function xe(e){return function(e,t="#ffffff"){const i=String(null!=e?e:"").trim();if(!i||function(e){const t=e.trim().toLowerCase();if("transparent"===t)return!0;const i=t.match(/^#([0-9a-f]{4}|[0-9a-f]{8})$/i);if(i){const e=i[1],t=4===e.length?e[3]:e.slice(6,8);return/^0+$/.test(t)}const a=t.match(/^(?:rgba|hsla)\((.*),\s*([^,/)]+)\)$/i);if(a&&Se(a[2]))return!0;const n=t.match(/^[a-z][a-z0-9-]*\([^/]+\/\s*([^)]+)\)$/i);return!(!n||!Se(n[1]))}(i))return"#ffffff";const a=function(){try{return"undefined"==typeof document||"function"!=typeof document.createElement?null:document.createElement("canvas").getContext("2d")}catch{return null}}();if(!a)return t;a.fillStyle="#000001";const n=a.fillStyle;a.fillStyle=i;const o=a.fillStyle;if(o!==n)return o;a.fillStyle="#000002";const r=a.fillStyle;a.fillStyle=i;const s=a.fillStyle;return s!==r?s:t}(e)}function Se(e){const t=e.trim();if(t.endsWith("%")){const e=Number.parseFloat(t.slice(0,-1));return Number.isFinite(e)&&0===e}const i=Number.parseFloat(t);return Number.isFinite(i)&&0===i}function Oe(e){console.warn(`[ImageEditor] ${e} skipped: no image is loaded on the canvas.`)}async function Ee(e,t){if(!e.isImageLoaded())return Oe("exportImageBase64"),"";const i=function(e){var t;try{const i=e;return"function"!=typeof i.getActiveObject?null:null!==(t=i.getActiveObject())&&void 0!==t?t:null}catch{return null}}(e.canvas),a=function(e){const t=[];for(const i of Ie(e)){if(!S(i))continue;const a=i.labelObject;if(!a)continue;const n=Ce(e,a);t.push({mask:i,label:a,wasOnCanvas:n,visible:a.visible});try{"function"==typeof a.set&&a.set({visible:!1}),n&&e.remove(a)}catch{}}return t}(e.canvas);try{e.canvas.discardActiveObject();const i=function(e,t){const i=null!=t?t:{};return{exportArea:(a=i.exportArea,n=e.options.exportAreaByDefault,"canvas"===a||"image"===a?a:"canvas"===n?"canvas":"image"),mergeMask:"boolean"==typeof i.mergeMask?i.mergeMask:e.options.mergeMaskByDefault,multiplier:be(i.multiplier,e.options.exportMultiplier),format:re(i,e.options.downsampleQuality)};var a,n}(e,t),{region:a,partialEdges:n}=function(e,t){if("canvas"===t)return{region:null,partialEdges:null};const i=e.getOriginalImage();if(!i)return{region:null,partialEdges:null};const a=ee(i),n=e.canvas,o="function"==typeof n.getWidth?n.getWidth():n.width,r="function"==typeof n.getHeight?n.getHeight():n.height;if(!V(a,o,r))throw new U("exportImageBase64 failed: image export region is empty.");return{region:J(a,o,r,{includePartialPixels:!0}),partialEdges:Z(a,Number(i.angle)||0)}}(e,i.exportArea);!function(e,t,i){var a,n;const o=null!==(a=null==i?void 0:i.width)&&void 0!==a?a:ve(e.canvas,"getWidth","width"),r=null!==(n=null==i?void 0:i.height)&&void 0!==n?n:ve(e.canvas,"getHeight","height"),s=Math.max(1,Math.ceil(o*t)),l=Math.max(1,Math.ceil(r*t)),c=s*l,u=e.options.maxExportPixels;if(!Number.isFinite(c)||c>u)throw new RangeError(`[ImageEditor] Export size ${s}x${l} (${c} pixels) exceeds maxExportPixels (${u}).`)}(e,i.multiplier,a);const o=a&&"jpeg"===i.format.format?"png":i.format.format,r="png"===o?void 0:i.format.quality;let s=await ye(e,i.mergeMask,async()=>function(e,t,i,a,n){const o={format:t,multiplier:a};return void 0!==i&&(o.quality=i),n&&(o.left=n.left,o.top=n.top,o.width=n.width,o.height=n.height),e.toDataURL(o)}(e.canvas,o,r,i.multiplier,a));return a&&(s=await async function(e,t){if(!function(e){return!!e&&(e.left||e.top||e.right||e.bottom)}(t))return e;const i=await we(e),{width:a,height:n}=Me(i),o=document.createElement("canvas");o.width=a,o.height=n;const r=o.getContext("2d");if(!r)throw new Error("2D canvas context is unavailable");r.drawImage(i,0,0,a,n);const s=r.getImageData(0,0,a,n),l=s.data,c=(e,t,i,n)=>{var o,r,s,c,u,h;const d=4*(t*a+e),m=4*(n*a+i),g=null!==(o=l[d+3])&&void 0!==o?o:0,p=null!==(r=l[m+3])&&void 0!==r?r:0;0===g&&p>0&&(l[d]=null!==(s=l[m])&&void 0!==s?s:0,l[d+1]=null!==(c=l[m+1])&&void 0!==c?c:0,l[d+2]=null!==(u=l[m+2])&&void 0!==u?u:0,l[d+3]=p);const f=null!==(h=l[d+3])&&void 0!==h?h:0;f>0&&f<255&&(l[d+3]=255)};if((null==t?void 0:t.left)&&a>1)for(let e=0;e<n;e+=1)c(0,e,1,e);if((null==t?void 0:t.right)&&a>1)for(let e=0;e<n;e+=1)c(a-1,e,a-2,e);if((null==t?void 0:t.top)&&n>1)for(let e=0;e<a;e+=1)c(e,0,e,1);if((null==t?void 0:t.bottom)&&n>1)for(let e=0;e<a;e+=1)c(e,n-1,e,n-2);return r.putImageData(s,0,0),o.toDataURL("image/png")}(s,n),"jpeg"===i.format.format&&(s=await async function(e,t,i){const a=await we(e),{width:n,height:o}=Me(a),r=document.createElement("canvas");r.width=n,r.height=o;const s=r.getContext("2d");if(!s)throw new Error("2D canvas context is unavailable");return s.fillStyle=xe(t),s.fillRect(0,0,n,o),s.drawImage(a,0,0,n,o),r.toDataURL("image/jpeg",i)}(s,e.options.backgroundColor,i.format.quality))),s}finally{!function(e,t){for(const i of t)try{i.mask.labelObject=i.label,"function"==typeof i.label.set?i.label.set({visible:i.visible}):i.label.visible=i.visible,i.wasOnCanvas&&!Ce(e,i.label)&&(e.add(i.label),e.bringObjectToFront(i.label))}catch{}}(e.canvas,a),function(e,t){if(t)try{const i=e;"function"==typeof i.setActiveObject&&i.setActiveObject(t)}catch{}}(e.canvas,i),function(e){try{"function"==typeof e.requestRenderAll?e.requestRenderAll():e.renderAll()}catch{}}(e.canvas)}}async function Le(e,t){var i;if(!e.isImageLoaded())throw Oe("exportImageFile"),new H("exportImageFile");const a=null!=t?t:{},n=null!==(i=a.fileName)&&void 0!==i?i:e.options.defaultDownloadFileName,o=re(a,e.options.downsampleQuality),r=await Ee(e,{exportArea:a.exportArea,mergeMask:a.mergeMask,multiplier:a.multiplier,quality:a.quality,fileType:a.fileType});if(!r)throw new H("exportImageFile");const s=await async function(e,t,i){if(e.startsWith(`data:${t.mimeType}`))return e;const a=await we(e),{width:n,height:o}=Me(a),r=document.createElement("canvas");r.width=n,r.height=o;const s=r.getContext("2d");if(!s)throw new Error("Unable to acquire 2D context for export conversion");return"jpeg"===t.format&&(s.fillStyle=xe(i),s.fillRect(0,0,n,o)),s.drawImage(a,0,0,n,o),r.toDataURL(t.mimeType,t.quality)}(r,o,e.options.backgroundColor);let l;try{l=function(e){var t;const i=/^data:image\/[a-z0-9.+-]+;base64,([A-Za-z0-9+/=\s]+)$/i.exec(e);if(!i||!(null===(t=i[1])||void 0===t?void 0:t.trim()))throw new Error("exportImageFile received a malformed or empty image data URL.");const a=e.indexOf(","),n=e.slice(a+1).replace(/\s/g,"");if("function"==typeof globalThis.atob){const e=globalThis.atob(n),t=new ArrayBuffer(e.length),i=new Uint8Array(t);for(let t=e.length-1;t>=0;t-=1)i[t]=e.charCodeAt(t);return i}const o=globalThis.Buffer;if(o&&"function"==typeof o.from){const e=o.from(n,"base64"),t=new ArrayBuffer(e.length),i=new Uint8Array(t);return i.set(e),i}throw new Error("No base64 decoder is available for exportImageFile.")}(s)}catch(e){throw new U("exportImageFile failed to decode rendered data URL.",e)}return new File([l],n,{type:o.mimeType})}function Be(e,t,i){return new Promise((a,n)=>{const o=Date.now(),r=setTimeout(()=>{n(new R(i,Date.now()-o))},t);e.then(e=>{clearTimeout(r),a(e)},e=>{clearTimeout(r),n(e)})})}function je(e){return e.fitImageToCanvas?"fit":e.coverImageToCanvas?"cover":"expand"}class Ae{constructor(){Object.defineProperty(this,"lastVisible",{enumerable:!0,configurable:!0,writable:!0,value:null})}measure(e,t,i){var a;if(!e)return t;const n=Math.floor(e.clientWidth),o=Math.floor(e.clientHeight);return n>0&&o>0?(this.lastVisible=function(e,t,i){if(!e)return t;const a=Math.floor(e.clientWidth||0),n=Math.floor(e.clientHeight||0);if(a<=0||n<=0)return t;const o=function(e){var t,i;const a=e.style;let n="",o="",r="";const s=null!==(i=null===(t=e.ownerDocument)||void 0===t?void 0:t.defaultView)&&void 0!==i?i:"undefined"==typeof window?null:window;if("function"==typeof(null==s?void 0:s.getComputedStyle)){const t=s.getComputedStyle(e);n=t.overflow,o=t.overflowX,r=t.overflowY}const l=[Te(null==a?void 0:a.overflow),Te(null==a?void 0:a.overflowX),Te(n),Te(o)],c=[Te(null==a?void 0:a.overflow),Te(null==a?void 0:a.overflowY),Te(n),Te(r)];return{x:l,y:c,all:[...l,...c]}}(e);if(o.all.includes("scroll"))return{width:a,height:n};const r=Pe(i),s=o.x.some(Fe),l=o.y.some(Fe),c=Math.ceil(e.scrollWidth||0),u=Math.ceil(e.scrollHeight||0),h=s&&c>a+Ne;return{width:a+(l&&u>n+Ne?r.width:0),height:n+(h?r.height:0)}}(e,t,i),this.lastVisible):null!==(a=this.lastVisible)&&void 0!==a?a:t}peek(){return this.lastVisible}clear(){this.lastVisible=null}}const Ne=.5;function Te(e){return String(null!=e?e:"").trim().toLowerCase()}function Fe(e){return"auto"===e||"overlay"===e}function Re(e){const t=null!=e?e:"undefined"==typeof document?null:document;if(!(null==t?void 0:t.body))return{width:0,height:0};const i=t.createElement("div");i.style.position="absolute",i.style.left="-9999px",i.style.top="-9999px",i.style.width="100px",i.style.height="100px",i.style.overflow="scroll",i.style.visibility="hidden",i.style.pointerEvents="none",t.body.appendChild(i);const a=Math.max(0,i.offsetWidth-i.clientWidth),n=Math.max(0,i.offsetHeight-i.clientHeight);return i.remove(),{width:a,height:n}}function Pe(e){return{width:Math.max(0,Number(null==e?void 0:e.width)||0),height:Math.max(0,Number(null==e?void 0:e.height)||0)}}function De(e,t,i,a){const n=Math.max(1,i.width||1),o=Math.max(1,i.height||1),r=Pe(a);let s=!1,l=!1;for(let i=0;i<4;i+=1){const i=Math.max(1,n-(l?r.width:0)),a=Math.max(1,o-(s?r.height:0)),c=e>i+Ne,u=t>a+Ne;if(c===s&&u===l)break;s=c,l=u}const c=Math.max(1,n-(l?r.width:0)),u=Math.max(1,o-(s?r.height:0));return{width:s?Math.ceil(e):c,height:l?Math.ceil(t):u}}function We(e,t,i,a){const n=Math.max(1,Math.round(Number(t)||1)),o=Math.max(1,Math.round(Number(i)||1));var r;e.setDimensions({width:n,height:o}),(r=a)&&r.offsetWidth}function He(e,t,i,a){if(!(Ue(e)&&Ue(t)&&Ue(i)&&Ue(a)))return{width:Math.max(1,Math.round(e)||1),height:Math.max(1,Math.round(t)||1),needsResize:!1};if(!(e>i||t>a))return{width:e,height:t,needsResize:!1};const n=Math.min(i/e,a/t);return{width:Math.max(1,Math.round(e*n)),height:Math.max(1,Math.round(t*n)),needsResize:!0}}function Ue(e){return Number.isFinite(e)&&e>0}function ze(e){const t=/^data:(image\/[a-z0-9+\-.]+)\s*;/i.exec(e);return t?t[1].toLowerCase():null}async function Qe(e,t,n={}){if("string"!=typeof t||!t.startsWith("data:image/"))return;const o={placeholderHidden:e.placeholderElement?!!e.placeholderElement.hidden:null,containerScrollTop:e.containerElement?e.containerElement.scrollTop:null,containerScrollLeft:e.containerElement?e.containerElement.scrollLeft:null,containerOverflow:e.containerElement?e.containerElement.style.overflow:null,originalImage:e.getOriginalImage(),isImageLoadedToCanvas:e.getIsImageLoadedToCanvas(),lastSnapshot:e.getLastSnapshot(),canvasJson:Ge(e.canvas),maskCounter:e.getMaskCounter(),currentScale:e.getCurrentScale(),currentRotation:e.getCurrentRotation(),baseImageScale:e.getBaseImageScale(),currentImageMimeType:e.getCurrentImageMimeType()};try{e.setPlaceholderVisible(!1);const a=function(e){const t=new Image,i=(e=!1)=>{"function"==typeof t.removeEventListener?(t.removeEventListener("load",a),t.removeEventListener("error",n)):(t.onload=null,t.onerror=null),e&&(t.src="")},a=()=>{if(!function(e){return Number.isFinite(e.naturalWidth)&&Number.isFinite(e.naturalHeight)&&e.naturalWidth>0&&e.naturalHeight>0}(t))return i(!0),void r(new F("Failed to decode image data URL: image has no natural dimensions.",null));i(!1),o(t)},n=e=>{i(!0),r(new F("Failed to decode image data URL.",e))};let o,r;const s=new Promise((i,s)=>{o=i,r=s,"function"==typeof t.addEventListener?(t.addEventListener("load",a,{once:!0}),t.addEventListener("error",n,{once:!0})):(t.onload=a,t.onerror=n),t.src=e});return{promise:s,cleanup:i}}(t);let r;try{r=await Be(a.promise,e.options.imageLoadTimeoutMs,"image decode")}catch(e){throw a.cleanup(!0),e}const s=function(e,t,a){const n=qe(ze(t));if(!a.downsampleOnLoad)return{dataUrl:t,mimeType:n};if(!$e(a.downsampleMaxWidth)||!$e(a.downsampleMaxHeight))return i(a,null,"loadImage skipped downsampling because downsample bounds are invalid."),{dataUrl:t,mimeType:n};const o=He(e.naturalWidth,e.naturalHeight,a.downsampleMaxWidth,a.downsampleMaxHeight);if(!o.needsResize)return{dataUrl:t,mimeType:n};const r=ze(t),s=function(e,t,i,a,n,o,r){const{width:s,height:l}=He(e.naturalWidth,e.naturalHeight,t,i),c=function(e,t,i){return i||(!t||"image/png"!==e&&"image/webp"!==e?"image/jpeg":e)}(a,n,o),u=document.createElement("canvas");u.width=s,u.height=l;const h=u.getContext("2d");if(!h)throw new P("Failed to obtain a 2D context for downsampling.");return h.drawImage(e,0,0,e.naturalWidth,e.naturalHeight,0,0,s,l),{dataUrl:"image/png"===c?u.toDataURL(c):u.toDataURL(c,r),width:s,height:l,mimeType:c}}(e,a.downsampleMaxWidth,a.downsampleMaxHeight,r,a.preserveSourceFormat,a.downsampleMimeType,a.downsampleQuality),l=qe(ze(s.dataUrl));return{dataUrl:s.dataUrl,mimeType:null!=l?l:s.mimeType}}(r,t,e.options),l=await Be(e.fabric.FabricImage.fromURL(s.dataUrl,{crossOrigin:"anonymous"}),e.options.imageLoadTimeoutMs,"FabricImage.fromURL");e.canvas.discardActiveObject(),e.canvas.clear(),e.canvas.backgroundColor=e.options.backgroundColor,l.set({originX:"left",originY:"top",selectable:!1,evented:!1});const c=function(e,t){var i,a,n,o;const r=null!==(i=t.width)&&void 0!==i?i:0,s=null!==(a=t.height)&&void 0!==a?a:0,l=Re(null!==(o=null===(n=e.containerElement)||void 0===n?void 0:n.ownerDocument)&&void 0!==o?o:null),c=e.viewportCache.measure(e.containerElement,{width:e.options.canvasWidth,height:e.options.canvasHeight},l),u=je(e.options);if("fit"===u)return function(e,t,i,a,n){const o=Math.max(1,(n.width||i)-1),r=Math.max(1,(n.height||a)-1),s=Math.min(o/e,r/t,1);return{canvasWidth:o,canvasHeight:r,imageScale:s,imageLeft:0,imageTop:0,baseImageScale:s}}(r,s,e.options.canvasWidth,e.options.canvasHeight,c);if("cover"===u)return function(e,t,i,a,n,o){const r=n.width||i,s=n.height||a,l=Pe(o);let c=!1,u=!1,h=1,d=e,m=t;for(let i=0;i<4;i+=1){const i=Math.max(1,r-(u?l.width:0)),a=Math.max(1,s-(c?l.height:0));h=Math.min(1,Math.max(i/e,a/t)),d=e*h,m=t*h;const n=d>i+Ne,o=m>a+Ne;if(n===c&&o===u)break;c=n,u=o}const g=De(d,m,{width:r,height:s},l);return{canvasWidth:g.width,canvasHeight:g.height,imageScale:h,imageLeft:0,imageTop:0,baseImageScale:h}}(r,s,e.options.canvasWidth,e.options.canvasHeight,c,l);return function(e,t,i,a,n){return{canvasWidth:Math.max(n.width,Math.floor(e)),canvasHeight:Math.max(n.height,Math.floor(t)),imageScale:1,imageLeft:0,imageTop:0,baseImageScale:1}}(r,s,e.options.canvasWidth,e.options.canvasHeight,c)}(e,l);if(We(e.canvas,c.canvasWidth,c.canvasHeight,e.containerElement),l.set({left:c.imageLeft,top:c.imageTop}),l.scale(c.imageScale),e.canvas.add(l),e.canvas.sendObjectToBack(l),e.setOriginalImage(l),e.setBaseImageScale(c.baseImageScale),e.setCurrentScale(1),e.setCurrentRotation(0),e.setMaskCounter(0),e.setIsImageLoadedToCanvas(!0),e.setCurrentImageMimeType(s.mimeType),e.canvas.renderAll(),e.setLastSnapshot(E({canvas:e.canvas,currentScale:1,currentRotation:0,baseImageScale:c.baseImageScale,currentImageMimeType:s.mimeType})),!0===n.preserveScroll&&e.containerElement)try{null!==o.containerScrollTop&&(e.containerElement.scrollTop=o.containerScrollTop),null!==o.containerScrollLeft&&(e.containerElement.scrollLeft=o.containerScrollLeft)}catch(e){console.warn("[ImageEditor] preserveScroll restore failed",e)}}catch(t){await async function(e,t){if(e.containerElement&&null!==t.containerOverflow)try{e.containerElement.style.overflow=t.containerOverflow}catch(e){console.warn("[ImageEditor] rollback: overflow restore failed",e)}try{await e.canvas.loadFromJSON(JSON.parse(t.canvasJson)),e.canvas.renderAll()}catch(e){console.warn("[ImageEditor] rollback: loadFromJSON failed",e)}if(e.setOriginalImage(t.originalImage),e.setIsImageLoadedToCanvas(t.isImageLoadedToCanvas),e.setLastSnapshot(t.lastSnapshot),e.setMaskCounter(t.maskCounter),e.setCurrentScale(t.currentScale),e.setCurrentRotation(t.currentRotation),e.setBaseImageScale(t.baseImageScale),e.setCurrentImageMimeType(t.currentImageMimeType),e.containerElement)try{null!==t.containerScrollTop&&(e.containerElement.scrollTop=t.containerScrollTop),null!==t.containerScrollLeft&&(e.containerElement.scrollLeft=t.containerScrollLeft)}catch(e){console.warn("[ImageEditor] rollback: scroll restore failed",e)}null!==t.placeholderHidden&&e.setPlaceholderVisible(!t.placeholderHidden)}(e,o);const i=t instanceof Error?`loadImage failed: ${t.message}`:"loadImage failed";throw a(e.options,t,i),t}}function $e(e){return Number.isFinite(e)&&e>0}function qe(e){return"image/jpeg"===e||"image/png"===e||"image/webp"===e?e:null}function Ge(e){e.discardActiveObject();const t=e.toJSON(O);return JSON.stringify(t)}function Ye(e,t,i,a){return new Promise((n,o)=>{const r=Object.keys(t).length;if(0===r)return void n();let s=0;try{e.animate(t,{duration:i.duration,onChange:()=>{var e;a.isDisposed()||null===(e=i.onChange)||void 0===e||e.call(i)},onComplete:()=>{++s>=r&&n()}})}catch(e){o(e)}})}class Xe{constructor(e){Object.defineProperty(this,"context",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.context=e}async scaleImage(e){if(!Number.isFinite(e))return;const t=this.context.getOriginalImage();if(!t)return;if(this.context.guard.isAnimating())return;if(this.context.guard.isDisposed())return;const i=Math.max(this.context.options.minScale,Math.min(this.context.options.maxScale,e));this.context.setCurrentScale(i);const a=this.context.getBaseImageScale()*i;try{const e=_e(t);t.set({originX:"left",originY:"top"}),t.setPositionByOrigin(e,"left","top"),t.setCoords()}catch(e){console.warn("[ImageEditor] scaleImage: origin pre-anchor failed",e)}try{await this.context.guard.runAnimation(()=>Ye(t,{scaleX:a,scaleY:a},{duration:this.context.options.animationDuration,onChange:()=>this.context.canvas.requestRenderAll()},this.context.guard))}catch(e){return void console.warn("[ImageEditor] scaleImage animation error",e)}this.context.guard.isDisposed()||(t.set({scaleX:a,scaleY:a}),t.setCoords(),this.context.afterTransformSnap&&this.context.afterTransformSnap(),this.context.saveCanvasState())}async rotateImage(e){if(!Number.isFinite(e))return;const t=this.context.getOriginalImage();if(!t)return;if(this.context.guard.isAnimating())return;if(this.context.guard.isDisposed())return;this.context.setCurrentRotation(e);try{const e=t.getCenterPoint();t.set({originX:"center",originY:"center"}),t.setPositionByOrigin(e,"center","center"),t.setCoords()}catch(e){console.warn("[ImageEditor] rotateImage: origin pre-anchor failed",e)}let i=!1;try{await this.context.guard.runAnimation(()=>Ye(t,{angle:e},{duration:this.context.options.animationDuration,onChange:()=>this.context.canvas.requestRenderAll()},this.context.guard))}catch(e){i=!0,console.warn("[ImageEditor] rotateImage animation error",e)}finally{this.context.guard.isDisposed()&&function(e,t,i){try{e.set({originX:t,originY:i}),e.setCoords()}catch{}}(t,"left","top")}if(!i&&!this.context.guard.isDisposed()){t.set("angle",e),t.setCoords(),this.context.afterTransformSnap&&this.context.afterTransformSnap();try{const e=_e(t);t.set({originX:"left",originY:"top"}),t.setPositionByOrigin(e,"left","top"),t.setCoords()}catch(e){console.warn("[ImageEditor] rotateImage: origin post-restore failed",e)}this.context.saveCanvasState()}}async resetImageTransform(){if(this.context.getOriginalImage()){this.context.setSuppressSaveState(!0);try{await this.scaleImage(1),await this.rotateImage(0)}finally{this.context.setSuppressSaveState(!1)}this.context.guard.isDisposed()||this.context.saveCanvasState()}}}function _e(e){e.setCoords();const t=e.getCoords()[0];if(t)return t;const i=e.getBoundingRect();return{x:i.left,y:i.top}}function Ve(e,t,i,a,n){if("number"==typeof e)return e;if("function"==typeof e)return e(a,n);if("string"==typeof e&&e.endsWith("%")){const n=parseFloat(e);if(!Number.isFinite(n))return i;const o="x"===t?a.getWidth():a.getHeight();return Math.floor(o*(n/100))}return i}function Je(e){return Array.isArray(e)?{x:Number(e[0]),y:Number(e[1])}:{x:Number(e.x),y:Number(e.y)}}let Ke=0;function Ze(e,t){i(e,null,`createMask skipped: ${t}.`)}function et(e){return void 0===e||("number"==typeof e?Number.isFinite(e):"function"==typeof e||!("string"!=typeof e||!e.endsWith("%"))&&Number.isFinite(Number.parseFloat(e)))}function tt(e){return"number"==typeof e&&Number.isFinite(e)}function it(e,t,i){return!!tt(i)||(Ze(e,`${t} must resolve to a finite number`),!1)}function at(e,t,i){return!!(tt(i)&&i>0)||(Ze(e,`${t} must resolve to a positive number`),!1)}function nt(e,t,i){return!!(tt(i)&&i>=0)||(Ze(e,`${t} must resolve to a non-negative number`),!1)}function ot(e,t){if(!Array.isArray(t)||t.length<3)return Ze(e,"polygon masks require at least three points"),null;const i=t.map(Je);return i.every(e=>Number.isFinite(e.x)&&Number.isFinite(e.y))?function(e){let t=0;for(let i=0;i<e.length;i+=1){const a=e[i],n=e[(i+1)%e.length];t+=a.x*n.y-n.x*a.y}return Math.abs(t)/2}(i)<=1e-6?(Ze(e,"polygon points must describe a non-zero area"),null):i:(Ze(e,"polygon points must contain finite x/y values"),null)}function rt(e,t={}){var a,n,o,r,s,l,c,u,h,d,m,g,p,f,b,v;const{canvas:y,options:I,fabric:C}=e;if(!y)return null;const k=null!==(a=t.shape)&&void 0!==a?a:"rect";if(!function(e,t){const i=[["width",t.width],["height",t.height],["rx",t.rx],["ry",t.ry],["radius",t.radius],["left",t.left],["top",t.top]];for(const[t,a]of i)if(!et(a))return Ze(e,`${t} is not a supported numeric value`),!1;return!0}(I,t))return null;const M={shape:k,width:I.defaultMaskWidth,height:I.defaultMaskHeight,color:"rgba(0,0,0,0.5)",alpha:.5,gap:5,left:void 0,top:void 0,angle:0,selectable:!0,...t};let w,x;const S=e.getLastMask();if(void 0===t.left&&S){const e=(null!==(n=S.left)&&void 0!==n?n:0)+("function"==typeof S.getScaledWidth?S.getScaledWidth():(null!==(o=S.width)&&void 0!==o?o:0)*(null!==(r=S.scaleX)&&void 0!==r?r:1));w=Math.round(e+(null!==(s=M.gap)&&void 0!==s?s:5)),x=null!==(l=S.top)&&void 0!==l?l:10}else w=Ve(t.left,"x",10,y,I),x=Ve(t.top,"y",10,y,I);M.width=Ve(t.width,"x",I.defaultMaskWidth,y,I),M.height=Ve(t.height,"y",I.defaultMaskHeight,y,I);const O=void 0!==t.rx?Ve(t.rx,"x",0,y,I):void 0,E=void 0!==t.ry?Ve(t.ry,"y",0,y,I):void 0,L="circle"===k?Ve(t.radius,"x",Math.min(M.width,M.height)/2,y,I):void 0,B="polygon"===k?ot(I,t.points):null;if(!(it(I,"left",w)&&it(I,"top",x)&&at(I,"width",M.width)&&at(I,"height",M.height)&&it(I,"gap",M.gap)&&it(I,"angle",M.angle)&&it(I,"alpha",M.alpha)))return null;if(void 0!==O&&!nt(I,"rx",O)||void 0!==E&&!nt(I,"ry",E)||void 0!==L&&!at(I,"radius",L)||"polygon"===k&&null===B)return null;if(I.expandCanvasToImage){const t=Math.ceil(w+M.width+10),i=Math.ceil(x+M.height+10),a=Math.max(y.getWidth(),t),n=Math.max(y.getHeight(),i);a===y.getWidth()&&n===y.getHeight()||(e.expandCanvasIfNeeded?e.expandCanvasIfNeeded(a,n):y.setDimensions({width:a,height:n}))}let j;if("function"==typeof M.fabricGenerator){const e=M.fabricGenerator(M,y,I);if(!function(e){if(!e||"object"!=typeof e)return!1;const t=e;return"function"==typeof t.set&&"function"==typeof t.on}(e))return i(I,e,"createMask skipped: fabricGenerator did not return a Fabric object."),null;j=e}else{const e={originX:"left",originY:"top"};switch(k){case"circle":j=new C.Circle({left:w,top:x,...e,radius:L,fill:M.color,opacity:M.alpha,angle:null!==(c=M.angle)&&void 0!==c?c:0,...M.styles});break;case"ellipse":j=new C.Ellipse({left:w,top:x,...e,rx:null!=O?O:M.width/2,ry:null!=E?E:M.height/2,fill:M.color,opacity:M.alpha,angle:null!==(u=M.angle)&&void 0!==u?u:0,...M.styles});break;case"polygon":{const t=new C.Polygon(B,{...e,fill:M.color,opacity:M.alpha,angle:null!==(h=M.angle)&&void 0!==h?h:0,...M.styles});t.setCoords();const i=t.getBoundingRect(),a=w-i.left,n=x-i.top;t.set({left:(null!==(d=t.left)&&void 0!==d?d:0)+a,top:(null!==(m=t.top)&&void 0!==m?m:0)+n}),t.setCoords(),j=t;break}default:j=new C.Rect({left:w,top:x,...e,width:M.width,height:M.height,fill:M.color,opacity:M.alpha,angle:null!==(g=M.angle)&&void 0!==g?g:0,...void 0!==O?{rx:O}:{},...void 0!==E?{ry:E}:{},...M.styles})}}const A=j;A.selectable=!("selectable"in t)||!!t.selectable,A.evented=!("evented"in t)||!!t.evented,A.hasControls=!("hasControls"in t)||!!t.hasControls,A.transparentCorners="transparentCorners"in t&&!!t.transparentCorners,A.strokeUniform=!("strokeUniform"in t)||!!t.strokeUniform,A.lockRotation=!I.maskRotatable,A.borderColor=null!==(p=t.borderColor)&&void 0!==p?p:"red",A.cornerColor=null!==(f=t.cornerColor)&&void 0!==f?f:"black",A.cornerSize=null!==(b=t.cornerSize)&&void 0!==b?b:8;const N=null!==(v=M.styles)&&void 0!==v?v:{};A.stroke="stroke"in N?N.stroke:"#ccc",A.strokeWidth="strokeWidth"in N?N.strokeWidth:1,"strokeDashArray"in N&&(A.strokeDashArray=N.strokeDashArray),A.originalAlpha=M.alpha,A.originalStroke=A.stroke,A.originalStrokeWidth=A.strokeWidth,$(A);const T=e.getMaskCounter()+1;if(e.setMaskCounter(T),A.maskId=T,A.maskUid=(Ke+=1,`mask-${T}-${Ke}`),A.maskName=`${I.maskName}${T}`,e.setLastMask(A),y.add(A),y.bringObjectToFront(A),e.updateMaskList(),!1!==M.selectable&&y.setActiveObject(A),y.renderAll(),e.saveCanvasState(),"function"==typeof M.onCreate)try{M.onCreate(A,y)}catch(e){i(I,e,"createMask onCreate callback threw.")}return A}function st(e,t={}){const i=e.canvas.getObjects().filter(S);if(0!==i.length){for(const t of i)e.removeLabelForMask(t),G(t),e.canvas.remove(t);e.canvas.discardActiveObject(),e.setLastMask(null),e.updateMaskList(),e.canvas.renderAll(),!1!==t.saveHistory&&e.saveCanvasState()}}function lt(e,t){if(e.canvas&&t.labelObject){try{e.canvas.getObjects().includes(t.labelObject)&&e.canvas.remove(t.labelObject)}catch{}try{delete t.labelObject}catch{}}}function ct(e,t){var a;const{canvas:n,options:o,fabric:r}=e;if(!n||!o.maskLabelOnSelect)return;lt(e,t);let s=null;if("function"==typeof o.label.create)try{s=o.label.create(t,r)}catch(e){i(o,e,"label.create callback threw."),s=null}if(!s){const e=t.maskId-1;let n=t.maskName;if("function"==typeof o.label.getText)try{n=o.label.getText(t,e)}catch(e){i(o,e,"label.getText callback threw."),n=t.maskName}const l={left:0,top:0,...null!==(a=o.label.textOptions)&&void 0!==a?a:{},originX:"left",originY:"top"};s=new r.FabricText(n,l)}s.maskLabel=!0,t.labelObject=s,n.add(s),n.bringObjectToFront(s),ut(e,t)}function ut(e,t){var i,a,n;const{canvas:o,options:r}=e;if(!o||!r.maskLabelOnSelect||!t.labelObject)return;const s=null===(i=t.getCoords)||void 0===i?void 0:i.call(t);if(!(null==s?void 0:s.length))return;const l=s[0];if(!l)return;const c=t.getCenterPoint(),u=c.x-l.x,h=c.y-l.y,d=Math.sqrt(u*u+h*h)||1,m=Math.max(0,null!==(a=r.maskLabelOffset)&&void 0!==a?a:3);t.labelObject.set({left:Math.round(l.x+u/d*m),top:Math.round(l.y+h/d*m),angle:null!==(n=t.angle)&&void 0!==n?n:0,originX:"left",originY:"top",visible:!0}),t.labelObject.setCoords(),o.renderAll()}class ht{constructor(e,t){Object.defineProperty(this,"registry",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"resolveElementId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isDisposed",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.resolveElementId=e,this.isDisposed=t}bindIfExists(e,t,i){const a=this.resolveElementId(e);if(!a)return!1;const n=document.getElementById(a);if(!n)return!1;const o=e=>{this.isDisposed()||i(e)};return n.addEventListener(t,o),this.registry.push({elementKey:e,eventType:t,handler:o}),!0}removeAll(){for(const e of this.registry){const t=this.resolveElementId(e.elementKey);if(!t)continue;const i=document.getElementById(t);if(i)try{i.removeEventListener(e.eventType,e.handler)}catch{}}this.registry=[]}size(){return this.registry.length}}function dt(e,t,i){e&&(e.hidden=!i,e.setAttribute("aria-hidden",i?"false":"true")),t&&(t.hidden=i,t.setAttribute("aria-hidden",i?"true":"false"))}const mt={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",webp:"image/webp",gif:"image/gif",bmp:"image/bmp"},gt=new Set(Object.values(mt));function pt(e){if(e)try{e.value=""}catch{}}const ft=.5,bt=Symbol.for("ImageEditorInternalOperation"),vt=Symbol.for("ImageEditorAllowDuringAnimationQueue"),yt=["scalePercentageInput","rotateLeftDegreesInput","rotateRightDegreesInput","rotateLeftButton","rotateRightButton","createMaskButton","removeSelectedMaskButton","removeAllMasksButton","mergeMasksButton","downloadImageButton","zoomInButton","zoomOutButton","resetImageTransformButton","undoButton","redoButton","imageInput","enterCropModeButton","applyCropButton","cancelCropButton"],It=["applyCropButton","cancelCropButton"],Ct=new Set(["applyCrop","cancelCrop"]);class kt{constructor(e={},a={}){var n;Object.defineProperty(this,"fabricModule",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isFabricLoaded",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"canvas",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"canvasElement",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"containerElement",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"placeholderElement",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"elements",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"elementOriginalDisabledMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"elementOriginalAriaDisabledMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"elementOriginalPointerEventsMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"originalImage",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"baseImageScale",{enumerable:!0,configurable:!0,writable:!0,value:1}),Object.defineProperty(this,"currentScale",{enumerable:!0,configurable:!0,writable:!0,value:1}),Object.defineProperty(this,"currentRotation",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"isImageLoadedToCanvas",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"currentImageMimeType",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"maskCounter",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"lastMask",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"lastSnapshot",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"historyManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"operationGuard",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"animQueue",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"transformController",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"viewportCache",{enumerable:!0,configurable:!0,writable:!0,value:new Ae}),Object.defineProperty(this,"cropSession",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"domBindings",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"isDisposed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"shouldSuppressSaveState",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"lastEmittedIsBusy",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"activeStateRestoreOperation",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"nextSelectionChangeContext",{enumerable:!0,configurable:!0,writable:!0,value:null});const o=function(e,t,i=globalThis){var a;if(N(e))return{fabric:e,isFabricLoaded:!0,options:null!=t?t:{}};const n=null!==(a=e)&&void 0!==a?a:{},o=function(e){return e.fabric}(i);return N(o)?{fabric:o,isFabricLoaded:!0,options:n}:(console.error("[ImageEditor] fabric.js v7 is not available. Pass it as the first constructor argument (ESM) or load it as a global <script> before instantiation."),{fabric:null,isFabricLoaded:!1,options:n})}(e,a);this.fabricModule=null!==(n=o.fabric)&&void 0!==n?n:{},this.isFabricLoaded=o.isFabricLoaded,this.options=w(o.options);const r=function(e){if(!e.fitImageToCanvas||!e.coverImageToCanvas)return null;const t=["fit","cover"];e.expandCanvasToImage&&t.push("expand");const i=je(e);return{enabled:t,selected:i,message:`Layout flags ${t.map(e=>`\`${e}\``).join(", ")} are enabled simultaneously. Using precedence \`fit > cover > expand\`; selected \`${i}\`.`}}(this.options);r&&i(this.options,null,r.message),this.operationGuard=new x,this.animQueue=new t,this.historyManager=new A(this.options.maxHistorySize)}init(e={}){if(!this.isFabricLoaded){const e=globalThis.fabric;if(!e||"function"!=typeof e.Canvas)return;this.fabricModule=e,this.isFabricLoaded=!0}if(this.isDisposed)return;this.elements={canvas:"canvas",canvasContainer:null,imagePlaceholder:"imagePlaceholder",scalePercentageInput:"scalePercentageInput",rotateLeftDegreesInput:"rotateLeftDegreesInput",rotateRightDegreesInput:"rotateRightDegreesInput",rotateLeftButton:"rotateLeftButton",rotateRightButton:"rotateRightButton",createMaskButton:"createMaskButton",removeSelectedMaskButton:"removeSelectedMaskButton",removeAllMasksButton:"removeAllMasksButton",mergeMasksButton:"mergeMasksButton",downloadImageButton:"downloadImageButton",maskList:"maskList",zoomInButton:"zoomInButton",zoomOutButton:"zoomOutButton",resetImageTransformButton:"resetImageTransformButton",undoButton:"undoButton",redoButton:"redoButton",imageInput:"imageInput",enterCropModeButton:"enterCropModeButton",applyCropButton:"applyCropButton",cancelCropButton:"cancelCropButton",uploadArea:"uploadArea",...e},this.domBindings=new ht(e=>this.elements[e],()=>this.isDisposed),this.initCanvas(),this.transformController=new Xe(this.buildTransformContext()),this.bindDomEvents(),this.updateInputs(),this.updateMaskList(),this.updateUi(),this.options.initialImageBase64?this.loadImage(this.options.initialImageBase64).catch(()=>{}):this.updatePlaceholderStatus()}initCanvas(){var e;const t=this.elements.canvas,i=t?document.getElementById(t):null;if(!i)throw new Error(`[ImageEditor] Canvas element not found: "${t}"`);this.canvasElement=i;const a=this.elements.canvasContainer;this.containerElement=a&&null!==(e=document.getElementById(a))&&void 0!==e?e:i.parentElement;const n=this.elements.imagePlaceholder;this.placeholderElement=n?document.getElementById(n):null;let o=this.options.canvasWidth,r=this.options.canvasHeight;if(this.containerElement){const e=Math.floor(this.containerElement.clientWidth),t=Math.floor(this.containerElement.clientHeight);e>0&&t>0&&(o=e,r=t)}this.canvas=new this.fabricModule.Canvas(i,{width:o,height:r,backgroundColor:this.options.backgroundColor,selection:this.options.groupSelection,preserveObjectStacking:!0}),this.canvas.on("selection:created",e=>{this.handleSelectionChanged(e.selected)}),this.canvas.on("selection:updated",e=>{this.handleSelectionChanged(e.selected)}),this.canvas.on("selection:cleared",()=>this.handleSelectionChanged([]));const s=e=>{e.target&&S(e.target)&&this.syncMaskLabel(e.target)};this.canvas.on("object:moving",s),this.canvas.on("object:scaling",s),this.canvas.on("object:rotating",s),this.canvas.on("object:modified",e=>{e.target&&S(e.target)&&(this.syncMaskLabel(e.target),this.saveState())})}bindDomEvents(){this.bindElementIfExists("uploadArea","click",()=>{var e;const t=this.elements.imageInput;t&&(null===(e=document.getElementById(t))||void 0===e||e.click())}),this.bindElementIfExists("imageInput","change",e=>{var t;const i=null===(t=e.target.files)||void 0===t?void 0:t[0];i&&this.loadImageFile(i)}),this.bindElementIfExists("zoomInButton","click",()=>{this.scaleImage(this.currentScale+this.options.scaleStep)}),this.bindElementIfExists("zoomOutButton","click",()=>{this.scaleImage(this.currentScale-this.options.scaleStep)}),this.bindElementIfExists("resetImageTransformButton","click",()=>{this.resetImageTransform()}),this.bindElementIfExists("createMaskButton","click",()=>{this.createMask()}),this.bindElementIfExists("removeSelectedMaskButton","click",()=>{this.removeSelectedMask()}),this.bindElementIfExists("removeAllMasksButton","click",()=>{this.removeAllMasks()}),this.bindElementIfExists("mergeMasksButton","click",()=>{this.mergeMasks()}),this.bindElementIfExists("downloadImageButton","click",()=>{this.downloadImage()}),this.bindElementIfExists("undoButton","click",()=>{this.undo()}),this.bindElementIfExists("redoButton","click",()=>{this.redo()}),this.bindElementIfExists("rotateLeftButton","click",()=>{const e=this.elements.rotateLeftDegreesInput,t=e?document.getElementById(e):null;let i=this.options.rotationStep;if(t){const e=parseFloat(t.value);isNaN(e)||(i=e)}this.rotateImage(this.currentRotation-i)}),this.bindElementIfExists("rotateRightButton","click",()=>{const e=this.elements.rotateRightDegreesInput,t=e?document.getElementById(e):null;let i=this.options.rotationStep;if(t){const e=parseFloat(t.value);isNaN(e)||(i=e)}this.rotateImage(this.currentRotation+i)}),this.bindElementIfExists("enterCropModeButton","click",()=>{this.enterCropMode()}),this.bindElementIfExists("applyCropButton","click",()=>{this.applyCrop().catch(e=>{a(this.options,e,"Crop apply failed.")})}),this.bindElementIfExists("cancelCropButton","click",()=>{this.cancelCrop()})}bindElementIfExists(e,t,i){var a;null===(a=this.domBindings)||void 0===a||a.bindIfExists(e,t,i)}async loadImageFile(e){const t=this.elements.imageInput,n=t?document.getElementById(t):null,o=function(e){var t,i;if(e.type&&gt.has(e.type))return e.type;if(e.type)return null;const a=/\.([a-z0-9]+)$/i.exec(e.name),n=null===(t=null==a?void 0:a[1])||void 0===t?void 0:t.toLowerCase();return n&&null!==(i=mt[n])&&void 0!==i?i:null}(e);if(!o)return i(this.options,null,`Unsupported image file type: ${e.type||e.name||"unknown"}.`),void pt(n);let r;try{r=await function(e){return new Promise((t,i)=>{const a=new FileReader;a.onload=()=>{const e=a.result;"string"==typeof e?t(e):i(new Error("FileReader returned a non-string result"))},a.onerror=()=>{var e;i(null!==(e=a.error)&&void 0!==e?e:new Error("FileReader error"))},a.onabort=()=>{i(new Error("FileReader read aborted"))},a.readAsDataURL(e)})}(e)}catch(e){return a(this.options,e,"Failed to read selected image file."),void pt(n)}try{await this.loadImage(r)}catch{}finally{pt(n)}}async loadImage(e,t={}){if(!this.isFabricLoaded||!this.canvas)return;if(this.isDisposed)return;if("string"!=typeof e||!e.startsWith("data:image/"))return;if(!this.canRunIdleOperation("loadImage",t))return;const i=this.getOperationContext("loadImage",t),a=this.originalImage,n=this.getMasks().length>0;this.emitOptionCallback("onImageLoadStart",[i]),this.operationGuard.beginLoading(),this.emitBusyChangeIfChanged(i),this.updateUi(),this.hideAllMaskLabels();const o={fabric:this.fabricModule,canvas:this.canvas,options:this.options,containerElement:this.containerElement,placeholderElement:this.placeholderElement,viewportCache:this.viewportCache,getOriginalImage:()=>this.originalImage,setOriginalImage:e=>{this.originalImage=e},getIsImageLoadedToCanvas:()=>this.isImageLoadedToCanvas,setIsImageLoadedToCanvas:e=>{this.isImageLoadedToCanvas=e},getLastSnapshot:()=>this.lastSnapshot,setLastSnapshot:e=>{this.lastSnapshot=e},getMaskCounter:()=>this.maskCounter,setMaskCounter:e=>{this.maskCounter=e},getCurrentScale:()=>this.currentScale,setCurrentScale:e=>{this.currentScale=e},getCurrentRotation:()=>this.currentRotation,setCurrentRotation:e=>{this.currentRotation=e},getBaseImageScale:()=>this.baseImageScale,setBaseImageScale:e=>{this.baseImageScale=e},getCurrentImageMimeType:()=>this.currentImageMimeType,setCurrentImageMimeType:e=>{this.currentImageMimeType=e},setPlaceholderVisible:e=>{dt(this.placeholderElement,this.containerElement,!!this.options.showPlaceholder&&e)}};try{await Qe(o,e,t)}finally{this.operationGuard.endLoading(),this.emitBusyChangeIfChanged(i),!this.isDisposed&&this.canvas&&this.updateUi()}this.lastMask=null,this.updateInputs(),this.updateMaskList(),this.updateUi(),a&&a!==this.originalImage&&this.emitOptionCallback("onImageCleared",[a,i]);const r=this.getImageInfo();r&&this.emitOptionCallback("onImageLoaded",[r,i]),n&&this.emitMasksChanged(i),this.emitImageChanged(i)}getInternalOperationToken(e){var t;return null!==(t=null==e?void 0:e[bt])&&void 0!==t?t:null}canRunDuringAnimationQueue(e){return!!(null==e?void 0:e[vt])}withInternalOperationOptions(e,t={}){return{...t,...e?{[bt]:e}:{}}}withAnimationQueueBypass(e={}){return{...e,[vt]:!0}}assertIdleForOperation(e,t){const i=this.getInternalOperationToken(t);if(this.operationGuard.assertIdleForOperation(e,i),this.cropSession&&!this.operationGuard.isOwnOperation(i)&&!Ct.has(e))throw new Error(`[ImageEditor] Cannot run "${e}" while crop mode is active.`);if(this.animQueue.isBusy()&&!this.canRunDuringAnimationQueue(t))throw new Error(`[ImageEditor] Cannot run "${e}" while an animation is queued.`)}canRunIdleOperation(e,t){try{return this.assertIdleForOperation(e,t),!0}catch{return!1}}assertCanQueueAnimation(e,t){this.operationGuard.assertCanQueueAnimation(e,this.getInternalOperationToken(t))}isImageLoaded(){var e,t;return!!(this.originalImage&&this.originalImage instanceof this.fabricModule.FabricImage&&(null!==(e=this.originalImage.width)&&void 0!==e?e:0)>0&&(null!==(t=this.originalImage.height)&&void 0!==t?t:0)>0)}isBusy(){return this.operationGuard.isBusy()||this.animQueue.isBusy()||null!==this.cropSession}setLayoutMode(e){"fit"===e||"cover"===e||"expand"===e?(this.options.fitImageToCanvas="fit"===e,this.options.coverImageToCanvas="cover"===e,this.options.expandCanvasToImage="expand"===e):i(this.options,new TypeError(`[ImageEditor] Unsupported layout mode ${JSON.stringify(e)}. Expected "fit", "cover", or "expand".`),"Ignored invalid layout mode.")}buildCallbackContext(e,t=!1){return{operation:e,isInternalOperation:t}}getOperationContext(e,t){const i=this.getInternalOperationToken(t),a=this.operationGuard.activeOperationName();return i&&a?this.buildCallbackContext(a,!0):this.buildCallbackContext(e,!1)}emitOptionCallback(e,t){const i=this.options[e];if("function"==typeof i)try{i(...t)}catch(t){console.error(`[ImageEditor] ${e} callback threw`,t)}}getImageInfo(){if(!this.canvas||!this.originalImage)return null;const e=this.canvas.getWidth(),t=this.canvas.getHeight();let i,a;try{this.originalImage.setCoords();const e=this.originalImage.getBoundingRect();i=Math.max(0,Number(e.width)||0),a=Math.max(0,Number(e.height)||0)}catch{i=Math.max(0,(Number(this.originalImage.width)||0)*Math.abs(Number(this.originalImage.scaleX)||1)),a=Math.max(0,(Number(this.originalImage.height)||0)*Math.abs(Number(this.originalImage.scaleY)||1))}return{width:Math.max(0,Number(this.originalImage.width)||0),height:Math.max(0,Number(this.originalImage.height)||0),displayWidth:i,displayHeight:a,scale:this.currentScale,rotation:this.currentRotation,canvasWidth:e,canvasHeight:t}}getMasks(){return this.canvas?this.canvas.getObjects().filter(S).slice():[]}getMaskCollectionSignature(){return this.getMasks().map(e=>`${e.maskId}:${e.maskName}`).join("|")}getEditorState(){const e=this.canvas?this.canvas.getWidth():0,t=this.canvas?this.canvas.getHeight():0,i=this.getImageInfo();return{hasImage:null!==i,image:i,maskCount:this.getMasks().length,currentScale:this.currentScale,currentRotation:this.currentRotation,isBusy:this.isBusy(),isCropMode:null!==this.cropSession,canUndo:this.historyManager.canUndo(),canRedo:this.historyManager.canRedo(),canvasWidth:e,canvasHeight:t}}emitImageChanged(e){this.emitOptionCallback("onImageChanged",[this.getEditorState(),e])}emitMasksChanged(e){this.emitOptionCallback("onMasksChanged",[this.getMasks(),e])}emitBusyChangeIfChanged(e){const t=this.isBusy();this.lastEmittedIsBusy!==t&&(this.lastEmittedIsBusy=t,this.emitOptionCallback("onBusyChange",[t,e]))}buildSelection(e){var t;const i=e.filter(S);return{selectedMask:null!==(t=i[0])&&void 0!==t?t:null,selectedMasks:i}}withSelectionChangeContext(e,t){const i=this.nextSelectionChangeContext;this.nextSelectionChangeContext=e;try{return t()}finally{this.nextSelectionChangeContext=i}}isSupportedImageMimeType(e){return"image/jpeg"===e||"image/png"===e||"image/webp"===e}inferCurrentImageMimeType(){const e=this.originalImage;if(!e)return null;let t=null;try{"function"==typeof e.getSrc?t=e.getSrc():"string"==typeof e.src&&(t=e.src)}catch{t=null}const i=t?ze(t):null;return this.isSupportedImageMimeType(i)?i:null}setCanvasSizePx(e,t){this.canvas&&We(this.canvas,e,t,this.containerElement)}alignObjectBoundingBoxToCanvasTopLeft(e){var t,i;e.setCoords();const a=e.getBoundingRect();e.set({left:(null!==(t=e.left)&&void 0!==t?t:0)-a.left,top:(null!==(i=e.top)&&void 0!==i?i:0)-a.top}),e.setCoords(),this.canvas.renderAll()}measureLayoutViewport(e){return this.viewportCache.measure(this.containerElement,{width:this.options.canvasWidth,height:this.options.canvasHeight},e)}updateCanvasSizeToImageBounds(){var e,t;if(!this.originalImage)return;this.originalImage.setCoords();const i=this.originalImage.getBoundingRect(),a=Re(null!==(t=null===(e=this.containerElement)||void 0===e?void 0:e.ownerDocument)&&void 0!==t?t:null),n=this.measureLayoutViewport(a);if(this.options.fitImageToCanvas||this.options.coverImageToCanvas){const e=De(i.width,i.height,n,a);return void this.setCanvasSizePx(e.width,e.height)}i.width<=n.width&&i.height<=n.height?this.setCanvasSizePx(n.width,n.height):this.setCanvasSizePx(Math.max(n.width,Math.ceil(i.width)),Math.max(n.height,Math.ceil(i.height)))}shouldNormalizeCanvasSizeAfterStateRestore(){var e,t;if(!this.canvas||!this.originalImage)return!1;this.originalImage.setCoords();const i=this.originalImage.getBoundingRect(),a=this.measureLayoutViewport(Re(null!==(t=null===(e=this.containerElement)||void 0===e?void 0:e.ownerDocument)&&void 0!==t?t:null)),n=Math.ceil(this.canvas.getWidth()),o=Math.ceil(this.canvas.getHeight()),r=i.width>n+ft||i.height>o+ft;if(this.options.fitImageToCanvas||this.options.coverImageToCanvas){const e=n>a.width+ft&&i.width<=a.width+ft,t=o>a.height+ft&&i.height<=a.height+ft;return r||e||t}if(this.options.expandCanvasToImage){const e=Math.max(a.width,Math.ceil(i.width)),t=Math.max(a.height,Math.ceil(i.height));return Math.abs(n-e)>ft||Math.abs(o-t)>ft}return r}captureImageDisplayGeometry(){if(!this.canvas||!this.originalImage)return null;this.originalImage.setCoords();const e=this.originalImage.getBoundingRect();return{canvasWidth:this.canvas.getWidth(),canvasHeight:this.canvas.getHeight(),imageDisplayWidth:Math.max(1,e.width),imageDisplayHeight:Math.max(1,e.height)}}restoreMergedImageDisplayGeometry(e){if(!e||!this.canvas||!this.originalImage)return;this.setCanvasSizePx(e.canvasWidth,e.canvasHeight);const t=Math.max(1,this.originalImage.width||e.imageDisplayWidth),i=Math.max(1,this.originalImage.height||e.imageDisplayHeight),a=Math.min(e.imageDisplayWidth/t,e.imageDisplayHeight/i);this.originalImage.set({left:0,top:0,angle:0,scaleX:a,scaleY:a,originX:"left",originY:"top",selectable:!1,evented:!1,hasControls:!1,hoverCursor:"default"}),this.originalImage.setCoords(),this.canvas.sendObjectToBack(this.originalImage),this.currentScale=1,this.currentRotation=0,this.baseImageScale=a,this.lastSnapshot=this.captureSnapshotInternal(),this.canvas.renderAll()}buildTransformContext(){return{canvas:this.canvas,options:this.options,guard:this.operationGuard,getOriginalImage:()=>this.originalImage,getCurrentScale:()=>this.currentScale,setCurrentScale:e=>{this.currentScale=e},getCurrentRotation:()=>this.currentRotation,setCurrentRotation:e=>{this.currentRotation=e},getBaseImageScale:()=>this.baseImageScale,saveCanvasState:()=>{this.saveStateInternal(this.withAnimationQueueBypass())},setSuppressSaveState:e=>{this.shouldSuppressSaveState=e},afterTransformSnap:()=>{!this.isDisposed&&this.canvas&&this.originalImage&&((this.options.expandCanvasToImage||this.options.coverImageToCanvas||this.options.fitImageToCanvas)&&this.updateCanvasSizeToImageBounds(),this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage),this.canvas.getObjects().filter(S).forEach(e=>this.syncMaskLabel(e)))}}}scaleImage(e){if(this.isDisposed||!this.transformController)return Promise.resolve();if(!Number.isFinite(e))return Promise.resolve();try{this.assertCanQueueAnimation("scaleImage")}catch(e){return Promise.reject(e)}const t=this.transformController,i=this.buildCallbackContext("scaleImage",!1),a=this.animQueue.add(async()=>{if(!this.isDisposed){this.updateUi();try{await t.scaleImage(e),this.isDisposed||this.emitImageChanged(i)}finally{this.isDisposed||this.updateInputs()}}});return this.emitBusyChangeIfChanged(i),a.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(i)})}rotateImage(e){if(this.isDisposed||!this.transformController)return Promise.resolve();if(!Number.isFinite(e))return Promise.resolve();try{this.assertCanQueueAnimation("rotateImage")}catch(e){return Promise.reject(e)}const t=this.transformController,i=this.buildCallbackContext("rotateImage",!1),a=this.animQueue.add(async()=>{if(!this.isDisposed){this.updateUi();try{await t.rotateImage(e),this.isDisposed||this.emitImageChanged(i)}finally{this.isDisposed||this.updateInputs()}}});return this.emitBusyChangeIfChanged(i),a.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(i)})}resetImageTransform(){if(this.isDisposed||!this.transformController)return Promise.resolve();try{this.assertCanQueueAnimation("resetImageTransform")}catch(e){return Promise.reject(e)}const e=this.transformController,t=this.buildCallbackContext("resetImageTransform",!1),i=this.animQueue.add(async()=>{if(!this.isDisposed){this.updateUi();try{await e.resetImageTransform(),this.isDisposed||this.emitImageChanged(t)}finally{this.isDisposed||this.updateInputs()}}});return this.emitBusyChangeIfChanged(t),i.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(t)})}refreshUiAfterQueuedAnimation(){!this.isDisposed&&this.canvas&&(this.updateInputs(),this.updateUi())}async loadFromState(e){return this.loadFromStateInternal(e)}async loadFromStateInternal(e,t){var i;if(!e||!this.canvas)return;if(this.isDisposed)return;if(!this.canRunIdleOperation("loadFromState",t))return;const n=this.activeStateRestoreOperation,o=this.buildCallbackContext(null!=n?n:"loadFromState","undo"===n||"redo"===n),r=this.originalImage,s=this.getMaskCollectionSignature();try{const t=await L({canvas:this.canvas,jsonString:e,setCanvasSize:(e,t)=>this.setCanvasSizePx(e,t)});if(this.isDisposed||!this.canvas)return;this.hideAllMaskLabels(),this.originalImage=t.originalImage,this.originalImage&&(this.originalImage.set({originX:"left",originY:"top",selectable:!1,evented:!1,hasControls:!1,hoverCursor:"default"}),this.canvas.sendObjectToBack(this.originalImage)),this.maskCounter=t.maxMaskId;const a=t.editorState;a&&(this.currentScale=a.currentScale,this.currentRotation=a.currentRotation,this.baseImageScale=a.baseImageScale),this.originalImage?this.currentImageMimeType=a&&"currentImageMimeType"in a?null!==(i=a.currentImageMimeType)&&void 0!==i?i:null:this.inferCurrentImageMimeType():this.currentImageMimeType=null,this.isImageLoadedToCanvas=!!this.originalImage,this.originalImage&&(this.options.expandCanvasToImage||this.options.coverImageToCanvas||this.options.fitImageToCanvas)&&this.shouldNormalizeCanvasSizeAfterStateRestore()&&(this.updateCanvasSizeToImageBounds(),this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage));const n=t.objects.filter(S);this.lastMask=n.reduce((e,t)=>!e||t.maskId>e.maskId?t:e,null),n.forEach(e=>{Q(e),q(e)}),this.lastSnapshot=this.captureSnapshotInternal(),this.canvas.renderAll(),this.updateInputs(),this.updateMaskList(),this.updateUi(),r&&r!==this.originalImage&&this.emitOptionCallback("onImageCleared",[r,o]),s!==this.getMaskCollectionSignature()&&this.emitMasksChanged(o),this.emitImageChanged(o);const l=null==a?void 0:a.activeMaskId;if("number"==typeof l){const e=n.find(e=>e.maskId===l);e&&this.withSelectionChangeContext(o,()=>{this.canvas.setActiveObject(e),this.handleSelectionChanged([e])})}}catch(e){throw a(this.options,e,"Failed to restore canvas state."),e}}saveState(){this.saveStateInternal()}saveStateInternal(e){var t,a;if(!this.canvas||this.shouldSuppressSaveState)return;if(!this.canRunIdleOperation("saveState",e))return;const n=this.canvas.getActiveObject(),o=this.getActiveMaskForSnapshot();this.hideAllMaskLabels();try{const e=E({canvas:this.canvas,activeMaskId:null!==(t=null==o?void 0:o.maskId)&&void 0!==t?t:null,currentScale:this.currentScale,currentRotation:this.currentRotation,baseImageScale:this.baseImageScale,currentImageMimeType:this.currentImageMimeType}),i=null!==(a=this.lastSnapshot)&&void 0!==a?a:e;if(e===i)return;let n=!1;const r=new j(async()=>{n&&await this.loadFromStateInternal(e,this.withAnimationQueueBypass()),n=!0},async()=>{await this.loadFromStateInternal(i,this.withAnimationQueueBypass())});this.historyManager.execute(r),this.lastSnapshot=e}catch(e){i(this.options,e,"Failed to capture canvas snapshot.")}finally{this.restoreActiveMaskAfterSnapshot(n,o),this.updateUi()}}restoreActiveMaskAfterSnapshot(e,t){if(!this.canvas)return;const i=e&&S(e)?e:t;i&&this.canvas.getObjects().includes(i)&&(this.canvas.setActiveObject(i),this.showLabelForMask(i),this.updateMaskListSelection(i))}undo(){if(this.isDisposed)return Promise.resolve();if(!this.canRunIdleOperation("undo"))return Promise.resolve();const e=this.buildCallbackContext("undo",!0),t=this.animQueue.add(async()=>{if(!this.isDisposed){this.activeStateRestoreOperation="undo";try{await this.historyManager.undo()}finally{this.activeStateRestoreOperation=null}}});return this.emitBusyChangeIfChanged(e),t.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(e)})}redo(){if(this.isDisposed)return Promise.resolve();if(!this.canRunIdleOperation("redo"))return Promise.resolve();const e=this.buildCallbackContext("redo",!0),t=this.animQueue.add(async()=>{if(!this.isDisposed){this.activeStateRestoreOperation="redo";try{await this.historyManager.redo()}finally{this.activeStateRestoreOperation=null}}});return this.emitBusyChangeIfChanged(e),t.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(e)})}createMask(e={}){if(!this.canvas)return null;if(!this.canRunIdleOperation("createMask"))return null;const t=this.buildCallbackContext("createMask",!1),i=this.buildCreateMaskContext(),a=this.withSelectionChangeContext(t,()=>rt(i,e));return a&&(this.emitMasksChanged(t),this.emitImageChanged(t)),a}removeSelectedMask(){if(!this.canvas)return;if(!this.canRunIdleOperation("removeSelectedMask"))return;const e=this.getMasks().length,t=this.buildCallbackContext("removeSelectedMask",!1),i=this.buildRemoveMaskContext();this.withSelectionChangeContext(t,()=>function(e){const t=e.canvas.getActiveObject();t&&S(t)&&(e.removeLabelForMask(t),G(t),e.canvas.remove(t),e.canvas.discardActiveObject(),e.updateMaskList(),e.canvas.renderAll(),e.saveCanvasState())}(i)),this.updateUi(),this.getMasks().length!==e&&(this.emitMasksChanged(t),this.emitImageChanged(t))}removeAllMasks(e={}){if(!this.canvas)return;if(!this.canRunIdleOperation("removeAllMasks",e))return;const t=this.getMasks().length,i=this.buildCallbackContext("removeAllMasks",!1),a=this.buildRemoveMaskContext();this.withSelectionChangeContext(i,()=>st(a,e)),this.updateUi(),this.getMasks().length!==t&&(this.emitMasksChanged(i),this.emitImageChanged(i))}buildCreateMaskContext(){return{fabric:this.fabricModule,canvas:this.canvas,options:this.options,getLastMask:()=>this.lastMask,setLastMask:e=>{this.lastMask=e},getMaskCounter:()=>this.maskCounter,setMaskCounter:e=>{this.maskCounter=e},updateMaskList:()=>{this.updateMaskList()},saveCanvasState:()=>{this.saveState()},expandCanvasIfNeeded:(e,t)=>{this.setCanvasSizePx(e,t)}}}buildRemoveMaskContext(){return{canvas:this.canvas,removeLabelForMask:e=>{this.removeLabelForMask(e)},updateMaskList:()=>{this.updateMaskList()},saveCanvasState:()=>{this.saveState()},setLastMask:e=>{this.lastMask=e}}}buildMaskLabelContext(){return this.canvas?{fabric:this.fabricModule,canvas:this.canvas,options:this.options}:null}removeLabelForMask(e){const t=this.buildMaskLabelContext();t&&lt(t,e)}createLabelForMask(e){const t=this.buildMaskLabelContext();t&&ct(t,e)}hideAllMaskLabels(){const e=this.buildMaskLabelContext();e&&function(e){const{canvas:t}=e;if(!t)return;const i=t.getObjects();i.filter(e=>e.maskLabel).forEach(e=>{try{t.remove(e)}catch{}}),i.filter(S).forEach(e=>{try{delete e.labelObject}catch{}})}(e)}syncMaskLabel(e){const t=this.buildMaskLabelContext();t&&ut(t,e)}showLabelForMask(e){const t=this.buildMaskLabelContext();t&&function(e,t){e.options.maskLabelOnSelect&&(t.labelObject||ct(e,t),t.labelObject&&(t.labelObject.visible=!0,ut(e,t)))}(t,e)}handleSelectionChanged(e){var t,i,a;if(!this.canvas)return;const n=null!==(t=e.find(S))&&void 0!==t?t:null;this.canvas.getObjects().filter(S).forEach(e=>{e!==n?(e.labelObject&&this.removeLabelForMask(e),Q(e)):e.set({stroke:"#ff0000",strokeWidth:1})}),n&&this.showLabelForMask(n),this.updateMaskListSelection(n),this.canvas.requestRenderAll(),this.updateUi();const o=null!==(i=this.nextSelectionChangeContext)&&void 0!==i?i:this.buildCallbackContext(null!==(a=this.activeStateRestoreOperation)&&void 0!==a?a:"createMask","undo"===this.activeStateRestoreOperation||"redo"===this.activeStateRestoreOperation);this.emitOptionCallback("onSelectionChange",[this.buildSelection(e),o])}buildMaskListContext(){return{canvas:this.canvas,getListElementId:()=>this.elements.maskList,onMaskSelected:e=>this.handleSelectionChanged([e])}}updateMaskList(){!function(e){const t=e.getListElementId();if(!t)return;const i=document.getElementById(t);if(!i||!e.canvas)return;i.innerHTML="";const a=e.canvas;a.getObjects().filter(S).forEach(t=>{const n=document.createElement("li");n.className="list-group-item mask-item",n.textContent=t.maskName,n.dataset.maskId=String(t.maskId),n.onclick=()=>{const t=Number(n.dataset.maskId);if(!Number.isFinite(t))return;const i=a.getObjects().find(e=>S(e)&&e.maskId===t);i&&(a.setActiveObject(i),e.onMaskSelected(i))},i.appendChild(n)})}(this.buildMaskListContext())}updateMaskListSelection(e){!function(e,t){const i=e.getListElementId();if(!i)return;const a=document.getElementById(i);if(!a)return;const n=t?String(t.maskId):null;a.querySelectorAll(".mask-item").forEach(e=>{const t=null!==n&&e.dataset.maskId===n;e.classList.toggle("active",t)})}(this.buildMaskListContext(),e)}async mergeMasks(){if(!this.canvas)return;if(!this.canRunIdleOperation("mergeMasks"))return;if(!this.canvas.getObjects().some(S))return;const e=this.buildCallbackContext("mergeMasks",!1),t=this.operationGuard.beginBusyOperation("mergeMasks");this.emitBusyChangeIfChanged(e),this.updateUi();try{const i=this.buildMergeMasksContext(t);await async function(e){if(!e.isImageLoaded())return;if(0===e.canvas.getObjects().filter(e=>"maskId"in e&&"number"==typeof e.maskId).length)return;const t=e.saveState();e.canvas.discardActiveObject(),e.canvas.renderAll();const i=e.containerElement?e.containerElement.scrollTop:null,a=e.containerElement?e.containerElement.scrollLeft:null;try{const n=await Ee(e,{exportArea:"image",mergeMask:!0,multiplier:e.options.exportMultiplier,fileType:"png"});if(!n)throw new D("mergeMasks: exportImageBase64 returned an empty data URL.");e.removeAllMasksNoHistory(),await e.loadImage(n,{preserveScroll:!0});const o=e.saveState();if(e.containerElement)try{null!==i&&(e.containerElement.scrollTop=i),null!==a&&(e.containerElement.scrollLeft=a)}catch(e){console.warn("[ImageEditor] mergeMasks: scroll restore failed",e)}t&&o&&t!==o&&e.historyManager.push(new j(()=>e.loadFromState(o),()=>e.loadFromState(t)))}catch(i){try{await e.loadFromState(t)}catch(e){console.warn("[ImageEditor] mergeMasks: rollback failed",e)}if(i instanceof D)throw i;const a=i instanceof Error?`mergeMasks failed: ${i.message}`:"mergeMasks failed";throw new D(a,i)}}(i),this.updateInputs(),this.updateMaskList(),this.emitMasksChanged(e),this.emitImageChanged(e)}finally{this.operationGuard.endBusyOperation(t),this.emitBusyChangeIfChanged(e),this.updateUi()}}downloadImage(e){if(!this.canvas)return;if(!this.canRunIdleOperation("downloadImage"))return;const t=this.buildCallbackContext("downloadImage",!1),i=this.operationGuard.beginBusyOperation("downloadImage");this.emitBusyChangeIfChanged(t);const n=this.buildExportServiceContext();try{!function(e,t){if(!e.isImageLoaded())return void Oe("downloadImage");const i=null!=t?t:e.options.defaultDownloadFileName;Ee(e,{exportArea:e.options.exportAreaByDefault,mergeMask:e.options.mergeMaskByDefault,multiplier:e.options.exportMultiplier}).then(e=>{if(!e)return;const t=document.createElement("a");t.download=i,t.href=e,document.body.appendChild(t);try{t.click()}finally{document.body.removeChild(t)}}).catch(t=>{a(e.options,t,"downloadImage failed."),console.error("[ImageEditor] downloadImage failed",t)})}(n,e)}finally{this.operationGuard.endBusyOperation(i),this.emitBusyChangeIfChanged(t)}}async exportImageBase64(e){if(!this.canvas)return"";if(!this.canRunIdleOperation("exportImageBase64",e))return"";const t=this.buildCallbackContext("exportImageBase64",!1),i=this.operationGuard.beginBusyOperation("exportImageBase64");this.emitBusyChangeIfChanged(t);const a=this.buildExportServiceContext();try{return await Ee(a,e)}finally{this.operationGuard.endBusyOperation(i),this.emitBusyChangeIfChanged(t)}}async exportImageFile(e){this.assertIdleForOperation("exportImageFile",e);const t=this.buildCallbackContext("exportImageFile",!1),i=this.operationGuard.beginBusyOperation("exportImageFile");this.emitBusyChangeIfChanged(t);const a=this.buildExportServiceContext();try{return await Le(a,e)}finally{this.operationGuard.endBusyOperation(i),this.emitBusyChangeIfChanged(t)}}buildExportServiceContext(){return{fabric:this.fabricModule,canvas:this.canvas,options:this.options,isImageLoaded:()=>this.isImageLoaded(),getOriginalImage:()=>this.originalImage}}buildMergeMasksContext(e){return{...this.buildExportServiceContext(),historyManager:this.historyManager,containerElement:this.containerElement,loadImage:async(t,i)=>{const a=this.captureImageDisplayGeometry();await this.loadImage(t,this.withInternalOperationOptions(e,i)),this.restoreMergedImageDisplayGeometry(a)},saveState:()=>this.captureSnapshotInternal(),loadFromState:t=>this.loadFromStateInternal(t,this.withInternalOperationOptions(e,this.withAnimationQueueBypass())),removeAllMasksNoHistory:()=>{st(this.buildRemoveMaskContext(),{saveHistory:!1})}}}captureSnapshotInternal(){var e;if(!this.canvas)return"";const t=this.getActiveMaskForSnapshot();return this.hideAllMaskLabels(),E({canvas:this.canvas,activeMaskId:null!==(e=null==t?void 0:t.maskId)&&void 0!==e?e:null,currentScale:this.currentScale,currentRotation:this.currentRotation,baseImageScale:this.baseImageScale,currentImageMimeType:this.currentImageMimeType})}getActiveMaskForSnapshot(){var e;if(!this.canvas)return null;const t=this.canvas.getActiveObject();return t&&S(t)?t:null!==(e=this.canvas.getObjects().find(e=>S(e)&&!!e.labelObject))&&void 0!==e?e:null}enterCropMode(){if(!this.canvas||!this.originalImage)return;if(this.cropSession)return;if(!this.isImageLoaded())return;if(!this.canRunIdleOperation("enterCropMode"))return;!function(e){const{canvas:t,options:i}=e;if(e.getCropSession())return;const a=e.getOriginalImage();if(!a)return;if(!e.isImageLoaded())return;t.discardActiveObject();const n=e.saveState(),o=!!t.selection;t.selection=!1,a.setCoords();const r=a.getBoundingRect(),s=Number.isFinite(Number(i.crop.padding))?Number(i.crop.padding):10,l=Math.max(0,Math.floor(r.left)),c=Math.max(0,Math.floor(r.top)),u=Math.max(1,Math.floor(r.width)),h=Math.max(1,Math.floor(r.height)),d=Math.min(l+u-1,Math.max(l,Math.floor(r.left+s))),m=Math.min(c+h-1,Math.max(c,Math.floor(r.top+s))),g=Math.max(1,Number(i.crop.minWidth)||1),p=Math.max(1,Number(i.crop.minHeight)||1),f=Math.min(g,u),b=Math.min(p,h),v=!!i.crop.allowRotationOfCropRect,y=new e.fabric.Rect({left:d,top:m,width:f,height:b,originX:"left",originY:"top",fill:"rgba(0,0,0,0.12)",stroke:"#00aaff",strokeDashArray:se,strokeWidth:1,strokeUniform:!0,selectable:!0,lockRotation:!v,cornerSize:8,objectCaching:!1,lockScalingFlip:!0});v||y.setControlVisible("mtr",!1),t.add(y),y.isCropRect=!0,t.bringObjectToFront(y),t.setActiveObject(y);const I=!!i.crop.hideMasksDuringCrop,C=[];I&&t.getObjects().forEach(e=>{e!==y&&S(e)&&C.push(Y(e))});const k=[];if(t.getObjects().forEach(e=>{var t,i;if(e!==y){k.push({object:e,evented:null===(t=e.evented)||void 0===t||t,selectable:null===(i=e.selectable)||void 0===i||i});try{e.set({evented:!1,selectable:!1})}catch{}}}),I)for(const e of C)_(e.object);const M=()=>{try{const e=Math.max(1,Number(y.width)||1),i=Math.max(1,Number(y.height)||1),a=Math.min(u/e,Math.max(f/e,Number(y.scaleX)||1)),n=Math.min(h/i,Math.max(b/i,Number(y.scaleY)||1)),o=e*a,r=i*n,s=Math.max(l,l+u-o),d=Math.max(c,c+h-r),m=Math.min(s,Math.max(l,Number(y.left)||l)),g=Math.min(d,Math.max(c,Number(y.top)||c));y.set({left:m,top:g,scaleX:a,scaleY:n}),y.setCoords(),t.requestRenderAll()}catch{}};y.on("modified",M),y.on("moving",M),y.on("scaling",M);const w={beforeJson:n,prevSelection:o,prevEvented:k,maskBackups:C,cropRect:y,handlers:[{target:y,handlers:[{eventName:"modified",callback:M},{eventName:"moving",callback:M},{eventName:"scaling",callback:M}]}]};e.setCropSession(w),t.renderAll()}(this.buildCropControllerContext()),this.updateUi();const e=this.buildCallbackContext("enterCropMode",!1);this.emitBusyChangeIfChanged(e),this.emitImageChanged(e)}cancelCrop(){if(!this.canvas||!this.cropSession)return;if(!this.canRunIdleOperation("cancelCrop"))return;pe(this.buildCropControllerContext()),this.cropSession=null,this.updateUi(),this.canvas.requestRenderAll();const e=this.buildCallbackContext("cancelCrop",!1);this.emitBusyChangeIfChanged(e),this.emitImageChanged(e)}async applyCrop(){if(!this.canvas||!this.cropSession)return;if(!this.canRunIdleOperation("applyCrop"))return;const e=this.buildCallbackContext("applyCrop",!1),t=this.getMasks().length>0,i=this.operationGuard.beginBusyOperation("applyCrop");this.emitBusyChangeIfChanged(e),this.updateUi();try{const a=this.buildCropControllerContext(i);await fe(a),this.updateInputs(),this.updateMaskList(),(t||this.getMasks().length>0)&&this.emitMasksChanged(e),this.emitImageChanged(e)}finally{this.operationGuard.endBusyOperation(i),this.emitBusyChangeIfChanged(e),this.updateUi()}}buildCropControllerContext(e){return{fabric:this.fabricModule,canvas:this.canvas,options:this.options,historyManager:this.historyManager,isImageLoaded:()=>this.isImageLoaded(),getOriginalImage:()=>this.originalImage,getCurrentImageMimeType:()=>this.currentImageMimeType,getCropSession:()=>this.cropSession,setCropSession:e=>{this.cropSession=e},saveState:()=>this.captureSnapshotInternal(),loadFromState:t=>this.loadFromStateInternal(t,this.withInternalOperationOptions(e,this.withAnimationQueueBypass())),loadImage:(t,i)=>this.loadImage(t,this.withInternalOperationOptions(e,i)),getMaskCounter:()=>this.maskCounter,setMaskCounter:e=>{this.maskCounter=e},updateMaskList:()=>{this.updateMaskList()}}}updateInputs(){const e=this.elements.scalePercentageInput;if(!e)return;const t=document.getElementById(e);t&&(t.value=String(Math.round(100*this.currentScale)))}updateUi(){if(!this.canvas)return;const e=!!this.originalImage,t=(e?this.canvas.getObjects().filter(S):[]).length>0,i=this.canvas.getActiveObject(),a=!(!i||!S(i)),n=1===this.currentScale&&0===this.currentRotation,o=this.historyManager.canUndo(),r=this.historyManager.canRedo(),s=null!==this.cropSession,l=this.operationGuard.isBusy()||this.animQueue.isBusy();s?yt.forEach(e=>{this.setControlEnabled(e,!l&&It.includes(e))}):(this.setControlEnabled("scalePercentageInput",e&&!l),this.setControlEnabled("rotateLeftDegreesInput",e&&!l),this.setControlEnabled("rotateRightDegreesInput",e&&!l),this.setControlEnabled("zoomInButton",e&&!l&&this.currentScale<this.options.maxScale),this.setControlEnabled("zoomOutButton",e&&!l&&this.currentScale>this.options.minScale),this.setControlEnabled("rotateLeftButton",e&&!l),this.setControlEnabled("rotateRightButton",e&&!l),this.setControlEnabled("createMaskButton",e&&!l),this.setControlEnabled("removeSelectedMaskButton",a&&!l),this.setControlEnabled("removeAllMasksButton",t&&!l),this.setControlEnabled("mergeMasksButton",e&&t&&!l),this.setControlEnabled("downloadImageButton",e&&!l),this.setControlEnabled("resetImageTransformButton",e&&!n&&!l),this.setControlEnabled("undoButton",e&&!l&&o),this.setControlEnabled("redoButton",e&&!l&&r),this.setControlEnabled("enterCropModeButton",e&&!l),this.setControlEnabled("imageInput",!l),this.setControlEnabled("applyCropButton",!1),this.setControlEnabled("cancelCropButton",!1))}setControlEnabled(e,t){var i;const a=this.elements[e];if(!a)return;const n=document.getElementById(a);if(n)if(this.recordElementOriginalState(e,n),"disabled"in n)n.disabled=!t;else if(t){const t=this.elementOriginalAriaDisabledMap.get(e);null==t?n.removeAttribute("aria-disabled"):n.setAttribute("aria-disabled",t),n.style.pointerEvents=null!==(i=this.elementOriginalPointerEventsMap.get(e))&&void 0!==i?i:""}else n.setAttribute("aria-disabled","true"),n.style.pointerEvents="none"}recordElementOriginalState(e,t){this.elementOriginalAriaDisabledMap.has(e)||this.elementOriginalAriaDisabledMap.set(e,t.getAttribute("aria-disabled")),this.elementOriginalPointerEventsMap.has(e)||this.elementOriginalPointerEventsMap.set(e,t.style.pointerEvents||""),"disabled"in t&&!this.elementOriginalDisabledMap.has(e)&&this.elementOriginalDisabledMap.set(e,!!t.disabled)}restoreElementOriginalStates(){var e,t;for(const i of Object.keys(this.elements)){const a=this.elements[i];if(!a)continue;const n=document.getElementById(a);if(n){if("disabled"in n&&this.elementOriginalDisabledMap.has(i)&&(n.disabled=null!==(e=this.elementOriginalDisabledMap.get(i))&&void 0!==e&&e),this.elementOriginalAriaDisabledMap.has(i)){const e=this.elementOriginalAriaDisabledMap.get(i);null==e?n.removeAttribute("aria-disabled"):n.setAttribute("aria-disabled",e)}this.elementOriginalPointerEventsMap.has(i)&&(n.style.pointerEvents=null!==(t=this.elementOriginalPointerEventsMap.get(i))&&void 0!==t?t:"")}}this.elementOriginalDisabledMap.clear(),this.elementOriginalAriaDisabledMap.clear(),this.elementOriginalPointerEventsMap.clear()}updatePlaceholderStatus(){dt(this.placeholderElement,this.containerElement,!!this.options.showPlaceholder&&!this.originalImage)}dispose(){var e;if(this.isDisposed)return;const t=this.buildCallbackContext("dispose",!1),i=this.originalImage;if(this.isDisposed=!0,this.operationGuard.markDisposed(),this.animQueue.clear(),null===(e=this.domBindings)||void 0===e||e.removeAll(),this.restoreElementOriginalStates(),this.cropSession&&this.canvas){try{pe(this.buildCropControllerContext())}catch{}this.cropSession=null}if(this.canvas){try{Promise.resolve(this.canvas.dispose()).catch(()=>{})}catch{}this.canvas=null,this.canvasElement=null,this.isImageLoadedToCanvas=!1}this.originalImage=null,this.currentImageMimeType=null,this.lastMask=null,this.maskCounter=0,this.currentScale=1,this.currentRotation=0,this.baseImageScale=1,this.lastSnapshot=null,this.transformController=null,this.viewportCache.clear(),i&&this.emitOptionCallback("onImageCleared",[i,t]),this.emitImageChanged(t),this.emitBusyChangeIfChanged(t),this.emitOptionCallback("onEditorDisposed",[t])}}e.ImageEditor=kt,e.default=kt,e.isMaskObject=S,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ImageEditor={})}(this,function(e){"use strict";class t{constructor(){Object.defineProperty(this,"queue",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"running",{enumerable:!0,configurable:!0,writable:!0,value:!1})}add(e){return new Promise((t,i)=>{this.queue.push({run:e,resolve:t,reject:i}),this.running||this.drainQueue()})}clear(e){const t=this.queue;if(this.queue=[],void 0!==e)for(const i of t)i.reject(e);else for(const e of t)e.resolve()}isRunning(){return this.running}isBusy(){return this.running||this.queue.length>0}waitForIdle(){return this.running||0!==this.queue.length?this.add(()=>Promise.resolve()).then(()=>{},()=>{}):Promise.resolve()}async drainQueue(){if(!this.running){this.running=!0;try{for(;this.queue.length>0;){const e=this.queue.shift();try{await e.run(),e.resolve()}catch(t){e.reject(t)}}}finally{this.running=!1,this.queue.length>0&&this.drainQueue()}}}}function i(e,t,i){const n=e.onWarning;if("function"==typeof n)try{n(t,i)}catch(e){console.warn("[ImageEditor] onWarning callback threw",e)}}function n(e,t,i){const n=e.onError;if("function"==typeof n)try{n(t,i)}catch(e){console.error("[ImageEditor] onError callback threw",e)}}const a=Object.freeze({jpeg:"jpeg",jpg:"jpeg","image/jpeg":"jpeg",png:"png","image/png":"png",webp:"webp","image/webp":"webp"}),o=Object.freeze({jpeg:"image/jpeg",png:"image/png",webp:"image/webp"});function r(e){var t;if(!e)return null;const i=String(e).toLowerCase();return Object.prototype.hasOwnProperty.call(a,i)&&null!==(t=a[i])&&void 0!==t?t:null}function s(e){return o[e]}function l(e,t){const i=Number(e);return Number.isFinite(i)?Math.max(0,Math.min(1,i)):t}function c(e,t){var i;const n=null!=e?e:{},a=n.fileType,o=n.format,c=function(e){var t;return null!==(t=r(e))&&void 0!==t?t:"jpeg"}(a||o),u=s(c);if("png"===c)return{format:c,mimeType:u,quality:void 0};return{format:c,mimeType:u,quality:l(null!==(i=n.quality)&&void 0!==i?i:t,t)}}const u=Object.freeze({}),h="expand",d={canvasWidth:800,canvasHeight:600,backgroundColor:"transparent",animationDuration:300,minScale:.1,maxScale:5,scaleStep:.05,rotationStep:90,defaultLayoutMode:h,layoutMode:h,downsampleOnLoad:!0,downsampleMaxWidth:4e3,downsampleMaxHeight:3e3,downsampleQuality:.92,preserveSourceFormat:!0,downsampleMimeType:null,imageLoadTimeoutMs:3e4,maxHistorySize:50,exportMultiplier:1,maxExportPixels:5e7,exportAreaByDefault:"image",mergeMaskByDefault:!0,defaultMaskWidth:50,defaultMaskHeight:80,defaultMaskConfig:u,maskRotatable:!1,maskLabelOnSelect:!0,maskLabelOffset:3,maskName:"mask",groupSelection:!1,showPlaceholder:!0,initialImageBase64:null,defaultDownloadFileName:"edited_image.jpg",onImageLoadStart:null,onImageLoaded:null,onImageCleared:null,onImageChanged:null,onBusyChange:null,onEditorDisposed:null,onMasksChanged:null,onSelectionChange:null,onError:null,onWarning:null},m={fontSize:12,fill:"#fff",backgroundColor:"rgba(0,0,0,0.7)",padding:2,fontFamily:"monospace",fontWeight:"bold",selectable:!1,evented:!1,originX:"left",originY:"top"},g={getText:e=>e.maskName},p=100,f=100,b=10,v=!0,y=!1,M=!1,C="source",I=Object.freeze({brushSize:48,blockSize:8,previewStroke:"#333",previewStrokeWidth:1,previewStrokeDashArray:Object.freeze([4,4]),previewFill:"rgba(0,0,0,0)",outputFileType:"source",outputQuality:void 0}),k=new Set(["canvasWidth","canvasHeight","backgroundColor","animationDuration","minScale","maxScale","scaleStep","rotationStep","defaultLayoutMode","downsampleOnLoad","downsampleMaxWidth","downsampleMaxHeight","downsampleQuality","preserveSourceFormat","downsampleMimeType","imageLoadTimeoutMs","maxHistorySize","exportMultiplier","maxExportPixels","exportAreaByDefault","mergeMaskByDefault","defaultMaskWidth","defaultMaskHeight","defaultMaskConfig","maskRotatable","maskLabelOnSelect","maskLabelOffset","maskName","groupSelection","showPlaceholder","initialImageBase64","defaultDownloadFileName","onImageLoadStart","onImageLoaded","onImageCleared","onImageChanged","onBusyChange","onEditorDisposed","onMasksChanged","onSelectionChange","onError","onWarning","label","crop","defaultMosaicConfig"]);function w(e){return"function"==typeof e?e:null}function S(e){return"fit"===e||"cover"===e||"expand"===e}function x(e){return S(e)?e:h}function O(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function E(e){return Array.isArray(e)?[...e]:e}function B(e){if(!O(e))return u;const t={};for(const[i,n]of Object.entries(e))"onCreate"!==i&&"fabricGenerator"!==i&&"styles"!==i&&(t[i]=E(n));const i=e.styles;if(O(i)){const e={};for(const[t,n]of Object.entries(i))e[t]=E(n);Object.freeze(e),t.styles=e}return Object.freeze(t),t}function A(e,t){const i=Number(e);return!Number.isFinite(i)||i<=0?t:Math.max(1,Math.floor(i))}function L(e,t){const i=Number(e);return!Number.isFinite(i)||i<=0?t:i}function j(e,t){const i=Number(e);return!Number.isFinite(i)||i<0?t:i}function F(e,t){const i=Number(e);return Number.isFinite(i)?i:t}function N(e){if(null==e)return d.downsampleQuality;const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.min(1,t)):d.downsampleQuality}function T(e){const t=Number(e);return!Number.isFinite(t)||t<=0?d.maxExportPixels:Math.max(1,Math.floor(t))}function D(e){return"canvas"===e||"image"===e?e:d.exportAreaByDefault}function P(e){if(null==e)return;const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.min(1,t)):void 0}function R(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function z(e){return"number"==typeof e&&Number.isFinite(e)}function W(e){return{...e,previewStrokeDashArray:e.previewStrokeDashArray?[...e.previewStrokeDashArray]:null}}function U(e,t,i=e){const n=O(t)?t:{},a=W(e);return R(n,"brushSize")&&(a.brushSize=function(e,t){return z(e)&&e>0?e:t}(n.brushSize,i.brushSize)),R(n,"blockSize")&&(a.blockSize=function(e,t){return z(e)&&e>0?Math.max(1,Math.floor(e)):t}(n.blockSize,i.blockSize)),R(n,"previewStroke")&&(a.previewStroke="string"==typeof n.previewStroke?n.previewStroke:i.previewStroke),R(n,"previewStrokeWidth")&&(a.previewStrokeWidth=function(e,t){return z(e)&&e>=0?e:t}(n.previewStrokeWidth,i.previewStrokeWidth)),R(n,"previewStrokeDashArray")&&(a.previewStrokeDashArray=function(e,t){return null===e?null:Array.isArray(e)&&e.every(e=>"number"==typeof e&&Number.isFinite(e)&&e>=0)?[...e]:t?[...t]:null}(n.previewStrokeDashArray,i.previewStrokeDashArray)),R(n,"previewFill")&&(a.previewFill="string"==typeof n.previewFill?n.previewFill:i.previewFill),R(n,"outputFileType")&&(a.outputFileType=function(e,t){var i;return"source"===e?"source":"string"!=typeof e?t:null!==(i=r(e))&&void 0!==i?i:t}(n.outputFileType,i.outputFileType)),R(n,"outputQuality")&&(a.outputQuality=function(e,t){if(null!=e)return z(e)?Math.max(0,Math.min(1,e)):t}(n.outputQuality,i.outputQuality)),a}function H(e,t){const i=e.previewStrokeDashArray,n=t.previewStrokeDashArray,a=i===n||Array.isArray(i)&&Array.isArray(n)&&i.length===n.length&&i.every((e,t)=>e===n[t]);return e.brushSize===t.brushSize&&e.blockSize===t.blockSize&&e.previewStroke===t.previewStroke&&e.previewStrokeWidth===t.previewStrokeWidth&&a&&e.previewFill===t.previewFill&&e.outputFileType===t.outputFileType&&e.outputQuality===t.outputQuality}function Q(e){var t,i,n,a;const o=null!=e?e:{},r={...d};for(const e of Object.keys(o)){if(!k.has(e))continue;if("label"===e||"crop"===e||"defaultMosaicConfig"===e)continue;if("onImageLoadStart"===e||"onImageLoaded"===e||"onImageCleared"===e||"onImageChanged"===e||"onBusyChange"===e||"onEditorDisposed"===e||"onMasksChanged"===e||"onSelectionChange"===e||"onError"===e||"onWarning"===e)continue;const t=o[e];if(void 0!==t)if("downsampleQuality"!==e)if("maxExportPixels"!==e)if("exportAreaByDefault"!==e){if("defaultLayoutMode"===e){const e=x(t);r.defaultLayoutMode=e,r.layoutMode=e;continue}"canvasWidth"!==e?"canvasHeight"!==e?"animationDuration"!==e?"minScale"!==e?"maxScale"!==e?"scaleStep"!==e?"rotationStep"!==e?"downsampleMaxWidth"!==e?"downsampleMaxHeight"!==e?"imageLoadTimeoutMs"!==e?"exportMultiplier"!==e?"defaultMaskWidth"!==e?"defaultMaskHeight"!==e?"defaultMaskConfig"!==e?"maskLabelOffset"!==e?r[e]=t:r.maskLabelOffset=j(t,d.maskLabelOffset):r.defaultMaskConfig=B(t):r.defaultMaskHeight=L(t,d.defaultMaskHeight):r.defaultMaskWidth=L(t,d.defaultMaskWidth):r.exportMultiplier=L(t,d.exportMultiplier):r.imageLoadTimeoutMs=A(t,d.imageLoadTimeoutMs):r.downsampleMaxHeight=A(t,d.downsampleMaxHeight):r.downsampleMaxWidth=A(t,d.downsampleMaxWidth):r.rotationStep=F(t,d.rotationStep):r.scaleStep=L(t,d.scaleStep):r.maxScale=L(t,d.maxScale):r.minScale=L(t,d.minScale):r.animationDuration=j(t,d.animationDuration):r.canvasHeight=A(t,d.canvasHeight):r.canvasWidth=A(t,d.canvasWidth)}else r.exportAreaByDefault=D(t);else r.maxExportPixels=T(t);else r.downsampleQuality=N(t)}if(r.onImageLoadStart=w(o.onImageLoadStart),r.onImageLoaded=w(o.onImageLoaded),r.onImageCleared=w(o.onImageCleared),r.onImageChanged=w(o.onImageChanged),r.onBusyChange=w(o.onBusyChange),r.onEditorDisposed=w(o.onEditorDisposed),r.onMasksChanged=w(o.onMasksChanged),r.onSelectionChange=w(o.onSelectionChange),r.onError=w(o.onError),r.onWarning=w(o.onWarning),r.maxHistorySize=function(e){const t=Number(e);return Number.isFinite(t)?Math.max(1,Math.floor(t)):d.maxHistorySize}(r.maxHistorySize),r.maxExportPixels=T(r.maxExportPixels),r.minScale>r.maxScale){const e=r.minScale;r.minScale=r.maxScale,r.maxScale=e}const s=o.label&&"object"==typeof o.label?o.label:{},l={...m,...s.textOptions&&"object"==typeof s.textOptions?s.textOptions:{}},c={getText:"function"==typeof s.getText?s.getText:g.getText,textOptions:l};"function"==typeof s.create&&(c.create=s.create),Object.freeze(c.textOptions),Object.freeze(c);const u=o.crop&&"object"==typeof o.crop?o.crop:{},h={minWidth:L(u.minWidth,p),minHeight:L(u.minHeight,f),padding:j(u.padding,b),hideMasksDuringCrop:null!==(t=u.hideMasksDuringCrop)&&void 0!==t?t:v,preserveMasksAfterCrop:null!==(i=u.preserveMasksAfterCrop)&&void 0!==i?i:y,allowRotationOfCropRect:null!==(n=u.allowRotationOfCropRect)&&void 0!==n?n:M,exportFileType:null!==(a=u.exportFileType)&&void 0!==a?a:C,exportQuality:P(u.exportQuality)};Object.freeze(h);const S=function(e,t){return O(e)?U(t,e):W(t)}(o.defaultMosaicConfig,I);return S.previewStrokeDashArray&&Object.freeze(S.previewStrokeDashArray),Object.freeze(S),Object.freeze({...r,label:c,crop:h,defaultMosaicConfig:S})}class ${constructor(){Object.defineProperty(this,"isAnimationActive",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"isDisposedFlag",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"isLoadingActive",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"currentOperationName",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"currentOperationToken",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"animationAborters",{enumerable:!0,configurable:!0,writable:!0,value:new Set})}isAnimating(){return this.isAnimationActive}isDisposed(){return this.isDisposedFlag}isLoading(){return this.isLoadingActive}activeOperationName(){return this.currentOperationName}isBusy(){return this.isAnimationActive||this.isLoadingActive||null!==this.currentOperationToken}beginAnimation(){this.isAnimationActive=!0}endAnimation(){this.isAnimationActive=!1}markDisposed(){this.isDisposedFlag=!0,this.isAnimationActive=!1,this.isLoadingActive=!1,this.currentOperationName=null,this.currentOperationToken=null;for(const e of this.animationAborters)try{e()}catch{}this.animationAborters.clear()}registerAnimationAborter(e){if(this.isDisposedFlag){try{e()}catch{}return()=>{}}return this.animationAborters.add(e),()=>{this.animationAborters.delete(e)}}beginLoading(){this.isLoadingActive=!0}endLoading(){this.isLoadingActive=!1}beginBusyOperation(e){const t=Symbol(e);return this.currentOperationName=e,this.currentOperationToken=t,t}endBusyOperation(e){e&&e===this.currentOperationToken&&(this.currentOperationName=null,this.currentOperationToken=null)}isOwnOperation(e){return!!e&&e===this.currentOperationToken}async runAnimation(e){this.beginAnimation();try{return await e()}finally{this.endAnimation()}}assertNotAnimating(e){if(this.isAnimationActive)throw new Error(`[ImageEditor] Cannot run "${e}" while an animation is in progress.`)}assertIdleForOperation(e,t){var i;if(this.isDisposedFlag)throw new Error(`[ImageEditor] Cannot run "${e}" after dispose.`);const n=this.isOwnOperation(t);if(this.isAnimationActive)throw new Error(`[ImageEditor] Cannot run "${e}" while an animation is in progress.`);if(this.isLoadingActive&&!n)throw new Error(`[ImageEditor] Cannot run "${e}" while an image is loading.`);if(this.currentOperationToken&&!n)throw new Error(`[ImageEditor] Cannot run "${e}" while ${null!==(i=this.currentOperationName)&&void 0!==i?i:"another operation"} is running.`)}assertCanQueueAnimation(e,t){var i;if(this.isDisposedFlag)throw new Error(`[ImageEditor] Cannot run "${e}" after dispose.`);const n=this.isOwnOperation(t);if(this.isLoadingActive&&!n)throw new Error(`[ImageEditor] Cannot run "${e}" while an image is loading.`);if(this.currentOperationToken&&!n)throw new Error(`[ImageEditor] Cannot run "${e}" while ${null!==(i=this.currentOperationName)&&void 0!==i?i:"another operation"} is running.`)}}function q(e){return"maskId"in e&&"number"==typeof e.maskId}const Y=["maskId","maskUid","maskName","isCropRect","maskLabel","originalAlpha","originalStroke","originalStrokeWidth","hasControls","selectable","strokeUniform","lockRotation","transparentCorners","borderColor","cornerColor","cornerSize","isMosaicPreview"];function X(e){var t,i,n;const{canvas:a,currentScale:o,currentRotation:r,baseImageScale:s}=e,l=null===(i=(t=a).getActiveObject)||void 0===i?void 0:i.call(t),c=l&&q(l)?l.maskId:"number"==typeof e.activeMaskId?e.activeMaskId:null;(function(e){if(!e)return!1;if("activeselection"===("string"==typeof e.type?e.type.toLowerCase():""))return!0;const t=e.isType;return"function"==typeof t&&(t.call(e,"ActiveSelection")||t.call(e,"activeSelection"))})(l)&&a.discardActiveObject();const u=a.toJSON(Y);return function(e,t){if(Array.isArray(t))for(let i=0;i<t.length;i+=1){const n=e[i],a=t[i];n&&a&&("number"==typeof n.maskId&&(a.maskId=n.maskId),"string"==typeof n.maskUid&&(a.maskUid=n.maskUid),"string"==typeof n.maskName&&(a.maskName=n.maskName),"number"==typeof n.originalAlpha&&(a.originalAlpha=n.originalAlpha),"originalStroke"in n&&(a.originalStroke=n.originalStroke),"number"==typeof n.originalStrokeWidth&&(a.originalStrokeWidth=n.originalStrokeWidth),"boolean"==typeof n.hasControls&&(a.hasControls=n.hasControls),"boolean"==typeof n.selectable&&(a.selectable=n.selectable),"boolean"==typeof n.strokeUniform&&(a.strokeUniform=n.strokeUniform),"boolean"==typeof n.lockRotation&&(a.lockRotation=n.lockRotation),"boolean"==typeof n.transparentCorners&&(a.transparentCorners=n.transparentCorners),"string"==typeof n.borderColor&&(a.borderColor=n.borderColor),"string"==typeof n.cornerColor&&(a.cornerColor=n.cornerColor),"number"==typeof n.cornerSize&&(a.cornerSize=n.cornerSize),!0===n.isCropRect&&(a.isCropRect=!0),!0===n.maskLabel&&(a.maskLabel=!0),!0===n.isMosaicPreview&&(a.isMosaicPreview=!0))}}(a.getObjects(),u.objects),Array.isArray(u.objects)&&(u.objects=u.objects.filter(e=>!0!==e.isCropRect&&!0!==e.maskLabel&&!0!==e.isMosaicPreview)),u._editorState={currentScale:o,currentRotation:r,baseImageScale:s,currentImageMimeType:null!==(n=e.currentImageMimeType)&&void 0!==n?n:null},null!==c&&(u._editorState.activeMaskId=c),JSON.stringify(u)}async function G(e){var t,i;const{canvas:n,jsonString:a,setCanvasSize:o}=e,r="string"==typeof a?a:JSON.stringify(a),s=JSON.parse(r);"number"==typeof s.width&&s.width>0&&"number"==typeof s.height&&s.height>0&&o(s.width,s.height),await n.loadFromJSON(s);const l=n.getObjects();!function(e,t){var i,n,a,o,r;const s=new Set;for(const l of t){if("number"!=typeof l.maskId)continue;const t=String(null!==(i=l.type)&&void 0!==i?i:""),c=Number(null!==(n=l.left)&&void 0!==n?n:0),u=Number(null!==(a=l.top)&&void 0!==a?a:0),h="string"==typeof l.maskUid?l.maskUid:null;let d=-1;if(h&&(d=e.findIndex((e,t)=>!s.has(t)&&e.maskUid===h)),d<0&&(d=e.findIndex((e,i)=>{var n,a;return!s.has(i)&&((!t||e.type===t)&&(Math.abs((null!==(n=e.left)&&void 0!==n?n:0)-c)<.5&&Math.abs((null!==(a=e.top)&&void 0!==a?a:0)-u)<.5))})),d<0)continue;s.add(d);const m=e[d];m.maskId=l.maskId,"string"==typeof l.maskUid&&(m.maskUid=l.maskUid),m.maskName=String(null!==(o=l.maskName)&&void 0!==o?o:""),m.originalAlpha="number"==typeof l.originalAlpha?l.originalAlpha:null!==(r=m.opacity)&&void 0!==r?r:.5,"originalStroke"in l&&(m.originalStroke=l.originalStroke),"number"==typeof l.originalStrokeWidth&&(m.originalStrokeWidth=l.originalStrokeWidth),"boolean"==typeof l.hasControls&&(m.hasControls=l.hasControls),"boolean"==typeof l.selectable&&(m.selectable=l.selectable),"boolean"==typeof l.strokeUniform&&(m.strokeUniform=l.strokeUniform),"boolean"==typeof l.lockRotation&&(m.lockRotation=l.lockRotation),"boolean"==typeof l.transparentCorners&&(m.transparentCorners=l.transparentCorners),"string"==typeof l.borderColor&&(m.borderColor=l.borderColor),"string"==typeof l.cornerColor&&(m.cornerColor=l.cornerColor),"number"==typeof l.cornerSize&&(m.cornerSize=l.cornerSize)}t.forEach((t,i)=>{if(!0!==t.maskLabel)return;const n=e[i];n&&(n.maskLabel=!0)})}(l,null!==(t=s.objects)&&void 0!==t?t:[]);const c=s._editorState&&"object"==typeof s._editorState?{currentScale:"number"==typeof s._editorState.currentScale?s._editorState.currentScale:1,currentRotation:"number"==typeof s._editorState.currentRotation?s._editorState.currentRotation:0,baseImageScale:"number"==typeof s._editorState.baseImageScale?s._editorState.baseImageScale:1}:null;if(c&&s._editorState&&"number"==typeof s._editorState.activeMaskId&&(c.activeMaskId=s._editorState.activeMaskId),c&&s._editorState&&"currentImageMimeType"in s._editorState){const e=s._editorState.currentImageMimeType;c.currentImageMimeType="image/jpeg"===e||"image/png"===e||"image/webp"===e?e:null}return{editorState:c,maxMaskId:l.filter(q).reduce((e,t)=>Math.max(e,t.maskId),0),originalImage:null!==(i=l.find(_))&&void 0!==i?i:null,objects:l,jsonString:r}}function _(e){if(q(e))return!1;if("image"===("string"==typeof e.type?e.type.toLowerCase():""))return!0;const t=e.isType;return"function"==typeof t&&t.call(e,"image")}class V{constructor(e,t){Object.defineProperty(this,"execute",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"undo",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.execute=e,this.undo=t}}class J{constructor(e=50){Object.defineProperty(this,"history",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"currentIndex",{enumerable:!0,configurable:!0,writable:!0,value:-1}),Object.defineProperty(this,"isProcessing",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"maxSize",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.maxSize=e}execute(e){e.execute(),this.pushAndTrim(e)}push(e){this.pushAndTrim(e)}canUndo(){return this.currentIndex>=0}canRedo(){return this.currentIndex<this.history.length-1}async undo(){if(!this.isProcessing&&this.canUndo()){this.isProcessing=!0;try{const e=this.history[this.currentIndex];if(!e)return;await e.undo(),this.currentIndex--}finally{this.isProcessing=!1}}}async redo(){if(!this.isProcessing&&this.canRedo()){this.isProcessing=!0;try{const e=this.history[this.currentIndex+1];if(!e)return;await e.execute(),this.currentIndex++}finally{this.isProcessing=!1}}}pushAndTrim(e){this.currentIndex<this.history.length-1&&(this.history=this.history.slice(0,this.currentIndex+1)),this.history.push(e),this.history.length>this.maxSize?this.history.shift():this.currentIndex++}}function K(e){if(null===e||"object"!=typeof e)return!1;return"function"==typeof e.Canvas}function Z(e,t){Object.setPrototypeOf(e,t.prototype)}class ee extends Error{constructor(e="Failed to decode image data URL.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ImageDecodeError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,Z(this,ee)}}class te extends Error{constructor(e,t){super(`Image load timed out after ${t}ms during ${e}`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ImageLoadTimeoutError"}),Object.defineProperty(this,"label",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"elapsedMs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.label=e,this.elapsedMs=t,Z(this,te)}}class ie extends Error{constructor(e="Failed to obtain a 2D context for downsampling.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"DownsampleError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,Z(this,ie)}}class ne extends Error{constructor(e="Failed to merge masks into the image.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"MergeMasksError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,Z(this,ne)}}class ae extends Error{constructor(e="Failed to apply crop to the image.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"CropApplyError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,Z(this,ae)}}class oe extends Error{constructor(e="exportImageFile"){super(`Cannot ${e}: no image is loaded on the canvas.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ExportNotReadyError"}),Object.defineProperty(this,"operation",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.operation=e,Z(this,oe)}}class re extends Error{constructor(e="Failed to export image.",t=null){super(e),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"ExportError"}),Object.defineProperty(this,"originalError",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.originalError=t,Z(this,re)}}const se="#ccc";function le(e){var t;const i=Number(e.originalStrokeWidth);e.set({stroke:null!==(t=e.originalStroke)&&void 0!==t?t:se,strokeWidth:Number.isFinite(i)?i:1})}function ce(e){const t=e,i=()=>{var e;t.set(function(e){const t=Number(e.originalAlpha),i=Number.isFinite(t)?t:.5;return{stroke:"#ff5500",strokeWidth:2,opacity:Math.min(i+.2,1)}}(t)),null===(e=t.canvas)||void 0===e||e.requestRenderAll()},n=()=>{var e;t.set(function(e){var t;const i=Number(e.originalStrokeWidth),n=Number(e.originalAlpha);return{stroke:null!==(t=e.originalStroke)&&void 0!==t?t:se,strokeWidth:Number.isFinite(i)?i:1,opacity:Number.isFinite(n)?n:.5}}(t)),null===(e=t.canvas)||void 0===e||e.requestRenderAll()};t.on("mouseover",i),t.on("mouseout",n),t.imageEditorMaskHandlers={mouseover:i,mouseout:n}}function ue(e){var t;const i=e;if(i.imageEditorMaskHandlers){try{i.off("mouseover",i.imageEditorMaskHandlers.mouseover),i.off("mouseout",i.imageEditorMaskHandlers.mouseout)}catch{}delete i.imageEditorMaskHandlers}const n={};if(!Number.isFinite(Number(i.originalAlpha))){const e=Number(i.opacity);n.originalAlpha=Number.isFinite(e)?e:.5}if(null==i.originalStroke&&(n.originalStroke=null!==(t=i.stroke)&&void 0!==t?t:se),!Number.isFinite(Number(i.originalStrokeWidth))){const e=Number(i.strokeWidth);n.originalStrokeWidth=Number.isFinite(e)?e:1}Object.keys(n).length>0&&i.set(n),ce(i)}function he(e){const t=e;if(t.imageEditorMaskHandlers){try{t.off("mouseover",t.imageEditorMaskHandlers.mouseover),t.off("mouseout",t.imageEditorMaskHandlers.mouseout)}catch{}delete t.imageEditorMaskHandlers}}function de(e){var t,i,n,a,o,r,s;return{object:e,opacity:null!==(t=e.opacity)&&void 0!==t?t:1,fill:null!==(i=e.fill)&&void 0!==i?i:null,strokeWidth:null!==(n=e.strokeWidth)&&void 0!==n?n:0,stroke:null!==(a=e.stroke)&&void 0!==a?a:null,selectable:null===(o=e.selectable)||void 0===o||o,evented:null===(r=e.evented)||void 0===r||r,lockRotation:null!==(s=e.lockRotation)&&void 0!==s&&s}}function me(e){try{e.object.set({opacity:e.opacity,fill:e.fill,strokeWidth:e.strokeWidth,stroke:e.stroke,selectable:e.selectable,evented:e.evented,lockRotation:e.lockRotation}),"function"==typeof e.object.setCoords&&e.object.setCoords()}catch{}}function ge(e){try{e.set({opacity:0,evented:!1,selectable:!1})}catch{}}function pe(e,t,i){const n=Number(e.left),a=Number(e.top),o=Number(e.width),r=Number(e.height);if(!Number.isFinite(n)||!Number.isFinite(a)||!Number.isFinite(o)||!Number.isFinite(r)||o<=0||r<=0)return!1;const s=n+o,l=a+r;if(!Number.isFinite(s)||!Number.isFinite(l))return!1;const c=Number(t),u=Number(i);if(!Number.isFinite(c)||!Number.isFinite(u)||c<=0||u<=0)return!0;const h=Math.min(s,c)-Math.max(n,0),d=Math.min(l,u)-Math.max(a,0);return h>0&&d>0}function fe(e,t,i,n={}){const a=Number.isFinite(e.left)?e.left:0,o=Number.isFinite(e.top)?e.top:0,r=Math.max(0,Number.isFinite(e.width)?e.width:0),s=Math.max(0,Number.isFinite(e.height)?e.height:0),l=!1!==n.includePartialPixels?Math.ceil:Math.floor,c=Number.isFinite(t),u=Number.isFinite(i),h=c?Math.max(1,Math.round(Number(t))):Number.POSITIVE_INFINITY,d=u?Math.max(1,Math.round(Number(i))):Number.POSITIVE_INFINITY,m=Math.min(h-1,Math.max(0,Math.floor(a))),g=Math.min(d-1,Math.max(0,Math.floor(o))),p=Math.min(h,Math.max(m+1,l(a+r))),f=Math.min(d,Math.max(g+1,l(o+s)));return{left:m,top:g,width:Math.max(1,p-m),height:Math.max(1,f-g)}}function be(e){const t=Number(e);return!!Number.isFinite(t)&&Math.abs(t-Math.round(t))>.01}function ve(e,t=0){if(!e)return null;const i=Math.abs((Number(t)||0)%90);if(!(i<.01||Math.abs(i-90)<.01))return null;const n=Number(e.left)||0,a=Number(e.top)||0;return{left:be(n),top:be(a),right:be(n+(Number(e.width)||0)),bottom:be(a+(Number(e.height)||0))}}function ye(e){e.setCoords();const t=e.getBoundingRect();return{left:t.left,top:t.top,width:t.width,height:t.height}}const Me=[6,4],Ce=.92;function Ie(e,t){const i=Number(e);return Number.isFinite(i)?i:t}function ke(e,t){const i=Number(e);if(Number.isFinite(i))return l(i,Ce);const n=Number(t);return Number.isFinite(n)?l(n,Ce):Ce}function we(e,t){for(const e of t.handlers)for(const t of e.handlers)try{e.target.off(t.eventName,t.callback)}catch{}if(t.handlers=[],t.cropRect){try{e.canvas.remove(t.cropRect)}catch{}t.cropRect=null}}function Se(e){for(const t of e.prevEvented)try{t.object.set({evented:t.evented,selectable:t.selectable})}catch{}e.prevEvented=[]}function xe(e,t){we(e,t),Se(t),function(e){for(const t of e.maskBackups)me(t);e.maskBackups=[]}(t);try{e.canvas.selection=!!t.prevSelection}catch{}}function Oe(e,t){const i=ye(e);return i.left<t.left+t.width&&i.left+i.width>t.left&&i.top<t.top+t.height&&i.top+i.height>t.top}function Ee(e){const t=e.getCropSession();if(t){e.canvas.discardActiveObject(),xe(e,t),e.setCropSession(null);try{e.canvas.renderAll()}catch{}}}async function Be(e){var t,i;const n=e.getCropSession();if(!n||!n.cropRect)return;const{canvas:a}=e;a.discardActiveObject();const o=n.beforeJson,l=n.cropRect,c=!!e.options.crop.preserveMasksAfterCrop;try{l.setCoords();const u=Number(l.angle)||0;if(!e.options.crop.allowRotationOfCropRect&&Math.abs(u%360)>.01)throw new ae("applyCrop failed: rotated crop rectangles are disabled.");const h=function(e){const t=Number(e.angle)||0,i=Math.abs(t%360);return i>.01&&Math.abs(i-360)>.01?ye(e):{left:Number(e.left)||0,top:Number(e.top)||0,width:Math.max(0,(Number(e.width)||0)*Math.abs(Number(e.scaleX)||1)),height:Math.max(0,(Number(e.height)||0)*Math.abs(Number(e.scaleY)||1))}}(l);if(!pe(h,a.getWidth(),a.getHeight()))throw new ae("applyCrop failed: crop region is empty or outside the canvas.");const d=fe(h,a.getWidth(),a.getHeight(),{includePartialPixels:!1}),m=c?function(e,t,i=[]){var n;const a=[],o=i.length>0?new Map(i.map(e=>[e.object,e])):null,r=e.getObjects().filter(q);for(const i of r)try{if(i.setCoords(),Oe(i,t)){const e=null!==(n=null==o?void 0:o.get(i))&&void 0!==n?n:de(i);a.push({mask:i,left:Ie(i.left,0),top:Ie(i.top,0),angle:Ie(i.angle,0),scaleX:Ie(i.scaleX,1),scaleY:Ie(i.scaleY,1),styleBackup:e})}e.remove(i)}catch{}return a}(a,d,n.maskBackups):[];Se(n),we(e,n),a.selection=!!n.prevSelection;const g=function(e){var t,i;const n=e.cropExportFileType,a=null==n||"source"===n?null!==(t=function(e){return"image/jpeg"===e?"jpeg":"image/png"===e?"png":"image/webp"===e?"webp":null}(e.currentImageMimeType))&&void 0!==t?t:"png":null!==(i=r(String(n)))&&void 0!==i?i:"png",o=s(a);return"png"===a?{format:a,mimeType:o}:{format:a,mimeType:o,quality:ke(e.cropExportQuality,e.downsampleQuality)}}({cropExportFileType:e.options.crop.exportFileType,currentImageMimeType:null!==(i=null===(t=e.getCurrentImageMimeType)||void 0===t?void 0:t.call(e))&&void 0!==i?i:null,cropExportQuality:e.options.crop.exportQuality,downsampleQuality:e.options.downsampleQuality}),p={format:g.format,multiplier:1,left:d.left,top:d.top,width:d.width,height:d.height};void 0!==g.quality&&(p.quality=g.quality);const f=a.toDataURL(p);await e.loadImage(f),m.length>0&&(!function(e,t,i){var n;if(0===i.length)return;const{canvas:a}=e;let o=0;for(const e of i)try{me(e.styleBackup),e.mask.set({left:e.left-t.left,top:e.top-t.top,angle:e.angle,scaleX:e.scaleX,scaleY:e.scaleY,visible:!0}),e.mask.setCoords(),a.add(e.mask),a.bringObjectToFront(e.mask),ue(e.mask);const i=Number(e.mask.maskId);Number.isFinite(i)&&i>o&&(o=i)}catch{}if("function"==typeof e.getMaskCounter&&"function"==typeof e.setMaskCounter){const t=Number(e.getMaskCounter()),i=Number.isFinite(t)?t:0;e.setMaskCounter(Math.max(i,o))}try{null===(n=e.updateMaskList)||void 0===n||n.call(e)}catch{}}(e,d,m),a.renderAll());const b=e.saveState();e.setCropSession(null),o&&b&&o!==b&&e.historyManager.push(new V(()=>e.loadFromState(b),()=>e.loadFromState(o)))}catch(t){xe(e,n),e.setCropSession(null);try{await e.loadFromState(o)}catch(e){console.warn("[ImageEditor] applyCrop: rollback failed",e)}if(t instanceof ae)throw t;const i=t instanceof Error?`applyCrop failed: ${t.message}`:"applyCrop failed";throw new ae(i,t)}}function Ae(e,t,i,n){if(!(Le(e)&&Le(t)&&Le(i)&&Le(n)))return{width:Math.max(1,Math.round(e)||1),height:Math.max(1,Math.round(t)||1),needsResize:!1};if(!(e>i||t>n))return{width:e,height:t,needsResize:!1};const a=Math.min(i/e,n/t);return{width:Math.max(1,Math.round(e*a)),height:Math.max(1,Math.round(t*a)),needsResize:!0}}function Le(e){return Number.isFinite(e)&&e>0}function je(e){const t=/^data:(image\/[a-z0-9+\-.]+)\s*;/i.exec(e);return t?t[1].toLowerCase():null}function Fe(e,t,i){return new Promise((n,a)=>{const o=Date.now(),r=setTimeout(()=>{a(new te(i,Date.now()-o))},t);e.then(e=>{clearTimeout(r),n(e)},e=>{clearTimeout(r),a(e)})})}function Ne(e,t){const i=Math.hypot(e.a,e.b),n=Math.hypot(e.c,e.d),a=Math.min(i>1e-8?i:Number.POSITIVE_INFINITY,n>1e-8?n:Number.POSITIVE_INFINITY);return!Number.isFinite(a)||a<=0?t:t/a}function Te(e,t,i,n){const a=Number(t.width)||0,o=Number(t.height)||0,r=Number(n);if(a<=0||o<=0||!Number.isFinite(i.x)||!Number.isFinite(i.y)||!Number.isFinite(r)||r<=0)return null;const s=function(e){if(e.length<6)return null;const t=e[0],i=e[1],n=e[2],a=e[3],o=e[4],r=e[5];return Number.isFinite(t)&&Number.isFinite(i)&&Number.isFinite(n)&&Number.isFinite(a)&&Number.isFinite(o)&&Number.isFinite(r)?{a:t,b:i,c:n,d:a,e:o,f:r}:null}(t.calcTransformMatrix());if(!s)return null;const l=function(e){const t=e.a*e.d-e.b*e.c;return!Number.isFinite(t)||Math.abs(t)<1e-8?null:{a:e.d/t,b:-e.b/t,c:-e.c/t,d:e.a/t,e:(e.c*e.f-e.d*e.e)/t,f:(e.b*e.e-e.a*e.f)/t}}(s);if(!l)return null;const c=function(e,t){return{x:t.a*e.x+t.c*e.y+t.e,y:t.b*e.x+t.d*e.y+t.f}}(i,l),u=c.x+a/2,h=c.y+o/2;return u<0||h<0||u>a||h>o?null:{sourceX:u,sourceY:h,sourceRadius:Ne(s,r/2)}}function De(e,t,i,n,a){const o=e-i,r=t-n;return o*o+r*r<=a}function Pe(e,t,i){return 4*(i*e+t)}function Re(e){var t,i,n,a;const{imageData:o}=e,{width:r,height:s,data:l}=o,c=Number(e.centerX),u=Number(e.centerY),h=Number(e.radius);if(!Number.isFinite(c)||!Number.isFinite(u)||!Number.isFinite(h)||h<=0||r<=0||s<=0)return!1;const d=(m=e.blockSize,Number.isFinite(m)&&m>0?Math.max(1,Math.floor(m)):1);var m;const g=Math.max(0,Math.floor(c-h)),p=Math.min(r-1,Math.ceil(c+h)),f=Math.max(0,Math.floor(u-h)),b=Math.min(s-1,Math.ceil(u+h));if(g>p||f>b)return!1;const v=h*h;let y=!1;for(let e=f;e<=b;e+=d)for(let o=g;o<=p;o+=d){const s=Math.min(p,o+d-1),h=Math.min(b,e+d-1);let m=-1;for(let t=e;t<=h&&m<0;t+=1)for(let e=o;e<=s;e+=1)if(De(e,t,c,u,v)){m=Pe(r,e,t);break}if(m<0)continue;const g=null!==(t=l[m])&&void 0!==t?t:0,f=null!==(i=l[m+1])&&void 0!==i?i:0,M=null!==(n=l[m+2])&&void 0!==n?n:0,C=null!==(a=l[m+3])&&void 0!==a?a:0;for(let t=e;t<=h;t+=1)for(let e=o;e<=s;e+=1){if(!De(e,t,c,u,v))continue;const i=Pe(r,e,t);l[i]=g,l[i+1]=f,l[i+2]=M,l[i+3]=C,y=!0}}return y}function ze(e){const t=e;return!!t&&"number"==typeof t.x&&Number.isFinite(t.x)&&"number"==typeof t.y&&Number.isFinite(t.y)}function We(e,t){const i=t;if(ze(i.scenePoint))return i.scenePoint;if(ze(i.pointer))return i.pointer;if(ze(i.absolutePointer))return i.absolutePointer;if(i.e&&"function"==typeof e.getPointer){const t=e.getPointer(i.e);if(ze(t))return t}return null}function Ue(e){try{e.requestRenderAll()}catch{try{e.renderAll()}catch{}}}function He(e,t){var i;const{canvas:n}=e,a=null!==(i=t.previewCircle)&&void 0!==i?i:function(e){var t;const i=e.getMosaicConfig(),n=new e.fabric.Circle({left:0,top:0,radius:i.brushSize/2,originX:"center",originY:"center",fill:i.previewFill,stroke:i.previewStroke,strokeWidth:i.previewStrokeWidth,strokeDashArray:null!==(t=i.previewStrokeDashArray)&&void 0!==t?t:void 0,selectable:!1,evented:!1,excludeFromExport:!0,objectCaching:!1,visible:!1});return n.isMosaicPreview=!0,n}(e);return t.previewCircle=a,n.getObjects().includes(a)||n.add(a),n.bringObjectToFront(a),st(e),a}function Qe(e,t){const i=t.previewCircle;if(i){try{e.canvas.remove(i)}catch{}t.previewCircle=null}}function $e(e,t,i){var n;const a=t.rasterCache;if(!a)return null;const o=null!==(n=t.previewImage)&&void 0!==n?n:function(e,t,i){const n=new e.fabric.FabricImage(i.offscreenCanvas,{selectable:!1,evented:!1,excludeFromExport:!0,objectCaching:!1,visible:!0});return Je(n,t),n.set({selectable:!1,evented:!1,excludeFromExport:!0,objectCaching:!1,visible:!0}),n.isMosaicPreview=!0,n}(e,i,a);t.previewImage=o,Je(o,i),o.set({selectable:!1,evented:!1,excludeFromExport:!0,objectCaching:!1,visible:!0}),o.dirty=!0,e.canvas.getObjects().includes(o)||e.canvas.add(o),function(e,t,i){var n,a;const o=e.canvas.getObjects().indexOf(i);if(!(o<0))try{null===(a=(n=e.canvas).moveObjectTo)||void 0===a||a.call(n,t,o+1)}catch{}}(e,o,i);const r=t.previewCircle;return r&&e.canvas.getObjects().includes(r)&&e.canvas.bringObjectToFront(r),o}function qe(e,t){const i=t.previewImage;if(i){try{e.canvas.remove(i)}catch{}t.previewImage=null}}function Ye(e){var t;const i=null===(t=e.getMosaicSession())||void 0===t?void 0:t.previewCircle;i&&(i.set({visible:!1}),Ue(e.canvas))}function Xe(e,t){const i=e.getMosaicSession();if(!i)return;He(e,i).set({left:t.x,top:t.y,visible:!0}),Ue(e.canvas)}function Ge(e,t,i,n){e.canvas.on(i,n),t.handlers.push({eventName:i,callback:n})}function _e(e){var t;const i=e;try{const e=null===(t=i.getSrc)||void 0===t?void 0:t.call(i);if("string"==typeof e&&e.length>0)return e}catch{}return"string"==typeof i.src&&i.src.length>0?i.src:null}function Ve(e){const t=Number(e);return Number.isFinite(t)&&t>0?Math.floor(t):0}function Je(e,t){e.set({left:t.left,top:t.top,scaleX:t.scaleX,scaleY:t.scaleY,angle:t.angle,skewX:t.skewX,skewY:t.skewY,flipX:t.flipX,flipY:t.flipY,originX:t.originX,originY:t.originY,selectable:t.selectable,evented:t.evented,hasControls:t.hasControls,hoverCursor:t.hoverCursor}),e.setCoords()}async function Ke(e,t,i){if(t.rasterCache)return t.rasterCache;const a=function(e){var t,i,n,a,o;const r=null===(i=(t=e.canvas).getElement)||void 0===i?void 0:i.call(t);return null!==(o=null!==(n=null==r?void 0:r.ownerDocument)&&void 0!==n?n:null===(a=e.canvas.lowerCanvasEl)||void 0===a?void 0:a.ownerDocument)&&void 0!==o?o:document}(e),o=await function(e,t){return new Promise((i,n)=>{const a=e.createElement("img"),o=()=>{"function"==typeof a.removeEventListener?(a.removeEventListener("load",r),a.removeEventListener("error",s)):(a.onload=null,a.onerror=null)},r=()=>{const e=Ve(a.naturalWidth||a.width),t=Ve(a.naturalHeight||a.height);o(),e<=0||t<=0?n(new Error("Mosaic image decode failed: source image has no dimensions.")):i({element:a,width:e,height:t})},s=e=>{o(),n(new Error("string"==typeof e?`Mosaic image decode failed: ${e}`:"Mosaic image decode failed."))};t.startsWith("data:")||(a.crossOrigin="anonymous"),"function"==typeof a.addEventListener?(a.addEventListener("load",r,{once:!0}),a.addEventListener("error",s,{once:!0})):(a.onload=r,a.onerror=s),a.src=t})}(a,i),r=a.createElement("canvas");r.width=o.width,r.height=o.height;const s=r.getContext("2d");if(!s)return n(e.options,new Error("Mosaic could not obtain a 2D canvas context."),"Mosaic apply failed."),null;let l;s.drawImage(o.element,0,0,o.width,o.height);try{l=s.getImageData(0,0,o.width,o.height)}catch(t){return n(e.options,t,"Mosaic apply failed because the source image pixels could not be read."),null}const c={offscreenCanvas:r,renderingContext:s,imageData:l,source:i,width:o.width,height:o.height};return t.rasterCache=c,c}function Ze(e,t,i,n){const a=t.rasterCache;if(!a)return!1;const o=e.getMosaicConfig(),r=t.lastImagePoint,s=r?function(e,t){const i=t.sourceX-e.sourceX,n=t.sourceY-e.sourceY,a=Math.hypot(i,n),o=Math.min(e.sourceRadius,t.sourceRadius),r=Math.max(1,o/2),s=Math.max(1,Math.ceil(a/r)),l=[];for(let a=1;a<=s;a+=1){const o=a/s;l.push({sourceX:e.sourceX+i*o,sourceY:e.sourceY+n*o,sourceRadius:e.sourceRadius+(t.sourceRadius-e.sourceRadius)*o})}return l}(r,n):[n];let l=!1;for(const e of s)l=Re({imageData:a.imageData,centerX:e.sourceX,centerY:e.sourceY,radius:e.sourceRadius,blockSize:o.blockSize})||l;return t.lastImagePoint=n,l&&(t.hasUncommittedChanges=!0,a.renderingContext.putImageData(a.imageData,0,0),$e(e,t,i),Ue(e.canvas)),l}async function et(e,t,n){const a=e.getMosaicSession();if(!a||a!==t)return;const o=e.getOriginalImage();if(!o||!e.isImageLoaded())return;const r=e.getMosaicConfig(),s=Te(e.fabric,o,n,r.brushSize);if(!s)return void(a.lastImagePoint=null);const l=_e(o);if(!l)return void i(e.options,new Error("Mosaic cannot read the current image source."),"Mosaic skipped because the image source is unavailable.");await Ke(e,a,l)&&Ze(e,a,o,s)}async function tt(e,t,i){var n;if(t.commitRequested=!1,t.lastImagePoint=null,!t.hasUncommittedChanges||!t.rasterCache)return;const a=e.getOriginalImage();if(!a||!e.isImageLoaded())return;const o=null!==(n=_e(a))&&void 0!==n?n:t.rasterCache.source,l=t.rasterCache;l.renderingContext.putImageData(l.imageData,0,0);const c=function(e,t){var i,n,a,o;const l=e.getMosaicConfig(),c=l.outputFileType,u="source"===c?function(e){return"image/jpeg"===e?"jpeg":"image/webp"===e?"webp":"png"}(null!==(n=null!==(i=e.getCurrentImageMimeType())&&void 0!==i?i:function(e){return"image/jpeg"===e||"image/png"===e||"image/webp"===e?e:null}(je(t)))&&void 0!==n?n:"image/png"):null!==(a=r(String(c)))&&void 0!==a?a:"png",h=s(u);return"png"===u?{mimeType:h}:{mimeType:h,quality:null!==(o=l.outputQuality)&&void 0!==o?o:e.options.downsampleQuality}}(e,o),u=void 0===c.quality?l.offscreenCanvas.toDataURL(c.mimeType):l.offscreenCanvas.toDataURL(c.mimeType,c.quality),h=await async function(e,t){return await Fe(e.fabric.FabricImage.fromURL(t,{crossOrigin:"anonymous"}),e.options.imageLoadTimeoutMs,"Mosaic FabricImage.fromURL")}(e,u);Qe(e,t),qe(e,t);try{!function(e,t,i,n){const{canvas:a}=e;let o=!1,r=!1;try{Je(i,t),a.remove(t),o=!0,a.add(i),r=!0,a.sendObjectToBack(i),e.setOriginalImage(i),e.setCurrentImageMimeType(n),a.renderAll()}catch(n){try{r&&a.remove(i),o&&!a.getObjects().includes(t)&&(a.add(t),a.sendObjectToBack(t)),e.setOriginalImage(t)}catch{}throw n}}(e,a,h,c.mimeType);const i=e.captureSnapshot();!function(e,t){var i;const n=null!==(i=e.getLastSnapshot())&&void 0!==i?i:t;n&&t&&n!==t&&(e.historyManager.push(new V(async()=>{await e.loadFromState(t)},async()=>{await e.loadFromState(n)})),e.setLastSnapshot(t))}(e,i),l.source=u,t.hasUncommittedChanges=!1}finally{e.getMosaicSession()===t&&He(e,t)}e.updateInputs(),e.updateUi(),e.emitImageChanged(i)}async function it(e,t){const i=e.getMosaicSession();if(!i||i!==t||i.isApplying)return;i.isApplying=!0;const a=e.buildCallbackContext("applyMosaic",!1);e.emitBusyChangeIfChanged(a),e.updateUi();try{for(;e.getMosaicSession()===i&&i.pendingCanvasPoints.length>0;){const t=i.pendingCanvasPoints.shift();t&&await et(e,i,t)}e.getMosaicSession()===i&&i.commitRequested&&await tt(e,i,a)}finally{e.getMosaicSession()===i&&(i.isApplying=!1),e.emitBusyChangeIfChanged(a),e.updateUi(),e.getMosaicSession()===i&&(i.pendingCanvasPoints.length>0||i.commitRequested)&&it(e,i).catch(t=>{n(e.options,t,"Mosaic apply failed.")})}}function nt(e,t){const i=e.getMosaicSession();i&&(i.pendingCanvasPoints.push(t),i.pendingCanvasPoints.length>4096&&i.pendingCanvasPoints.splice(0,i.pendingCanvasPoints.length-4096),it(e,i).catch(t=>{n(e.options,t,"Mosaic apply failed.")}))}function at(e,t){t.commitRequested=!0,it(e,t).catch(t=>{n(e.options,t,"Mosaic apply failed.")})}function ot(e){if(e.getMosaicSession())return;if(!e.isImageLoaded()||!e.getOriginalImage())return;const{canvas:t}=e;e.hideAllMaskLabels(),t.discardActiveObject();const i=!!t.selection,n=t.defaultCursor,a=t.getObjects().map(e=>{var t,i;return{object:e,evented:null===(t=e.evented)||void 0===t||t,selectable:null===(i=e.selectable)||void 0===i||i}});for(const e of a)try{e.object.set({evented:!1,selectable:!1})}catch{}t.selection=!1,t.defaultCursor="crosshair";const o={previewCircle:null,previewImage:null,prevSelection:i,prevDefaultCursor:n,prevObjectStates:a,handlers:[],rasterCache:null,pendingCanvasPoints:[],isPointerDown:!1,isApplying:!1,commitRequested:!1,hasUncommittedChanges:!1,lastImagePoint:null};e.setMosaicSession(o),He(e,o),function(e,t){Ge(e,t,"mouse:move",t=>{const i=We(e.canvas,t);if(!i)return void Ye(e);Xe(e,i);const n=e.getMosaicSession();(null==n?void 0:n.isPointerDown)&&nt(e,i)}),Ge(e,t,"mouse:out",()=>{Ye(e);const t=e.getMosaicSession();(null==t?void 0:t.isPointerDown)&&(t.isPointerDown=!1,at(e,t))}),Ge(e,t,"mouse:down",t=>{const i=We(e.canvas,t);if(!i)return;const n=e.getMosaicSession();n&&(n.isPointerDown=!0,n.lastImagePoint=null,nt(e,i))}),Ge(e,t,"mouse:up",t=>{const i=e.getMosaicSession();if(!i)return;const n=We(e.canvas,t);n&&(Xe(e,n),nt(e,n)),i.isPointerDown=!1,at(e,i)})}(e,o),t.renderAll()}function rt(e){var t;const i=e.getMosaicSession();i&&(!function(e,t){for(const i of t.handlers)try{e.canvas.off(i.eventName,i.callback)}catch{}t.handlers=[]}(e,i),Qe(e,i),qe(e,i),function(e){for(const t of e.prevObjectStates)try{t.object.set({evented:t.evented,selectable:t.selectable})}catch{}e.prevObjectStates=[]}(i),e.canvas.selection=!!i.prevSelection,e.canvas.defaultCursor=null!==(t=i.prevDefaultCursor)&&void 0!==t?t:"default",e.setMosaicSession(null),e.canvas.renderAll())}function st(e){var t;const i=e.getMosaicSession(),n=null==i?void 0:i.previewCircle;if(!i||!n)return;const a=e.getMosaicConfig();n.set({radius:a.brushSize/2,fill:a.previewFill,stroke:a.previewStroke,strokeWidth:a.previewStrokeWidth,strokeDashArray:null!==(t=a.previewStrokeDashArray)&&void 0!==t?t:void 0}),e.canvas.bringObjectToFront(n),Ue(e.canvas)}function lt(e,t){const i=Number(e);if(Number.isFinite(i)&&i>0)return i;const n=Number(t);return Number.isFinite(n)&&n>0?n:1}function ct(e,t,i){const n=e,a=n[t],o="function"==typeof a?a.call(n):n[i];return Math.max(1,Math.ceil(Number.isFinite(o)?Number(o):1))}async function ut(e,t,i){return t?async function(e,t,i){if(!e.canvas)return await i();const n=e.canvas.getObjects().filter(q),a=n.map(de);try{return n.forEach((e,i)=>t(e,i)),await i()}finally{for(const e of a)me(e)}}({canvas:e.canvas,options:e.options},mt,i):async function(e,t){const i=ht(e.canvas).filter(q).map(e=>({mask:e,visible:e.visible}));for(const e of i)try{"function"==typeof e.mask.set?e.mask.set({visible:!1}):e.mask.visible=!1}catch{}try{return await t()}finally{for(const e of i)try{"function"==typeof e.mask.set?e.mask.set({visible:e.visible}):e.mask.visible=e.visible}catch{}}}(e,i)}function ht(e){try{return e.getObjects()}catch{return[]}}function dt(e,t){return ht(e).includes(t)}function mt(e){try{e.set({opacity:1,fill:"#000",strokeWidth:0,stroke:null,selectable:!1}),"function"==typeof e.setCoords&&e.setCoords()}catch{}}function gt(e){return{width:Math.max(1,e.naturalWidth||e.width||1),height:Math.max(1,e.naturalHeight||e.height||1)}}function pt(e){return new Promise((t,i)=>{const n=new Image;n.crossOrigin="anonymous";const a=()=>{"function"==typeof n.removeEventListener?(n.removeEventListener("load",o),n.removeEventListener("error",r)):(n.onload=null,n.onerror=null)},o=()=>{a(),t(n)},r=()=>{a(),i(new Error("Failed to decode export data URL"))};"function"==typeof n.addEventListener?(n.addEventListener("load",o,{once:!0}),n.addEventListener("error",r,{once:!0})):(n.onload=o,n.onerror=r),n.src=e})}function ft(e){return function(e,t="#ffffff"){const i=String(null!=e?e:"").trim();if(!i||function(e){const t=e.trim().toLowerCase();if("transparent"===t)return!0;const i=t.match(/^#([0-9a-f]{4}|[0-9a-f]{8})$/i);if(i){const e=i[1],t=4===e.length?e[3]:e.slice(6,8);return/^0+$/.test(t)}const n=t.match(/^(?:rgba|hsla)\((.*),\s*([^,/)]+)\)$/i);if(n&&bt(n[2]))return!0;const a=t.match(/^[a-z][a-z0-9-]*\([^/]+\/\s*([^)]+)\)$/i);return!(!a||!bt(a[1]))}(i))return"#ffffff";const n=function(){try{return"undefined"==typeof document||"function"!=typeof document.createElement?null:document.createElement("canvas").getContext("2d")}catch{return null}}();if(!n)return t;n.fillStyle="#000001";const a=n.fillStyle;n.fillStyle=i;const o=n.fillStyle;if(o!==a)return o;n.fillStyle="#000002";const r=n.fillStyle;n.fillStyle=i;const s=n.fillStyle;return s!==r?s:t}(e)}function bt(e){const t=e.trim();if(t.endsWith("%")){const e=Number.parseFloat(t.slice(0,-1));return Number.isFinite(e)&&0===e}const i=Number.parseFloat(t);return Number.isFinite(i)&&0===i}function vt(e){console.warn(`[ImageEditor] ${e} skipped: no image is loaded on the canvas.`)}async function yt(e,t){if(!e.isImageLoaded())return vt("exportImageBase64"),"";const i=function(e){var t;try{const i=e;return"function"!=typeof i.getActiveObject?null:null!==(t=i.getActiveObject())&&void 0!==t?t:null}catch{return null}}(e.canvas),n=function(e){const t=[];for(const i of ht(e)){if(!q(i))continue;const n=i.labelObject;if(!n)continue;const a=dt(e,n);t.push({mask:i,label:n,wasOnCanvas:a,visible:n.visible});try{"function"==typeof n.set&&n.set({visible:!1}),a&&e.remove(n)}catch{}}return t}(e.canvas);try{e.canvas.discardActiveObject();const i=function(e,t){const i=null!=t?t:{};return{exportArea:(n=i.exportArea,a=e.options.exportAreaByDefault,"canvas"===n||"image"===n?n:"canvas"===a?"canvas":"image"),mergeMask:"boolean"==typeof i.mergeMask?i.mergeMask:e.options.mergeMaskByDefault,multiplier:lt(i.multiplier,e.options.exportMultiplier),format:c(i,e.options.downsampleQuality)};var n,a}(e,t),{region:n,partialEdges:a}=function(e,t){if("canvas"===t)return{region:null,partialEdges:null};const i=e.getOriginalImage();if(!i)return{region:null,partialEdges:null};const n=ye(i),a=e.canvas,o="function"==typeof a.getWidth?a.getWidth():a.width,r="function"==typeof a.getHeight?a.getHeight():a.height;if(!pe(n,o,r))throw new re("exportImageBase64 failed: image export region is empty.");return{region:fe(n,o,r,{includePartialPixels:!0}),partialEdges:ve(n,Number(i.angle)||0)}}(e,i.exportArea);!function(e,t,i){var n,a;const o=null!==(n=null==i?void 0:i.width)&&void 0!==n?n:ct(e.canvas,"getWidth","width"),r=null!==(a=null==i?void 0:i.height)&&void 0!==a?a:ct(e.canvas,"getHeight","height"),s=Math.max(1,Math.ceil(o*t)),l=Math.max(1,Math.ceil(r*t)),c=s*l,u=e.options.maxExportPixels;if(!Number.isFinite(c)||c>u)throw new RangeError(`[ImageEditor] Export size ${s}x${l} (${c} pixels) exceeds maxExportPixels (${u}).`)}(e,i.multiplier,n);const o=n&&"jpeg"===i.format.format?"png":i.format.format,r="png"===o?void 0:i.format.quality;let s=await ut(e,i.mergeMask,async()=>function(e,t,i,n,a){const o={format:t,multiplier:n};return void 0!==i&&(o.quality=i),a&&(o.left=a.left,o.top=a.top,o.width=a.width,o.height=a.height),e.toDataURL(o)}(e.canvas,o,r,i.multiplier,n));if(n){const t="jpeg"===i.format.format?{format:"png",mimeType:"image/png",quality:void 0}:i.format;s=await async function(e,t,i){if(!function(e){return!!e&&(e.left||e.top||e.right||e.bottom)}(t))return e;const n=await pt(e),{width:a,height:o}=gt(n),r=document.createElement("canvas");r.width=a,r.height=o;const s=r.getContext("2d");if(!s)throw new Error("2D canvas context is unavailable");s.drawImage(n,0,0,a,o);const l=s.getImageData(0,0,a,o),c=l.data,u=(e,t,i,n)=>{var o,r,s,l,u,h;const d=4*(t*a+e),m=4*(n*a+i),g=null!==(o=c[d+3])&&void 0!==o?o:0,p=null!==(r=c[m+3])&&void 0!==r?r:0;0===g&&p>0&&(c[d]=null!==(s=c[m])&&void 0!==s?s:0,c[d+1]=null!==(l=c[m+1])&&void 0!==l?l:0,c[d+2]=null!==(u=c[m+2])&&void 0!==u?u:0,c[d+3]=p);const f=null!==(h=c[d+3])&&void 0!==h?h:0;f>0&&f<255&&(c[d+3]=255)};if((null==t?void 0:t.left)&&a>1)for(let e=0;e<o;e+=1)u(0,e,1,e);if((null==t?void 0:t.right)&&a>1)for(let e=0;e<o;e+=1)u(a-1,e,a-2,e);if((null==t?void 0:t.top)&&o>1)for(let e=0;e<a;e+=1)u(e,0,e,1);if((null==t?void 0:t.bottom)&&o>1)for(let e=0;e<a;e+=1)u(e,o-1,e,o-2);return s.putImageData(l,0,0),void 0===i.quality?r.toDataURL(i.mimeType):r.toDataURL(i.mimeType,i.quality)}(s,a,t),"jpeg"===i.format.format&&(s=await async function(e,t,i){const n=await pt(e),{width:a,height:o}=gt(n),r=document.createElement("canvas");r.width=a,r.height=o;const s=r.getContext("2d");if(!s)throw new Error("2D canvas context is unavailable");return s.fillStyle=ft(t),s.fillRect(0,0,a,o),s.drawImage(n,0,0,a,o),r.toDataURL("image/jpeg",i)}(s,e.options.backgroundColor,i.format.quality))}return s}finally{!function(e,t){for(const i of t)try{i.mask.labelObject=i.label,"function"==typeof i.label.set?i.label.set({visible:i.visible}):i.label.visible=i.visible,i.wasOnCanvas&&!dt(e,i.label)&&(e.add(i.label),e.bringObjectToFront(i.label))}catch{}}(e.canvas,n),function(e,t){if(t)try{const i=e;"function"==typeof i.setActiveObject&&i.setActiveObject(t)}catch{}}(e.canvas,i),function(e){try{"function"==typeof e.requestRenderAll?e.requestRenderAll():e.renderAll()}catch{}}(e.canvas)}}async function Mt(e,t){var i;if(!e.isImageLoaded())throw vt("exportImageFile"),new oe("exportImageFile");const n=null!=t?t:{},a=null!==(i=n.fileName)&&void 0!==i?i:e.options.defaultDownloadFileName,o=c(n,e.options.downsampleQuality),r=await yt(e,{exportArea:n.exportArea,mergeMask:n.mergeMask,multiplier:n.multiplier,quality:n.quality,fileType:n.fileType});if(!r)throw new oe("exportImageFile");const s=await async function(e,t,i){if(e.startsWith(`data:${t.mimeType}`))return e;const n=await pt(e),{width:a,height:o}=gt(n),r=document.createElement("canvas");r.width=a,r.height=o;const s=r.getContext("2d");if(!s)throw new Error("Unable to acquire 2D context for export conversion");return"jpeg"===t.format&&(s.fillStyle=ft(i),s.fillRect(0,0,a,o)),s.drawImage(n,0,0,a,o),r.toDataURL(t.mimeType,t.quality)}(r,o,e.options.backgroundColor);let l;try{l=function(e){var t;const i=/^data:image\/[a-z0-9.+-]+;base64,([A-Za-z0-9+/=]+)$/i.exec(e),n=null!==(t=null==i?void 0:i[1])&&void 0!==t?t:"";if(!n)throw new Error("exportImageFile received a malformed or empty image data URL.");if("function"==typeof globalThis.atob){const e=globalThis.atob(n),t=new ArrayBuffer(e.length),i=new Uint8Array(t);for(let t=e.length-1;t>=0;t-=1)i[t]=e.charCodeAt(t);return i}const a=globalThis.Buffer;if(a&&"function"==typeof a.from){const e=a.from(n,"base64"),t=new ArrayBuffer(e.length),i=new Uint8Array(t);return i.set(e),i}throw new Error("No base64 decoder is available for exportImageFile.")}(s)}catch(e){throw new re("exportImageFile failed to decode rendered data URL.",e)}return new File([l],a,{type:o.mimeType})}function Ct(e,t){if(!e.isImageLoaded())return void vt("downloadImage");const i=null!=t?t:e.options.defaultDownloadFileName;yt(e,{exportArea:e.options.exportAreaByDefault,mergeMask:e.options.mergeMaskByDefault,multiplier:e.options.exportMultiplier}).then(t=>{if(!t)return;const n=function(e){var t,i,n,a,o;const r=e;return null!==(o=null!==(n=null===(i=null===(t=r.getElement)||void 0===t?void 0:t.call(r))||void 0===i?void 0:i.ownerDocument)&&void 0!==n?n:null===(a=r.lowerCanvasEl)||void 0===a?void 0:a.ownerDocument)&&void 0!==o?o:document}(e.canvas),a=n.createElement("a");a.download=i,a.href=t;const o=n.body;o.appendChild(a);try{a.click()}finally{o.removeChild(a)}}).catch(t=>{n(e.options,t,"downloadImage failed."),console.error("[ImageEditor] downloadImage failed",t)})}class It{constructor(){Object.defineProperty(this,"lastVisible",{enumerable:!0,configurable:!0,writable:!0,value:null})}measure(e,t,i){var n;if(!e)return t;const a=Math.floor(e.clientWidth),o=Math.floor(e.clientHeight);return a>0&&o>0?(this.lastVisible=function(e,t,i){if(!e)return t;const n=Math.floor(e.clientWidth||0),a=Math.floor(e.clientHeight||0);if(n<=0||a<=0)return t;const o=function(e){var t,i;const n=e.style;let a="",o="",r="";const s=null!==(i=null===(t=e.ownerDocument)||void 0===t?void 0:t.defaultView)&&void 0!==i?i:"undefined"==typeof window?null:window;if("function"==typeof(null==s?void 0:s.getComputedStyle)){const t=s.getComputedStyle(e);a=t.overflow,o=t.overflowX,r=t.overflowY}const l=[wt(null==n?void 0:n.overflow),wt(null==n?void 0:n.overflowX),wt(a),wt(o)],c=[wt(null==n?void 0:n.overflow),wt(null==n?void 0:n.overflowY),wt(a),wt(r)];return{x:l,y:c,all:[...l,...c]}}(e);if(o.all.includes("scroll"))return{width:n,height:a};const r=Ot(i),s=o.x.some(St),l=o.y.some(St),c=Math.ceil(e.scrollWidth||0),u=Math.ceil(e.scrollHeight||0),h=s&&c>n+kt;return{width:n+(l&&u>a+kt?r.width:0),height:a+(h?r.height:0)}}(e,t,i),this.lastVisible):null!==(n=this.lastVisible)&&void 0!==n?n:t}peek(){return this.lastVisible}clear(){this.lastVisible=null}}const kt=.5;function wt(e){return String(null!=e?e:"").trim().toLowerCase()}function St(e){return"auto"===e||"overlay"===e}function xt(e){const t=null!=e?e:"undefined"==typeof document?null:document;if(!(null==t?void 0:t.body))return{width:0,height:0};const i=t.createElement("div");i.style.position="absolute",i.style.left="-9999px",i.style.top="-9999px",i.style.width="100px",i.style.height="100px",i.style.overflow="scroll",i.style.visibility="hidden",i.style.pointerEvents="none",t.body.appendChild(i);const n=Math.max(0,i.offsetWidth-i.clientWidth),a=Math.max(0,i.offsetHeight-i.clientHeight);return i.remove(),{width:n,height:a}}function Ot(e){return{width:Math.max(0,Number(null==e?void 0:e.width)||0),height:Math.max(0,Number(null==e?void 0:e.height)||0)}}function Et(e,t,i,n){const a=Math.max(1,i.width||1),o=Math.max(1,i.height||1),r=Ot(n);let s=!1,l=!1;for(let i=0;i<4;i+=1){const i=Math.max(1,a-(l?r.width:0)),n=Math.max(1,o-(s?r.height:0)),c=e>i+kt,u=t>n+kt;if(c===s&&u===l)break;s=c,l=u}const c=Math.max(1,a-(l?r.width:0)),u=Math.max(1,o-(s?r.height:0));return{width:s?Math.ceil(e):c,height:l?Math.ceil(t):u}}function Bt(e,t,i,n){const a=Math.max(1,Math.round(Number(t)||1)),o=Math.max(1,Math.round(Number(i)||1));var r;e.setDimensions({width:a,height:o}),(r=n)&&r.offsetWidth}async function At(e,t,a={}){if("string"!=typeof t||!t.startsWith("data:image/"))return;const o={placeholderHidden:e.placeholderElement?!!e.placeholderElement.hidden:null,containerScrollTop:e.containerElement?e.containerElement.scrollTop:null,containerScrollLeft:e.containerElement?e.containerElement.scrollLeft:null,originalImage:e.getOriginalImage(),isImageLoadedToCanvas:e.getIsImageLoadedToCanvas(),lastSnapshot:e.getLastSnapshot(),canvasJson:Ft(e.canvas),maskCounter:e.getMaskCounter(),currentScale:e.getCurrentScale(),currentRotation:e.getCurrentRotation(),baseImageScale:e.getBaseImageScale(),currentImageMimeType:e.getCurrentImageMimeType()};try{e.setPlaceholderVisible(!1);const n=function(e){const t=new Image,i=(e=!1)=>{"function"==typeof t.removeEventListener?(t.removeEventListener("load",n),t.removeEventListener("error",a)):(t.onload=null,t.onerror=null),e&&(t.src="")},n=()=>{if(!function(e){return Number.isFinite(e.naturalWidth)&&Number.isFinite(e.naturalHeight)&&e.naturalWidth>0&&e.naturalHeight>0}(t))return i(!0),void r(new ee("Failed to decode image data URL: image has no natural dimensions.",null));i(!1),o(t)},a=e=>{i(!0),r(new ee("Failed to decode image data URL.",e))};let o,r;const s=new Promise((i,s)=>{o=i,r=s,"function"==typeof t.addEventListener?(t.addEventListener("load",n,{once:!0}),t.addEventListener("error",a,{once:!0})):(t.onload=n,t.onerror=a),t.src=e});return{promise:s,cleanup:i}}(t);let r;try{r=await Fe(n.promise,e.options.imageLoadTimeoutMs,"image decode")}catch(e){throw n.cleanup(!0),e}const s=function(e,t,n,a){const o=jt(je(t));if(!n.downsampleOnLoad)return{dataUrl:t,mimeType:o};if(!Lt(n.downsampleMaxWidth)||!Lt(n.downsampleMaxHeight))return i(n,null,"loadImage skipped downsampling because downsample bounds are invalid."),{dataUrl:t,mimeType:o};const r=Ae(e.naturalWidth,e.naturalHeight,n.downsampleMaxWidth,n.downsampleMaxHeight);if(!r.needsResize)return{dataUrl:t,mimeType:o};const s=je(t),l=function(e,t,i,n,a,o,r,s){var l;const{width:c,height:u}=Ae(e.naturalWidth,e.naturalHeight,t,i),h=function(e,t,i){return i||(!t||"image/png"!==e&&"image/webp"!==e?"image/jpeg":e)}(n,a,o),d=null!==(l=null!=s?s:e.ownerDocument)&&void 0!==l?l:"undefined"!=typeof document?document:null;if(!d)throw new ie("Failed to obtain an owner document for downsampling.");const m=d.createElement("canvas");m.width=c,m.height=u;const g=m.getContext("2d");if(!g)throw new ie("Failed to obtain a 2D context for downsampling.");return g.drawImage(e,0,0,e.naturalWidth,e.naturalHeight,0,0,c,u),{dataUrl:"image/png"===h?m.toDataURL(h):m.toDataURL(h,r),width:c,height:u,mimeType:h}}(e,n.downsampleMaxWidth,n.downsampleMaxHeight,s,n.preserveSourceFormat,n.downsampleMimeType,n.downsampleQuality,a),c=jt(je(l.dataUrl));return{dataUrl:l.dataUrl,mimeType:null!=c?c:l.mimeType}}(r,t,e.options,function(e){var t,i,n,a,o;const r=e;return null!==(o=null!==(n=null===(i=null===(t=r.getElement)||void 0===t?void 0:t.call(r))||void 0===i?void 0:i.ownerDocument)&&void 0!==n?n:null===(a=r.lowerCanvasEl)||void 0===a?void 0:a.ownerDocument)&&void 0!==o?o:"undefined"!=typeof document?document:void 0}(e.canvas)),l=await Fe(e.fabric.FabricImage.fromURL(s.dataUrl,{crossOrigin:"anonymous"}),e.options.imageLoadTimeoutMs,"FabricImage.fromURL");e.canvas.discardActiveObject(),e.canvas.clear(),e.canvas.backgroundColor=e.options.backgroundColor,l.set({originX:"left",originY:"top",selectable:!1,evented:!1});const c=function(e,t){var i,n,a,o;const r=null!==(i=t.width)&&void 0!==i?i:0,s=null!==(n=t.height)&&void 0!==n?n:0,l=xt(null!==(o=null===(a=e.containerElement)||void 0===a?void 0:a.ownerDocument)&&void 0!==o?o:null),c=e.viewportCache.measure(e.containerElement,{width:e.options.canvasWidth,height:e.options.canvasHeight},l),u=e.options.layoutMode;if("fit"===u)return function(e,t,i,n,a){const o=Math.max(1,(a.width||i)-1),r=Math.max(1,(a.height||n)-1),s=Math.min(o/e,r/t,1);return{canvasWidth:o,canvasHeight:r,imageScale:s,imageLeft:0,imageTop:0,baseImageScale:s}}(r,s,e.options.canvasWidth,e.options.canvasHeight,c);if("cover"===u)return function(e,t,i,n,a,o){const r=a.width||i,s=a.height||n,l=Ot(o);let c=!1,u=!1,h=1,d=e,m=t;for(let i=0;i<4;i+=1){const i=Math.max(1,r-(u?l.width:0)),n=Math.max(1,s-(c?l.height:0));h=Math.min(1,Math.max(i/e,n/t)),d=e*h,m=t*h;const a=d>i+kt,o=m>n+kt;if(a===c&&o===u)break;c=a,u=o}const g=Et(d,m,{width:r,height:s},l);return{canvasWidth:g.width,canvasHeight:g.height,imageScale:h,imageLeft:0,imageTop:0,baseImageScale:h}}(r,s,e.options.canvasWidth,e.options.canvasHeight,c,l);return function(e,t,i,n,a){return{canvasWidth:Math.max(a.width,Math.floor(e)),canvasHeight:Math.max(a.height,Math.floor(t)),imageScale:1,imageLeft:0,imageTop:0,baseImageScale:1}}(r,s,e.options.canvasWidth,e.options.canvasHeight,c)}(e,l);if(Bt(e.canvas,c.canvasWidth,c.canvasHeight,e.containerElement),l.set({left:c.imageLeft,top:c.imageTop}),l.scale(c.imageScale),e.canvas.add(l),e.canvas.sendObjectToBack(l),e.setOriginalImage(l),e.setBaseImageScale(c.baseImageScale),e.setCurrentScale(1),e.setCurrentRotation(0),e.setMaskCounter(0),e.setIsImageLoadedToCanvas(!0),e.setCurrentImageMimeType(s.mimeType),e.canvas.renderAll(),e.setLastSnapshot(X({canvas:e.canvas,currentScale:1,currentRotation:0,baseImageScale:c.baseImageScale,currentImageMimeType:s.mimeType})),!0===a.preserveScroll&&e.containerElement)try{null!==o.containerScrollTop&&(e.containerElement.scrollTop=o.containerScrollTop),null!==o.containerScrollLeft&&(e.containerElement.scrollLeft=o.containerScrollLeft)}catch(e){console.warn("[ImageEditor] preserveScroll restore failed",e)}}catch(t){await async function(e,t){try{await e.canvas.loadFromJSON(JSON.parse(t.canvasJson)),e.canvas.renderAll()}catch(e){console.warn("[ImageEditor] rollback: loadFromJSON failed",e)}if(e.setOriginalImage(t.originalImage),e.setIsImageLoadedToCanvas(t.isImageLoadedToCanvas),e.setLastSnapshot(t.lastSnapshot),e.setMaskCounter(t.maskCounter),e.setCurrentScale(t.currentScale),e.setCurrentRotation(t.currentRotation),e.setBaseImageScale(t.baseImageScale),e.setCurrentImageMimeType(t.currentImageMimeType),e.containerElement)try{null!==t.containerScrollTop&&(e.containerElement.scrollTop=t.containerScrollTop),null!==t.containerScrollLeft&&(e.containerElement.scrollLeft=t.containerScrollLeft)}catch(e){console.warn("[ImageEditor] rollback: scroll restore failed",e)}null!==t.placeholderHidden&&e.setPlaceholderVisible(!t.placeholderHidden)}(e,o);const i=t instanceof Error?`loadImage failed: ${t.message}`:"loadImage failed";throw n(e.options,t,i),t}}function Lt(e){return Number.isFinite(e)&&e>0}function jt(e){return"image/jpeg"===e||"image/png"===e||"image/webp"===e?e:null}function Ft(e){e.discardActiveObject();const t=e.toJSON(Y);return JSON.stringify(t)}function Nt(e,t,i,n){return new Promise((a,o)=>{const r=Object.keys(t).length;if(0===r||n.isDisposed())return void a();let s=0,l=!1,c=[],u=null,h=null;const d=()=>{null!==u&&(clearTimeout(u),u=null),null==h||h(),h=null},m=()=>{l||(l=!0,d(),a())},g=()=>{for(const e of c)try{e()}catch{}m()},p=Number.isFinite(i.duration)?Math.max(0,i.duration):0;u=setTimeout(g,p+1e3),h=n.registerAnimationAborter(g);try{const a=e.animate(t,{duration:i.duration,onChange:()=>{var e;n.isDisposed()||null===(e=i.onChange)||void 0===e||e.call(i)},onComplete:()=>{++s>=r&&m()}});c=function(e){const t=Array.isArray(e)?e:e&&"object"==typeof e?Object.values(e):[e];return t.flatMap(e=>{const t=null==e?void 0:e.abort;return"function"==typeof t?[()=>t.call(e)]:[]})}(a)}catch(e){(e=>{l||(l=!0,d(),o(e))})(e)}})}class Tt{constructor(e){Object.defineProperty(this,"context",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.context=e}async scaleImage(e){if(!Number.isFinite(e))return;const t=this.context.getOriginalImage();if(!t)return;if(this.context.guard.isAnimating())return;if(this.context.guard.isDisposed())return;const i=Math.max(this.context.options.minScale,Math.min(this.context.options.maxScale,e));this.context.setCurrentScale(i);const n=this.context.getBaseImageScale()*i;try{const e=Dt(t);t.set({originX:"left",originY:"top"}),t.setPositionByOrigin(e,"left","top"),t.setCoords()}catch(e){console.warn("[ImageEditor] scaleImage: origin pre-anchor failed",e)}try{await this.context.guard.runAnimation(()=>Nt(t,{scaleX:n,scaleY:n},{duration:this.context.options.animationDuration,onChange:()=>this.context.canvas.requestRenderAll()},this.context.guard))}catch(e){return void console.warn("[ImageEditor] scaleImage animation error",e)}this.context.guard.isDisposed()||(t.set({scaleX:n,scaleY:n}),t.setCoords(),this.context.afterTransformSnap&&this.context.afterTransformSnap(),this.context.saveCanvasState())}async rotateImage(e){if(!Number.isFinite(e))return;const t=this.context.getOriginalImage();if(!t)return;if(this.context.guard.isAnimating())return;if(this.context.guard.isDisposed())return;this.context.setCurrentRotation(e);try{const e=t.getCenterPoint();t.set({originX:"center",originY:"center"}),t.setPositionByOrigin(e,"center","center"),t.setCoords()}catch(e){console.warn("[ImageEditor] rotateImage: origin pre-anchor failed",e)}let i=!1;try{await this.context.guard.runAnimation(()=>Nt(t,{angle:e},{duration:this.context.options.animationDuration,onChange:()=>this.context.canvas.requestRenderAll()},this.context.guard))}catch(e){i=!0,console.warn("[ImageEditor] rotateImage animation error",e)}finally{this.context.guard.isDisposed()&&function(e,t,i){try{e.set({originX:t,originY:i}),e.setCoords()}catch{}}(t,"left","top")}if(!i&&!this.context.guard.isDisposed()){t.set("angle",e),t.setCoords(),this.context.afterTransformSnap&&this.context.afterTransformSnap();try{const e=Dt(t);t.set({originX:"left",originY:"top"}),t.setPositionByOrigin(e,"left","top"),t.setCoords()}catch(e){console.warn("[ImageEditor] rotateImage: origin post-restore failed",e)}this.context.saveCanvasState()}}async resetImageTransform(){if(this.context.getOriginalImage()){this.context.setSuppressSaveState(!0);try{await this.scaleImage(1),await this.rotateImage(0)}finally{this.context.setSuppressSaveState(!1)}this.context.guard.isDisposed()||this.context.saveCanvasState()}}}function Dt(e){e.setCoords();const t=e.getCoords()[0];if(t)return t;const i=e.getBoundingRect();return{x:i.left,y:i.top}}function Pt(e,t,i,n,a){if("number"==typeof e)return e;if("function"==typeof e)return e(n,a);if("string"==typeof e&&e.endsWith("%")){const a=parseFloat(e);if(!Number.isFinite(a))return i;const o="x"===t?n.getWidth():n.getHeight();return Math.floor(o*(a/100))}return i}function Rt(e){return Array.isArray(e)?{x:Number(e[0]),y:Number(e[1])}:{x:Number(e.x),y:Number(e.y)}}function zt(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function Wt(e,t){i(e,null,`createMask skipped: ${t}.`)}function Ut(e){return void 0===e||("number"==typeof e?Number.isFinite(e):"function"==typeof e||!("string"!=typeof e||!e.endsWith("%"))&&Number.isFinite(Number.parseFloat(e)))}function Ht(e){return"number"==typeof e&&Number.isFinite(e)}function Qt(e,t,i){return!!Ht(i)||(Wt(e,`${t} must resolve to a finite number`),!1)}function $t(e,t,i){return!!(Ht(i)&&i>0)||(Wt(e,`${t} must resolve to a positive number`),!1)}function qt(e,t,i){return!!(Ht(i)&&i>=0)||(Wt(e,`${t} must resolve to a non-negative number`),!1)}function Yt(e,t){if(!Array.isArray(t)||t.length<3)return Wt(e,"polygon masks require at least three points"),null;const i=t.map(Rt);return i.every(e=>Number.isFinite(e.x)&&Number.isFinite(e.y))?function(e){let t=0;for(let i=0;i<e.length;i+=1){const n=e[i],a=e[(i+1)%e.length];t+=n.x*a.y-a.x*n.y}return Math.abs(t)/2}(i)<=1e-6?(Wt(e,"polygon points must describe a non-zero area"),null):i:(Wt(e,"polygon points must contain finite x/y values"),null)}function Xt(e,t={}){var n,a,o,r,s,l,c,u,h,d,m,g,p,f,b,v;const{canvas:y,options:M,fabric:C}=e;if(!y)return null;const I=function(e,t){const i={...e},n=i.styles;delete i.onCreate,delete i.fabricGenerator,delete i.styles;const a=zt(t.styles)?t.styles:{},o=zt(n)?n:{};return{...i,...t,styles:{...o,...a}}}(M.defaultMaskConfig,t),k=null!==(n=I.shape)&&void 0!==n?n:"rect";if(!function(e,t){const i=[["width",t.width],["height",t.height],["rx",t.rx],["ry",t.ry],["radius",t.radius],["left",t.left],["top",t.top]];for(const[t,n]of i)if(!Ut(n))return Wt(e,`${t} is not a supported numeric value`),!1;return!0}(M,I))return null;const w={width:M.defaultMaskWidth,height:M.defaultMaskHeight,color:"rgba(0,0,0,0.5)",alpha:.5,gap:5,left:void 0,top:void 0,angle:0,selectable:!0,...I,shape:k};let S,x;const O=e.getLastMask();if(void 0===I.left&&O){const e=(null!==(a=O.left)&&void 0!==a?a:0)+("function"==typeof O.getScaledWidth?O.getScaledWidth():(null!==(o=O.width)&&void 0!==o?o:0)*(null!==(r=O.scaleX)&&void 0!==r?r:1));S=Math.round(e+(null!==(s=w.gap)&&void 0!==s?s:5)),x=null!==(l=O.top)&&void 0!==l?l:10}else S=Pt(I.left,"x",10,y,M),x=Pt(I.top,"y",10,y,M);w.width=Pt(I.width,"x",M.defaultMaskWidth,y,M),w.height=Pt(I.height,"y",M.defaultMaskHeight,y,M);const E=void 0!==I.rx?Pt(I.rx,"x",0,y,M):void 0,B=void 0!==I.ry?Pt(I.ry,"y",0,y,M):void 0,A="circle"===k?Pt(I.radius,"x",Math.min(w.width,w.height)/2,y,M):void 0,L="polygon"===k?Yt(M,I.points):null;if(!(Qt(M,"left",S)&&Qt(M,"top",x)&&$t(M,"width",w.width)&&$t(M,"height",w.height)&&Qt(M,"gap",w.gap)&&Qt(M,"angle",w.angle)&&Qt(M,"alpha",w.alpha)))return null;if(void 0!==E&&!qt(M,"rx",E)||void 0!==B&&!qt(M,"ry",B)||void 0!==A&&!$t(M,"radius",A)||"polygon"===k&&null===L)return null;if("expand"===M.layoutMode){const t=Math.ceil(S+w.width+10),i=Math.ceil(x+w.height+10),n=Math.max(y.getWidth(),t),a=Math.max(y.getHeight(),i);n===y.getWidth()&&a===y.getHeight()||(e.expandCanvasIfNeeded?e.expandCanvasIfNeeded(n,a):y.setDimensions({width:n,height:a}))}let j;if("function"==typeof t.fabricGenerator){const e=t.fabricGenerator(w,y,M);if(!function(e){if(!e||"object"!=typeof e)return!1;const t=e;return"function"==typeof t.set&&"function"==typeof t.on}(e))return i(M,e,"createMask skipped: fabricGenerator did not return a Fabric object."),null;j=e}else{const e={originX:"left",originY:"top"};switch(k){case"circle":j=new C.Circle({left:S,top:x,...e,radius:A,fill:w.color,opacity:w.alpha,angle:null!==(c=w.angle)&&void 0!==c?c:0,...w.styles});break;case"ellipse":j=new C.Ellipse({left:S,top:x,...e,rx:null!=E?E:w.width/2,ry:null!=B?B:w.height/2,fill:w.color,opacity:w.alpha,angle:null!==(u=w.angle)&&void 0!==u?u:0,...w.styles});break;case"polygon":{const t=new C.Polygon(L,{...e,fill:w.color,opacity:w.alpha,angle:null!==(h=w.angle)&&void 0!==h?h:0,...w.styles});t.setCoords();const i=t.getBoundingRect(),n=S-i.left,a=x-i.top;t.set({left:(null!==(d=t.left)&&void 0!==d?d:0)+n,top:(null!==(m=t.top)&&void 0!==m?m:0)+a}),t.setCoords(),j=t;break}default:j=new C.Rect({left:S,top:x,...e,width:w.width,height:w.height,fill:w.color,opacity:w.alpha,angle:null!==(g=w.angle)&&void 0!==g?g:0,...void 0!==E?{rx:E}:{},...void 0!==B?{ry:B}:{},...w.styles})}}const F=j;F.selectable=!("selectable"in I)||!!I.selectable,F.evented=!("evented"in I)||!!I.evented,F.hasControls=!("hasControls"in I)||!!I.hasControls,F.transparentCorners="transparentCorners"in I&&!!I.transparentCorners,F.strokeUniform=!("strokeUniform"in I)||!!I.strokeUniform,F.lockRotation=!M.maskRotatable,F.borderColor=null!==(p=I.borderColor)&&void 0!==p?p:"red",F.cornerColor=null!==(f=I.cornerColor)&&void 0!==f?f:"black",F.cornerSize=null!==(b=I.cornerSize)&&void 0!==b?b:8;const N=null!==(v=w.styles)&&void 0!==v?v:{};F.stroke="stroke"in N?N.stroke:"#ccc",F.strokeWidth="strokeWidth"in N?N.strokeWidth:1,"strokeDashArray"in N&&(F.strokeDashArray=N.strokeDashArray),F.originalAlpha=w.alpha,F.originalStroke=F.stroke,F.originalStrokeWidth=F.strokeWidth,ce(F);const T=e.getMaskCounter()+1;if(e.setMaskCounter(T),F.maskId=T,F.maskUid=`mask-${T}`,F.maskName=`${M.maskName}${T}`,e.setLastMask(F),y.add(F),y.bringObjectToFront(F),e.updateMaskList(),!1!==w.selectable&&y.setActiveObject(F),y.renderAll(),e.saveCanvasState(),"function"==typeof t.onCreate)try{t.onCreate(F,y)}catch(e){i(M,e,"createMask onCreate callback threw.")}return F}function Gt(e,t={}){const i=e.canvas.getObjects().filter(q);if(0!==i.length){for(const t of i)e.removeLabelForMask(t),he(t),e.canvas.remove(t);e.canvas.discardActiveObject(),e.setLastMask(null),e.updateMaskList(),e.canvas.renderAll(),!1!==t.saveHistory&&e.saveCanvasState()}}function _t(e,t){if(e.canvas&&t.labelObject){try{e.canvas.getObjects().includes(t.labelObject)&&e.canvas.remove(t.labelObject)}catch{}try{delete t.labelObject}catch{}}}function Vt(e,t){var n;const{canvas:a,options:o,fabric:r}=e;if(!a||!o.maskLabelOnSelect)return;_t(e,t);let s=null;if("function"==typeof o.label.create)try{s=o.label.create(t,r)}catch(e){i(o,e,"label.create callback threw."),s=null}if(!s){const e=t.maskId-1;let a=t.maskName;if("function"==typeof o.label.getText)try{a=o.label.getText(t,e)}catch(e){i(o,e,"label.getText callback threw."),a=t.maskName}const l={left:0,top:0,...null!==(n=o.label.textOptions)&&void 0!==n?n:{},originX:"left",originY:"top"};s=new r.FabricText(a,l)}s.maskLabel=!0,t.labelObject=s,a.add(s),a.bringObjectToFront(s),Jt(e,t)}function Jt(e,t){var i,n,a;const{canvas:o,options:r}=e;if(!o||!r.maskLabelOnSelect||!t.labelObject)return;const s=null===(i=t.getCoords)||void 0===i?void 0:i.call(t);if(!(null==s?void 0:s.length))return;const l=s[0];if(!l)return;const c=t.getCenterPoint(),u=c.x-l.x,h=c.y-l.y,d=Math.sqrt(u*u+h*h)||1,m=Math.max(0,null!==(n=r.maskLabelOffset)&&void 0!==n?n:3);t.labelObject.set({left:Math.round(l.x+u/d*m),top:Math.round(l.y+h/d*m),angle:null!==(a=t.angle)&&void 0!==a?a:0,originX:"left",originY:"top",visible:!0}),t.labelObject.setCoords(),o.renderAll()}function Kt(e){var t,i,n,a,o;const r=e.canvas;return null!==(o=null!==(n=null===(i=null===(t=null==r?void 0:r.getElement)||void 0===t?void 0:t.call(r))||void 0===i?void 0:i.ownerDocument)&&void 0!==n?n:null===(a=null==r?void 0:r.lowerCanvasEl)||void 0===a?void 0:a.ownerDocument)&&void 0!==o?o:document}class Zt{constructor(e,t,i=()=>document){Object.defineProperty(this,"registry",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"resolveElementId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isDisposed",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"resolveDocument",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.resolveElementId=e,this.isDisposed=t,this.resolveDocument=i}bindIfExists(e,t,i){const n=this.resolveElementId(e);if(!n)return!1;const a=this.resolveDocument().getElementById(n);if(!a)return!1;const o=e=>{this.isDisposed()||i(e)};return a.addEventListener(t,o),this.registry.push({elementKey:e,eventType:t,handler:o}),!0}removeAll(){for(const e of this.registry){const t=this.resolveElementId(e.elementKey);if(!t)continue;const i=this.resolveDocument().getElementById(t);if(i)try{i.removeEventListener(e.eventType,e.handler)}catch{}}this.registry=[]}size(){return this.registry.length}}function ei(e,t,i){e&&(e.hidden=!i,e.setAttribute("aria-hidden",i?"false":"true")),t&&(t.hidden=i,t.setAttribute("aria-hidden",i?"true":"false"))}const ti={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",webp:"image/webp",gif:"image/gif",bmp:"image/bmp"},ii=new Set(Object.values(ti));function ni(e){if(e)try{e.value=""}catch{}}const ai=.5,oi=Symbol("ImageEditorInternalOperation"),ri=Symbol("ImageEditorAllowDuringAnimationQueue"),si=["scalePercentageInput","rotateLeftDegreesInput","rotateRightDegreesInput","rotateLeftButton","rotateRightButton","createMaskButton","removeSelectedMaskButton","removeAllMasksButton","mergeMasksButton","downloadImageButton","zoomInButton","zoomOutButton","resetImageTransformButton","undoButton","redoButton","imageInput","enterCropModeButton","applyCropButton","cancelCropButton","enterMosaicModeButton","exitMosaicModeButton","mosaicBrushSizeInput","mosaicBlockSizeInput"],li=["applyCropButton","cancelCropButton"],ci=new Set(["applyCrop","cancelCrop"]),ui=["scalePercentageInput","rotateLeftDegreesInput","rotateRightDegreesInput","rotateLeftButton","rotateRightButton","createMaskButton","removeSelectedMaskButton","removeAllMasksButton","mergeMasksButton","downloadImageButton","zoomInButton","zoomOutButton","resetImageTransformButton","undoButton","redoButton","imageInput","enterCropModeButton","applyCropButton","cancelCropButton","enterMosaicModeButton","exitMosaicModeButton","mosaicBrushSizeInput","mosaicBlockSizeInput"],hi=["exitMosaicModeButton","mosaicBrushSizeInput","mosaicBlockSizeInput"],di=new Set(["exitMosaicMode","applyMosaic","setMosaicConfig","resetMosaicConfig","setMosaicBrushSize","setMosaicBlockSize","saveState"]),mi=new Set(["init","loadImage","loadFromState","saveState","scaleImage","rotateImage","resetImageTransform","createMask","removeSelectedMask","removeAllMasks","mergeMasks","enterCropMode","applyCrop","cancelCrop","enterMosaicMode","exitMosaicMode","applyMosaic","setMosaicConfig","resetMosaicConfig","setMosaicBrushSize","setMosaicBlockSize","undo","redo","exportImageBase64","exportImageFile","downloadImage","dispose"]);class gi{constructor(e={},n={}){var a;Object.defineProperty(this,"fabricModule",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isFabricLoaded",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"currentLayoutMode",{enumerable:!0,configurable:!0,writable:!0,value:"expand"}),Object.defineProperty(this,"defaultMosaicConfig",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"currentMosaicConfig",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"canvas",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"canvasElement",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"containerElement",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"placeholderElement",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"elements",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"elementOriginalDisabledMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"elementOriginalAriaDisabledMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"elementOriginalPointerEventsMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"originalImage",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"baseImageScale",{enumerable:!0,configurable:!0,writable:!0,value:1}),Object.defineProperty(this,"currentScale",{enumerable:!0,configurable:!0,writable:!0,value:1}),Object.defineProperty(this,"currentRotation",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"isImageLoadedToCanvas",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"currentImageMimeType",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"maskCounter",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"lastMask",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"lastSnapshot",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"historyManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"operationGuard",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"animQueue",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"transformController",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"viewportCache",{enumerable:!0,configurable:!0,writable:!0,value:new It}),Object.defineProperty(this,"cropSession",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"mosaicSession",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"domBindings",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"isDisposed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"shouldSuppressSaveState",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"lastEmittedIsBusy",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"activeStateRestoreOperation",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"nextSelectionChangeContext",{enumerable:!0,configurable:!0,writable:!0,value:null});const o=function(e,t,i=globalThis){var n;if(K(e))return{fabric:e,isFabricLoaded:!0,options:null!=t?t:{}};const a=null!==(n=e)&&void 0!==n?n:{},o=function(e){return e.fabric}(i);return K(o)?{fabric:o,isFabricLoaded:!0,options:a}:(console.error("[ImageEditor] fabric.js v7 is not available. Pass it as the first constructor argument (ESM) or load it as a global <script> before instantiation."),{fabric:null,isFabricLoaded:!1,options:a})}(e,n);this.fabricModule=null!==(a=o.fabric)&&void 0!==a?a:{},this.isFabricLoaded=o.isFabricLoaded,this.options=Q(o.options),this.currentLayoutMode=this.options.layoutMode,this.defaultMosaicConfig=this.options.defaultMosaicConfig,this.currentMosaicConfig=W(this.defaultMosaicConfig);const r=o.options.defaultLayoutMode;void 0===r||S(r)||i(this.options,new TypeError(`[ImageEditor] Unsupported defaultLayoutMode ${JSON.stringify(r)}. Expected "fit", "cover", or "expand".`),'Invalid defaultLayoutMode fell back to "expand".'),this.operationGuard=new $,this.animQueue=new t,this.historyManager=new J(this.options.maxHistorySize)}init(e={}){if(!this.isFabricLoaded){const e=globalThis.fabric;if(!e||"function"!=typeof e.Canvas)return;this.fabricModule=e,this.isFabricLoaded=!0}if(this.isDisposed)return;this.elements={canvas:"canvas",canvasContainer:null,imagePlaceholder:"imagePlaceholder",scalePercentageInput:"scalePercentageInput",rotateLeftDegreesInput:"rotateLeftDegreesInput",rotateRightDegreesInput:"rotateRightDegreesInput",rotateLeftButton:"rotateLeftButton",rotateRightButton:"rotateRightButton",createMaskButton:"createMaskButton",removeSelectedMaskButton:"removeSelectedMaskButton",removeAllMasksButton:"removeAllMasksButton",mergeMasksButton:"mergeMasksButton",downloadImageButton:"downloadImageButton",maskList:"maskList",zoomInButton:"zoomInButton",zoomOutButton:"zoomOutButton",resetImageTransformButton:"resetImageTransformButton",undoButton:"undoButton",redoButton:"redoButton",imageInput:"imageInput",enterCropModeButton:"enterCropModeButton",applyCropButton:"applyCropButton",cancelCropButton:"cancelCropButton",enterMosaicModeButton:"enterMosaicModeButton",exitMosaicModeButton:"exitMosaicModeButton",mosaicBrushSizeInput:"mosaicBrushSizeInput",mosaicBlockSizeInput:"mosaicBlockSizeInput",uploadArea:"uploadArea",...e},this.domBindings=new Zt(e=>this.elements[e],()=>this.isDisposed,()=>{var e,t;return null!==(t=null===(e=this.canvasElement)||void 0===e?void 0:e.ownerDocument)&&void 0!==t?t:document}),this.initCanvas(),this.transformController=new Tt(this.buildTransformContext()),this.bindDomEvents(),this.updateInputs(),this.updateMaskList(),this.updateUi(),this.options.initialImageBase64?this.loadImage(this.options.initialImageBase64).catch(()=>{}):this.updatePlaceholderStatus()}initCanvas(){var e;const t=this.elements.canvas,i=t?document.getElementById(t):null;if(!i)throw new Error(`[ImageEditor] Canvas element not found: "${t}"`);this.canvasElement=i;const n=this.elements.canvasContainer;this.containerElement=n&&null!==(e=document.getElementById(n))&&void 0!==e?e:i.parentElement;const a=this.elements.imagePlaceholder;this.placeholderElement=a?document.getElementById(a):null;let o=this.options.canvasWidth,r=this.options.canvasHeight;if(this.containerElement){const e=Math.floor(this.containerElement.clientWidth),t=Math.floor(this.containerElement.clientHeight);e>0&&t>0&&(o=e,r=t)}this.canvas=new this.fabricModule.Canvas(i,{width:o,height:r,backgroundColor:this.options.backgroundColor,selection:this.options.groupSelection,preserveObjectStacking:!0}),this.canvas.on("selection:created",e=>{this.handleSelectionChanged(e.selected)}),this.canvas.on("selection:updated",e=>{this.handleSelectionChanged(e.selected)}),this.canvas.on("selection:cleared",()=>this.handleSelectionChanged([]));const s=e=>{e.target&&q(e.target)&&this.syncMaskLabel(e.target)};this.canvas.on("object:moving",s),this.canvas.on("object:scaling",s),this.canvas.on("object:rotating",s),this.canvas.on("object:modified",e=>{e.target&&q(e.target)&&(this.syncMaskLabel(e.target),this.saveState())})}bindDomEvents(){this.bindElementIfExists("uploadArea","click",()=>{var e;const t=this.elements.imageInput;t&&(null===(e=document.getElementById(t))||void 0===e||e.click())}),this.bindElementIfExists("imageInput","change",e=>{var t;const i=null===(t=e.target.files)||void 0===t?void 0:t[0];i&&this.loadImageFile(i)}),this.bindElementIfExists("zoomInButton","click",()=>{this.scaleImage(this.currentScale+this.options.scaleStep)}),this.bindElementIfExists("zoomOutButton","click",()=>{this.scaleImage(this.currentScale-this.options.scaleStep)}),this.bindElementIfExists("resetImageTransformButton","click",()=>{this.resetImageTransform()}),this.bindElementIfExists("createMaskButton","click",()=>{this.createMask()}),this.bindElementIfExists("removeSelectedMaskButton","click",()=>{this.removeSelectedMask()}),this.bindElementIfExists("removeAllMasksButton","click",()=>{this.removeAllMasks()}),this.bindElementIfExists("mergeMasksButton","click",()=>{this.mergeMasks()}),this.bindElementIfExists("downloadImageButton","click",()=>{this.downloadImage()}),this.bindElementIfExists("undoButton","click",()=>{this.undo()}),this.bindElementIfExists("redoButton","click",()=>{this.redo()}),this.bindElementIfExists("rotateLeftButton","click",()=>{const e=this.elements.rotateLeftDegreesInput,t=e?document.getElementById(e):null;let i=this.options.rotationStep;if(t){const e=parseFloat(t.value);isNaN(e)||(i=e)}this.rotateImage(this.currentRotation-i)}),this.bindElementIfExists("rotateRightButton","click",()=>{const e=this.elements.rotateRightDegreesInput,t=e?document.getElementById(e):null;let i=this.options.rotationStep;if(t){const e=parseFloat(t.value);isNaN(e)||(i=e)}this.rotateImage(this.currentRotation+i)}),this.bindElementIfExists("enterCropModeButton","click",()=>{this.enterCropMode()}),this.bindElementIfExists("applyCropButton","click",()=>{this.applyCrop().catch(e=>{n(this.options,e,"Crop apply failed.")})}),this.bindElementIfExists("cancelCropButton","click",()=>{this.cancelCrop()}),this.bindElementIfExists("enterMosaicModeButton","click",()=>{this.enterMosaicMode()}),this.bindElementIfExists("exitMosaicModeButton","click",()=>{this.exitMosaicMode()});const e=(e,t)=>{const i=e=>{const i=parseFloat(e.target.value);t(i)};this.bindElementIfExists(e,"input",i),this.bindElementIfExists(e,"change",i)};e("mosaicBrushSizeInput",e=>{this.setMosaicBrushSize(e)}),e("mosaicBlockSizeInput",e=>{this.setMosaicBlockSize(e)})}bindElementIfExists(e,t,i){var n;null===(n=this.domBindings)||void 0===n||n.bindIfExists(e,t,i)}async loadImageFile(e){const t=this.elements.imageInput,a=t?document.getElementById(t):null,o=function(e){var t,i;if(e.type&&ii.has(e.type))return e.type;if(e.type)return null;const n=/\.([a-z0-9]+)$/i.exec(e.name),a=null===(t=null==n?void 0:n[1])||void 0===t?void 0:t.toLowerCase();return a&&null!==(i=ti[a])&&void 0!==i?i:null}(e);if(!o)return i(this.options,null,`Unsupported image file type: ${e.type||e.name||"unknown"}.`),void ni(a);let r;try{r=await function(e){return new Promise((t,i)=>{const n=new FileReader;n.onload=()=>{const e=n.result;"string"==typeof e?t(e):i(new Error("FileReader returned a non-string result"))},n.onerror=()=>{var e;i(null!==(e=n.error)&&void 0!==e?e:new Error("FileReader error"))},n.onabort=()=>{i(new Error("FileReader read aborted"))},n.readAsDataURL(e)})}(e)}catch(e){return n(this.options,e,"Failed to read selected image file."),void ni(a)}try{await this.loadImage(r)}catch{}finally{ni(a)}}async loadImage(e,t={}){return this.loadImageInternal(e,t)}async loadImageInternal(e,t={}){if(!this.isFabricLoaded||!this.canvas)return;if(this.isDisposed)return;if("string"!=typeof e||!e.startsWith("data:image/"))return;if(!this.canRunIdleOperation("loadImage",t))return;const i=this.getOperationContext("loadImage",t),n=this.originalImage,a=this.getMasks().length>0;this.emitOptionCallback("onImageLoadStart",[i]),this.operationGuard.beginLoading(),this.emitBusyChangeIfChanged(i),this.updateUi(),this.hideAllMaskLabels();const o={fabric:this.fabricModule,canvas:this.canvas,options:this.getRuntimeOptions(),containerElement:this.containerElement,placeholderElement:this.placeholderElement,viewportCache:this.viewportCache,getOriginalImage:()=>this.originalImage,setOriginalImage:e=>{this.originalImage=e},getIsImageLoadedToCanvas:()=>this.isImageLoadedToCanvas,setIsImageLoadedToCanvas:e=>{this.isImageLoadedToCanvas=e},getLastSnapshot:()=>this.lastSnapshot,setLastSnapshot:e=>{this.lastSnapshot=e},getMaskCounter:()=>this.maskCounter,setMaskCounter:e=>{this.maskCounter=e},getCurrentScale:()=>this.currentScale,setCurrentScale:e=>{this.currentScale=e},getCurrentRotation:()=>this.currentRotation,setCurrentRotation:e=>{this.currentRotation=e},getBaseImageScale:()=>this.baseImageScale,setBaseImageScale:e=>{this.baseImageScale=e},getCurrentImageMimeType:()=>this.currentImageMimeType,setCurrentImageMimeType:e=>{this.currentImageMimeType=e},setPlaceholderVisible:e=>{ei(this.placeholderElement,this.containerElement,!!this.options.showPlaceholder&&e)}};try{await At(o,e,t)}finally{this.operationGuard.endLoading(),this.emitBusyChangeIfChanged(i),!this.isDisposed&&this.canvas&&this.updateUi()}this.lastMask=null,this.updateInputs(),this.updateMaskList(),this.updateUi(),n&&n!==this.originalImage&&this.emitOptionCallback("onImageCleared",[n,i]);const r=this.getImageInfo();r&&this.emitOptionCallback("onImageLoaded",[r,i]),a&&this.emitMasksChanged(i),this.emitImageChanged(i)}getInternalOperationToken(e){var t;return null!==(t=null==e?void 0:e[oi])&&void 0!==t?t:null}canRunDuringAnimationQueue(e){return!!(null==e?void 0:e[ri])}withInternalOperationOptions(e,t={}){return{...t,...e?{[oi]:e}:{}}}withAnimationQueueBypass(e={}){return{...e,[ri]:!0}}assertIdleForOperation(e,t){const i=this.getInternalOperationToken(t);if(this.operationGuard.assertIdleForOperation(e,i),this.cropSession&&!this.operationGuard.isOwnOperation(i)&&!ci.has(e))throw new Error(`[ImageEditor] Cannot run "${e}" while crop mode is active.`);if(this.mosaicSession&&!this.operationGuard.isOwnOperation(i)&&!di.has(e))throw new Error(`[ImageEditor] Cannot run "${e}" while mosaic mode is active.`);if(this.animQueue.isBusy()&&!this.canRunDuringAnimationQueue(t))throw new Error(`[ImageEditor] Cannot run "${e}" while an animation is queued.`)}canRunIdleOperation(e,t){try{return this.assertIdleForOperation(e,t),!0}catch(t){if(!this.isExpectedIdleGuardError(t,e))throw t;return!1}}isExpectedIdleGuardError(e,t){return e instanceof Error&&e.message.startsWith(`[ImageEditor] Cannot run "${t}" `)}assertCanQueueAnimation(e,t){this.operationGuard.assertCanQueueAnimation(e,this.getInternalOperationToken(t))}isImageLoaded(){var e,t;return!!(this.originalImage&&this.originalImage instanceof this.fabricModule.FabricImage&&(null!==(e=this.originalImage.width)&&void 0!==e?e:0)>0&&(null!==(t=this.originalImage.height)&&void 0!==t?t:0)>0)}isBusy(){return this.operationGuard.isBusy()||this.animQueue.isBusy()||null!==this.cropSession||null!==this.mosaicSession}setLayoutMode(e){S(e)?this.currentLayoutMode=e:i(this.options,new TypeError(`[ImageEditor] Unsupported layout mode ${JSON.stringify(e)}. Expected "fit", "cover", or "expand".`),"Ignored invalid layout mode.")}getRuntimeOptions(){return this.currentLayoutMode===this.options.layoutMode?this.options:Object.freeze({...this.options,layoutMode:this.currentLayoutMode})}buildCallbackContext(e,t=!1){return{operation:e,isInternalOperation:t}}getOperationContext(e,t){const i=this.getInternalOperationToken(t),n=this.operationGuard.activeOperationName();return i&&n?this.buildCallbackContext(null!==(a=n)&&mi.has(a)?n:e,!0):this.buildCallbackContext(e,!1);var a}emitOptionCallback(e,t){const i=this.options[e];if("function"==typeof i)try{i(...t)}catch(t){console.error(`[ImageEditor] ${e} callback threw`,t)}}getImageInfo(){if(!this.canvas||!this.originalImage)return null;const e=this.canvas.getWidth(),t=this.canvas.getHeight();let i,n;try{this.originalImage.setCoords();const e=this.originalImage.getBoundingRect();i=Math.max(0,Number(e.width)||0),n=Math.max(0,Number(e.height)||0)}catch{i=Math.max(0,(Number(this.originalImage.width)||0)*Math.abs(Number(this.originalImage.scaleX)||1)),n=Math.max(0,(Number(this.originalImage.height)||0)*Math.abs(Number(this.originalImage.scaleY)||1))}return{width:Math.max(0,Number(this.originalImage.width)||0),height:Math.max(0,Number(this.originalImage.height)||0),displayWidth:i,displayHeight:n,scale:this.currentScale,rotation:this.currentRotation,canvasWidth:e,canvasHeight:t}}getMasks(){return this.canvas?this.canvas.getObjects().filter(q).slice():[]}getMaskCollectionSignature(){return this.getMasks().map(e=>`${e.maskId}:${e.maskName}`).join("|")}getEditorState(){const e=this.canvas?this.canvas.getWidth():0,t=this.canvas?this.canvas.getHeight():0,i=this.getImageInfo();return{hasImage:null!==i,image:i,maskCount:this.getMasks().length,currentScale:this.currentScale,currentRotation:this.currentRotation,isBusy:this.isBusy(),isCropMode:null!==this.cropSession,isMosaicMode:null!==this.mosaicSession,canUndo:this.historyManager.canUndo(),canRedo:this.historyManager.canRedo(),canvasWidth:e,canvasHeight:t}}emitImageChanged(e){this.emitOptionCallback("onImageChanged",[this.getEditorState(),e])}emitMasksChanged(e){this.emitOptionCallback("onMasksChanged",[this.getMasks(),e])}emitBusyChangeIfChanged(e){const t=this.isBusy();this.lastEmittedIsBusy!==t&&(this.lastEmittedIsBusy=t,this.emitOptionCallback("onBusyChange",[t,e]))}buildSelection(e){var t;const i=e.filter(q);return{selectedMask:null!==(t=i[0])&&void 0!==t?t:null,selectedMasks:i}}withSelectionChangeContext(e,t){const i=this.nextSelectionChangeContext;this.nextSelectionChangeContext=e;try{return t()}finally{this.nextSelectionChangeContext=i}}isSupportedImageMimeType(e){return"image/jpeg"===e||"image/png"===e||"image/webp"===e}inferCurrentImageMimeType(){const e=this.originalImage;if(!e)return null;let t=null;try{"function"==typeof e.getSrc?t=e.getSrc():"string"==typeof e.src&&(t=e.src)}catch{t=null}const i=t?je(t):null;return this.isSupportedImageMimeType(i)?i:null}setCanvasSizePx(e,t){this.canvas&&Bt(this.canvas,e,t,this.containerElement)}alignObjectBoundingBoxToCanvasTopLeft(e){var t,i;e.setCoords();const n=e.getBoundingRect();e.set({left:(null!==(t=e.left)&&void 0!==t?t:0)-n.left,top:(null!==(i=e.top)&&void 0!==i?i:0)-n.top}),e.setCoords(),this.canvas.renderAll()}measureLayoutViewport(e){return this.viewportCache.measure(this.containerElement,{width:this.options.canvasWidth,height:this.options.canvasHeight},e)}updateCanvasSizeToImageBounds(){var e,t;if(!this.originalImage)return;this.originalImage.setCoords();const i=this.originalImage.getBoundingRect(),n=xt(null!==(t=null===(e=this.containerElement)||void 0===e?void 0:e.ownerDocument)&&void 0!==t?t:null),a=this.measureLayoutViewport(n);if("fit"===this.currentLayoutMode||"cover"===this.currentLayoutMode){const e=Et(i.width,i.height,a,n);return void this.setCanvasSizePx(e.width,e.height)}i.width<=a.width&&i.height<=a.height?this.setCanvasSizePx(a.width,a.height):this.setCanvasSizePx(Math.max(a.width,Math.ceil(i.width)),Math.max(a.height,Math.ceil(i.height)))}shouldNormalizeCanvasSizeAfterStateRestore(){var e,t;if(!this.canvas||!this.originalImage)return!1;this.originalImage.setCoords();const i=this.originalImage.getBoundingRect(),n=this.measureLayoutViewport(xt(null!==(t=null===(e=this.containerElement)||void 0===e?void 0:e.ownerDocument)&&void 0!==t?t:null)),a=Math.ceil(this.canvas.getWidth()),o=Math.ceil(this.canvas.getHeight()),r=i.width>a+ai||i.height>o+ai;if("fit"===this.currentLayoutMode||"cover"===this.currentLayoutMode){const e=a>n.width+ai&&i.width<=n.width+ai,t=o>n.height+ai&&i.height<=n.height+ai;return r||e||t}if("expand"===this.currentLayoutMode){const e=Math.max(n.width,Math.ceil(i.width)),t=Math.max(n.height,Math.ceil(i.height));return Math.abs(a-e)>ai||Math.abs(o-t)>ai}return r}settleFitCoverScrollbarsAfterStateRestore(){if(!this.canvas||!this.containerElement||"fit"!==this.currentLayoutMode&&"cover"!==this.currentLayoutMode)return;const e=Math.ceil(this.canvas.getWidth()),t=Math.ceil(this.canvas.getHeight());if(e<=1||t<=1)return;const i=Math.floor(this.containerElement.clientWidth||0),n=Math.floor(this.containerElement.clientHeight||0);if(i<=0||n<=0)return;const a=Math.ceil(this.containerElement.scrollWidth||0),o=Math.ceil(this.containerElement.scrollHeight||0),r=a>i+ai,s=o>n+ai;if(!r&&!s)return;const l=s&&Math.abs(e-i)<=1,c=r&&Math.abs(t-n)<=1;(l||c)&&(this.setCanvasSizePx(l?e-1:e,c?t-1:t),this.setCanvasSizePx(e,t))}captureImageDisplayGeometry(){if(!this.canvas||!this.originalImage)return null;this.originalImage.setCoords();const e=this.originalImage.getBoundingRect();return{canvasWidth:this.canvas.getWidth(),canvasHeight:this.canvas.getHeight(),imageDisplayWidth:Math.max(1,e.width),imageDisplayHeight:Math.max(1,e.height)}}restoreMergedImageDisplayGeometry(e){if(!e||!this.canvas||!this.originalImage)return;this.setCanvasSizePx(e.canvasWidth,e.canvasHeight);const t=Math.max(1,this.originalImage.width||e.imageDisplayWidth),i=Math.max(1,this.originalImage.height||e.imageDisplayHeight),n=Math.min(e.imageDisplayWidth/t,e.imageDisplayHeight/i);this.originalImage.set({left:0,top:0,angle:0,scaleX:n,scaleY:n,originX:"left",originY:"top",selectable:!1,evented:!1,hasControls:!1,hoverCursor:"default"}),this.originalImage.setCoords(),this.canvas.sendObjectToBack(this.originalImage),this.currentScale=1,this.currentRotation=0,this.baseImageScale=n,this.lastSnapshot=this.captureSnapshotInternal(),this.canvas.renderAll()}buildTransformContext(){return{canvas:this.canvas,options:this.options,guard:this.operationGuard,getOriginalImage:()=>this.originalImage,getCurrentScale:()=>this.currentScale,setCurrentScale:e=>{this.currentScale=e},getCurrentRotation:()=>this.currentRotation,setCurrentRotation:e=>{this.currentRotation=e},getBaseImageScale:()=>this.baseImageScale,saveCanvasState:()=>{this.saveStateInternal(this.withAnimationQueueBypass())},setSuppressSaveState:e=>{this.shouldSuppressSaveState=e},afterTransformSnap:()=>{!this.isDisposed&&this.canvas&&this.originalImage&&(this.updateCanvasSizeToImageBounds(),this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage),this.canvas.getObjects().filter(q).forEach(e=>this.syncMaskLabel(e)))}}}scaleImage(e){if(this.isDisposed||!this.transformController)return Promise.resolve();if(!Number.isFinite(e))return Promise.resolve();try{this.assertCanQueueAnimation("scaleImage")}catch(e){return Promise.reject(e)}const t=this.transformController,i=this.buildCallbackContext("scaleImage",!1),n=this.animQueue.add(async()=>{if(!this.isDisposed){this.updateUi();try{await t.scaleImage(e),this.isDisposed||this.emitImageChanged(i)}finally{this.isDisposed||this.updateInputs()}}});return this.emitBusyChangeIfChanged(i),n.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(i)})}rotateImage(e){if(this.isDisposed||!this.transformController)return Promise.resolve();if(!Number.isFinite(e))return Promise.resolve();try{this.assertCanQueueAnimation("rotateImage")}catch(e){return Promise.reject(e)}const t=this.transformController,i=this.buildCallbackContext("rotateImage",!1),n=this.animQueue.add(async()=>{if(!this.isDisposed){this.updateUi();try{await t.rotateImage(e),this.isDisposed||this.emitImageChanged(i)}finally{this.isDisposed||this.updateInputs()}}});return this.emitBusyChangeIfChanged(i),n.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(i)})}resetImageTransform(){if(this.isDisposed||!this.transformController)return Promise.resolve();try{this.assertCanQueueAnimation("resetImageTransform")}catch(e){return Promise.reject(e)}const e=this.transformController,t=this.buildCallbackContext("resetImageTransform",!1),i=this.animQueue.add(async()=>{if(!this.isDisposed){this.updateUi();try{await e.resetImageTransform(),this.isDisposed||this.emitImageChanged(t)}finally{this.isDisposed||this.updateInputs()}}});return this.emitBusyChangeIfChanged(t),i.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(t)})}refreshUiAfterQueuedAnimation(){!this.isDisposed&&this.canvas&&(this.updateInputs(),this.updateUi())}async loadFromState(e){return this.loadFromStateInternal(e)}async loadFromStateInternal(e,t){var i;if(!e||!this.canvas)return;if(this.isDisposed)return;if(!this.canRunIdleOperation("loadFromState",t))return;const a=this.activeStateRestoreOperation,o=this.buildCallbackContext(null!=a?a:"loadFromState","undo"===a||"redo"===a),r=this.originalImage,s=this.getMaskCollectionSignature();try{const t=await G({canvas:this.canvas,jsonString:e,setCanvasSize:(e,t)=>this.setCanvasSizePx(e,t)});if(this.isDisposed||!this.canvas)return;this.hideAllMaskLabels(),this.originalImage=t.originalImage,this.originalImage&&(this.originalImage.set({originX:"left",originY:"top",selectable:!1,evented:!1,hasControls:!1,hoverCursor:"default"}),this.canvas.sendObjectToBack(this.originalImage)),this.maskCounter=t.maxMaskId;const n=t.editorState;n&&(this.currentScale=n.currentScale,this.currentRotation=n.currentRotation,this.baseImageScale=n.baseImageScale),this.originalImage?this.currentImageMimeType=n&&"currentImageMimeType"in n?null!==(i=n.currentImageMimeType)&&void 0!==i?i:null:this.inferCurrentImageMimeType():this.currentImageMimeType=null,this.isImageLoadedToCanvas=!!this.originalImage,this.originalImage&&this.shouldNormalizeCanvasSizeAfterStateRestore()&&(this.updateCanvasSizeToImageBounds(),this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage)),this.originalImage&&this.settleFitCoverScrollbarsAfterStateRestore();const a=t.objects.filter(q);this.lastMask=a.reduce((e,t)=>!e||t.maskId>e.maskId?t:e,null),a.forEach(e=>{le(e),ue(e)}),this.lastSnapshot=this.captureSnapshotInternal(),this.canvas.renderAll(),this.updateInputs(),this.updateMaskList(),this.updateUi(),r&&r!==this.originalImage&&this.emitOptionCallback("onImageCleared",[r,o]),s!==this.getMaskCollectionSignature()&&this.emitMasksChanged(o),this.emitImageChanged(o);const l=null==n?void 0:n.activeMaskId;if("number"==typeof l){const e=a.find(e=>e.maskId===l);e&&this.withSelectionChangeContext(o,()=>{this.canvas.setActiveObject(e),this.handleSelectionChanged([e])})}}catch(e){throw n(this.options,e,"Failed to restore canvas state."),e}}saveState(){this.saveStateInternal()}saveStateInternal(e){var t,n;if(!this.canvas||this.shouldSuppressSaveState)return;if(!this.canRunIdleOperation("saveState",e))return;const a=this.canvas.getActiveObject(),o=this.getActiveMaskForSnapshot();this.hideAllMaskLabels();try{const e=X({canvas:this.canvas,activeMaskId:null!==(t=null==o?void 0:o.maskId)&&void 0!==t?t:null,currentScale:this.currentScale,currentRotation:this.currentRotation,baseImageScale:this.baseImageScale,currentImageMimeType:this.currentImageMimeType}),i=null!==(n=this.lastSnapshot)&&void 0!==n?n:e;if(e===i)return;const a=new V(async()=>{await this.loadFromStateInternal(e,this.withAnimationQueueBypass())},async()=>{await this.loadFromStateInternal(i,this.withAnimationQueueBypass())});this.historyManager.push(a),this.lastSnapshot=e}catch(e){i(this.options,e,"Failed to capture canvas snapshot.")}finally{this.restoreActiveMaskAfterSnapshot(a,o),this.updateUi()}}restoreActiveMaskAfterSnapshot(e,t){if(!this.canvas)return;const i=e&&q(e)?e:t;i&&this.canvas.getObjects().includes(i)&&(this.canvas.setActiveObject(i),this.showLabelForMask(i),this.updateMaskListSelection(i))}undo(){if(this.isDisposed)return Promise.resolve();if(!this.canRunIdleOperation("undo"))return Promise.resolve();const e=this.buildCallbackContext("undo",!0),t=this.animQueue.add(async()=>{if(!this.isDisposed){this.activeStateRestoreOperation="undo";try{await this.historyManager.undo()}finally{this.activeStateRestoreOperation=null}}});return this.emitBusyChangeIfChanged(e),t.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(e)})}redo(){if(this.isDisposed)return Promise.resolve();if(!this.canRunIdleOperation("redo"))return Promise.resolve();const e=this.buildCallbackContext("redo",!0),t=this.animQueue.add(async()=>{if(!this.isDisposed){this.activeStateRestoreOperation="redo";try{await this.historyManager.redo()}finally{this.activeStateRestoreOperation=null}}});return this.emitBusyChangeIfChanged(e),t.finally(()=>{this.refreshUiAfterQueuedAnimation(),this.emitBusyChangeIfChanged(e)})}createMask(e={}){if(!this.canvas)return null;if(!this.canRunIdleOperation("createMask"))return null;const t=this.buildCallbackContext("createMask",!1),i=this.buildCreateMaskContext(),n=this.withSelectionChangeContext(t,()=>Xt(i,e));return n&&(this.emitMasksChanged(t),this.emitImageChanged(t)),n}removeSelectedMask(){if(!this.canvas)return;if(!this.canRunIdleOperation("removeSelectedMask"))return;const e=this.getMasks().length,t=this.buildCallbackContext("removeSelectedMask",!1),i=this.buildRemoveMaskContext();this.withSelectionChangeContext(t,()=>function(e){const t=e.canvas.getActiveObject();t&&q(t)&&(e.removeLabelForMask(t),he(t),e.canvas.remove(t),e.canvas.discardActiveObject(),e.updateMaskList(),e.canvas.renderAll(),e.saveCanvasState())}(i)),this.updateUi(),this.getMasks().length!==e&&(this.emitMasksChanged(t),this.emitImageChanged(t))}removeAllMasks(e={}){if(!this.canvas)return;if(!this.canRunIdleOperation("removeAllMasks",e))return;const t=this.getMasks().length,i=this.buildCallbackContext("removeAllMasks",!1),n=this.buildRemoveMaskContext();this.withSelectionChangeContext(i,()=>Gt(n,e)),this.updateUi(),this.getMasks().length!==t&&(this.emitMasksChanged(i),this.emitImageChanged(i))}buildCreateMaskContext(){return{fabric:this.fabricModule,canvas:this.canvas,options:this.getRuntimeOptions(),getLastMask:()=>this.lastMask,setLastMask:e=>{this.lastMask=e},getMaskCounter:()=>this.maskCounter,setMaskCounter:e=>{this.maskCounter=e},updateMaskList:()=>{this.updateMaskList()},saveCanvasState:()=>{this.saveState()},expandCanvasIfNeeded:(e,t)=>{this.setCanvasSizePx(e,t)}}}buildRemoveMaskContext(){return{canvas:this.canvas,removeLabelForMask:e=>{this.removeLabelForMask(e)},updateMaskList:()=>{this.updateMaskList()},saveCanvasState:()=>{this.saveState()},setLastMask:e=>{this.lastMask=e}}}buildMaskLabelContext(){return this.canvas?{fabric:this.fabricModule,canvas:this.canvas,options:this.options}:null}removeLabelForMask(e){const t=this.buildMaskLabelContext();t&&_t(t,e)}createLabelForMask(e){const t=this.buildMaskLabelContext();t&&Vt(t,e)}hideAllMaskLabels(){const e=this.buildMaskLabelContext();e&&function(e){const{canvas:t}=e;if(!t)return;const i=t.getObjects();i.filter(e=>e.maskLabel).forEach(e=>{try{t.remove(e)}catch{}}),i.filter(q).forEach(e=>{try{delete e.labelObject}catch{}})}(e)}syncMaskLabel(e){const t=this.buildMaskLabelContext();t&&Jt(t,e)}showLabelForMask(e){const t=this.buildMaskLabelContext();t&&function(e,t){e.options.maskLabelOnSelect&&(t.labelObject||Vt(e,t),t.labelObject&&(t.labelObject.visible=!0,Jt(e,t)))}(t,e)}handleSelectionChanged(e){var t,i,n;if(!this.canvas)return;const a=null!==(t=e.find(q))&&void 0!==t?t:null;this.canvas.getObjects().filter(q).forEach(e=>{e!==a?(e.labelObject&&this.removeLabelForMask(e),le(e)):e.set({stroke:"#ff0000",strokeWidth:1})}),a&&this.showLabelForMask(a),this.updateMaskListSelection(a),this.canvas.requestRenderAll(),this.updateUi();const o=null!==(i=this.nextSelectionChangeContext)&&void 0!==i?i:this.buildCallbackContext(null!==(n=this.activeStateRestoreOperation)&&void 0!==n?n:"createMask","undo"===this.activeStateRestoreOperation||"redo"===this.activeStateRestoreOperation);this.emitOptionCallback("onSelectionChange",[this.buildSelection(e),o])}buildMaskListContext(){return{canvas:this.canvas,getListElementId:()=>this.elements.maskList,onMaskSelected:e=>this.handleSelectionChanged([e])}}updateMaskList(){!function(e){const t=e.getListElementId();if(!t)return;const i=Kt(e),n=i.getElementById(t);if(!n||!e.canvas)return;n.innerHTML="";const a=e.canvas;a.getObjects().filter(q).forEach(t=>{const o=i.createElement("li");o.className="list-group-item mask-item",o.textContent=t.maskName,o.dataset.maskId=String(t.maskId),o.onclick=()=>{const t=Number(o.dataset.maskId);if(!Number.isFinite(t))return;const i=a.getObjects().find(e=>q(e)&&e.maskId===t);i&&(a.setActiveObject(i),e.onMaskSelected(i))},n.appendChild(o)})}(this.buildMaskListContext())}updateMaskListSelection(e){!function(e,t){const i=e.getListElementId();if(!i)return;const n=Kt(e).getElementById(i);if(!n)return;const a=t?String(t.maskId):null;n.querySelectorAll(".mask-item").forEach(e=>{const t=null!==a&&e.dataset.maskId===a;e.classList.toggle("active",t)})}(this.buildMaskListContext(),e)}async mergeMasks(){if(!this.canvas)return;if(!this.canRunIdleOperation("mergeMasks"))return;if(!this.canvas.getObjects().some(q))return;const e=this.buildCallbackContext("mergeMasks",!1),t=this.operationGuard.beginBusyOperation("mergeMasks");this.emitBusyChangeIfChanged(e),this.updateUi();try{const i=this.buildMergeMasksContext(t);await async function(e){if(!e.isImageLoaded())return;if(0===e.canvas.getObjects().filter(e=>"maskId"in e&&"number"==typeof e.maskId).length)return;const t=e.saveState();e.canvas.discardActiveObject(),e.canvas.renderAll();const i=e.containerElement?e.containerElement.scrollTop:null,n=e.containerElement?e.containerElement.scrollLeft:null;try{const a=await yt(e,{exportArea:"image",mergeMask:!0,multiplier:e.options.exportMultiplier,fileType:"png"});if(!a)throw new ne("mergeMasks: exportImageBase64 returned an empty data URL.");e.removeAllMasksNoHistory(),await e.loadImage(a,{preserveScroll:!0});const o=e.saveState();if(e.containerElement)try{null!==i&&(e.containerElement.scrollTop=i),null!==n&&(e.containerElement.scrollLeft=n)}catch(e){console.warn("[ImageEditor] mergeMasks: scroll restore failed",e)}t&&o&&t!==o&&e.historyManager.push(new V(()=>e.loadFromState(o),()=>e.loadFromState(t)))}catch(i){try{await e.loadFromState(t)}catch(e){console.warn("[ImageEditor] mergeMasks: rollback failed",e)}if(i instanceof ne)throw i;const n=i instanceof Error?`mergeMasks failed: ${i.message}`:"mergeMasks failed";throw new ne(n,i)}}(i),this.updateInputs(),this.updateMaskList(),this.emitMasksChanged(e),this.emitImageChanged(e)}finally{this.operationGuard.endBusyOperation(t),this.emitBusyChangeIfChanged(e),this.updateUi()}}downloadImage(e){if(!this.canvas)return;if(!this.canRunIdleOperation("downloadImage"))return;const t=this.buildCallbackContext("downloadImage",!1),i=this.operationGuard.beginBusyOperation("downloadImage");this.emitBusyChangeIfChanged(t);const n=this.buildExportServiceContext();try{Ct(n,e)}finally{this.operationGuard.endBusyOperation(i),this.emitBusyChangeIfChanged(t)}}async exportImageBase64(e){if(!this.canvas)return"";if(!this.canRunIdleOperation("exportImageBase64",e))return"";const t=this.buildCallbackContext("exportImageBase64",!1),i=this.operationGuard.beginBusyOperation("exportImageBase64");this.emitBusyChangeIfChanged(t);const n=this.buildExportServiceContext();try{return await yt(n,e)}finally{this.operationGuard.endBusyOperation(i),this.emitBusyChangeIfChanged(t)}}async exportImageFile(e){this.assertIdleForOperation("exportImageFile",e);const t=this.buildCallbackContext("exportImageFile",!1),i=this.operationGuard.beginBusyOperation("exportImageFile");this.emitBusyChangeIfChanged(t);const n=this.buildExportServiceContext();try{return await Mt(n,e)}finally{this.operationGuard.endBusyOperation(i),this.emitBusyChangeIfChanged(t)}}buildExportServiceContext(){return{fabric:this.fabricModule,canvas:this.canvas,options:this.options,isImageLoaded:()=>this.isImageLoaded(),getOriginalImage:()=>this.originalImage}}buildMergeMasksContext(e){return{...this.buildExportServiceContext(),historyManager:this.historyManager,containerElement:this.containerElement,loadImage:async(t,i)=>{const n=this.captureImageDisplayGeometry();await this.loadImageInternal(t,this.withInternalOperationOptions(e,null!=i?i:{})),this.restoreMergedImageDisplayGeometry(n)},saveState:()=>this.captureSnapshotInternal(),loadFromState:t=>this.loadFromStateInternal(t,this.withInternalOperationOptions(e,this.withAnimationQueueBypass())),removeAllMasksNoHistory:()=>{Gt(this.buildRemoveMaskContext(),{saveHistory:!1})}}}captureSnapshotInternal(){var e;if(!this.canvas)throw new Error("[ImageEditor] Cannot capture canvas snapshot before init or after dispose.");const t=this.getActiveMaskForSnapshot();return this.hideAllMaskLabels(),X({canvas:this.canvas,activeMaskId:null!==(e=null==t?void 0:t.maskId)&&void 0!==e?e:null,currentScale:this.currentScale,currentRotation:this.currentRotation,baseImageScale:this.baseImageScale,currentImageMimeType:this.currentImageMimeType})}getActiveMaskForSnapshot(){var e;if(!this.canvas)return null;const t=this.canvas.getActiveObject();if(t&&q(t))return t;const i=this.canvas.getObjects().filter(e=>q(e)&&!!e.labelObject);return 1===i.length&&null!==(e=i[0])&&void 0!==e?e:null}enterMosaicMode(){if(!this.canvas||!this.originalImage)return;if(this.mosaicSession)return;if(!this.isImageLoaded())return;if(!this.canRunIdleOperation("enterMosaicMode"))return;ot(this.buildMosaicControllerContext()),this.updateInputs(),this.updateUi();const e=this.buildCallbackContext("enterMosaicMode",!1);this.emitBusyChangeIfChanged(e),this.emitImageChanged(e)}exitMosaicMode(){if(!this.canvas||!this.mosaicSession)return;if(!this.canRunIdleOperation("exitMosaicMode"))return;rt(this.buildMosaicControllerContext()),this.updateInputs(),this.updateUi();const e=this.buildCallbackContext("exitMosaicMode",!1);this.emitBusyChangeIfChanged(e),this.emitImageChanged(e)}isMosaicMode(){return null!==this.mosaicSession}getMosaicConfig(){return W(this.currentMosaicConfig)}setMosaicConfig(e){this.applyMosaicConfigPatch(e,"setMosaicConfig")}resetMosaicConfig(){if(this.isDisposed)return;const e=W(this.defaultMosaicConfig);H(this.currentMosaicConfig,e)||(this.currentMosaicConfig=e,this.mosaicSession&&this.canvas&&st(this.buildMosaicControllerContext()),this.updateInputs(),this.updateUi(),this.emitImageChanged(this.buildCallbackContext("resetMosaicConfig",!1)))}setMosaicBrushSize(e){this.applyMosaicConfigPatch({brushSize:e},"setMosaicBrushSize")}setMosaicBlockSize(e){this.applyMosaicConfigPatch({blockSize:e},"setMosaicBlockSize")}applyMosaicConfigPatch(e,t){if(this.isDisposed)return;if(null===e||"object"!=typeof e||Array.isArray(e))return void i(this.options,new TypeError("[ImageEditor] Invalid Mosaic config object."),"Ignored invalid Mosaic config.");const n=function(e){const t=O(e)?e:{},i=[];if(!R(t,"brushSize")||"number"==typeof t.brushSize&&Number.isFinite(t.brushSize)&&t.brushSize>0||i.push("brushSize"),!R(t,"blockSize")||"number"==typeof t.blockSize&&Number.isFinite(t.blockSize)&&t.blockSize>0||i.push("blockSize"),R(t,"previewStroke")&&"string"!=typeof t.previewStroke&&i.push("previewStroke"),!R(t,"previewStrokeWidth")||"number"==typeof t.previewStrokeWidth&&Number.isFinite(t.previewStrokeWidth)&&t.previewStrokeWidth>=0||i.push("previewStrokeWidth"),R(t,"previewStrokeDashArray")){const e=t.previewStrokeDashArray;null===e||Array.isArray(e)&&e.every(e=>"number"==typeof e&&Number.isFinite(e)&&e>=0)||i.push("previewStrokeDashArray")}if(R(t,"previewFill")&&"string"!=typeof t.previewFill&&i.push("previewFill"),R(t,"outputFileType")){const e=t.outputFileType;"source"===e||"string"==typeof e&&r(e)||i.push("outputFileType")}return!R(t,"outputQuality")||void 0===t.outputQuality||null===t.outputQuality||"number"==typeof t.outputQuality&&Number.isFinite(t.outputQuality)||i.push("outputQuality"),i}(e);n.length>0&&i(this.options,new TypeError(`[ImageEditor] Ignored invalid Mosaic config field(s): ${n.join(", ")}.`),"Ignored invalid Mosaic config fields.");const a=U(this.currentMosaicConfig,e);H(this.currentMosaicConfig,a)||(this.currentMosaicConfig=a,this.mosaicSession&&this.canvas&&st(this.buildMosaicControllerContext()),this.updateInputs(),this.updateUi(),this.emitImageChanged(this.buildCallbackContext(t,!1)))}buildMosaicControllerContext(){return{fabric:this.fabricModule,canvas:this.canvas,options:this.options,historyManager:this.historyManager,getMosaicConfig:()=>W(this.currentMosaicConfig),isImageLoaded:()=>this.isImageLoaded(),getOriginalImage:()=>this.originalImage,setOriginalImage:e=>{this.originalImage=e},getCurrentImageMimeType:()=>this.currentImageMimeType,setCurrentImageMimeType:e=>{this.currentImageMimeType=e},getLastSnapshot:()=>this.lastSnapshot,setLastSnapshot:e=>{this.lastSnapshot=e},captureSnapshot:()=>this.captureSnapshotInternal(),loadFromState:e=>this.loadFromStateInternal(e,this.withAnimationQueueBypass()),updateUi:()=>{this.updateUi()},updateInputs:()=>{this.updateInputs()},hideAllMaskLabels:()=>{this.hideAllMaskLabels()},emitImageChanged:e=>{this.emitImageChanged(e)},emitBusyChangeIfChanged:e=>{this.emitBusyChangeIfChanged(e)},buildCallbackContext:(e,t)=>this.buildCallbackContext(e,t),getMosaicSession:()=>this.mosaicSession,setMosaicSession:e=>{this.mosaicSession=e}}}enterCropMode(){if(!this.canvas||!this.originalImage)return;if(this.cropSession)return;if(!this.isImageLoaded())return;if(!this.canRunIdleOperation("enterCropMode"))return;!function(e){const{canvas:t,options:i}=e;if(e.getCropSession())return;const n=e.getOriginalImage();if(!n)return;if(!e.isImageLoaded())return;t.discardActiveObject();const a=e.saveState(),o=!!t.selection;t.selection=!1,n.setCoords();const r=n.getBoundingRect(),s=Number.isFinite(Number(i.crop.padding))?Number(i.crop.padding):10,l=Math.max(0,Math.floor(r.left)),c=Math.max(0,Math.floor(r.top)),u=Math.max(1,Math.floor(r.width)),h=Math.max(1,Math.floor(r.height)),d=Math.min(l+u-1,Math.max(l,Math.floor(r.left+s))),m=Math.min(c+h-1,Math.max(c,Math.floor(r.top+s))),g=Math.max(1,Number(i.crop.minWidth)||1),p=Math.max(1,Number(i.crop.minHeight)||1),f=Math.min(g,u),b=Math.min(p,h),v=!!i.crop.allowRotationOfCropRect,y=new e.fabric.Rect({left:d,top:m,width:f,height:b,originX:"left",originY:"top",fill:"rgba(0,0,0,0.12)",stroke:"#00aaff",strokeDashArray:Me,strokeWidth:1,strokeUniform:!0,selectable:!0,lockRotation:!v,cornerSize:8,objectCaching:!1,lockScalingFlip:!0});v||y.setControlVisible("mtr",!1),t.add(y),y.isCropRect=!0,t.bringObjectToFront(y),t.setActiveObject(y);const M=!!i.crop.hideMasksDuringCrop,C=[];M&&t.getObjects().forEach(e=>{e!==y&&q(e)&&C.push(de(e))});const I=[];if(t.getObjects().forEach(e=>{var t,i;if(e!==y){I.push({object:e,evented:null===(t=e.evented)||void 0===t||t,selectable:null===(i=e.selectable)||void 0===i||i});try{e.set({evented:!1,selectable:!1})}catch{}}}),M)for(const e of C)ge(e.object);const k=()=>{try{const e=Math.max(1,Number(y.width)||1),i=Math.max(1,Number(y.height)||1),n=Math.min(u/e,Math.max(f/e,Number(y.scaleX)||1)),a=Math.min(h/i,Math.max(b/i,Number(y.scaleY)||1)),o=e*n,r=i*a,s=Math.max(l,l+u-o),d=Math.max(c,c+h-r),m=Math.min(s,Math.max(l,Number(y.left)||l)),g=Math.min(d,Math.max(c,Number(y.top)||c));y.set({left:m,top:g,scaleX:n,scaleY:a}),y.setCoords(),t.requestRenderAll()}catch{}};y.on("modified",k),y.on("moving",k),y.on("scaling",k);const w={beforeJson:a,prevSelection:o,prevEvented:I,maskBackups:C,cropRect:y,handlers:[{target:y,handlers:[{eventName:"modified",callback:k},{eventName:"moving",callback:k},{eventName:"scaling",callback:k}]}]};e.setCropSession(w),t.renderAll()}(this.buildCropControllerContext()),this.updateUi();const e=this.buildCallbackContext("enterCropMode",!1);this.emitBusyChangeIfChanged(e),this.emitImageChanged(e)}cancelCrop(){if(!this.canvas||!this.cropSession)return;if(!this.canRunIdleOperation("cancelCrop"))return;Ee(this.buildCropControllerContext()),this.cropSession=null,this.updateUi(),this.canvas.requestRenderAll();const e=this.buildCallbackContext("cancelCrop",!1);this.emitBusyChangeIfChanged(e),this.emitImageChanged(e)}async applyCrop(){if(!this.canvas||!this.cropSession)return;if(!this.canRunIdleOperation("applyCrop"))return;const e=this.buildCallbackContext("applyCrop",!1),t=this.getMasks().length>0,i=this.operationGuard.beginBusyOperation("applyCrop");this.emitBusyChangeIfChanged(e),this.updateUi();try{const n=this.buildCropControllerContext(i);await Be(n),this.updateInputs(),this.updateMaskList(),(t||this.getMasks().length>0)&&this.emitMasksChanged(e),this.emitImageChanged(e)}finally{this.operationGuard.endBusyOperation(i),this.emitBusyChangeIfChanged(e),this.updateUi()}}buildCropControllerContext(e){return{fabric:this.fabricModule,canvas:this.canvas,options:this.options,historyManager:this.historyManager,isImageLoaded:()=>this.isImageLoaded(),getOriginalImage:()=>this.originalImage,getCurrentImageMimeType:()=>this.currentImageMimeType,getCropSession:()=>this.cropSession,setCropSession:e=>{this.cropSession=e},saveState:()=>this.captureSnapshotInternal(),loadFromState:t=>this.loadFromStateInternal(t,this.withInternalOperationOptions(e,this.withAnimationQueueBypass())),loadImage:(t,i)=>this.loadImageInternal(t,this.withInternalOperationOptions(e,null!=i?i:{})),getMaskCounter:()=>this.maskCounter,setMaskCounter:e=>{this.maskCounter=e},updateMaskList:()=>{this.updateMaskList()}}}updateInputs(){const e=this.elements.scalePercentageInput;if(e){const t=document.getElementById(e);t&&(t.value=String(Math.round(100*this.currentScale)))}const t=this.getMosaicConfig(),i=this.elements.mosaicBrushSizeInput;if(i){const e=document.getElementById(i);e&&(e.value=String(t.brushSize))}const n=this.elements.mosaicBlockSizeInput;if(n){const e=document.getElementById(n);e&&(e.value=String(t.blockSize))}}updateUi(){var e;if(!this.canvas)return;const t=!!this.originalImage,i=(t?this.canvas.getObjects().filter(q):[]).length>0,n=this.canvas.getActiveObject(),a=!(!n||!q(n)),o=1===this.currentScale&&0===this.currentRotation,r=this.historyManager.canUndo(),s=this.historyManager.canRedo(),l=null!==this.cropSession,c=null!==this.mosaicSession,u=this.operationGuard.isBusy()||this.animQueue.isBusy(),h=!0===(null===(e=this.mosaicSession)||void 0===e?void 0:e.isApplying);if(l)si.forEach(e=>{this.setControlEnabled(e,!u&&li.includes(e))});else{if(c)return ui.forEach(e=>{this.setControlEnabled(e,!u&&!h&&hi.includes(e))}),void this.setControlEnabled("imageInput",!1);this.setControlEnabled("scalePercentageInput",t&&!u),this.setControlEnabled("rotateLeftDegreesInput",t&&!u),this.setControlEnabled("rotateRightDegreesInput",t&&!u),this.setControlEnabled("zoomInButton",t&&!u&&this.currentScale<this.options.maxScale),this.setControlEnabled("zoomOutButton",t&&!u&&this.currentScale>this.options.minScale),this.setControlEnabled("rotateLeftButton",t&&!u),this.setControlEnabled("rotateRightButton",t&&!u),this.setControlEnabled("createMaskButton",t&&!u),this.setControlEnabled("removeSelectedMaskButton",a&&!u),this.setControlEnabled("removeAllMasksButton",i&&!u),this.setControlEnabled("mergeMasksButton",t&&i&&!u),this.setControlEnabled("downloadImageButton",t&&!u),this.setControlEnabled("resetImageTransformButton",t&&!o&&!u),this.setControlEnabled("undoButton",t&&!u&&r),this.setControlEnabled("redoButton",t&&!u&&s),this.setControlEnabled("enterCropModeButton",t&&!u),this.setControlEnabled("enterMosaicModeButton",t&&!u),this.setControlEnabled("exitMosaicModeButton",!1),this.setControlEnabled("mosaicBrushSizeInput",!this.isDisposed),this.setControlEnabled("mosaicBlockSizeInput",!this.isDisposed),this.setControlEnabled("imageInput",!u),this.setControlEnabled("applyCropButton",!1),this.setControlEnabled("cancelCropButton",!1)}}setControlEnabled(e,t){var i;const n=this.elements[e];if(!n)return;const a=document.getElementById(n);if(a)if(this.recordElementOriginalState(e,a),"disabled"in a)a.disabled=!t;else if(t){const t=this.elementOriginalAriaDisabledMap.get(e);null==t?a.removeAttribute("aria-disabled"):a.setAttribute("aria-disabled",t),a.style.pointerEvents=null!==(i=this.elementOriginalPointerEventsMap.get(e))&&void 0!==i?i:""}else a.setAttribute("aria-disabled","true"),a.style.pointerEvents="none"}recordElementOriginalState(e,t){this.elementOriginalAriaDisabledMap.has(e)||this.elementOriginalAriaDisabledMap.set(e,t.getAttribute("aria-disabled")),this.elementOriginalPointerEventsMap.has(e)||this.elementOriginalPointerEventsMap.set(e,t.style.pointerEvents||""),"disabled"in t&&!this.elementOriginalDisabledMap.has(e)&&this.elementOriginalDisabledMap.set(e,!!t.disabled)}restoreElementOriginalStates(){var e,t;for(const i of Object.keys(this.elements)){const n=this.elements[i];if(!n)continue;const a=document.getElementById(n);if(a){if("disabled"in a&&this.elementOriginalDisabledMap.has(i)&&(a.disabled=null!==(e=this.elementOriginalDisabledMap.get(i))&&void 0!==e&&e),this.elementOriginalAriaDisabledMap.has(i)){const e=this.elementOriginalAriaDisabledMap.get(i);null==e?a.removeAttribute("aria-disabled"):a.setAttribute("aria-disabled",e)}this.elementOriginalPointerEventsMap.has(i)&&(a.style.pointerEvents=null!==(t=this.elementOriginalPointerEventsMap.get(i))&&void 0!==t?t:"")}}this.elementOriginalDisabledMap.clear(),this.elementOriginalAriaDisabledMap.clear(),this.elementOriginalPointerEventsMap.clear()}updatePlaceholderStatus(){ei(this.placeholderElement,this.containerElement,!!this.options.showPlaceholder&&!this.originalImage)}dispose(){var e;if(this.isDisposed)return;const t=this.buildCallbackContext("dispose",!1),i=this.originalImage;if(this.isDisposed=!0,this.operationGuard.markDisposed(),this.animQueue.clear(),null===(e=this.domBindings)||void 0===e||e.removeAll(),this.restoreElementOriginalStates(),this.cropSession&&this.canvas){try{Ee(this.buildCropControllerContext())}catch{}this.cropSession=null}if(this.mosaicSession&&this.canvas){try{rt(this.buildMosaicControllerContext())}catch{}this.mosaicSession=null}if(this.canvas){try{Promise.resolve(this.canvas.dispose()).catch(()=>{})}catch{}this.canvas=null,this.canvasElement=null,this.isImageLoadedToCanvas=!1}this.originalImage=null,this.currentImageMimeType=null,this.lastMask=null,this.maskCounter=0,this.currentScale=1,this.currentRotation=0,this.baseImageScale=1,this.lastSnapshot=null,this.transformController=null,this.viewportCache.clear(),i&&this.emitOptionCallback("onImageCleared",[i,t]),this.emitImageChanged(t),this.emitBusyChangeIfChanged(t),this.emitOptionCallback("onEditorDisposed",[t])}}e.ImageEditor=gi,e.default=gi,e.isMaskObject=q,Object.defineProperty(e,"__esModule",{value:!0})});
2
2
  //# sourceMappingURL=image-editor.umd.js.map