@bensitu/image-editor 1.5.2 → 2.0.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.
- package/README.md +367 -518
- package/dist/cjs/index.cjs +5422 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/esm/animation/animation-queue.js +67 -0
- package/dist/esm/animation/animation-queue.js.map +1 -0
- package/dist/esm/core/callback-reporter.js +23 -0
- package/dist/esm/core/callback-reporter.js.map +1 -0
- package/dist/esm/core/default-options.js +322 -0
- package/dist/esm/core/default-options.js.map +1 -0
- package/dist/esm/core/errors.js +156 -0
- package/dist/esm/core/errors.js.map +1 -0
- package/dist/esm/core/operation-guard.js +129 -0
- package/dist/esm/core/operation-guard.js.map +1 -0
- package/dist/esm/core/public-types.js +4 -0
- package/dist/esm/core/public-types.js.map +1 -0
- package/dist/esm/core/state-serializer.js +251 -0
- package/dist/esm/core/state-serializer.js.map +1 -0
- package/dist/esm/crop/crop-controller.js +403 -0
- package/dist/esm/crop/crop-controller.js.map +1 -0
- package/dist/esm/export/export-format.js +53 -0
- package/dist/esm/export/export-format.js.map +1 -0
- package/dist/esm/export/export-service.js +596 -0
- package/dist/esm/export/export-service.js.map +1 -0
- package/dist/esm/fabric/fabric-adapter.js +37 -0
- package/dist/esm/fabric/fabric-adapter.js.map +1 -0
- package/dist/esm/fabric/fabric-animation.js +37 -0
- package/dist/esm/fabric/fabric-animation.js.map +1 -0
- package/dist/esm/history/command.js +2 -0
- package/dist/esm/history/command.js.map +1 -0
- package/dist/esm/history/history-manager.js +103 -0
- package/dist/esm/history/history-manager.js.map +1 -0
- package/dist/esm/image/image-loader.js +245 -0
- package/dist/esm/image/image-loader.js.map +1 -0
- package/dist/esm/image/image-resampler.js +55 -0
- package/dist/esm/image/image-resampler.js.map +1 -0
- package/dist/esm/image/layout-manager.js +224 -0
- package/dist/esm/image/layout-manager.js.map +1 -0
- package/dist/esm/image/transform-controller.js +132 -0
- package/dist/esm/image/transform-controller.js.map +1 -0
- package/dist/esm/image-editor.js +1740 -0
- package/dist/esm/image-editor.js.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/mask/mask-factory.js +332 -0
- package/dist/esm/mask/mask-factory.js.map +1 -0
- package/dist/esm/mask/mask-label-manager.js +120 -0
- package/dist/esm/mask/mask-label-manager.js.map +1 -0
- package/dist/esm/mask/mask-list.js +47 -0
- package/dist/esm/mask/mask-list.js.map +1 -0
- package/dist/esm/mask/mask-style.js +182 -0
- package/dist/esm/mask/mask-style.js.map +1 -0
- package/dist/esm/ui/dom-bindings.js +60 -0
- package/dist/esm/ui/dom-bindings.js.map +1 -0
- package/dist/esm/ui/ui-state.js +25 -0
- package/dist/esm/ui/ui-state.js.map +1 -0
- package/dist/esm/ui/visibility-state.js +11 -0
- package/dist/esm/ui/visibility-state.js.map +1 -0
- package/dist/esm/utils/canvas-region.js +100 -0
- package/dist/esm/utils/canvas-region.js.map +1 -0
- package/dist/esm/utils/dom.js +6 -0
- package/dist/esm/utils/dom.js.map +1 -0
- package/dist/esm/utils/file.js +53 -0
- package/dist/esm/utils/file.js.map +1 -0
- package/dist/esm/utils/number.js +24 -0
- package/dist/esm/utils/number.js.map +1 -0
- package/dist/esm/utils/timeout.js +17 -0
- package/dist/esm/utils/timeout.js.map +1 -0
- package/dist/types/animation/animation-queue.d.ts +111 -0
- package/dist/types/animation/animation-queue.d.ts.map +1 -0
- package/dist/types/core/callback-reporter.d.ts +125 -0
- package/dist/types/core/callback-reporter.d.ts.map +1 -0
- package/dist/types/core/default-options.d.ts +56 -0
- package/dist/types/core/default-options.d.ts.map +1 -0
- package/dist/types/core/errors.d.ts +142 -0
- package/dist/types/core/errors.d.ts.map +1 -0
- package/dist/types/core/operation-guard.d.ts +192 -0
- package/dist/types/core/operation-guard.d.ts.map +1 -0
- package/dist/types/core/public-types.d.ts +678 -0
- package/dist/types/core/public-types.d.ts.map +1 -0
- package/dist/types/core/state-serializer.d.ts +301 -0
- package/dist/types/core/state-serializer.d.ts.map +1 -0
- package/dist/types/crop/crop-controller.d.ts +407 -0
- package/dist/types/crop/crop-controller.d.ts.map +1 -0
- package/dist/types/export/export-format.d.ts +136 -0
- package/dist/types/export/export-format.d.ts.map +1 -0
- package/dist/types/export/export-service.d.ts +333 -0
- package/dist/types/export/export-service.d.ts.map +1 -0
- package/dist/types/fabric/fabric-adapter.d.ts +74 -0
- package/dist/types/fabric/fabric-adapter.d.ts.map +1 -0
- package/dist/types/fabric/fabric-animation.d.ts +141 -0
- package/dist/types/fabric/fabric-animation.d.ts.map +1 -0
- package/dist/types/history/command.d.ts +16 -0
- package/dist/types/history/command.d.ts.map +1 -0
- package/dist/types/history/history-manager.d.ts +129 -0
- package/dist/types/history/history-manager.d.ts.map +1 -0
- package/dist/types/image/image-loader.d.ts +265 -0
- package/dist/types/image/image-loader.d.ts.map +1 -0
- package/dist/types/image/image-resampler.d.ts +139 -0
- package/dist/types/image/image-resampler.d.ts.map +1 -0
- package/dist/types/image/layout-manager.d.ts +255 -0
- package/dist/types/image/layout-manager.d.ts.map +1 -0
- package/dist/types/image/transform-controller.d.ts +287 -0
- package/dist/types/image/transform-controller.d.ts.map +1 -0
- package/dist/types/image-editor.d.ts +650 -0
- package/dist/types/image-editor.d.ts.map +1 -0
- package/dist/types/index.d.cts +31 -0
- package/dist/types/index.d.cts.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/mask/mask-factory.d.ts +209 -0
- package/dist/types/mask/mask-factory.d.ts.map +1 -0
- package/dist/types/mask/mask-label-manager.d.ts +171 -0
- package/dist/types/mask/mask-label-manager.d.ts.map +1 -0
- package/dist/types/mask/mask-list.d.ts +144 -0
- package/dist/types/mask/mask-list.d.ts.map +1 -0
- package/dist/types/mask/mask-style.d.ts +338 -0
- package/dist/types/mask/mask-style.d.ts.map +1 -0
- package/dist/types/ui/dom-bindings.d.ts +103 -0
- package/dist/types/ui/dom-bindings.d.ts.map +1 -0
- package/dist/types/ui/ui-state.d.ts +112 -0
- package/dist/types/ui/ui-state.d.ts.map +1 -0
- package/dist/types/ui/visibility-state.d.ts +77 -0
- package/dist/types/ui/visibility-state.d.ts.map +1 -0
- package/dist/types/utils/canvas-region.d.ts +177 -0
- package/dist/types/utils/canvas-region.d.ts.map +1 -0
- package/dist/types/utils/dom.d.ts +26 -0
- package/dist/types/utils/dom.d.ts.map +1 -0
- package/dist/types/utils/file.d.ts +80 -0
- package/dist/types/utils/file.d.ts.map +1 -0
- package/dist/types/utils/number.d.ts +132 -0
- package/dist/types/utils/number.d.ts.map +1 -0
- package/dist/types/utils/timeout.d.ts +84 -0
- package/dist/types/utils/timeout.d.ts.map +1 -0
- package/dist/umd/image-editor.umd.js +2 -0
- package/dist/umd/image-editor.umd.js.map +1 -0
- package/package.json +72 -66
- package/dist/image-editor.cjs +0 -4407
- package/dist/image-editor.cjs.map +0 -7
- package/dist/image-editor.esm.js +0 -4376
- package/dist/image-editor.esm.js.map +0 -7
- package/dist/image-editor.esm.min.js +0 -9
- package/dist/image-editor.esm.min.js.map +0 -7
- package/dist/image-editor.esm.min.mjs +0 -9
- package/dist/image-editor.esm.min.mjs.map +0 -7
- package/dist/image-editor.esm.mjs +0 -4376
- package/dist/image-editor.esm.mjs.map +0 -7
- package/dist/image-editor.js +0 -4373
- package/dist/image-editor.js.map +0 -7
- package/dist/image-editor.min.js +0 -9
- package/dist/image-editor.min.js.map +0 -7
- package/image-editor.d.ts +0 -271
- package/src/browser.js +0 -11
- package/src/esm.js +0 -9
- package/src/image-editor.js +0 -5013
|
@@ -0,0 +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&>.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&<(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})});
|
|
2
|
+
//# sourceMappingURL=image-editor.umd.js.map
|