@bensitu/image-editor 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -16
- package/dist/cjs/index.cjs +1800 -330
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/animation/animation-queue.js +16 -9
- package/dist/esm/animation/animation-queue.js.map +1 -1
- package/dist/esm/core/default-options.js +216 -9
- package/dist/esm/core/default-options.js.map +1 -1
- package/dist/esm/core/operation-guard.js +28 -0
- package/dist/esm/core/operation-guard.js.map +1 -1
- package/dist/esm/core/public-types.js.map +1 -1
- package/dist/esm/core/state-serializer.js +5 -4
- package/dist/esm/core/state-serializer.js.map +1 -1
- package/dist/esm/crop/crop-controller.js +4 -2
- package/dist/esm/crop/crop-controller.js.map +1 -1
- package/dist/esm/export/export-service.js +21 -10
- package/dist/esm/export/export-service.js.map +1 -1
- package/dist/esm/fabric/fabric-animation.js +56 -4
- package/dist/esm/fabric/fabric-animation.js.map +1 -1
- package/dist/esm/image/image-loader.js +9 -16
- package/dist/esm/image/image-loader.js.map +1 -1
- package/dist/esm/image/image-resampler.js +7 -2
- package/dist/esm/image/image-resampler.js.map +1 -1
- package/dist/esm/image/layout-manager.js +2 -20
- package/dist/esm/image/layout-manager.js.map +1 -1
- package/dist/esm/image/transform-controller.js.map +1 -1
- package/dist/esm/image-editor.js +383 -47
- package/dist/esm/image-editor.js.map +1 -1
- package/dist/esm/mask/mask-factory.js +53 -29
- package/dist/esm/mask/mask-factory.js.map +1 -1
- package/dist/esm/mask/mask-list.js +9 -3
- package/dist/esm/mask/mask-list.js.map +1 -1
- package/dist/esm/mosaic/mosaic-controller.js +670 -0
- package/dist/esm/mosaic/mosaic-controller.js.map +1 -0
- package/dist/esm/mosaic/mosaic-geometry.js +81 -0
- package/dist/esm/mosaic/mosaic-geometry.js.map +1 -0
- package/dist/esm/mosaic/mosaic-pixelate.js +71 -0
- package/dist/esm/mosaic/mosaic-pixelate.js.map +1 -0
- package/dist/esm/ui/dom-bindings.js +10 -3
- package/dist/esm/ui/dom-bindings.js.map +1 -1
- package/dist/esm/utils/number.js.map +1 -1
- package/dist/types/animation/animation-queue.d.ts.map +1 -1
- package/dist/types/core/default-options.d.ts +34 -6
- package/dist/types/core/default-options.d.ts.map +1 -1
- package/dist/types/core/errors.d.ts +1 -1
- package/dist/types/core/operation-guard.d.ts +2 -0
- package/dist/types/core/operation-guard.d.ts.map +1 -1
- package/dist/types/core/public-types.d.ts +123 -13
- package/dist/types/core/public-types.d.ts.map +1 -1
- package/dist/types/core/state-serializer.d.ts +3 -1
- package/dist/types/core/state-serializer.d.ts.map +1 -1
- package/dist/types/crop/crop-controller.d.ts.map +1 -1
- package/dist/types/export/export-service.d.ts.map +1 -1
- package/dist/types/fabric/fabric-animation.d.ts.map +1 -1
- package/dist/types/image/image-loader.d.ts +2 -4
- package/dist/types/image/image-loader.d.ts.map +1 -1
- package/dist/types/image/image-resampler.d.ts +1 -1
- package/dist/types/image/image-resampler.d.ts.map +1 -1
- package/dist/types/image/layout-manager.d.ts +5 -49
- package/dist/types/image/layout-manager.d.ts.map +1 -1
- package/dist/types/image/transform-controller.d.ts +1 -2
- package/dist/types/image/transform-controller.d.ts.map +1 -1
- package/dist/types/image-editor.d.ts +20 -9
- package/dist/types/image-editor.d.ts.map +1 -1
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/mask/mask-factory.d.ts +24 -21
- package/dist/types/mask/mask-factory.d.ts.map +1 -1
- package/dist/types/mask/mask-list.d.ts.map +1 -1
- package/dist/types/mosaic/mosaic-controller.d.ts +82 -0
- package/dist/types/mosaic/mosaic-controller.d.ts.map +1 -0
- package/dist/types/mosaic/mosaic-geometry.d.ts +29 -0
- package/dist/types/mosaic/mosaic-geometry.d.ts.map +1 -0
- package/dist/types/mosaic/mosaic-pixelate.d.ts +23 -0
- package/dist/types/mosaic/mosaic-pixelate.d.ts.map +1 -0
- package/dist/types/ui/dom-bindings.d.ts +3 -1
- package/dist/types/ui/dom-bindings.d.ts.map +1 -1
- package/dist/types/utils/number.d.ts +1 -2
- package/dist/types/utils/number.d.ts.map +1 -1
- package/dist/umd/image-editor.umd.js +1 -1
- package/dist/umd/image-editor.umd.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-editor.umd.js","sources":["../esm/animation/animation-queue.js","../esm/core/callback-reporter.js","../esm/core/default-options.js","../esm/core/operation-guard.js","../esm/core/public-types.js","../esm/core/state-serializer.js","../esm/history/history-manager.js","../esm/fabric/fabric-adapter.js","../esm/core/errors.js","../esm/mask/mask-style.js","../esm/utils/canvas-region.js","../esm/export/export-format.js","../esm/crop/crop-controller.js","../esm/export/export-service.js","../esm/utils/timeout.js","../esm/image/layout-manager.js","../esm/utils/dom.js","../esm/image/image-resampler.js","../esm/image/image-loader.js","../esm/fabric/fabric-animation.js","../esm/image/transform-controller.js","../esm/utils/number.js","../esm/mask/mask-factory.js","../esm/mask/mask-label-manager.js","../esm/ui/dom-bindings.js","../esm/ui/visibility-state.js","../esm/utils/file.js","../esm/image-editor.js","../esm/mask/mask-list.js"],"sourcesContent":["export class AnimationQueue {\n constructor() {\n Object.defineProperty(this, \"queue\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n Object.defineProperty(this, \"running\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n }\n add(animationFn) {\n return new Promise((resolve, reject) => {\n this.queue.push({ run: animationFn, resolve, reject });\n if (!this.running) {\n void this.drainQueue();\n }\n });\n }\n clear(reason) {\n const pending = this.queue;\n this.queue = [];\n if (reason !== undefined) {\n for (const entry of pending) {\n entry.reject(reason);\n }\n }\n else {\n for (const entry of pending) {\n entry.resolve();\n }\n }\n }\n isRunning() {\n return this.running;\n }\n isBusy() {\n return this.running || this.queue.length > 0;\n }\n waitForIdle() {\n if (!this.running && this.queue.length === 0) {\n return Promise.resolve();\n }\n return this.add(() => Promise.resolve()).then(() => undefined, () => undefined);\n }\n async drainQueue() {\n if (this.queue.length === 0) {\n this.running = false;\n return;\n }\n this.running = true;\n const entry = this.queue.shift();\n try {\n await entry.run();\n entry.resolve();\n }\n catch (error) {\n entry.reject(error);\n }\n void this.drainQueue();\n }\n}\n//# sourceMappingURL=animation-queue.js.map","export function reportWarning(options, error, message) {\n const warningCallback = options.onWarning;\n if (typeof warningCallback !== 'function')\n return;\n try {\n warningCallback(error, message);\n }\n catch (callbackError) {\n console.warn('[ImageEditor] onWarning callback threw', callbackError);\n }\n}\nexport function reportError(options, error, message) {\n const errorCallback = options.onError;\n if (typeof errorCallback !== 'function')\n return;\n try {\n errorCallback(error, message);\n }\n catch (callbackError) {\n console.error('[ImageEditor] onError callback threw', callbackError);\n }\n}\n//# sourceMappingURL=callback-reporter.js.map","export const DEFAULT_OPTIONS = {\n canvasWidth: 800,\n canvasHeight: 600,\n backgroundColor: 'transparent',\n animationDuration: 300,\n minScale: 0.1,\n maxScale: 5.0,\n scaleStep: 0.05,\n rotationStep: 90,\n expandCanvasToImage: true,\n fitImageToCanvas: false,\n coverImageToCanvas: false,\n downsampleOnLoad: true,\n downsampleMaxWidth: 4000,\n downsampleMaxHeight: 3000,\n downsampleQuality: 0.92,\n preserveSourceFormat: true,\n downsampleMimeType: null,\n imageLoadTimeoutMs: 30000,\n maxHistorySize: 50,\n exportMultiplier: 1,\n maxExportPixels: 50000000,\n exportAreaByDefault: 'image',\n mergeMaskByDefault: true,\n defaultMaskWidth: 50,\n defaultMaskHeight: 80,\n maskRotatable: false,\n maskLabelOnSelect: true,\n maskLabelOffset: 3,\n maskName: 'mask',\n groupSelection: false,\n showPlaceholder: true,\n initialImageBase64: null,\n defaultDownloadFileName: 'edited_image.jpg',\n onImageLoadStart: null,\n onImageLoaded: null,\n onImageCleared: null,\n onImageChanged: null,\n onBusyChange: null,\n onEditorDisposed: null,\n onMasksChanged: null,\n onSelectionChange: null,\n onError: null,\n onWarning: null,\n};\nconst DEFAULT_LABEL_TEXT_OPTIONS = {\n fontSize: 12,\n fill: '#fff',\n backgroundColor: 'rgba(0,0,0,0.7)',\n padding: 2,\n fontFamily: 'monospace',\n fontWeight: 'bold',\n selectable: false,\n evented: false,\n originX: 'left',\n originY: 'top',\n};\nexport const DEFAULT_LABEL = {\n getText: (mask) => mask.maskName,\n textOptions: { ...DEFAULT_LABEL_TEXT_OPTIONS },\n};\nexport const DEFAULT_CROP = {\n minWidth: 100,\n minHeight: 100,\n padding: 10,\n hideMasksDuringCrop: true,\n preserveMasksAfterCrop: false,\n allowRotationOfCropRect: false,\n exportFileType: 'source',\n exportQuality: undefined,\n};\nconst KNOWN_TOP_LEVEL_KEYS = new Set([\n 'canvasWidth',\n 'canvasHeight',\n 'backgroundColor',\n 'animationDuration',\n 'minScale',\n 'maxScale',\n 'scaleStep',\n 'rotationStep',\n 'expandCanvasToImage',\n 'fitImageToCanvas',\n 'coverImageToCanvas',\n 'downsampleOnLoad',\n 'downsampleMaxWidth',\n 'downsampleMaxHeight',\n 'downsampleQuality',\n 'preserveSourceFormat',\n 'downsampleMimeType',\n 'imageLoadTimeoutMs',\n 'maxHistorySize',\n 'exportMultiplier',\n 'maxExportPixels',\n 'exportAreaByDefault',\n 'mergeMaskByDefault',\n 'defaultMaskWidth',\n 'defaultMaskHeight',\n 'maskRotatable',\n 'maskLabelOnSelect',\n 'maskLabelOffset',\n 'maskName',\n 'groupSelection',\n 'showPlaceholder',\n 'initialImageBase64',\n 'defaultDownloadFileName',\n 'onImageLoadStart',\n 'onImageLoaded',\n 'onImageCleared',\n 'onImageChanged',\n 'onBusyChange',\n 'onEditorDisposed',\n 'onMasksChanged',\n 'onSelectionChange',\n 'onError',\n 'onWarning',\n 'label',\n 'crop',\n]);\nfunction normalizeCallback(value) {\n return typeof value === 'function' ? value : null;\n}\nfunction normalizePositiveInteger(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0)\n return fallback;\n return Math.max(1, Math.floor(numeric));\n}\nfunction normalizePositiveFiniteNumber(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0)\n return fallback;\n return numeric;\n}\nfunction normalizeNonNegativeFiniteNumber(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric < 0)\n return fallback;\n return numeric;\n}\nfunction normalizeFiniteNumber(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric))\n return fallback;\n return numeric;\n}\nfunction normalizeMaxHistorySize(value) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric))\n return DEFAULT_OPTIONS.maxHistorySize;\n return Math.max(1, Math.floor(numeric));\n}\nfunction normalizeQualityOption(value) {\n if (value == null)\n return DEFAULT_OPTIONS.downsampleQuality;\n const numeric = Number(value);\n if (!Number.isFinite(numeric))\n return DEFAULT_OPTIONS.downsampleQuality;\n return Math.max(0, Math.min(1, numeric));\n}\nfunction normalizeMaxExportPixels(value) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0)\n return DEFAULT_OPTIONS.maxExportPixels;\n return Math.max(1, Math.floor(numeric));\n}\nfunction normalizeExportArea(value) {\n return value === 'canvas' || value === 'image' ? value : DEFAULT_OPTIONS.exportAreaByDefault;\n}\nfunction normalizeOptionalQuality(value) {\n if (value === undefined || value === null)\n return undefined;\n const numeric = Number(value);\n if (!Number.isFinite(numeric))\n return undefined;\n return Math.max(0, Math.min(1, numeric));\n}\nexport function resolveOptions(input) {\n var _a, _b, _c, _d;\n const raw = input !== null && input !== void 0 ? input : {};\n const resolved = { ...DEFAULT_OPTIONS };\n for (const key of Object.keys(raw)) {\n if (!KNOWN_TOP_LEVEL_KEYS.has(key))\n continue;\n if (key === 'label' || key === 'crop')\n continue;\n if (key === 'onImageLoadStart' ||\n key === 'onImageLoaded' ||\n key === 'onImageCleared' ||\n key === 'onImageChanged' ||\n key === 'onBusyChange' ||\n key === 'onEditorDisposed' ||\n key === 'onMasksChanged' ||\n key === 'onSelectionChange' ||\n key === 'onError' ||\n key === 'onWarning') {\n continue;\n }\n const value = raw[key];\n if (value === undefined)\n continue;\n if (key === 'downsampleQuality') {\n resolved.downsampleQuality = normalizeQualityOption(value);\n continue;\n }\n if (key === 'maxExportPixels') {\n resolved.maxExportPixels = normalizeMaxExportPixels(value);\n continue;\n }\n if (key === 'exportAreaByDefault') {\n resolved.exportAreaByDefault = normalizeExportArea(value);\n continue;\n }\n if (key === 'canvasWidth') {\n resolved.canvasWidth = normalizePositiveInteger(value, DEFAULT_OPTIONS.canvasWidth);\n continue;\n }\n if (key === 'canvasHeight') {\n resolved.canvasHeight = normalizePositiveInteger(value, DEFAULT_OPTIONS.canvasHeight);\n continue;\n }\n if (key === 'animationDuration') {\n resolved.animationDuration = normalizeNonNegativeFiniteNumber(value, DEFAULT_OPTIONS.animationDuration);\n continue;\n }\n if (key === 'minScale') {\n resolved.minScale = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.minScale);\n continue;\n }\n if (key === 'maxScale') {\n resolved.maxScale = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.maxScale);\n continue;\n }\n if (key === 'scaleStep') {\n resolved.scaleStep = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.scaleStep);\n continue;\n }\n if (key === 'rotationStep') {\n resolved.rotationStep = normalizeFiniteNumber(value, DEFAULT_OPTIONS.rotationStep);\n continue;\n }\n if (key === 'downsampleMaxWidth') {\n resolved.downsampleMaxWidth = normalizePositiveInteger(value, DEFAULT_OPTIONS.downsampleMaxWidth);\n continue;\n }\n if (key === 'downsampleMaxHeight') {\n resolved.downsampleMaxHeight = normalizePositiveInteger(value, DEFAULT_OPTIONS.downsampleMaxHeight);\n continue;\n }\n if (key === 'imageLoadTimeoutMs') {\n resolved.imageLoadTimeoutMs = normalizePositiveInteger(value, DEFAULT_OPTIONS.imageLoadTimeoutMs);\n continue;\n }\n if (key === 'exportMultiplier') {\n resolved.exportMultiplier = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.exportMultiplier);\n continue;\n }\n if (key === 'defaultMaskWidth') {\n resolved.defaultMaskWidth = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.defaultMaskWidth);\n continue;\n }\n if (key === 'defaultMaskHeight') {\n resolved.defaultMaskHeight = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.defaultMaskHeight);\n continue;\n }\n if (key === 'maskLabelOffset') {\n resolved.maskLabelOffset = normalizeNonNegativeFiniteNumber(value, DEFAULT_OPTIONS.maskLabelOffset);\n continue;\n }\n resolved[key] = value;\n }\n resolved.onImageLoadStart = normalizeCallback(raw.onImageLoadStart);\n resolved.onImageLoaded = normalizeCallback(raw.onImageLoaded);\n resolved.onImageCleared = normalizeCallback(raw.onImageCleared);\n resolved.onImageChanged = normalizeCallback(raw.onImageChanged);\n resolved.onBusyChange = normalizeCallback(raw.onBusyChange);\n resolved.onEditorDisposed = normalizeCallback(raw.onEditorDisposed);\n resolved.onMasksChanged = normalizeCallback(raw.onMasksChanged);\n resolved.onSelectionChange = normalizeCallback(raw.onSelectionChange);\n resolved.onError = normalizeCallback(raw.onError);\n resolved.onWarning = normalizeCallback(raw.onWarning);\n resolved.maxHistorySize = normalizeMaxHistorySize(resolved.maxHistorySize);\n resolved.maxExportPixels = normalizeMaxExportPixels(resolved.maxExportPixels);\n if (resolved.minScale > resolved.maxScale) {\n const minScale = resolved.minScale;\n resolved.minScale = resolved.maxScale;\n resolved.maxScale = minScale;\n }\n const userLabel = raw.label && typeof raw.label === 'object' ? raw.label : {};\n const mergedTextOptions = {\n ...DEFAULT_LABEL_TEXT_OPTIONS,\n ...(userLabel.textOptions && typeof userLabel.textOptions === 'object'\n ? userLabel.textOptions\n : {}),\n };\n const label = {\n getText: typeof userLabel.getText === 'function' ? userLabel.getText : DEFAULT_LABEL.getText,\n textOptions: mergedTextOptions,\n };\n if (typeof userLabel.create === 'function') {\n label.create = userLabel.create;\n }\n Object.freeze(label.textOptions);\n Object.freeze(label);\n const userCrop = raw.crop && typeof raw.crop === 'object' ? raw.crop : {};\n const crop = {\n minWidth: normalizePositiveFiniteNumber(userCrop.minWidth, DEFAULT_CROP.minWidth),\n minHeight: normalizePositiveFiniteNumber(userCrop.minHeight, DEFAULT_CROP.minHeight),\n padding: normalizeNonNegativeFiniteNumber(userCrop.padding, DEFAULT_CROP.padding),\n hideMasksDuringCrop: (_a = userCrop.hideMasksDuringCrop) !== null && _a !== void 0 ? _a : DEFAULT_CROP.hideMasksDuringCrop,\n preserveMasksAfterCrop: (_b = userCrop.preserveMasksAfterCrop) !== null && _b !== void 0 ? _b : DEFAULT_CROP.preserveMasksAfterCrop,\n allowRotationOfCropRect: (_c = userCrop.allowRotationOfCropRect) !== null && _c !== void 0 ? _c : DEFAULT_CROP.allowRotationOfCropRect,\n exportFileType: (_d = userCrop.exportFileType) !== null && _d !== void 0 ? _d : DEFAULT_CROP.exportFileType,\n exportQuality: normalizeOptionalQuality(userCrop.exportQuality),\n };\n Object.freeze(crop);\n return {\n ...resolved,\n label,\n crop,\n };\n}\n//# sourceMappingURL=default-options.js.map","export class OperationGuard {\n constructor() {\n Object.defineProperty(this, \"isAnimationActive\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"isDisposedFlag\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"isLoadingActive\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"currentOperationName\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"currentOperationToken\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n }\n isAnimating() {\n return this.isAnimationActive;\n }\n isDisposed() {\n return this.isDisposedFlag;\n }\n isLoading() {\n return this.isLoadingActive;\n }\n activeOperationName() {\n return this.currentOperationName;\n }\n isBusy() {\n return (this.isAnimationActive || this.isLoadingActive || this.currentOperationToken !== null);\n }\n beginAnimation() {\n this.isAnimationActive = true;\n }\n endAnimation() {\n this.isAnimationActive = false;\n }\n markDisposed() {\n this.isDisposedFlag = true;\n this.isAnimationActive = false;\n this.isLoadingActive = false;\n this.currentOperationName = null;\n this.currentOperationToken = null;\n }\n beginLoading() {\n this.isLoadingActive = true;\n }\n endLoading() {\n this.isLoadingActive = false;\n }\n beginBusyOperation(operationName) {\n const token = Symbol(operationName);\n this.currentOperationName = operationName;\n this.currentOperationToken = token;\n return token;\n }\n endBusyOperation(token) {\n if (token && token === this.currentOperationToken) {\n this.currentOperationName = null;\n this.currentOperationToken = null;\n }\n }\n isOwnOperation(token) {\n return !!token && token === this.currentOperationToken;\n }\n async runAnimation(animationTask) {\n this.beginAnimation();\n try {\n return await animationTask();\n }\n finally {\n this.endAnimation();\n }\n }\n assertNotAnimating(operationLabel) {\n if (this.isAnimationActive) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while an animation is in progress.`);\n }\n }\n assertIdleForOperation(operationLabel, token) {\n var _a;\n if (this.isDisposedFlag) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" after dispose.`);\n }\n const ownOperation = this.isOwnOperation(token);\n if (this.isAnimationActive) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while an animation is in progress.`);\n }\n if (this.isLoadingActive && !ownOperation) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while an image is loading.`);\n }\n if (this.currentOperationToken && !ownOperation) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while ` +\n `${(_a = this.currentOperationName) !== null && _a !== void 0 ? _a : 'another operation'} is running.`);\n }\n }\n assertCanQueueAnimation(operationLabel, token) {\n var _a;\n if (this.isDisposedFlag) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" after dispose.`);\n }\n const ownOperation = this.isOwnOperation(token);\n if (this.isLoadingActive && !ownOperation) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while an image is loading.`);\n }\n if (this.currentOperationToken && !ownOperation) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while ` +\n `${(_a = this.currentOperationName) !== null && _a !== void 0 ? _a : 'another operation'} is running.`);\n }\n }\n}\n//# sourceMappingURL=operation-guard.js.map","export function isMaskObject(object) {\n return 'maskId' in object && typeof object.maskId === 'number';\n}\n//# sourceMappingURL=public-types.js.map","import { isMaskObject } from './public-types.js';\nexport const SNAPSHOT_CUSTOM_KEYS = [\n 'maskId',\n 'maskUid',\n 'maskName',\n 'isCropRect',\n 'maskLabel',\n 'originalAlpha',\n 'originalStroke',\n 'originalStrokeWidth',\n 'hasControls',\n 'selectable',\n 'strokeUniform',\n 'lockRotation',\n 'transparentCorners',\n 'borderColor',\n 'cornerColor',\n 'cornerSize',\n];\nfunction copySnapshotCustomPropsFromCanvas(canvasObjects, jsonObjects) {\n if (!Array.isArray(jsonObjects))\n return;\n for (let index = 0; index < jsonObjects.length; index += 1) {\n const liveObject = canvasObjects[index];\n const jsonObject = jsonObjects[index];\n if (!liveObject || !jsonObject)\n continue;\n if (typeof liveObject.maskId === 'number')\n jsonObject.maskId = liveObject.maskId;\n if (typeof liveObject.maskUid === 'string')\n jsonObject.maskUid = liveObject.maskUid;\n if (typeof liveObject.maskName === 'string')\n jsonObject.maskName = liveObject.maskName;\n if (typeof liveObject.originalAlpha === 'number') {\n jsonObject.originalAlpha = liveObject.originalAlpha;\n }\n if ('originalStroke' in liveObject)\n jsonObject.originalStroke = liveObject.originalStroke;\n if (typeof liveObject.originalStrokeWidth === 'number') {\n jsonObject.originalStrokeWidth = liveObject.originalStrokeWidth;\n }\n if (typeof liveObject.hasControls === 'boolean') {\n jsonObject.hasControls = liveObject.hasControls;\n }\n if (typeof liveObject.selectable === 'boolean') {\n jsonObject.selectable = liveObject.selectable;\n }\n if (typeof liveObject.strokeUniform === 'boolean') {\n jsonObject.strokeUniform = liveObject.strokeUniform;\n }\n if (typeof liveObject.lockRotation === 'boolean') {\n jsonObject.lockRotation = liveObject.lockRotation;\n }\n if (typeof liveObject.transparentCorners === 'boolean') {\n jsonObject.transparentCorners = liveObject.transparentCorners;\n }\n if (typeof liveObject.borderColor === 'string') {\n jsonObject.borderColor = liveObject.borderColor;\n }\n if (typeof liveObject.cornerColor === 'string') {\n jsonObject.cornerColor = liveObject.cornerColor;\n }\n if (typeof liveObject.cornerSize === 'number') {\n jsonObject.cornerSize = liveObject.cornerSize;\n }\n if (liveObject.isCropRect === true)\n jsonObject.isCropRect = true;\n if (liveObject.maskLabel === true)\n jsonObject.maskLabel = true;\n }\n}\nfunction isActiveSelectionObject(object) {\n if (!object)\n return false;\n const type = typeof object.type === 'string' ? object.type.toLowerCase() : '';\n if (type === 'activeselection')\n return true;\n const isType = object.isType;\n return (typeof isType === 'function' &&\n (isType.call(object, 'ActiveSelection') ||\n isType.call(object, 'activeSelection') ||\n isType.call(object, 'activeselection')));\n}\nexport function saveState(input) {\n var _a, _b, _c;\n const { canvas, currentScale, currentRotation, baseImageScale } = input;\n const activeObject = (_b = (_a = canvas).getActiveObject) === null || _b === void 0 ? void 0 : _b.call(_a);\n const activeMaskId = activeObject && isMaskObject(activeObject)\n ? activeObject.maskId\n : typeof input.activeMaskId === 'number'\n ? input.activeMaskId\n : null;\n if (isActiveSelectionObject(activeObject)) {\n canvas.discardActiveObject();\n }\n const jsonObj = canvas.toJSON(SNAPSHOT_CUSTOM_KEYS);\n copySnapshotCustomPropsFromCanvas(canvas.getObjects(), jsonObj.objects);\n if (Array.isArray(jsonObj.objects)) {\n jsonObj.objects = jsonObj.objects.filter((o) => o.isCropRect !== true && o.maskLabel !== true);\n }\n jsonObj._editorState = {\n currentScale,\n currentRotation,\n baseImageScale,\n currentImageMimeType: (_c = input.currentImageMimeType) !== null && _c !== void 0 ? _c : null,\n };\n if (activeMaskId !== null)\n jsonObj._editorState.activeMaskId = activeMaskId;\n return JSON.stringify(jsonObj);\n}\nexport async function loadFromState(input) {\n var _a, _b;\n const { canvas, jsonString: snapshotInput, setCanvasSize } = input;\n const jsonString = typeof snapshotInput === 'string' ? snapshotInput : JSON.stringify(snapshotInput);\n const json = JSON.parse(jsonString);\n if (typeof json.width === 'number' &&\n json.width > 0 &&\n typeof json.height === 'number' &&\n json.height > 0) {\n setCanvasSize(json.width, json.height);\n }\n await canvas.loadFromJSON(json);\n const objects = canvas.getObjects();\n restoreMaskPropsFromJson(objects, (_a = json.objects) !== null && _a !== void 0 ? _a : []);\n const editorState = json._editorState && typeof json._editorState === 'object'\n ? {\n currentScale: typeof json._editorState.currentScale === 'number'\n ? json._editorState.currentScale\n : 1,\n currentRotation: typeof json._editorState.currentRotation === 'number'\n ? json._editorState.currentRotation\n : 0,\n baseImageScale: typeof json._editorState.baseImageScale === 'number'\n ? json._editorState.baseImageScale\n : 1,\n }\n : null;\n if (editorState && json._editorState && typeof json._editorState.activeMaskId === 'number') {\n editorState.activeMaskId = json._editorState.activeMaskId;\n }\n if (editorState && json._editorState && 'currentImageMimeType' in json._editorState) {\n const mimeType = json._editorState.currentImageMimeType;\n editorState.currentImageMimeType =\n mimeType === 'image/jpeg' || mimeType === 'image/png' || mimeType === 'image/webp'\n ? mimeType\n : null;\n }\n const maxMaskId = objects\n .filter(isMaskObject)\n .reduce((max, maskObject) => Math.max(max, maskObject.maskId), 0);\n const originalImage = ((_b = objects.find(isOriginalImageObject)) !== null && _b !== void 0 ? _b : null);\n return {\n editorState,\n maxMaskId,\n originalImage,\n objects,\n jsonString,\n };\n}\nfunction isOriginalImageObject(object) {\n if (isMaskObject(object))\n return false;\n const type = typeof object.type === 'string' ? object.type.toLowerCase() : '';\n if (type === 'image')\n return true;\n const isType = object.isType;\n return typeof isType === 'function' && isType.call(object, 'image');\n}\nfunction restoreMaskPropsFromJson(canvasObjs, jsonObjs) {\n var _a, _b, _c, _d, _e;\n const consumedCanvasIndexes = new Set();\n for (const jObj of jsonObjs) {\n if (typeof jObj.maskId !== 'number')\n continue;\n const jType = String((_a = jObj.type) !== null && _a !== void 0 ? _a : '');\n const jLeft = Number((_b = jObj.left) !== null && _b !== void 0 ? _b : 0);\n const jTop = Number((_c = jObj.top) !== null && _c !== void 0 ? _c : 0);\n const jUid = typeof jObj.maskUid === 'string' ? jObj.maskUid : null;\n let matchIndex = -1;\n if (jUid) {\n matchIndex = canvasObjs.findIndex((o, index) => {\n if (consumedCanvasIndexes.has(index))\n return false;\n return o.maskUid === jUid;\n });\n }\n if (matchIndex < 0) {\n matchIndex = canvasObjs.findIndex((o, index) => {\n var _a, _b;\n if (consumedCanvasIndexes.has(index))\n return false;\n if (jType && o.type !== jType)\n return false;\n return Math.abs(((_a = o.left) !== null && _a !== void 0 ? _a : 0) - jLeft) < 0.5 && Math.abs(((_b = o.top) !== null && _b !== void 0 ? _b : 0) - jTop) < 0.5;\n });\n }\n if (matchIndex < 0)\n continue;\n consumedCanvasIndexes.add(matchIndex);\n const match = canvasObjs[matchIndex];\n const maskObject = match;\n maskObject.maskId = jObj.maskId;\n if (typeof jObj.maskUid === 'string') {\n maskObject.maskUid = jObj.maskUid;\n }\n maskObject.maskName = String((_d = jObj.maskName) !== null && _d !== void 0 ? _d : '');\n maskObject.originalAlpha =\n typeof jObj.originalAlpha === 'number'\n ? jObj.originalAlpha\n : ((_e = maskObject.opacity) !== null && _e !== void 0 ? _e : 0.5);\n if ('originalStroke' in jObj) {\n maskObject.originalStroke = jObj.originalStroke;\n }\n if (typeof jObj.originalStrokeWidth === 'number') {\n maskObject.originalStrokeWidth = jObj.originalStrokeWidth;\n }\n if (typeof jObj.hasControls === 'boolean') {\n maskObject.hasControls = jObj.hasControls;\n }\n if (typeof jObj.selectable === 'boolean') {\n maskObject.selectable = jObj.selectable;\n }\n if (typeof jObj.strokeUniform === 'boolean') {\n maskObject.strokeUniform = jObj.strokeUniform;\n }\n if (typeof jObj.lockRotation === 'boolean') {\n maskObject.lockRotation = jObj.lockRotation;\n }\n if (typeof jObj.transparentCorners === 'boolean') {\n maskObject.transparentCorners = jObj.transparentCorners;\n }\n if (typeof jObj.borderColor === 'string') {\n maskObject.borderColor = jObj.borderColor;\n }\n if (typeof jObj.cornerColor === 'string') {\n maskObject.cornerColor = jObj.cornerColor;\n }\n if (typeof jObj.cornerSize === 'number') {\n maskObject.cornerSize = jObj.cornerSize;\n }\n }\n jsonObjs.forEach((jObj, index) => {\n if (jObj.maskLabel !== true)\n return;\n const canvasObj = canvasObjs[index];\n if (canvasObj) {\n canvasObj.maskLabel = true;\n }\n });\n}\n//# sourceMappingURL=state-serializer.js.map","export class Command {\n constructor(execute, undo) {\n Object.defineProperty(this, \"execute\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"undo\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.execute = execute;\n this.undo = undo;\n }\n}\nexport class HistoryManager {\n constructor(maxSize = 50) {\n Object.defineProperty(this, \"history\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n Object.defineProperty(this, \"currentIndex\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: -1\n });\n Object.defineProperty(this, \"isProcessing\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"maxSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.maxSize = maxSize;\n }\n execute(command) {\n void command.execute();\n this.pushAndTrim(command);\n }\n push(command) {\n this.pushAndTrim(command);\n }\n canUndo() {\n return this.currentIndex >= 0;\n }\n canRedo() {\n return this.currentIndex < this.history.length - 1;\n }\n async undo() {\n if (this.isProcessing || !this.canUndo())\n return;\n this.isProcessing = true;\n try {\n const cmd = this.history[this.currentIndex];\n if (!cmd)\n return;\n await cmd.undo();\n this.currentIndex--;\n }\n finally {\n this.isProcessing = false;\n }\n }\n async redo() {\n if (this.isProcessing || !this.canRedo())\n return;\n this.isProcessing = true;\n try {\n const cmd = this.history[this.currentIndex + 1];\n if (!cmd)\n return;\n await cmd.execute();\n this.currentIndex++;\n }\n finally {\n this.isProcessing = false;\n }\n }\n pushAndTrim(command) {\n if (this.currentIndex < this.history.length - 1) {\n this.history = this.history.slice(0, this.currentIndex + 1);\n }\n this.history.push(command);\n if (this.history.length > this.maxSize) {\n this.history.shift();\n }\n else {\n this.currentIndex++;\n }\n }\n}\n//# sourceMappingURL=history-manager.js.map","function looksLikeFabricModule(value) {\n if (value === null || typeof value !== 'object')\n return false;\n const candidate = value.Canvas;\n return typeof candidate === 'function';\n}\nfunction readGlobalFabric(globalScope) {\n return globalScope.fabric;\n}\nexport function detectFabric(fabricOrOptions, maybeOptions, globalScope = globalThis) {\n var _a;\n if (looksLikeFabricModule(fabricOrOptions)) {\n return {\n fabric: fabricOrOptions,\n isFabricLoaded: true,\n options: maybeOptions !== null && maybeOptions !== void 0 ? maybeOptions : {},\n };\n }\n const options = (_a = fabricOrOptions) !== null && _a !== void 0 ? _a : {};\n const globalFabric = readGlobalFabric(globalScope);\n if (looksLikeFabricModule(globalFabric)) {\n return {\n fabric: globalFabric,\n isFabricLoaded: true,\n options,\n };\n }\n console.error('[ImageEditor] fabric.js v7 is not available. ' +\n 'Pass it as the first constructor argument (ESM) or ' +\n 'load it as a global <script> before instantiation.');\n return {\n fabric: null,\n isFabricLoaded: false,\n options,\n };\n}\n//# sourceMappingURL=fabric-adapter.js.map","function fixPrototype(self, ctor) {\n Object.setPrototypeOf(self, ctor.prototype);\n}\nexport class FabricUnavailableError extends Error {\n constructor(message = 'Fabric.js v7 is not available. Pass the Fabric module explicitly to the constructor or expose it as `globalThis.fabric`.') {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'FabricUnavailableError'\n });\n fixPrototype(this, FabricUnavailableError);\n }\n}\nexport class ImageDecodeError extends Error {\n constructor(message = 'Failed to decode image data URL.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'ImageDecodeError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, ImageDecodeError);\n }\n}\nexport class ImageLoadTimeoutError extends Error {\n constructor(label, elapsedMs) {\n super(`Image load timed out after ${elapsedMs}ms during ${label}`);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'ImageLoadTimeoutError'\n });\n Object.defineProperty(this, \"label\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"elapsedMs\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.label = label;\n this.elapsedMs = elapsedMs;\n fixPrototype(this, ImageLoadTimeoutError);\n }\n}\nexport class DownsampleError extends Error {\n constructor(message = 'Failed to obtain a 2D context for downsampling.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'DownsampleError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, DownsampleError);\n }\n}\nexport class MergeMasksError extends Error {\n constructor(message = 'Failed to merge masks into the image.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'MergeMasksError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, MergeMasksError);\n }\n}\nexport class CropApplyError extends Error {\n constructor(message = 'Failed to apply crop to the image.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'CropApplyError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, CropApplyError);\n }\n}\nexport class ExportNotReadyError extends Error {\n constructor(operation = 'exportImageFile') {\n super(`Cannot ${operation}: no image is loaded on the canvas.`);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'ExportNotReadyError'\n });\n Object.defineProperty(this, \"operation\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.operation = operation;\n fixPrototype(this, ExportNotReadyError);\n }\n}\nexport class ExportError extends Error {\n constructor(message = 'Failed to export image.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'ExportError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, ExportError);\n }\n}\n//# sourceMappingURL=errors.js.map","import { isMaskObject } from '../core/public-types.js';\nconst SELECTED_STROKE = '#ff0000';\nconst SELECTED_STROKE_WIDTH = 1;\nconst HOVER_STROKE = '#ff5500';\nconst HOVER_STROKE_WIDTH = 2;\nconst HOVER_OPACITY_BUMP = 0.2;\nconst DEFAULT_STROKE_FALLBACK = '#ccc';\nconst DEFAULT_STROKE_WIDTH_FALLBACK = 1;\nconst DEFAULT_ALPHA_FALLBACK = 0.5;\nexport function getMaskNormalStyle(mask) {\n var _a;\n const strokeWidth = Number(mask.originalStrokeWidth);\n const opacity = Number(mask.originalAlpha);\n return {\n stroke: (_a = mask.originalStroke) !== null && _a !== void 0 ? _a : DEFAULT_STROKE_FALLBACK,\n strokeWidth: Number.isFinite(strokeWidth) ? strokeWidth : DEFAULT_STROKE_WIDTH_FALLBACK,\n opacity: Number.isFinite(opacity) ? opacity : DEFAULT_ALPHA_FALLBACK,\n };\n}\nexport function getMaskHoverStyle(mask) {\n const opacity = Number(mask.originalAlpha);\n const baseAlpha = Number.isFinite(opacity) ? opacity : DEFAULT_ALPHA_FALLBACK;\n return {\n stroke: HOVER_STROKE,\n strokeWidth: HOVER_STROKE_WIDTH,\n opacity: Math.min(baseAlpha + HOVER_OPACITY_BUMP, 1),\n };\n}\nexport function applyMaskSelectedStyle(mask) {\n mask.set({ stroke: SELECTED_STROKE, strokeWidth: SELECTED_STROKE_WIDTH });\n}\nexport function applyMaskUnselectedStyle(mask) {\n var _a;\n const strokeWidth = Number(mask.originalStrokeWidth);\n mask.set({\n stroke: (_a = mask.originalStroke) !== null && _a !== void 0 ? _a : DEFAULT_STROKE_FALLBACK,\n strokeWidth: Number.isFinite(strokeWidth) ? strokeWidth : DEFAULT_STROKE_WIDTH_FALLBACK,\n });\n}\nexport function attachMaskHoverHandlers(mask) {\n const tagged = mask;\n const mouseover = () => {\n var _a;\n tagged.set(getMaskHoverStyle(tagged));\n (_a = tagged.canvas) === null || _a === void 0 ? void 0 : _a.requestRenderAll();\n };\n const mouseout = () => {\n var _a;\n tagged.set(getMaskNormalStyle(tagged));\n (_a = tagged.canvas) === null || _a === void 0 ? void 0 : _a.requestRenderAll();\n };\n tagged.on('mouseover', mouseover);\n tagged.on('mouseout', mouseout);\n tagged.imageEditorMaskHandlers = { mouseover, mouseout };\n}\nexport function reattachMaskHoverHandlers(mask) {\n var _a;\n const tagged = mask;\n if (tagged.imageEditorMaskHandlers) {\n try {\n tagged.off('mouseover', tagged.imageEditorMaskHandlers.mouseover);\n tagged.off('mouseout', tagged.imageEditorMaskHandlers.mouseout);\n }\n catch {\n }\n delete tagged.imageEditorMaskHandlers;\n }\n const patch = {};\n if (!Number.isFinite(Number(tagged.originalAlpha))) {\n const opacity = Number(tagged.opacity);\n patch.originalAlpha = Number.isFinite(opacity) ? opacity : DEFAULT_ALPHA_FALLBACK;\n }\n if (tagged.originalStroke == null) {\n patch.originalStroke = (_a = tagged.stroke) !== null && _a !== void 0 ? _a : DEFAULT_STROKE_FALLBACK;\n }\n if (!Number.isFinite(Number(tagged.originalStrokeWidth))) {\n const sw = Number(tagged.strokeWidth);\n patch.originalStrokeWidth = Number.isFinite(sw) ? sw : DEFAULT_STROKE_WIDTH_FALLBACK;\n }\n if (Object.keys(patch).length > 0)\n tagged.set(patch);\n attachMaskHoverHandlers(tagged);\n}\nexport function detachMaskHoverHandlers(mask) {\n const tagged = mask;\n if (!tagged.imageEditorMaskHandlers)\n return;\n try {\n tagged.off('mouseover', tagged.imageEditorMaskHandlers.mouseover);\n tagged.off('mouseout', tagged.imageEditorMaskHandlers.mouseout);\n }\n catch {\n }\n delete tagged.imageEditorMaskHandlers;\n}\nexport function captureMaskStyleBackup(mask) {\n var _a, _b, _c, _d, _e, _f, _g;\n return {\n object: mask,\n opacity: (_a = mask.opacity) !== null && _a !== void 0 ? _a : 1,\n fill: ((_b = mask.fill) !== null && _b !== void 0 ? _b : null),\n strokeWidth: (_c = mask.strokeWidth) !== null && _c !== void 0 ? _c : 0,\n stroke: ((_d = mask.stroke) !== null && _d !== void 0 ? _d : null),\n selectable: (_e = mask.selectable) !== null && _e !== void 0 ? _e : true,\n evented: (_f = mask.evented) !== null && _f !== void 0 ? _f : true,\n lockRotation: (_g = mask.lockRotation) !== null && _g !== void 0 ? _g : false,\n };\n}\nexport function restoreMaskStyleBackup(backup) {\n try {\n backup.object.set({\n opacity: backup.opacity,\n fill: backup.fill,\n strokeWidth: backup.strokeWidth,\n stroke: backup.stroke,\n selectable: backup.selectable,\n evented: backup.evented,\n lockRotation: backup.lockRotation,\n });\n if (typeof backup.object.setCoords === 'function') {\n backup.object.setCoords();\n }\n }\n catch {\n }\n}\nexport function withNormalizedMaskStyles(context, callback) {\n if (!context.canvas)\n return callback();\n const masks = context.canvas.getObjects().filter(isMaskObject);\n const patches = [];\n try {\n for (const mask of masks) {\n const normal = getMaskNormalStyle(mask);\n const snapshot = {};\n const stylePatch = {};\n Object.keys(normal).forEach((key) => {\n const live = mask[key];\n if (live !== normal[key]) {\n snapshot[key] = live;\n stylePatch[key] = normal[key];\n }\n });\n if (Object.keys(stylePatch).length === 0)\n continue;\n patches.push({ object: mask, snapshot });\n mask.set(stylePatch);\n }\n return callback();\n }\n finally {\n for (const patch of patches) {\n try {\n patch.object.set(patch.snapshot);\n }\n catch {\n }\n }\n }\n}\nexport async function withMaskStyleBackup(context, mutator, callback) {\n if (!context.canvas)\n return await callback();\n const masks = context.canvas.getObjects().filter(isMaskObject);\n const backups = masks.map(captureMaskStyleBackup);\n try {\n masks.forEach((mask, index) => mutator(mask, index));\n return await callback();\n }\n finally {\n for (const backup of backups)\n restoreMaskStyleBackup(backup);\n }\n}\nexport function applyCropHideMaskStyle(mask) {\n try {\n mask.set({ opacity: 0, evented: false, selectable: false });\n }\n catch {\n }\n}\n//# sourceMappingURL=mask-style.js.map","export function hasMeaningfulCanvasRegion(rect, canvasWidth, canvasHeight) {\n const left = Number(rect.left);\n const top = Number(rect.top);\n const width = Number(rect.width);\n const height = Number(rect.height);\n if (!Number.isFinite(left) ||\n !Number.isFinite(top) ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0) {\n return false;\n }\n const right = left + width;\n const bottom = top + height;\n if (!Number.isFinite(right) || !Number.isFinite(bottom))\n return false;\n const safeCanvasWidth = Number(canvasWidth);\n const safeCanvasHeight = Number(canvasHeight);\n if (!Number.isFinite(safeCanvasWidth) ||\n !Number.isFinite(safeCanvasHeight) ||\n safeCanvasWidth <= 0 ||\n safeCanvasHeight <= 0) {\n return true;\n }\n const overlapWidth = Math.min(right, safeCanvasWidth) - Math.max(left, 0);\n const overlapHeight = Math.min(bottom, safeCanvasHeight) - Math.max(top, 0);\n return overlapWidth > 0 && overlapHeight > 0;\n}\nexport function getClampedCanvasRegion(rect, canvasWidth, canvasHeight, options = {}) {\n const safeLeft = Number.isFinite(rect.left) ? rect.left : 0;\n const safeTop = Number.isFinite(rect.top) ? rect.top : 0;\n const safeWidth = Math.max(0, Number.isFinite(rect.width) ? rect.width : 0);\n const safeHeight = Math.max(0, Number.isFinite(rect.height) ? rect.height : 0);\n const includePartialPixels = options.includePartialPixels !== false;\n const roundEnd = includePartialPixels ? Math.ceil : Math.floor;\n const hasCanvasWidth = Number.isFinite(canvasWidth);\n const hasCanvasHeight = Number.isFinite(canvasHeight);\n const safeCanvasWidth = hasCanvasWidth\n ? Math.max(1, Math.round(Number(canvasWidth)))\n : Number.POSITIVE_INFINITY;\n const safeCanvasHeight = hasCanvasHeight\n ? Math.max(1, Math.round(Number(canvasHeight)))\n : Number.POSITIVE_INFINITY;\n const left = Math.min(safeCanvasWidth - 1, Math.max(0, Math.floor(safeLeft)));\n const top = Math.min(safeCanvasHeight - 1, Math.max(0, Math.floor(safeTop)));\n const right = Math.min(safeCanvasWidth, Math.max(left + 1, roundEnd(safeLeft + safeWidth)));\n const bottom = Math.min(safeCanvasHeight, Math.max(top + 1, roundEnd(safeTop + safeHeight)));\n return {\n left,\n top,\n width: Math.max(1, right - left),\n height: Math.max(1, bottom - top),\n };\n}\nexport function floorRegion(rect) {\n return getClampedCanvasRegion(rect, undefined, undefined, { includePartialPixels: false });\n}\nexport function hasFractionalCanvasEdge(value) {\n const numericValue = Number(value);\n if (!Number.isFinite(numericValue))\n return false;\n return Math.abs(numericValue - Math.round(numericValue)) > 0.01;\n}\nexport function getPartialExportEdges(bounds, angle = 0) {\n if (!bounds)\n return null;\n const normalizedAngle = Math.abs((Number(angle) || 0) % 90);\n const isAxisAligned = normalizedAngle < 0.01 || Math.abs(normalizedAngle - 90) < 0.01;\n if (!isAxisAligned)\n return null;\n const left = Number(bounds.left) || 0;\n const top = Number(bounds.top) || 0;\n return {\n left: hasFractionalCanvasEdge(left),\n top: hasFractionalCanvasEdge(top),\n right: hasFractionalCanvasEdge(left + (Number(bounds.width) || 0)),\n bottom: hasFractionalCanvasEdge(top + (Number(bounds.height) || 0)),\n };\n}\nexport function getObjectBBox(object) {\n object.setCoords();\n const boundingRect = object.getBoundingRect();\n return {\n left: boundingRect.left,\n top: boundingRect.top,\n width: boundingRect.width,\n height: boundingRect.height,\n };\n}\nexport function clampRegionToCanvas(region, canvasWidth, canvasHeight) {\n const safeCw = Math.max(1, Math.floor(Number.isFinite(canvasWidth) ? canvasWidth : 1));\n const safeCh = Math.max(1, Math.floor(Number.isFinite(canvasHeight) ? canvasHeight : 1));\n const left = Math.max(0, Math.min(region.left, safeCw - 1));\n const top = Math.max(0, Math.min(region.top, safeCh - 1));\n const width = Math.max(1, Math.min(region.width, safeCw - left));\n const height = Math.max(1, Math.min(region.height, safeCh - top));\n return { left, top, width, height };\n}\n//# sourceMappingURL=canvas-region.js.map","const FORMAT_ALIAS_TABLE = Object.freeze({\n jpeg: 'jpeg',\n jpg: 'jpeg',\n 'image/jpeg': 'jpeg',\n png: 'png',\n 'image/png': 'png',\n webp: 'webp',\n 'image/webp': 'webp',\n});\nconst MIME_TABLE = Object.freeze({\n jpeg: 'image/jpeg',\n png: 'image/png',\n webp: 'image/webp',\n});\nexport function normalizeImageFormat(input) {\n var _a;\n return (_a = tryNormalizeImageFormat(input)) !== null && _a !== void 0 ? _a : 'jpeg';\n}\nexport function tryNormalizeImageFormat(input) {\n var _a;\n if (!input)\n return null;\n const key = String(input).toLowerCase();\n if (Object.prototype.hasOwnProperty.call(FORMAT_ALIAS_TABLE, key)) {\n return (_a = FORMAT_ALIAS_TABLE[key]) !== null && _a !== void 0 ? _a : null;\n }\n return null;\n}\nexport function mimeTypeFor(format) {\n return MIME_TABLE[format];\n}\nexport function clampQuality(quality, fallback) {\n const numeric = Number(quality);\n if (!Number.isFinite(numeric))\n return fallback;\n return Math.max(0, Math.min(1, numeric));\n}\nexport function resolveExportFormat(options, downsampleQuality) {\n var _a;\n const providedOptions = options !== null && options !== void 0 ? options : {};\n const fileType = providedOptions.fileType;\n const formatAlias = providedOptions.format;\n const requested = fileType || formatAlias;\n const format = normalizeImageFormat(requested);\n const mimeType = mimeTypeFor(format);\n if (format === 'png') {\n return { format, mimeType, quality: undefined };\n }\n const rawQuality = (_a = providedOptions.quality) !== null && _a !== void 0 ? _a : downsampleQuality;\n const quality = clampQuality(rawQuality, downsampleQuality);\n return { format, mimeType, quality };\n}\n//# sourceMappingURL=export-format.js.map","import { CropApplyError } from '../core/errors.js';\nimport { isMaskObject } from '../core/public-types.js';\nimport { Command } from '../history/history-manager.js';\nimport { applyCropHideMaskStyle, captureMaskStyleBackup, reattachMaskHoverHandlers, restoreMaskStyleBackup, } from '../mask/mask-style.js';\nimport { getClampedCanvasRegion, getObjectBBox, hasMeaningfulCanvasRegion, } from '../utils/canvas-region.js';\nimport { clampQuality as clampExportQuality, mimeTypeFor, tryNormalizeImageFormat, } from '../export/export-format.js';\nconst CROP_RECT_FILL = 'rgba(0,0,0,0.12)';\nconst CROP_RECT_STROKE = '#00aaff';\nconst CROP_RECT_DASH = [6, 4];\nconst CROP_RECT_CORNER_SIZE = 8;\nconst CROP_DEFAULT_PADDING = 10;\nconst CROPPED_EXPORT_QUALITY_FALLBACK = 0.92;\nfunction finiteNumberOrFallback(value, fallback) {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : fallback;\n}\nfunction imageMimeToFormat(mimeType) {\n if (mimeType === 'image/jpeg')\n return 'jpeg';\n if (mimeType === 'image/png')\n return 'png';\n if (mimeType === 'image/webp')\n return 'webp';\n return null;\n}\nfunction resolveLossyCropQuality(cropExportQuality, downsampleQuality) {\n const cropQuality = Number(cropExportQuality);\n if (Number.isFinite(cropQuality)) {\n return clampExportQuality(cropQuality, CROPPED_EXPORT_QUALITY_FALLBACK);\n }\n const fallbackQuality = Number(downsampleQuality);\n if (Number.isFinite(fallbackQuality)) {\n return clampExportQuality(fallbackQuality, CROPPED_EXPORT_QUALITY_FALLBACK);\n }\n return CROPPED_EXPORT_QUALITY_FALLBACK;\n}\nfunction resolveCropExportFormat(input) {\n var _a, _b;\n const requested = input.cropExportFileType;\n const format = requested === undefined || requested === null || requested === 'source'\n ? ((_a = imageMimeToFormat(input.currentImageMimeType)) !== null && _a !== void 0 ? _a : 'png')\n : ((_b = tryNormalizeImageFormat(String(requested))) !== null && _b !== void 0 ? _b : 'png');\n const mimeType = mimeTypeFor(format);\n if (format === 'png')\n return { format, mimeType };\n return {\n format,\n mimeType,\n quality: resolveLossyCropQuality(input.cropExportQuality, input.downsampleQuality),\n };\n}\nfunction getCropRectContentBounds(cropRect) {\n const angle = Number(cropRect.angle) || 0;\n const normalizedAngle = Math.abs(angle % 360);\n if (normalizedAngle > 0.01 && Math.abs(normalizedAngle - 360) > 0.01) {\n return getObjectBBox(cropRect);\n }\n return {\n left: Number(cropRect.left) || 0,\n top: Number(cropRect.top) || 0,\n width: Math.max(0, (Number(cropRect.width) || 0) * Math.abs(Number(cropRect.scaleX) || 1)),\n height: Math.max(0, (Number(cropRect.height) || 0) * Math.abs(Number(cropRect.scaleY) || 1)),\n };\n}\nfunction removeCropRect(context, session) {\n for (const targetHandlers of session.handlers) {\n for (const record of targetHandlers.handlers) {\n try {\n targetHandlers.target.off(record.eventName, record.callback);\n }\n catch {\n }\n }\n }\n session.handlers = [];\n if (session.cropRect) {\n try {\n context.canvas.remove(session.cropRect);\n }\n catch {\n }\n session.cropRect = null;\n }\n}\nfunction restoreCropObjectState(session) {\n for (const record of session.prevEvented) {\n try {\n record.object.set({ evented: record.evented, selectable: record.selectable });\n }\n catch {\n }\n }\n session.prevEvented = [];\n}\nfunction restoreCropMaskBackups(session) {\n for (const backup of session.maskBackups) {\n restoreMaskStyleBackup(backup);\n }\n session.maskBackups = [];\n}\nfunction teardownSession(context, session) {\n removeCropRect(context, session);\n restoreCropObjectState(session);\n restoreCropMaskBackups(session);\n try {\n context.canvas.selection = !!session.prevSelection;\n }\n catch {\n }\n}\nfunction maskIntersectsRegion(mask, region) {\n const bbox = getObjectBBox(mask);\n return (bbox.left < region.left + region.width &&\n bbox.left + bbox.width > region.left &&\n bbox.top < region.top + region.height &&\n bbox.top + bbox.height > region.top);\n}\nfunction capturePreservedMasks(canvas, cropRegion, maskBackups = []) {\n var _a;\n const records = [];\n const styleBackupByMask = new Map(maskBackups.map((backup) => [backup.object, backup]));\n const masks = canvas.getObjects().filter(isMaskObject);\n for (const mask of masks) {\n try {\n mask.setCoords();\n const intersects = maskIntersectsRegion(mask, cropRegion);\n if (intersects) {\n const styleBackup = (_a = styleBackupByMask.get(mask)) !== null && _a !== void 0 ? _a : captureMaskStyleBackup(mask);\n records.push({\n mask,\n left: finiteNumberOrFallback(mask.left, 0),\n top: finiteNumberOrFallback(mask.top, 0),\n angle: finiteNumberOrFallback(mask.angle, 0),\n scaleX: finiteNumberOrFallback(mask.scaleX, 1),\n scaleY: finiteNumberOrFallback(mask.scaleY, 1),\n styleBackup,\n });\n }\n canvas.remove(mask);\n }\n catch {\n }\n }\n return records;\n}\nfunction reapplyPreservedMasks(context, cropRegion, records) {\n var _a;\n if (records.length === 0)\n return;\n const { canvas } = context;\n let maxRestoredId = 0;\n for (const record of records) {\n try {\n restoreMaskStyleBackup(record.styleBackup);\n record.mask.set({\n left: record.left - cropRegion.left,\n top: record.top - cropRegion.top,\n angle: record.angle,\n scaleX: record.scaleX,\n scaleY: record.scaleY,\n visible: true,\n });\n record.mask.setCoords();\n canvas.add(record.mask);\n canvas.bringObjectToFront(record.mask);\n reattachMaskHoverHandlers(record.mask);\n const id = Number(record.mask.maskId);\n if (Number.isFinite(id) && id > maxRestoredId)\n maxRestoredId = id;\n }\n catch {\n }\n }\n if (typeof context.getMaskCounter === 'function' &&\n typeof context.setMaskCounter === 'function') {\n const liveCounter = Number(context.getMaskCounter());\n const safeCounter = Number.isFinite(liveCounter) ? liveCounter : 0;\n context.setMaskCounter(Math.max(safeCounter, maxRestoredId));\n }\n try {\n (_a = context.updateMaskList) === null || _a === void 0 ? void 0 : _a.call(context);\n }\n catch {\n }\n}\nexport function enterCropMode(context) {\n const { canvas, options } = context;\n if (context.getCropSession())\n return;\n const originalImage = context.getOriginalImage();\n if (!originalImage)\n return;\n if (!context.isImageLoaded())\n return;\n canvas.discardActiveObject();\n const beforeJson = context.saveState();\n const prevSelection = !!canvas.selection;\n canvas.selection = false;\n originalImage.setCoords();\n const imageBounds = originalImage.getBoundingRect();\n const padding = Number.isFinite(Number(options.crop.padding))\n ? Number(options.crop.padding)\n : CROP_DEFAULT_PADDING;\n const boundsLeft = Math.max(0, Math.floor(imageBounds.left));\n const boundsTop = Math.max(0, Math.floor(imageBounds.top));\n const maxCropWidth = Math.max(1, Math.floor(imageBounds.width));\n const maxCropHeight = Math.max(1, Math.floor(imageBounds.height));\n const rectLeft = Math.min(boundsLeft + maxCropWidth - 1, Math.max(boundsLeft, Math.floor(imageBounds.left + padding)));\n const rectTop = Math.min(boundsTop + maxCropHeight - 1, Math.max(boundsTop, Math.floor(imageBounds.top + padding)));\n const configuredMinWidth = Math.max(1, Number(options.crop.minWidth) || 1);\n const configuredMinHeight = Math.max(1, Number(options.crop.minHeight) || 1);\n const minCropWidth = Math.min(configuredMinWidth, maxCropWidth);\n const minCropHeight = Math.min(configuredMinHeight, maxCropHeight);\n const allowRotation = !!options.crop.allowRotationOfCropRect;\n const cropRect = new context.fabric.Rect({\n left: rectLeft,\n top: rectTop,\n width: minCropWidth,\n height: minCropHeight,\n originX: 'left',\n originY: 'top',\n fill: CROP_RECT_FILL,\n stroke: CROP_RECT_STROKE,\n strokeDashArray: CROP_RECT_DASH,\n strokeWidth: 1,\n strokeUniform: true,\n selectable: true,\n lockRotation: !allowRotation,\n cornerSize: CROP_RECT_CORNER_SIZE,\n objectCaching: false,\n lockScalingFlip: true,\n });\n if (!allowRotation) {\n cropRect.setControlVisible('mtr', false);\n }\n canvas.add(cropRect);\n cropRect.isCropRect = true;\n canvas.bringObjectToFront(cropRect);\n canvas.setActiveObject(cropRect);\n const hideMasks = !!options.crop.hideMasksDuringCrop;\n const maskBackups = [];\n if (hideMasks) {\n canvas.getObjects().forEach((object) => {\n if (object === cropRect)\n return;\n if (!isMaskObject(object))\n return;\n maskBackups.push(captureMaskStyleBackup(object));\n });\n }\n const prevEvented = [];\n canvas.getObjects().forEach((object) => {\n var _a, _b;\n if (object === cropRect)\n return;\n prevEvented.push({\n object,\n evented: (_a = object.evented) !== null && _a !== void 0 ? _a : true,\n selectable: (_b = object.selectable) !== null && _b !== void 0 ? _b : true,\n });\n try {\n object.set({ evented: false, selectable: false });\n }\n catch {\n }\n });\n if (hideMasks) {\n for (const backup of maskBackups) {\n applyCropHideMaskStyle(backup.object);\n }\n }\n const handleCropRectModified = () => {\n try {\n const cropWidth = Math.max(1, Number(cropRect.width) || 1);\n const cropHeight = Math.max(1, Number(cropRect.height) || 1);\n const nextScaleX = Math.min(maxCropWidth / cropWidth, Math.max(minCropWidth / cropWidth, Number(cropRect.scaleX) || 1));\n const nextScaleY = Math.min(maxCropHeight / cropHeight, Math.max(minCropHeight / cropHeight, Number(cropRect.scaleY) || 1));\n const scaledWidth = cropWidth * nextScaleX;\n const scaledHeight = cropHeight * nextScaleY;\n const maxLeft = Math.max(boundsLeft, boundsLeft + maxCropWidth - scaledWidth);\n const maxTop = Math.max(boundsTop, boundsTop + maxCropHeight - scaledHeight);\n const nextLeft = Math.min(maxLeft, Math.max(boundsLeft, Number(cropRect.left) || boundsLeft));\n const nextTop = Math.min(maxTop, Math.max(boundsTop, Number(cropRect.top) || boundsTop));\n cropRect.set({\n left: nextLeft,\n top: nextTop,\n scaleX: nextScaleX,\n scaleY: nextScaleY,\n });\n cropRect.setCoords();\n canvas.requestRenderAll();\n }\n catch {\n }\n };\n cropRect.on('modified', handleCropRectModified);\n cropRect.on('moving', handleCropRectModified);\n cropRect.on('scaling', handleCropRectModified);\n const session = {\n beforeJson,\n prevSelection,\n prevEvented,\n maskBackups,\n cropRect,\n handlers: [\n {\n target: cropRect,\n handlers: [\n { eventName: 'modified', callback: handleCropRectModified },\n { eventName: 'moving', callback: handleCropRectModified },\n { eventName: 'scaling', callback: handleCropRectModified },\n ],\n },\n ],\n };\n context.setCropSession(session);\n canvas.renderAll();\n}\nexport function cancelCrop(context) {\n const session = context.getCropSession();\n if (!session)\n return;\n context.canvas.discardActiveObject();\n teardownSession(context, session);\n context.setCropSession(null);\n try {\n context.canvas.renderAll();\n }\n catch {\n }\n}\nexport async function applyCrop(context) {\n var _a, _b;\n const session = context.getCropSession();\n if (!session || !session.cropRect)\n return;\n const { canvas } = context;\n canvas.discardActiveObject();\n const beforeJson = session.beforeJson;\n const cropRect = session.cropRect;\n const preserveMasks = !!context.options.crop.preserveMasksAfterCrop;\n try {\n cropRect.setCoords();\n const cropAngle = Number(cropRect.angle) || 0;\n if (!context.options.crop.allowRotationOfCropRect && Math.abs(cropAngle % 360) > 0.01) {\n throw new CropApplyError('applyCrop failed: rotated crop rectangles are disabled.');\n }\n const rectBounds = getCropRectContentBounds(cropRect);\n if (!hasMeaningfulCanvasRegion(rectBounds, canvas.getWidth(), canvas.getHeight())) {\n throw new CropApplyError('applyCrop failed: crop region is empty or outside the canvas.');\n }\n const cropRegion = getClampedCanvasRegion(rectBounds, canvas.getWidth(), canvas.getHeight(), { includePartialPixels: false });\n const preservedRecords = preserveMasks\n ? capturePreservedMasks(canvas, cropRegion, session.maskBackups)\n : [];\n restoreCropObjectState(session);\n removeCropRect(context, session);\n canvas.selection = !!session.prevSelection;\n const cropFormat = resolveCropExportFormat({\n cropExportFileType: context.options.crop.exportFileType,\n currentImageMimeType: (_b = (_a = context.getCurrentImageMimeType) === null || _a === void 0 ? void 0 : _a.call(context)) !== null && _b !== void 0 ? _b : null,\n cropExportQuality: context.options.crop.exportQuality,\n downsampleQuality: context.options.downsampleQuality,\n });\n const exportOptions = {\n format: cropFormat.format,\n multiplier: 1,\n left: cropRegion.left,\n top: cropRegion.top,\n width: cropRegion.width,\n height: cropRegion.height,\n };\n if (cropFormat.quality !== undefined) {\n exportOptions.quality = cropFormat.quality;\n }\n const croppedBase64 = canvas.toDataURL(exportOptions);\n await context.loadImage(croppedBase64);\n if (preservedRecords.length > 0) {\n reapplyPreservedMasks(context, cropRegion, preservedRecords);\n canvas.renderAll();\n }\n const afterJson = context.saveState();\n context.setCropSession(null);\n if (beforeJson && afterJson && beforeJson !== afterJson) {\n context.historyManager.push(new Command(() => context.loadFromState(afterJson), () => context.loadFromState(beforeJson)));\n }\n }\n catch (error) {\n teardownSession(context, session);\n context.setCropSession(null);\n try {\n await context.loadFromState(beforeJson);\n }\n catch (rollbackError) {\n console.warn('[ImageEditor] applyCrop: rollback failed', rollbackError);\n }\n if (error instanceof CropApplyError)\n throw error;\n const message = error instanceof Error ? `applyCrop failed: ${error.message}` : 'applyCrop failed';\n throw new CropApplyError(message, error);\n }\n}\n//# sourceMappingURL=crop-controller.js.map","import { isMaskObject } from '../core/public-types.js';\nimport { reportError } from '../core/callback-reporter.js';\nimport { ExportError, ExportNotReadyError, MergeMasksError } from '../core/errors.js';\nimport { Command } from '../history/history-manager.js';\nimport { withMaskStyleBackup } from '../mask/mask-style.js';\nimport { getClampedCanvasRegion, getObjectBBox, getPartialExportEdges, hasMeaningfulCanvasRegion, } from '../utils/canvas-region.js';\nimport { resolveExportFormat } from './export-format.js';\nfunction resolveMultiplier(requested, fallback) {\n const num = Number(requested);\n if (Number.isFinite(num) && num > 0)\n return num;\n const fallbackValue = Number(fallback);\n return Number.isFinite(fallbackValue) && fallbackValue > 0 ? fallbackValue : 1;\n}\nfunction resolveExportArea(requested, fallback) {\n if (requested === 'canvas' || requested === 'image')\n return requested;\n return fallback === 'canvas' ? 'canvas' : 'image';\n}\nfunction resolveExportOptions(context, options) {\n const providedOptions = options !== null && options !== void 0 ? options : {};\n return {\n exportArea: resolveExportArea(providedOptions.exportArea, context.options.exportAreaByDefault),\n mergeMask: typeof providedOptions.mergeMask === 'boolean'\n ? providedOptions.mergeMask\n : context.options.mergeMaskByDefault,\n multiplier: resolveMultiplier(providedOptions.multiplier, context.options.exportMultiplier),\n format: resolveExportFormat(providedOptions, context.options.downsampleQuality),\n };\n}\nfunction readCanvasDimension(canvas, getterName, propertyName) {\n const canvasLike = canvas;\n const getter = canvasLike[getterName];\n const value = typeof getter === 'function' ? getter.call(canvasLike) : canvasLike[propertyName];\n return Math.max(1, Math.ceil(Number.isFinite(value) ? Number(value) : 1));\n}\nfunction assertExportPixelBudget(context, multiplier, region) {\n var _a, _b;\n const sourceWidth = (_a = region === null || region === void 0 ? void 0 : region.width) !== null && _a !== void 0 ? _a : readCanvasDimension(context.canvas, 'getWidth', 'width');\n const sourceHeight = (_b = region === null || region === void 0 ? void 0 : region.height) !== null && _b !== void 0 ? _b : readCanvasDimension(context.canvas, 'getHeight', 'height');\n const outputWidth = Math.max(1, Math.ceil(sourceWidth * multiplier));\n const outputHeight = Math.max(1, Math.ceil(sourceHeight * multiplier));\n const pixelCount = outputWidth * outputHeight;\n const maxPixels = context.options.maxExportPixels;\n if (!Number.isFinite(pixelCount) || pixelCount > maxPixels) {\n throw new RangeError(`[ImageEditor] Export size ${outputWidth}x${outputHeight} ` +\n `(${pixelCount} pixels) exceeds maxExportPixels (${maxPixels}).`);\n }\n}\nfunction computeExportRegion(context, exportArea) {\n if (exportArea === 'canvas')\n return { region: null, partialEdges: null };\n const originalImage = context.getOriginalImage();\n if (!originalImage)\n return { region: null, partialEdges: null };\n const bounds = getObjectBBox(originalImage);\n const canvasLike = context.canvas;\n const canvasWidth = typeof canvasLike.getWidth === 'function' ? canvasLike.getWidth() : canvasLike.width;\n const canvasHeight = typeof canvasLike.getHeight === 'function' ? canvasLike.getHeight() : canvasLike.height;\n if (!hasMeaningfulCanvasRegion(bounds, canvasWidth, canvasHeight)) {\n throw new ExportError('exportImageBase64 failed: image export region is empty.');\n }\n return {\n region: getClampedCanvasRegion(bounds, canvasWidth, canvasHeight, {\n includePartialPixels: true,\n }),\n partialEdges: getPartialExportEdges(bounds, Number(originalImage.angle) || 0),\n };\n}\nasync function withMaskExportState(context, mergeMask, callback) {\n if (!mergeMask)\n return withMasksHidden(context, callback);\n return withMaskStyleBackup({ canvas: context.canvas, options: context.options }, applyExportBakeInStyle, callback);\n}\nasync function withMasksHidden(context, callback) {\n const backups = getCanvasObjects(context.canvas)\n .filter(isMaskObject)\n .map((mask) => ({\n mask,\n visible: mask.visible,\n }));\n for (const backup of backups) {\n try {\n if (typeof backup.mask.set === 'function') {\n backup.mask.set({ visible: false });\n }\n else {\n backup.mask.visible = false;\n }\n }\n catch {\n }\n }\n try {\n return await callback();\n }\n finally {\n for (const backup of backups) {\n try {\n if (typeof backup.mask.set === 'function') {\n backup.mask.set({ visible: backup.visible });\n }\n else {\n backup.mask.visible = backup.visible;\n }\n }\n catch {\n }\n }\n }\n}\nfunction getCanvasObjects(canvas) {\n try {\n return canvas.getObjects();\n }\n catch {\n return [];\n }\n}\nfunction isObjectOnCanvas(canvas, object) {\n return getCanvasObjects(canvas).includes(object);\n}\nfunction captureMaskLabelBackups(canvas) {\n const backups = [];\n for (const object of getCanvasObjects(canvas)) {\n if (!isMaskObject(object))\n continue;\n const label = object.labelObject;\n if (!label)\n continue;\n const wasOnCanvas = isObjectOnCanvas(canvas, label);\n backups.push({\n mask: object,\n label,\n wasOnCanvas,\n visible: label.visible,\n });\n try {\n if (typeof label.set === 'function')\n label.set({ visible: false });\n if (wasOnCanvas)\n canvas.remove(label);\n }\n catch {\n }\n }\n return backups;\n}\nfunction restoreMaskLabelBackups(canvas, backups) {\n for (const backup of backups) {\n try {\n backup.mask.labelObject = backup.label;\n if (typeof backup.label.set === 'function') {\n backup.label.set({ visible: backup.visible });\n }\n else {\n backup.label.visible = backup.visible;\n }\n if (backup.wasOnCanvas && !isObjectOnCanvas(canvas, backup.label)) {\n canvas.add(backup.label);\n canvas.bringObjectToFront(backup.label);\n }\n }\n catch {\n }\n }\n}\nfunction captureActiveObject(canvas) {\n var _a;\n try {\n const canvasWithSelection = canvas;\n if (typeof canvasWithSelection.getActiveObject !== 'function')\n return null;\n return (_a = canvasWithSelection.getActiveObject()) !== null && _a !== void 0 ? _a : null;\n }\n catch {\n return null;\n }\n}\nfunction restoreActiveObject(canvas, activeObject) {\n if (!activeObject)\n return;\n try {\n const canvasWithSelection = canvas;\n if (typeof canvasWithSelection.setActiveObject === 'function') {\n canvasWithSelection.setActiveObject(activeObject);\n }\n }\n catch {\n }\n}\nfunction requestRender(canvas) {\n try {\n if (typeof canvas.requestRenderAll === 'function') {\n canvas.requestRenderAll();\n }\n else {\n canvas.renderAll();\n }\n }\n catch {\n }\n}\nfunction applyExportBakeInStyle(mask) {\n try {\n mask.set({\n opacity: 1,\n fill: '#000',\n strokeWidth: 0,\n stroke: null,\n selectable: false,\n });\n if (typeof mask.setCoords === 'function')\n mask.setCoords();\n }\n catch {\n }\n}\nfunction renderCanvasToDataUrl(canvas, format, quality, multiplier, region) {\n const fabricOptions = {\n format,\n multiplier,\n };\n if (quality !== undefined)\n fabricOptions.quality = quality;\n if (region) {\n fabricOptions.left = region.left;\n fabricOptions.top = region.top;\n fabricOptions.width = region.width;\n fabricOptions.height = region.height;\n }\n return canvas.toDataURL(fabricOptions);\n}\nfunction hasPartialEdges(edges) {\n return !!edges && (edges.left || edges.top || edges.right || edges.bottom);\n}\nfunction getImageDimensions(imageElement) {\n return {\n width: Math.max(1, imageElement.naturalWidth || imageElement.width || 1),\n height: Math.max(1, imageElement.naturalHeight || imageElement.height || 1),\n };\n}\nfunction loadImageElement(dataUrl) {\n return new Promise((resolve, reject) => {\n const imageElement = new Image();\n imageElement.crossOrigin = 'anonymous';\n const cleanup = () => {\n if (typeof imageElement.removeEventListener === 'function') {\n imageElement.removeEventListener('load', handleLoad);\n imageElement.removeEventListener('error', handleError);\n }\n else {\n imageElement.onload = null;\n imageElement.onerror = null;\n }\n };\n const handleLoad = () => {\n cleanup();\n resolve(imageElement);\n };\n const handleError = () => {\n cleanup();\n reject(new Error('Failed to decode export data URL'));\n };\n if (typeof imageElement.addEventListener === 'function') {\n imageElement.addEventListener('load', handleLoad, { once: true });\n imageElement.addEventListener('error', handleError, { once: true });\n }\n else {\n imageElement.onload = handleLoad;\n imageElement.onerror = handleError;\n }\n imageElement.src = dataUrl;\n });\n}\nasync function sealPartialTransparentEdges(dataUrl, edges) {\n if (!hasPartialEdges(edges))\n return dataUrl;\n const imageElement = await loadImageElement(dataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = document.createElement('canvas');\n offscreenCanvas.width = width;\n offscreenCanvas.height = height;\n const canvasContext = offscreenCanvas.getContext('2d');\n if (!canvasContext)\n throw new Error('2D canvas context is unavailable');\n canvasContext.drawImage(imageElement, 0, 0, width, height);\n const imageData = canvasContext.getImageData(0, 0, width, height);\n const pixels = imageData.data;\n const sealPixel = (x, y, fallbackX, fallbackY) => {\n var _a, _b, _c, _d, _e, _f;\n const index = (y * width + x) * 4;\n const fallbackIndex = (fallbackY * width + fallbackX) * 4;\n const alpha = (_a = pixels[index + 3]) !== null && _a !== void 0 ? _a : 0;\n const fallbackAlpha = (_b = pixels[fallbackIndex + 3]) !== null && _b !== void 0 ? _b : 0;\n if (alpha === 0 && fallbackAlpha > 0) {\n pixels[index] = (_c = pixels[fallbackIndex]) !== null && _c !== void 0 ? _c : 0;\n pixels[index + 1] = (_d = pixels[fallbackIndex + 1]) !== null && _d !== void 0 ? _d : 0;\n pixels[index + 2] = (_e = pixels[fallbackIndex + 2]) !== null && _e !== void 0 ? _e : 0;\n pixels[index + 3] = fallbackAlpha;\n }\n const nextAlpha = (_f = pixels[index + 3]) !== null && _f !== void 0 ? _f : 0;\n if (nextAlpha > 0 && nextAlpha < 255) {\n pixels[index + 3] = 255;\n }\n };\n if ((edges === null || edges === void 0 ? void 0 : edges.left) && width > 1) {\n for (let y = 0; y < height; y += 1)\n sealPixel(0, y, 1, y);\n }\n if ((edges === null || edges === void 0 ? void 0 : edges.right) && width > 1) {\n for (let y = 0; y < height; y += 1)\n sealPixel(width - 1, y, width - 2, y);\n }\n if ((edges === null || edges === void 0 ? void 0 : edges.top) && height > 1) {\n for (let x = 0; x < width; x += 1)\n sealPixel(x, 0, x, 1);\n }\n if ((edges === null || edges === void 0 ? void 0 : edges.bottom) && height > 1) {\n for (let x = 0; x < width; x += 1)\n sealPixel(x, height - 1, x, height - 2);\n }\n canvasContext.putImageData(imageData, 0, 0);\n return offscreenCanvas.toDataURL('image/png');\n}\nfunction getJpegBackgroundColor(backgroundColor) {\n return resolveCanvasFillStyle(backgroundColor);\n}\nfunction resolveCanvasFillStyle(backgroundColor, fallback = '#ffffff') {\n const value = String(backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : '').trim();\n if (!value || isTransparentCssColor(value))\n return '#ffffff';\n const context = createColorValidationContext();\n if (!context)\n return fallback;\n context.fillStyle = '#000001';\n const firstSentinel = context.fillStyle;\n context.fillStyle = value;\n const firstResolved = context.fillStyle;\n if (firstResolved !== firstSentinel)\n return firstResolved;\n context.fillStyle = '#000002';\n const secondSentinel = context.fillStyle;\n context.fillStyle = value;\n const secondResolved = context.fillStyle;\n if (secondResolved !== secondSentinel)\n return secondResolved;\n return fallback;\n}\nfunction createColorValidationContext() {\n try {\n if (typeof document === 'undefined' || typeof document.createElement !== 'function') {\n return null;\n }\n return document.createElement('canvas').getContext('2d');\n }\n catch {\n return null;\n }\n}\nfunction isTransparentCssColor(value) {\n const normalized = value.trim().toLowerCase();\n if (normalized === 'transparent')\n return true;\n const hex = normalized.match(/^#([0-9a-f]{4}|[0-9a-f]{8})$/i);\n if (hex) {\n const digits = hex[1];\n const alpha = digits.length === 4 ? digits[3] : digits.slice(6, 8);\n return /^0+$/.test(alpha);\n }\n const commaAlpha = normalized.match(/^(?:rgba|hsla)\\((.*),\\s*([^,/)]+)\\)$/i);\n if (commaAlpha && isZeroCssAlpha(commaAlpha[2]))\n return true;\n const slashAlpha = normalized.match(/^[a-z][a-z0-9-]*\\([^/]+\\/\\s*([^)]+)\\)$/i);\n if (slashAlpha && isZeroCssAlpha(slashAlpha[1]))\n return true;\n return false;\n}\nfunction isZeroCssAlpha(value) {\n const alpha = value.trim();\n if (alpha.endsWith('%')) {\n const numericPercent = Number.parseFloat(alpha.slice(0, -1));\n return Number.isFinite(numericPercent) && numericPercent === 0;\n }\n const numericAlpha = Number.parseFloat(alpha);\n return Number.isFinite(numericAlpha) && numericAlpha === 0;\n}\nasync function convertDataUrlToOpaqueJpeg(dataUrl, backgroundColor, quality) {\n const imageElement = await loadImageElement(dataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = document.createElement('canvas');\n offscreenCanvas.width = width;\n offscreenCanvas.height = height;\n const canvasContext = offscreenCanvas.getContext('2d');\n if (!canvasContext)\n throw new Error('2D canvas context is unavailable');\n canvasContext.fillStyle = getJpegBackgroundColor(backgroundColor);\n canvasContext.fillRect(0, 0, width, height);\n canvasContext.drawImage(imageElement, 0, 0, width, height);\n return offscreenCanvas.toDataURL('image/jpeg', quality);\n}\nfunction dataUrlToBytes(dataUrl) {\n var _a;\n const match = /^data:image\\/[a-z0-9.+-]+;base64,([A-Za-z0-9+/=\\s]+)$/i.exec(dataUrl);\n if (!match || !((_a = match[1]) === null || _a === void 0 ? void 0 : _a.trim())) {\n throw new Error('exportImageFile received a malformed or empty image data URL.');\n }\n const commaAt = dataUrl.indexOf(',');\n const base64 = dataUrl.slice(commaAt + 1).replace(/\\s/g, '');\n if (typeof globalThis.atob === 'function') {\n const binary = globalThis.atob(base64);\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = binary.length - 1; i >= 0; i -= 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n const bufferCtor = globalThis.Buffer;\n if (bufferCtor && typeof bufferCtor.from === 'function') {\n const source = bufferCtor.from(base64, 'base64');\n const buffer = new ArrayBuffer(source.length);\n const bytes = new Uint8Array(buffer);\n bytes.set(source);\n return bytes;\n }\n throw new Error('No base64 decoder is available for exportImageFile.');\n}\nasync function reencodeDataUrlAs(sourceDataUrl, target, backgroundColor) {\n if (sourceDataUrl.startsWith(`data:${target.mimeType}`)) {\n return sourceDataUrl;\n }\n const imageElement = await loadImageElement(sourceDataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = document.createElement('canvas');\n offscreenCanvas.width = width;\n offscreenCanvas.height = height;\n const canvasContext = offscreenCanvas.getContext('2d');\n if (!canvasContext) {\n throw new Error('Unable to acquire 2D context for export conversion');\n }\n if (target.format === 'jpeg') {\n canvasContext.fillStyle = getJpegBackgroundColor(backgroundColor);\n canvasContext.fillRect(0, 0, width, height);\n }\n canvasContext.drawImage(imageElement, 0, 0, width, height);\n return offscreenCanvas.toDataURL(target.mimeType, target.quality);\n}\nfunction warnNoImageLoaded(operation) {\n console.warn(`[ImageEditor] ${operation} skipped: no image is loaded on the canvas.`);\n}\nexport async function exportImageBase64(context, options) {\n if (!context.isImageLoaded()) {\n warnNoImageLoaded('exportImageBase64');\n return '';\n }\n const activeObject = captureActiveObject(context.canvas);\n const labelBackups = captureMaskLabelBackups(context.canvas);\n try {\n context.canvas.discardActiveObject();\n const resolved = resolveExportOptions(context, options);\n const { region, partialEdges } = computeExportRegion(context, resolved.exportArea);\n assertExportPixelBudget(context, resolved.multiplier, region);\n const renderFormat = region && resolved.format.format === 'jpeg' ? 'png' : resolved.format.format;\n const renderQuality = renderFormat === 'png' ? undefined : resolved.format.quality;\n let dataUrl = await withMaskExportState(context, resolved.mergeMask, async () => renderCanvasToDataUrl(context.canvas, renderFormat, renderQuality, resolved.multiplier, region));\n if (region) {\n dataUrl = await sealPartialTransparentEdges(dataUrl, partialEdges);\n if (resolved.format.format === 'jpeg') {\n dataUrl = await convertDataUrlToOpaqueJpeg(dataUrl, context.options.backgroundColor, resolved.format.quality);\n }\n }\n return dataUrl;\n }\n finally {\n restoreMaskLabelBackups(context.canvas, labelBackups);\n restoreActiveObject(context.canvas, activeObject);\n requestRender(context.canvas);\n }\n}\nexport async function exportImageFile(context, options) {\n var _a;\n if (!context.isImageLoaded()) {\n warnNoImageLoaded('exportImageFile');\n throw new ExportNotReadyError('exportImageFile');\n }\n const providedOptions = options !== null && options !== void 0 ? options : {};\n const fileName = (_a = providedOptions.fileName) !== null && _a !== void 0 ? _a : context.options.defaultDownloadFileName;\n const resolved = resolveExportFormat(providedOptions, context.options.downsampleQuality);\n const base64 = await exportImageBase64(context, {\n exportArea: providedOptions.exportArea,\n mergeMask: providedOptions.mergeMask,\n multiplier: providedOptions.multiplier,\n quality: providedOptions.quality,\n fileType: providedOptions.fileType,\n });\n if (!base64) {\n throw new ExportNotReadyError('exportImageFile');\n }\n const finalDataUrl = await reencodeDataUrlAs(base64, resolved, context.options.backgroundColor);\n let bytes;\n try {\n bytes = dataUrlToBytes(finalDataUrl);\n }\n catch (error) {\n throw new ExportError('exportImageFile failed to decode rendered data URL.', error);\n }\n return new File([bytes], fileName, { type: resolved.mimeType });\n}\nexport function downloadImage(context, fileName) {\n if (!context.isImageLoaded()) {\n warnNoImageLoaded('downloadImage');\n return;\n }\n const resolvedFileName = fileName !== null && fileName !== void 0 ? fileName : context.options.defaultDownloadFileName;\n void exportImageBase64(context, {\n exportArea: context.options.exportAreaByDefault,\n mergeMask: context.options.mergeMaskByDefault,\n multiplier: context.options.exportMultiplier,\n })\n .then((dataUrl) => {\n if (!dataUrl)\n return;\n const link = document.createElement('a');\n link.download = resolvedFileName;\n link.href = dataUrl;\n document.body.appendChild(link);\n try {\n link.click();\n }\n finally {\n document.body.removeChild(link);\n }\n })\n .catch((error) => {\n reportError(context.options, error, 'downloadImage failed.');\n console.error('[ImageEditor] downloadImage failed', error);\n });\n}\nexport async function mergeMasks(context) {\n if (!context.isImageLoaded())\n return;\n const masks = context.canvas\n .getObjects()\n .filter((o) => 'maskId' in o && typeof o.maskId === 'number');\n if (masks.length === 0)\n return;\n const beforeSnapshot = context.saveState();\n context.canvas.discardActiveObject();\n context.canvas.renderAll();\n const preScrollTop = context.containerElement ? context.containerElement.scrollTop : null;\n const preScrollLeft = context.containerElement ? context.containerElement.scrollLeft : null;\n try {\n const merged = await exportImageBase64(context, {\n exportArea: 'image',\n mergeMask: true,\n multiplier: context.options.exportMultiplier,\n fileType: 'png',\n });\n if (!merged) {\n throw new MergeMasksError('mergeMasks: exportImageBase64 returned an empty data URL.');\n }\n context.removeAllMasksNoHistory();\n await context.loadImage(merged, { preserveScroll: true });\n const afterSnapshot = context.saveState();\n if (context.containerElement) {\n try {\n if (preScrollTop !== null) {\n context.containerElement.scrollTop = preScrollTop;\n }\n if (preScrollLeft !== null) {\n context.containerElement.scrollLeft = preScrollLeft;\n }\n }\n catch (scrollError) {\n console.warn('[ImageEditor] mergeMasks: scroll restore failed', scrollError);\n }\n }\n if (beforeSnapshot && afterSnapshot && beforeSnapshot !== afterSnapshot) {\n context.historyManager.push(new Command(() => context.loadFromState(afterSnapshot), () => context.loadFromState(beforeSnapshot)));\n }\n }\n catch (error) {\n try {\n await context.loadFromState(beforeSnapshot);\n }\n catch (rollbackError) {\n console.warn('[ImageEditor] mergeMasks: rollback failed', rollbackError);\n }\n if (error instanceof MergeMasksError)\n throw error;\n const message = error instanceof Error ? `mergeMasks failed: ${error.message}` : 'mergeMasks failed';\n throw new MergeMasksError(message, error);\n }\n}\n//# sourceMappingURL=export-service.js.map","import { ImageLoadTimeoutError } from '../core/errors.js';\nexport function withTimeout(promise, ms, label) {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n const timeoutId = setTimeout(() => {\n reject(new ImageLoadTimeoutError(label, Date.now() - start));\n }, ms);\n promise.then((value) => {\n clearTimeout(timeoutId);\n resolve(value);\n }, (err) => {\n clearTimeout(timeoutId);\n reject(err);\n });\n });\n}\n//# sourceMappingURL=timeout.js.map","import { forceReflow } from '../utils/dom.js';\nexport function selectLayoutStrategy(options) {\n if (options.fitImageToCanvas)\n return 'fit';\n if (options.coverImageToCanvas)\n return 'cover';\n return 'expand';\n}\nexport function detectLayoutConflict(options) {\n if (!options.fitImageToCanvas || !options.coverImageToCanvas)\n return null;\n const enabled = ['fit', 'cover'];\n if (options.expandCanvasToImage)\n enabled.push('expand');\n const selected = selectLayoutStrategy(options);\n return {\n enabled,\n selected,\n message: `Layout flags ${enabled.map((s) => `\\`${s}\\``).join(', ')} are enabled simultaneously. ` +\n `Using precedence \\`fit > cover > expand\\`; selected \\`${selected}\\`.`,\n };\n}\nexport class ViewportCache {\n constructor() {\n Object.defineProperty(this, \"lastVisible\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n }\n measure(container, fallback, scrollbarSize) {\n var _a;\n if (!container)\n return fallback;\n const containerWidth = Math.floor(container.clientWidth);\n const containerHeight = Math.floor(container.clientHeight);\n if (containerWidth > 0 && containerHeight > 0) {\n this.lastVisible = measureContainerViewport(container, fallback, scrollbarSize);\n return this.lastVisible;\n }\n return (_a = this.lastVisible) !== null && _a !== void 0 ? _a : fallback;\n }\n peek() {\n return this.lastVisible;\n }\n clear() {\n this.lastVisible = null;\n }\n}\nconst OVERFLOW_EPSILON = 0.5;\nfunction normalizeOverflowValue(value) {\n return String(value !== null && value !== void 0 ? value : '')\n .trim()\n .toLowerCase();\n}\nfunction getContainerOverflowValues(container) {\n var _a, _b;\n const style = container.style;\n let computedOverflow = '';\n let computedOverflowX = '';\n let computedOverflowY = '';\n const view = (_b = (_a = container.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) !== null && _b !== void 0 ? _b : (typeof window === 'undefined' ? null : window);\n if (typeof (view === null || view === void 0 ? void 0 : view.getComputedStyle) === 'function') {\n const computed = view.getComputedStyle(container);\n computedOverflow = computed.overflow;\n computedOverflowX = computed.overflowX;\n computedOverflowY = computed.overflowY;\n }\n const x = [\n normalizeOverflowValue(style === null || style === void 0 ? void 0 : style.overflow),\n normalizeOverflowValue(style === null || style === void 0 ? void 0 : style.overflowX),\n normalizeOverflowValue(computedOverflow),\n normalizeOverflowValue(computedOverflowX),\n ];\n const y = [\n normalizeOverflowValue(style === null || style === void 0 ? void 0 : style.overflow),\n normalizeOverflowValue(style === null || style === void 0 ? void 0 : style.overflowY),\n normalizeOverflowValue(computedOverflow),\n normalizeOverflowValue(computedOverflowY),\n ];\n return { x, y, all: [...x, ...y] };\n}\nfunction isAutoScrollableOverflow(value) {\n return value === 'auto' || value === 'overlay';\n}\nexport function measureScrollbarSize(ownerDocument) {\n const doc = ownerDocument !== null && ownerDocument !== void 0 ? ownerDocument : (typeof document === 'undefined' ? null : document);\n if (!(doc === null || doc === void 0 ? void 0 : doc.body))\n return { width: 0, height: 0 };\n const probe = doc.createElement('div');\n probe.style.position = 'absolute';\n probe.style.left = '-9999px';\n probe.style.top = '-9999px';\n probe.style.width = '100px';\n probe.style.height = '100px';\n probe.style.overflow = 'scroll';\n probe.style.visibility = 'hidden';\n probe.style.pointerEvents = 'none';\n doc.body.appendChild(probe);\n const width = Math.max(0, probe.offsetWidth - probe.clientWidth);\n const height = Math.max(0, probe.offsetHeight - probe.clientHeight);\n probe.remove();\n return { width, height };\n}\nfunction normalizeScrollbarSize(scrollbarSize) {\n return {\n width: Math.max(0, Number(scrollbarSize === null || scrollbarSize === void 0 ? void 0 : scrollbarSize.width) || 0),\n height: Math.max(0, Number(scrollbarSize === null || scrollbarSize === void 0 ? void 0 : scrollbarSize.height) || 0),\n };\n}\nexport function measureContainerViewport(container, fallback, scrollbarSize) {\n if (!container)\n return fallback;\n const clientWidth = Math.floor(container.clientWidth || 0);\n const clientHeight = Math.floor(container.clientHeight || 0);\n if (clientWidth <= 0 || clientHeight <= 0)\n return fallback;\n const overflow = getContainerOverflowValues(container);\n if (overflow.all.includes('scroll')) {\n return { width: clientWidth, height: clientHeight };\n }\n const scrollbar = normalizeScrollbarSize(scrollbarSize);\n const canAutoScrollX = overflow.x.some(isAutoScrollableOverflow);\n const canAutoScrollY = overflow.y.some(isAutoScrollableOverflow);\n const scrollWidth = Math.ceil(container.scrollWidth || 0);\n const scrollHeight = Math.ceil(container.scrollHeight || 0);\n const hasHorizontalScrollbar = canAutoScrollX && scrollWidth > clientWidth + OVERFLOW_EPSILON;\n const hasVerticalScrollbar = canAutoScrollY && scrollHeight > clientHeight + OVERFLOW_EPSILON;\n return {\n width: clientWidth + (hasVerticalScrollbar ? scrollbar.width : 0),\n height: clientHeight + (hasHorizontalScrollbar ? scrollbar.height : 0),\n };\n}\nexport function computeScrollableCanvasSize(contentWidth, contentHeight, viewport, scrollbarSize) {\n const viewportW = Math.max(1, viewport.width || 1);\n const viewportH = Math.max(1, viewport.height || 1);\n const scrollbar = normalizeScrollbarSize(scrollbarSize);\n let hasHorizontal = false;\n let hasVertical = false;\n for (let i = 0; i < 4; i += 1) {\n const effectiveW = Math.max(1, viewportW - (hasVertical ? scrollbar.width : 0));\n const effectiveH = Math.max(1, viewportH - (hasHorizontal ? scrollbar.height : 0));\n const nextHorizontal = contentWidth > effectiveW + OVERFLOW_EPSILON;\n const nextVertical = contentHeight > effectiveH + OVERFLOW_EPSILON;\n if (nextHorizontal === hasHorizontal && nextVertical === hasVertical)\n break;\n hasHorizontal = nextHorizontal;\n hasVertical = nextVertical;\n }\n const effectiveW = Math.max(1, viewportW - (hasVertical ? scrollbar.width : 0));\n const effectiveH = Math.max(1, viewportH - (hasHorizontal ? scrollbar.height : 0));\n return {\n width: hasHorizontal ? Math.ceil(contentWidth) : effectiveW,\n height: hasVertical ? Math.ceil(contentHeight) : effectiveH,\n };\n}\nexport function computeFitLayout(imageWidth, imageHeight, optionsCanvasWidth, optionsCanvasHeight, containerSize) {\n const canvasWidth = Math.max(1, (containerSize.width || optionsCanvasWidth) - 1);\n const canvasHeight = Math.max(1, (containerSize.height || optionsCanvasHeight) - 1);\n const fitScale = Math.min(canvasWidth / imageWidth, canvasHeight / imageHeight, 1);\n return {\n canvasWidth,\n canvasHeight,\n imageScale: fitScale,\n imageLeft: 0,\n imageTop: 0,\n baseImageScale: fitScale,\n };\n}\nexport function computeCoverLayout(imageWidth, imageHeight, optionsCanvasWidth, optionsCanvasHeight, containerSize, scrollbarSize) {\n const viewportW = containerSize.width || optionsCanvasWidth;\n const viewportH = containerSize.height || optionsCanvasHeight;\n const scrollbar = normalizeScrollbarSize(scrollbarSize);\n let hasHorizontal = false;\n let hasVertical = false;\n let coverScale = 1;\n let scaledW = imageWidth;\n let scaledH = imageHeight;\n for (let i = 0; i < 4; i += 1) {\n const effectiveW = Math.max(1, viewportW - (hasVertical ? scrollbar.width : 0));\n const effectiveH = Math.max(1, viewportH - (hasHorizontal ? scrollbar.height : 0));\n coverScale = Math.min(1, Math.max(effectiveW / imageWidth, effectiveH / imageHeight));\n scaledW = imageWidth * coverScale;\n scaledH = imageHeight * coverScale;\n const nextHasHorizontal = scaledW > effectiveW + OVERFLOW_EPSILON;\n const nextHasVertical = scaledH > effectiveH + OVERFLOW_EPSILON;\n if (nextHasHorizontal === hasHorizontal && nextHasVertical === hasVertical)\n break;\n hasHorizontal = nextHasHorizontal;\n hasVertical = nextHasVertical;\n }\n const canvasSize = computeScrollableCanvasSize(scaledW, scaledH, {\n width: viewportW,\n height: viewportH,\n }, scrollbar);\n return {\n canvasWidth: canvasSize.width,\n canvasHeight: canvasSize.height,\n imageScale: coverScale,\n imageLeft: 0,\n imageTop: 0,\n baseImageScale: coverScale,\n };\n}\nexport function computeExpandLayout(imageWidth, imageHeight, optionsCanvasWidth, optionsCanvasHeight, containerSize) {\n const canvasWidth = Math.max(containerSize.width, Math.floor(imageWidth));\n const canvasHeight = Math.max(containerSize.height, Math.floor(imageHeight));\n return {\n canvasWidth,\n canvasHeight,\n imageScale: 1,\n imageLeft: 0,\n imageTop: 0,\n baseImageScale: 1,\n };\n}\nexport function applyCanvasDimensions(canvas, width, height, containerElement) {\n const integerWidth = Math.max(1, Math.round(Number(width) || 1));\n const integerHeight = Math.max(1, Math.round(Number(height) || 1));\n canvas.setDimensions({ width: integerWidth, height: integerHeight });\n forceReflow(containerElement);\n}\n//# sourceMappingURL=layout-manager.js.map","export function forceReflow(element) {\n if (!element)\n return;\n void element.offsetWidth;\n}\n//# sourceMappingURL=dom.js.map","import { DownsampleError } from '../core/errors.js';\nexport function computeDownsampleDimensions(srcWidth, srcHeight, maxWidth, maxHeight) {\n if (!isPositiveFinite(srcWidth) ||\n !isPositiveFinite(srcHeight) ||\n !isPositiveFinite(maxWidth) ||\n !isPositiveFinite(maxHeight)) {\n return {\n width: Math.max(1, Math.round(srcWidth) || 1),\n height: Math.max(1, Math.round(srcHeight) || 1),\n needsResize: false,\n };\n }\n const needsResize = srcWidth > maxWidth || srcHeight > maxHeight;\n if (!needsResize) {\n return { width: srcWidth, height: srcHeight, needsResize: false };\n }\n const ratio = Math.min(maxWidth / srcWidth, maxHeight / srcHeight);\n return {\n width: Math.max(1, Math.round(srcWidth * ratio)),\n height: Math.max(1, Math.round(srcHeight * ratio)),\n needsResize: true,\n };\n}\nfunction isPositiveFinite(value) {\n return Number.isFinite(value) && value > 0;\n}\nexport function selectDownsampleMimeType(sourceMime, preserveSourceFormat, downsampleMimeType) {\n if (downsampleMimeType)\n return downsampleMimeType;\n if (preserveSourceFormat && (sourceMime === 'image/png' || sourceMime === 'image/webp')) {\n return sourceMime;\n }\n return 'image/jpeg';\n}\nexport function detectSourceMimeType(dataUrl) {\n const match = /^data:(image\\/[a-z0-9+\\-.]+)\\s*;/i.exec(dataUrl);\n return match ? match[1].toLowerCase() : null;\n}\nexport function resampleImage(imageElement, maxWidth, maxHeight, sourceMime, preserveSourceFormat, downsampleMimeType, quality) {\n const { width, height } = computeDownsampleDimensions(imageElement.naturalWidth, imageElement.naturalHeight, maxWidth, maxHeight);\n const mimeType = selectDownsampleMimeType(sourceMime, preserveSourceFormat, downsampleMimeType);\n const offscreenCanvas = document.createElement('canvas');\n offscreenCanvas.width = width;\n offscreenCanvas.height = height;\n const context = offscreenCanvas.getContext('2d');\n if (!context) {\n throw new DownsampleError('Failed to obtain a 2D context for downsampling.');\n }\n context.drawImage(imageElement, 0, 0, imageElement.naturalWidth, imageElement.naturalHeight, 0, 0, width, height);\n const dataUrl = mimeType === 'image/png'\n ? offscreenCanvas.toDataURL(mimeType)\n : offscreenCanvas.toDataURL(mimeType, quality);\n return { dataUrl, width, height, mimeType };\n}\n//# sourceMappingURL=image-resampler.js.map","import { reportError, reportWarning } from '../core/callback-reporter.js';\nimport { ImageDecodeError } from '../core/errors.js';\nimport { saveState, SNAPSHOT_CUSTOM_KEYS } from '../core/state-serializer.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { computeCoverLayout, computeExpandLayout, computeFitLayout, selectLayoutStrategy, applyCanvasDimensions, measureScrollbarSize, } from './layout-manager.js';\nimport { computeDownsampleDimensions, detectSourceMimeType, resampleImage, } from './image-resampler.js';\nexport async function loadImage(context, imageBase64, loadOptions = {}) {\n if (typeof imageBase64 !== 'string' || !imageBase64.startsWith('data:image/')) {\n return;\n }\n const placeholderHidden = context.placeholderElement\n ? !!context.placeholderElement.hidden\n : null;\n const containerScrollTop = context.containerElement ? context.containerElement.scrollTop : null;\n const containerScrollLeft = context.containerElement\n ? context.containerElement.scrollLeft\n : null;\n const containerOverflow = context.containerElement\n ? context.containerElement.style.overflow\n : null;\n const bundle = {\n placeholderHidden,\n containerScrollTop,\n containerScrollLeft,\n containerOverflow,\n originalImage: context.getOriginalImage(),\n isImageLoadedToCanvas: context.getIsImageLoadedToCanvas(),\n lastSnapshot: context.getLastSnapshot(),\n canvasJson: serializeCanvas(context.canvas),\n maskCounter: context.getMaskCounter(),\n currentScale: context.getCurrentScale(),\n currentRotation: context.getCurrentRotation(),\n baseImageScale: context.getBaseImageScale(),\n currentImageMimeType: context.getCurrentImageMimeType(),\n };\n try {\n context.setPlaceholderVisible(false);\n const decode = startImageDecode(imageBase64);\n let imageElement;\n try {\n imageElement = await withTimeout(decode.promise, context.options.imageLoadTimeoutMs, 'image decode');\n }\n catch (error) {\n decode.cleanup(true);\n throw error;\n }\n const loadSource = maybeDownsample(imageElement, imageBase64, context.options);\n const fabricImage = await withTimeout(context.fabric.FabricImage.fromURL(loadSource.dataUrl, { crossOrigin: 'anonymous' }), context.options.imageLoadTimeoutMs, 'FabricImage.fromURL');\n context.canvas.discardActiveObject();\n context.canvas.clear();\n context.canvas.backgroundColor = context.options.backgroundColor;\n fabricImage.set({\n originX: 'left',\n originY: 'top',\n selectable: false,\n evented: false,\n });\n const layout = computeLayout(context, fabricImage);\n applyCanvasDimensions(context.canvas, layout.canvasWidth, layout.canvasHeight, context.containerElement);\n fabricImage.set({ left: layout.imageLeft, top: layout.imageTop });\n fabricImage.scale(layout.imageScale);\n context.canvas.add(fabricImage);\n context.canvas.sendObjectToBack(fabricImage);\n context.setOriginalImage(fabricImage);\n context.setBaseImageScale(layout.baseImageScale);\n context.setCurrentScale(1);\n context.setCurrentRotation(0);\n context.setMaskCounter(0);\n context.setIsImageLoadedToCanvas(true);\n context.setCurrentImageMimeType(loadSource.mimeType);\n context.canvas.renderAll();\n context.setLastSnapshot(saveState({\n canvas: context.canvas,\n currentScale: 1,\n currentRotation: 0,\n baseImageScale: layout.baseImageScale,\n currentImageMimeType: loadSource.mimeType,\n }));\n if (loadOptions.preserveScroll === true && context.containerElement) {\n try {\n if (bundle.containerScrollTop !== null) {\n context.containerElement.scrollTop = bundle.containerScrollTop;\n }\n if (bundle.containerScrollLeft !== null) {\n context.containerElement.scrollLeft = bundle.containerScrollLeft;\n }\n }\n catch (error) {\n console.warn('[ImageEditor] preserveScroll restore failed', error);\n }\n }\n }\n catch (error) {\n await replayRollback(context, bundle);\n const errorMessage = error instanceof Error ? `loadImage failed: ${error.message}` : 'loadImage failed';\n reportError(context.options, error, errorMessage);\n throw error;\n }\n}\nfunction startImageDecode(dataUrl) {\n const imageElement = new Image();\n const cleanup = (clearSource = false) => {\n if (typeof imageElement.removeEventListener === 'function') {\n imageElement.removeEventListener('load', handleLoad);\n imageElement.removeEventListener('error', handleError);\n }\n else {\n imageElement.onload = null;\n imageElement.onerror = null;\n }\n if (clearSource) {\n imageElement.src = '';\n }\n };\n const handleLoad = () => {\n if (!hasNaturalImageDimensions(imageElement)) {\n cleanup(true);\n rejectImage(new ImageDecodeError('Failed to decode image data URL: image has no natural dimensions.', null));\n return;\n }\n cleanup(false);\n resolveImage(imageElement);\n };\n const handleError = (e) => {\n cleanup(true);\n rejectImage(new ImageDecodeError('Failed to decode image data URL.', e));\n };\n let resolveImage;\n let rejectImage;\n const promise = new Promise((resolve, reject) => {\n resolveImage = resolve;\n rejectImage = reject;\n if (typeof imageElement.addEventListener === 'function') {\n imageElement.addEventListener('load', handleLoad, { once: true });\n imageElement.addEventListener('error', handleError, { once: true });\n }\n else {\n imageElement.onload = handleLoad;\n imageElement.onerror = handleError;\n }\n imageElement.src = dataUrl;\n });\n return { promise, cleanup };\n}\nfunction hasNaturalImageDimensions(imageElement) {\n return (Number.isFinite(imageElement.naturalWidth) &&\n Number.isFinite(imageElement.naturalHeight) &&\n imageElement.naturalWidth > 0 &&\n imageElement.naturalHeight > 0);\n}\nfunction isPositiveFinite(value) {\n return Number.isFinite(value) && value > 0;\n}\nfunction toSupportedImageMimeType(mimeType) {\n return mimeType === 'image/jpeg' || mimeType === 'image/png' || mimeType === 'image/webp'\n ? mimeType\n : null;\n}\nfunction maybeDownsample(imageElement, originalDataUrl, options) {\n const originalMimeType = toSupportedImageMimeType(detectSourceMimeType(originalDataUrl));\n if (!options.downsampleOnLoad) {\n return { dataUrl: originalDataUrl, mimeType: originalMimeType };\n }\n if (!isPositiveFinite(options.downsampleMaxWidth) ||\n !isPositiveFinite(options.downsampleMaxHeight)) {\n reportWarning(options, null, 'loadImage skipped downsampling because downsample bounds are invalid.');\n return { dataUrl: originalDataUrl, mimeType: originalMimeType };\n }\n const downsampleDimensions = computeDownsampleDimensions(imageElement.naturalWidth, imageElement.naturalHeight, options.downsampleMaxWidth, options.downsampleMaxHeight);\n if (!downsampleDimensions.needsResize) {\n return { dataUrl: originalDataUrl, mimeType: originalMimeType };\n }\n const sourceMime = detectSourceMimeType(originalDataUrl);\n const resampledImage = resampleImage(imageElement, options.downsampleMaxWidth, options.downsampleMaxHeight, sourceMime, options.preserveSourceFormat, options.downsampleMimeType, options.downsampleQuality);\n const actualMimeType = toSupportedImageMimeType(detectSourceMimeType(resampledImage.dataUrl));\n return {\n dataUrl: resampledImage.dataUrl,\n mimeType: actualMimeType !== null && actualMimeType !== void 0 ? actualMimeType : resampledImage.mimeType,\n };\n}\nfunction computeLayout(context, fabricImage) {\n var _a, _b, _c, _d;\n const imageWidth = (_a = fabricImage.width) !== null && _a !== void 0 ? _a : 0;\n const imageHeight = (_b = fabricImage.height) !== null && _b !== void 0 ? _b : 0;\n const scrollbarSize = measureScrollbarSize((_d = (_c = context.containerElement) === null || _c === void 0 ? void 0 : _c.ownerDocument) !== null && _d !== void 0 ? _d : null);\n const viewport = context.viewportCache.measure(context.containerElement, {\n width: context.options.canvasWidth,\n height: context.options.canvasHeight,\n }, scrollbarSize);\n const strategy = selectLayoutStrategy(context.options);\n if (strategy === 'fit') {\n return computeFitLayout(imageWidth, imageHeight, context.options.canvasWidth, context.options.canvasHeight, viewport);\n }\n if (strategy === 'cover') {\n return computeCoverLayout(imageWidth, imageHeight, context.options.canvasWidth, context.options.canvasHeight, viewport, scrollbarSize);\n }\n return computeExpandLayout(imageWidth, imageHeight, context.options.canvasWidth, context.options.canvasHeight, viewport);\n}\nfunction serializeCanvas(canvas) {\n canvas.discardActiveObject();\n const json = canvas.toJSON(SNAPSHOT_CUSTOM_KEYS);\n return JSON.stringify(json);\n}\nasync function replayRollback(context, bundle) {\n if (context.containerElement && bundle.containerOverflow !== null) {\n try {\n context.containerElement.style.overflow = bundle.containerOverflow;\n }\n catch (rollbackError) {\n console.warn('[ImageEditor] rollback: overflow restore failed', rollbackError);\n }\n }\n try {\n await context.canvas.loadFromJSON(JSON.parse(bundle.canvasJson));\n context.canvas.renderAll();\n }\n catch (rollbackError) {\n console.warn('[ImageEditor] rollback: loadFromJSON failed', rollbackError);\n }\n context.setOriginalImage(bundle.originalImage);\n context.setIsImageLoadedToCanvas(bundle.isImageLoadedToCanvas);\n context.setLastSnapshot(bundle.lastSnapshot);\n context.setMaskCounter(bundle.maskCounter);\n context.setCurrentScale(bundle.currentScale);\n context.setCurrentRotation(bundle.currentRotation);\n context.setBaseImageScale(bundle.baseImageScale);\n context.setCurrentImageMimeType(bundle.currentImageMimeType);\n if (context.containerElement) {\n try {\n if (bundle.containerScrollTop !== null) {\n context.containerElement.scrollTop = bundle.containerScrollTop;\n }\n if (bundle.containerScrollLeft !== null) {\n context.containerElement.scrollLeft = bundle.containerScrollLeft;\n }\n }\n catch (rollbackError) {\n console.warn('[ImageEditor] rollback: scroll restore failed', rollbackError);\n }\n }\n if (bundle.placeholderHidden !== null) {\n context.setPlaceholderVisible(!bundle.placeholderHidden);\n }\n}\n//# sourceMappingURL=image-loader.js.map","export function animateProps(object, props, options, guard) {\n return new Promise((resolve, reject) => {\n const propCount = Object.keys(props).length;\n if (propCount === 0) {\n resolve();\n return;\n }\n let completed = 0;\n try {\n object.animate(props, {\n duration: options.duration,\n onChange: () => {\n var _a;\n if (guard.isDisposed())\n return;\n (_a = options.onChange) === null || _a === void 0 ? void 0 : _a.call(options);\n },\n onComplete: () => {\n if (++completed >= propCount)\n resolve();\n },\n });\n }\n catch (error) {\n reject(error);\n }\n });\n}\nexport function restoreOrigin(object, originX, originY) {\n try {\n object.set({ originX, originY });\n object.setCoords();\n }\n catch {\n }\n}\n//# sourceMappingURL=fabric-animation.js.map","import { animateProps, restoreOrigin } from '../fabric/fabric-animation.js';\nexport class TransformController {\n constructor(context) {\n Object.defineProperty(this, \"context\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.context = context;\n }\n async scaleImage(factor) {\n if (!Number.isFinite(factor))\n return;\n const imageObject = this.context.getOriginalImage();\n if (!imageObject)\n return;\n if (this.context.guard.isAnimating())\n return;\n if (this.context.guard.isDisposed())\n return;\n const clamped = Math.max(this.context.options.minScale, Math.min(this.context.options.maxScale, factor));\n this.context.setCurrentScale(clamped);\n const targetAbs = this.context.getBaseImageScale() * clamped;\n try {\n const topLeft = computeTopLeftPoint(imageObject);\n imageObject.set({ originX: 'left', originY: 'top' });\n imageObject.setPositionByOrigin(topLeft, 'left', 'top');\n imageObject.setCoords();\n }\n catch (error) {\n console.warn('[ImageEditor] scaleImage: origin pre-anchor failed', error);\n }\n try {\n await this.context.guard.runAnimation(() => animateProps(imageObject, { scaleX: targetAbs, scaleY: targetAbs }, {\n duration: this.context.options.animationDuration,\n onChange: () => this.context.canvas.requestRenderAll(),\n }, this.context.guard));\n }\n catch (error) {\n console.warn('[ImageEditor] scaleImage animation error', error);\n return;\n }\n if (this.context.guard.isDisposed())\n return;\n imageObject.set({ scaleX: targetAbs, scaleY: targetAbs });\n imageObject.setCoords();\n if (this.context.afterTransformSnap)\n this.context.afterTransformSnap();\n this.context.saveCanvasState();\n }\n async rotateImage(degrees) {\n if (!Number.isFinite(degrees))\n return;\n const imageObject = this.context.getOriginalImage();\n if (!imageObject)\n return;\n if (this.context.guard.isAnimating())\n return;\n if (this.context.guard.isDisposed())\n return;\n this.context.setCurrentRotation(degrees);\n try {\n const centre = imageObject.getCenterPoint();\n imageObject.set({ originX: 'center', originY: 'center' });\n imageObject.setPositionByOrigin(centre, 'center', 'center');\n imageObject.setCoords();\n }\n catch (error) {\n console.warn('[ImageEditor] rotateImage: origin pre-anchor failed', error);\n }\n let animationFailed = false;\n try {\n await this.context.guard.runAnimation(() => animateProps(imageObject, { angle: degrees }, {\n duration: this.context.options.animationDuration,\n onChange: () => this.context.canvas.requestRenderAll(),\n }, this.context.guard));\n }\n catch (error) {\n animationFailed = true;\n console.warn('[ImageEditor] rotateImage animation error', error);\n }\n finally {\n if (this.context.guard.isDisposed()) {\n restoreOrigin(imageObject, 'left', 'top');\n }\n }\n if (animationFailed)\n return;\n if (this.context.guard.isDisposed())\n return;\n imageObject.set('angle', degrees);\n imageObject.setCoords();\n if (this.context.afterTransformSnap)\n this.context.afterTransformSnap();\n try {\n const newTopLeft = computeTopLeftPoint(imageObject);\n imageObject.set({ originX: 'left', originY: 'top' });\n imageObject.setPositionByOrigin(newTopLeft, 'left', 'top');\n imageObject.setCoords();\n }\n catch (error) {\n console.warn('[ImageEditor] rotateImage: origin post-restore failed', error);\n }\n this.context.saveCanvasState();\n }\n async resetImageTransform() {\n if (!this.context.getOriginalImage())\n return;\n this.context.setSuppressSaveState(true);\n try {\n await this.scaleImage(1);\n await this.rotateImage(0);\n }\n finally {\n this.context.setSuppressSaveState(false);\n }\n if (this.context.guard.isDisposed())\n return;\n this.context.saveCanvasState();\n }\n}\nfunction computeTopLeftPoint(object) {\n object.setCoords();\n const coords = object.getCoords();\n const first = coords[0];\n if (first)\n return first;\n const boundingRect = object.getBoundingRect();\n return { x: boundingRect.left, y: boundingRect.top };\n}\n//# sourceMappingURL=transform-controller.js.map","export function resolveNumeric(val, axis, fallback, canvas, options) {\n if (typeof val === 'number') {\n return val;\n }\n if (typeof val === 'function') {\n return val(canvas, options);\n }\n if (typeof val === 'string' && val.endsWith('%')) {\n const pct = parseFloat(val);\n if (!Number.isFinite(pct)) {\n return fallback;\n }\n const dim = axis === 'x' ? canvas.getWidth() : canvas.getHeight();\n return Math.floor(dim * (pct / 100));\n }\n return fallback;\n}\nexport function coercePoint(pt) {\n if (Array.isArray(pt)) {\n return { x: Number(pt[0]), y: Number(pt[1]) };\n }\n return { x: Number(pt.x), y: Number(pt.y) };\n}\n//# sourceMappingURL=number.js.map","import { isMaskObject } from '../core/public-types.js';\nimport { reportWarning } from '../core/callback-reporter.js';\nimport { attachMaskHoverHandlers, detachMaskHoverHandlers } from './mask-style.js';\nimport { coercePoint, resolveNumeric } from '../utils/number.js';\nconst POLYGON_AREA_EPSILON = 1e-6;\nlet nextMaskUid = 0;\nfunction createMaskUid(maskId) {\n nextMaskUid += 1;\n return `mask-${maskId}-${nextMaskUid}`;\n}\nfunction isFabricObjectLike(value) {\n if (!value || typeof value !== 'object')\n return false;\n const candidate = value;\n return typeof candidate.set === 'function' && typeof candidate.on === 'function';\n}\nfunction warnInvalidMask(options, reason) {\n reportWarning(options, null, `createMask skipped: ${reason}.`);\n}\nfunction isResolvableNumericInput(value) {\n if (value === undefined)\n return true;\n if (typeof value === 'number')\n return Number.isFinite(value);\n if (typeof value === 'function')\n return true;\n if (typeof value === 'string' && value.endsWith('%')) {\n return Number.isFinite(Number.parseFloat(value));\n }\n return false;\n}\nfunction isFiniteNumber(value) {\n return typeof value === 'number' && Number.isFinite(value);\n}\nfunction validateFiniteField(options, fieldName, value) {\n if (isFiniteNumber(value))\n return true;\n warnInvalidMask(options, `${fieldName} must resolve to a finite number`);\n return false;\n}\nfunction validatePositiveField(options, fieldName, value) {\n if (isFiniteNumber(value) && value > 0)\n return true;\n warnInvalidMask(options, `${fieldName} must resolve to a positive number`);\n return false;\n}\nfunction validateNonNegativeField(options, fieldName, value) {\n if (isFiniteNumber(value) && value >= 0)\n return true;\n warnInvalidMask(options, `${fieldName} must resolve to a non-negative number`);\n return false;\n}\nfunction validateNumericInputs(options, config) {\n const fields = [\n ['width', config.width],\n ['height', config.height],\n ['rx', config.rx],\n ['ry', config.ry],\n ['radius', config.radius],\n ['left', config.left],\n ['top', config.top],\n ];\n for (const [fieldName, value] of fields) {\n if (!isResolvableNumericInput(value)) {\n warnInvalidMask(options, `${fieldName} is not a supported numeric value`);\n return false;\n }\n }\n return true;\n}\nfunction resolvePolygonPoints(options, points) {\n if (!Array.isArray(points) || points.length < 3) {\n warnInvalidMask(options, 'polygon masks require at least three points');\n return null;\n }\n const resolvedPoints = points.map(coercePoint);\n const allFinite = resolvedPoints.every((point) => Number.isFinite(point.x) && Number.isFinite(point.y));\n if (!allFinite) {\n warnInvalidMask(options, 'polygon points must contain finite x/y values');\n return null;\n }\n if (polygonArea(resolvedPoints) <= POLYGON_AREA_EPSILON) {\n warnInvalidMask(options, 'polygon points must describe a non-zero area');\n return null;\n }\n return resolvedPoints;\n}\nfunction polygonArea(points) {\n let area = 0;\n for (let index = 0; index < points.length; index += 1) {\n const current = points[index];\n const next = points[(index + 1) % points.length];\n area += current.x * next.y - next.x * current.y;\n }\n return Math.abs(area) / 2;\n}\nexport function createMask(context, config = {}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;\n const { canvas, options, fabric: fabricModule } = context;\n if (!canvas)\n return null;\n const shapeType = (_a = config.shape) !== null && _a !== void 0 ? _a : 'rect';\n if (!validateNumericInputs(options, config))\n return null;\n const resolvedConfig = {\n shape: shapeType,\n width: options.defaultMaskWidth,\n height: options.defaultMaskHeight,\n color: 'rgba(0,0,0,0.5)',\n alpha: 0.5,\n gap: 5,\n left: undefined,\n top: undefined,\n angle: 0,\n selectable: true,\n ...config,\n };\n const firstOffset = 10;\n let left;\n let top;\n const previousMask = context.getLastMask();\n if (config.left === undefined && previousMask) {\n const previousRight = ((_b = previousMask.left) !== null && _b !== void 0 ? _b : 0) +\n (typeof previousMask.getScaledWidth === 'function'\n ? previousMask.getScaledWidth()\n : ((_c = previousMask.width) !== null && _c !== void 0 ? _c : 0) * ((_d = previousMask.scaleX) !== null && _d !== void 0 ? _d : 1));\n left = Math.round(previousRight + ((_e = resolvedConfig.gap) !== null && _e !== void 0 ? _e : 5));\n top = (_f = previousMask.top) !== null && _f !== void 0 ? _f : firstOffset;\n }\n else {\n left = resolveNumeric(config.left, 'x', firstOffset, canvas, options);\n top = resolveNumeric(config.top, 'y', firstOffset, canvas, options);\n }\n resolvedConfig.width = resolveNumeric(config.width, 'x', options.defaultMaskWidth, canvas, options);\n resolvedConfig.height = resolveNumeric(config.height, 'y', options.defaultMaskHeight, canvas, options);\n const rx = config.rx !== undefined ? resolveNumeric(config.rx, 'x', 0, canvas, options) : undefined;\n const ry = config.ry !== undefined ? resolveNumeric(config.ry, 'y', 0, canvas, options) : undefined;\n const radius = shapeType === 'circle'\n ? resolveNumeric(config.radius, 'x', Math.min(resolvedConfig.width, resolvedConfig.height) / 2, canvas, options)\n : undefined;\n const polygonPoints = shapeType === 'polygon' ? resolvePolygonPoints(options, config.points) : null;\n if (!validateFiniteField(options, 'left', left) ||\n !validateFiniteField(options, 'top', top) ||\n !validatePositiveField(options, 'width', resolvedConfig.width) ||\n !validatePositiveField(options, 'height', resolvedConfig.height) ||\n !validateFiniteField(options, 'gap', resolvedConfig.gap) ||\n !validateFiniteField(options, 'angle', resolvedConfig.angle) ||\n !validateFiniteField(options, 'alpha', resolvedConfig.alpha)) {\n return null;\n }\n if ((rx !== undefined && !validateNonNegativeField(options, 'rx', rx)) ||\n (ry !== undefined && !validateNonNegativeField(options, 'ry', ry)) ||\n (radius !== undefined && !validatePositiveField(options, 'radius', radius)) ||\n (shapeType === 'polygon' && polygonPoints === null)) {\n return null;\n }\n if (options.expandCanvasToImage) {\n const requiredWidth = Math.ceil(left + resolvedConfig.width + 10);\n const requiredHeight = Math.ceil(top + resolvedConfig.height + 10);\n const nextWidth = Math.max(canvas.getWidth(), requiredWidth);\n const nextHeight = Math.max(canvas.getHeight(), requiredHeight);\n if (nextWidth !== canvas.getWidth() || nextHeight !== canvas.getHeight()) {\n if (context.expandCanvasIfNeeded) {\n context.expandCanvasIfNeeded(nextWidth, nextHeight);\n }\n else {\n canvas.setDimensions({ width: nextWidth, height: nextHeight });\n }\n }\n }\n let mask;\n if (typeof resolvedConfig.fabricGenerator === 'function') {\n const generated = resolvedConfig.fabricGenerator(resolvedConfig, canvas, options);\n if (!isFabricObjectLike(generated)) {\n reportWarning(options, generated, 'createMask skipped: fabricGenerator did not return a Fabric object.');\n return null;\n }\n mask = generated;\n }\n else {\n const originProps = {\n originX: 'left',\n originY: 'top',\n };\n switch (shapeType) {\n case 'circle':\n mask = new fabricModule.Circle({\n left,\n top,\n ...originProps,\n radius,\n fill: resolvedConfig.color,\n opacity: resolvedConfig.alpha,\n angle: (_g = resolvedConfig.angle) !== null && _g !== void 0 ? _g : 0,\n ...resolvedConfig.styles,\n });\n break;\n case 'ellipse':\n mask = new fabricModule.Ellipse({\n left,\n top,\n ...originProps,\n rx: rx !== null && rx !== void 0 ? rx : resolvedConfig.width / 2,\n ry: ry !== null && ry !== void 0 ? ry : resolvedConfig.height / 2,\n fill: resolvedConfig.color,\n opacity: resolvedConfig.alpha,\n angle: (_h = resolvedConfig.angle) !== null && _h !== void 0 ? _h : 0,\n ...resolvedConfig.styles,\n });\n break;\n case 'polygon': {\n const polygon = new fabricModule.Polygon(polygonPoints, {\n ...originProps,\n fill: resolvedConfig.color,\n opacity: resolvedConfig.alpha,\n angle: (_j = resolvedConfig.angle) !== null && _j !== void 0 ? _j : 0,\n ...resolvedConfig.styles,\n });\n polygon.setCoords();\n const boundingRect = polygon.getBoundingRect();\n const deltaX = left - boundingRect.left;\n const deltaY = top - boundingRect.top;\n polygon.set({\n left: ((_k = polygon.left) !== null && _k !== void 0 ? _k : 0) + deltaX,\n top: ((_l = polygon.top) !== null && _l !== void 0 ? _l : 0) + deltaY,\n });\n polygon.setCoords();\n mask = polygon;\n break;\n }\n case 'rect':\n default:\n mask = new fabricModule.Rect({\n left,\n top,\n ...originProps,\n width: resolvedConfig.width,\n height: resolvedConfig.height,\n fill: resolvedConfig.color,\n opacity: resolvedConfig.alpha,\n angle: (_m = resolvedConfig.angle) !== null && _m !== void 0 ? _m : 0,\n ...(rx !== undefined ? { rx } : {}),\n ...(ry !== undefined ? { ry } : {}),\n ...resolvedConfig.styles,\n });\n }\n }\n const maskObject = mask;\n maskObject.selectable = 'selectable' in config ? !!config.selectable : true;\n maskObject.evented = 'evented' in config ? !!config.evented : true;\n maskObject.hasControls = 'hasControls' in config ? !!config.hasControls : true;\n maskObject.transparentCorners =\n 'transparentCorners' in config ? !!config.transparentCorners : false;\n maskObject.strokeUniform = 'strokeUniform' in config ? !!config.strokeUniform : true;\n maskObject.lockRotation = !options.maskRotatable;\n maskObject.borderColor = (_o = config.borderColor) !== null && _o !== void 0 ? _o : 'red';\n maskObject.cornerColor = (_p = config.cornerColor) !== null && _p !== void 0 ? _p : 'black';\n maskObject.cornerSize = (_q = config.cornerSize) !== null && _q !== void 0 ? _q : 8;\n const styles = ((_r = resolvedConfig.styles) !== null && _r !== void 0 ? _r : {});\n if ('stroke' in styles) {\n maskObject.stroke = styles.stroke;\n }\n else {\n maskObject.stroke = '#ccc';\n }\n if ('strokeWidth' in styles) {\n maskObject.strokeWidth = styles.strokeWidth;\n }\n else {\n maskObject.strokeWidth = 1;\n }\n if ('strokeDashArray' in styles) {\n maskObject.strokeDashArray = styles.strokeDashArray;\n }\n maskObject.originalAlpha = resolvedConfig.alpha;\n maskObject.originalStroke = maskObject.stroke;\n maskObject.originalStrokeWidth = maskObject.strokeWidth;\n attachMaskHoverHandlers(maskObject);\n const nextId = context.getMaskCounter() + 1;\n context.setMaskCounter(nextId);\n maskObject.maskId = nextId;\n maskObject.maskUid = createMaskUid(nextId);\n maskObject.maskName = `${options.maskName}${nextId}`;\n context.setLastMask(maskObject);\n canvas.add(maskObject);\n canvas.bringObjectToFront(maskObject);\n context.updateMaskList();\n if (resolvedConfig.selectable !== false) {\n canvas.setActiveObject(maskObject);\n }\n canvas.renderAll();\n context.saveCanvasState();\n if (typeof resolvedConfig.onCreate === 'function') {\n try {\n resolvedConfig.onCreate(maskObject, canvas);\n }\n catch (error) {\n reportWarning(options, error, 'createMask onCreate callback threw.');\n }\n }\n return maskObject;\n}\nexport function removeSelectedMask(context) {\n const active = context.canvas.getActiveObject();\n if (!active || !isMaskObject(active))\n return;\n context.removeLabelForMask(active);\n detachMaskHoverHandlers(active);\n context.canvas.remove(active);\n context.canvas.discardActiveObject();\n context.updateMaskList();\n context.canvas.renderAll();\n context.saveCanvasState();\n}\nexport function removeAllMasks(context, options = {}) {\n const masks = context.canvas.getObjects().filter(isMaskObject);\n if (masks.length === 0)\n return;\n for (const maskObject of masks) {\n context.removeLabelForMask(maskObject);\n detachMaskHoverHandlers(maskObject);\n context.canvas.remove(maskObject);\n }\n context.canvas.discardActiveObject();\n context.setLastMask(null);\n context.updateMaskList();\n context.canvas.renderAll();\n if (options.saveHistory !== false) {\n context.saveCanvasState();\n }\n}\n//# sourceMappingURL=mask-factory.js.map","import { isMaskObject } from '../core/public-types.js';\nimport { reportWarning } from '../core/callback-reporter.js';\nexport function removeLabelForMask(context, mask) {\n if (!context.canvas || !mask.labelObject)\n return;\n try {\n if (context.canvas.getObjects().includes(mask.labelObject)) {\n context.canvas.remove(mask.labelObject);\n }\n }\n catch {\n }\n try {\n delete mask.labelObject;\n }\n catch {\n }\n}\nexport function createLabelForMask(context, mask) {\n var _a;\n const { canvas, options, fabric: fabricModule } = context;\n if (!canvas || !options.maskLabelOnSelect)\n return;\n removeLabelForMask(context, mask);\n let labelTextObject = null;\n if (typeof options.label.create === 'function') {\n try {\n labelTextObject = options.label.create(mask, fabricModule);\n }\n catch (error) {\n reportWarning(options, error, 'label.create callback threw.');\n labelTextObject = null;\n }\n }\n if (!labelTextObject) {\n const indexForGetText = mask.maskId - 1;\n let labelText = mask.maskName;\n if (typeof options.label.getText === 'function') {\n try {\n labelText = options.label.getText(mask, indexForGetText);\n }\n catch (error) {\n reportWarning(options, error, 'label.getText callback threw.');\n labelText = mask.maskName;\n }\n }\n const textOptions = {\n left: 0,\n top: 0,\n ...((_a = options.label.textOptions) !== null && _a !== void 0 ? _a : {}),\n originX: 'left',\n originY: 'top',\n };\n labelTextObject = new fabricModule.FabricText(labelText, textOptions);\n }\n labelTextObject.maskLabel = true;\n mask.labelObject = labelTextObject;\n canvas.add(labelTextObject);\n canvas.bringObjectToFront(labelTextObject);\n syncMaskLabel(context, mask);\n}\nexport function syncMaskLabel(context, mask) {\n var _a, _b, _c;\n const { canvas, options } = context;\n if (!canvas || !options.maskLabelOnSelect || !mask.labelObject)\n return;\n const coords = (_a = mask.getCoords) === null || _a === void 0 ? void 0 : _a.call(mask);\n if (!(coords === null || coords === void 0 ? void 0 : coords.length))\n return;\n const tl = coords[0];\n if (!tl)\n return;\n const center = mask.getCenterPoint();\n const vx = center.x - tl.x;\n const vy = center.y - tl.y;\n const dist = Math.sqrt(vx * vx + vy * vy) || 1;\n const offset = Math.max(0, (_b = options.maskLabelOffset) !== null && _b !== void 0 ? _b : 3);\n mask.labelObject.set({\n left: Math.round(tl.x + (vx / dist) * offset),\n top: Math.round(tl.y + (vy / dist) * offset),\n angle: (_c = mask.angle) !== null && _c !== void 0 ? _c : 0,\n originX: 'left',\n originY: 'top',\n visible: true,\n });\n mask.labelObject.setCoords();\n canvas.renderAll();\n}\nexport function showLabelForMask(context, mask) {\n if (!context.options.maskLabelOnSelect)\n return;\n if (!mask.labelObject) {\n createLabelForMask(context, mask);\n }\n if (mask.labelObject) {\n mask.labelObject.visible = true;\n syncMaskLabel(context, mask);\n }\n}\nexport function hideAllMaskLabels(context) {\n const { canvas } = context;\n if (!canvas)\n return;\n const objs = canvas.getObjects();\n objs.filter((o) => o.maskLabel).forEach((l) => {\n try {\n canvas.remove(l);\n }\n catch {\n }\n });\n objs.filter(isMaskObject).forEach((o) => {\n try {\n delete o.labelObject;\n }\n catch {\n }\n });\n}\n//# sourceMappingURL=mask-label-manager.js.map","export class DomBindings {\n constructor(resolveElementId, isDisposed) {\n Object.defineProperty(this, \"registry\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n Object.defineProperty(this, \"resolveElementId\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"isDisposed\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.resolveElementId = resolveElementId;\n this.isDisposed = isDisposed;\n }\n bindIfExists(key, eventType, handler) {\n const id = this.resolveElementId(key);\n if (!id)\n return false;\n const element = document.getElementById(id);\n if (!element)\n return false;\n const wrapped = (event) => {\n if (this.isDisposed())\n return;\n handler(event);\n };\n element.addEventListener(eventType, wrapped);\n this.registry.push({ elementKey: key, eventType, handler: wrapped });\n return true;\n }\n removeAll() {\n for (const entry of this.registry) {\n const id = this.resolveElementId(entry.elementKey);\n if (!id)\n continue;\n const element = document.getElementById(id);\n if (!element)\n continue;\n try {\n element.removeEventListener(entry.eventType, entry.handler);\n }\n catch {\n }\n }\n this.registry = [];\n }\n size() {\n return this.registry.length;\n }\n}\n//# sourceMappingURL=dom-bindings.js.map","export function setPlaceholderVisible(placeholderElement, containerElement, show) {\n if (placeholderElement) {\n placeholderElement.hidden = !show;\n placeholderElement.setAttribute('aria-hidden', show ? 'false' : 'true');\n }\n if (containerElement) {\n containerElement.hidden = show;\n containerElement.setAttribute('aria-hidden', show ? 'true' : 'false');\n }\n}\n//# sourceMappingURL=visibility-state.js.map","export const SUPPORTED_IMAGE_EXTENSIONS = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n gif: 'image/gif',\n bmp: 'image/bmp',\n};\nexport const SUPPORTED_IMAGE_MIME_TYPES = new Set(Object.values(SUPPORTED_IMAGE_EXTENSIONS));\nexport function inferImageMimeType(file) {\n var _a, _b;\n if (file.type && SUPPORTED_IMAGE_MIME_TYPES.has(file.type))\n return file.type;\n if (file.type)\n return null;\n const match = /\\.([a-z0-9]+)$/i.exec(file.name);\n const ext = (_a = match === null || match === void 0 ? void 0 : match[1]) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n if (!ext)\n return null;\n return (_b = SUPPORTED_IMAGE_EXTENSIONS[ext]) !== null && _b !== void 0 ? _b : null;\n}\nexport function readFileAsDataUrl(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const fileReaderResult = reader.result;\n if (typeof fileReaderResult === 'string') {\n resolve(fileReaderResult);\n }\n else {\n reject(new Error('FileReader returned a non-string result'));\n }\n };\n reader.onerror = () => {\n var _a;\n reject((_a = reader.error) !== null && _a !== void 0 ? _a : new Error('FileReader error'));\n };\n reader.onabort = () => {\n reject(new Error('FileReader read aborted'));\n };\n reader.readAsDataURL(file);\n });\n}\nexport function resetFileInput(input) {\n if (!input)\n return;\n try {\n input.value = '';\n }\n catch {\n }\n}\n//# sourceMappingURL=file.js.map","import { AnimationQueue } from './animation/animation-queue.js';\nimport { reportError, reportWarning } from './core/callback-reporter.js';\nimport { resolveOptions } from './core/default-options.js';\nimport { OperationGuard } from './core/operation-guard.js';\nimport { loadFromState as loadFromStateImpl, saveState as saveStateImpl, } from './core/state-serializer.js';\nimport { Command, HistoryManager } from './history/history-manager.js';\nimport { detectFabric } from './fabric/fabric-adapter.js';\nimport { isMaskObject } from './core/public-types.js';\nimport { applyCrop as applyCropImpl, cancelCrop as cancelCropImpl, enterCropMode as enterCropModeImpl, } from './crop/crop-controller.js';\nimport { downloadImage as downloadImageImpl, exportImageBase64 as exportImageBase64Impl, exportImageFile as exportImageFileImpl, mergeMasks as mergeMasksImpl, } from './export/export-service.js';\nimport { loadImage as loadImageImpl } from './image/image-loader.js';\nimport { ViewportCache, applyCanvasDimensions, computeScrollableCanvasSize, detectLayoutConflict, measureScrollbarSize, } from './image/layout-manager.js';\nimport { TransformController } from './image/transform-controller.js';\nimport { createMask as createMaskImpl, removeAllMasks as removeAllMasksImpl, removeSelectedMask as removeSelectedMaskImpl, } from './mask/mask-factory.js';\nimport { createLabelForMask, hideAllMaskLabels, removeLabelForMask, showLabelForMask, syncMaskLabel, } from './mask/mask-label-manager.js';\nimport { renderMaskList, updateMaskListSelection } from './mask/mask-list.js';\nimport { applyMaskSelectedStyle, applyMaskUnselectedStyle, reattachMaskHoverHandlers, } from './mask/mask-style.js';\nimport { DomBindings } from './ui/dom-bindings.js';\nimport { setPlaceholderVisible as setPlaceholderVisibleImpl } from './ui/visibility-state.js';\nimport { inferImageMimeType, readFileAsDataUrl, resetFileInput } from './utils/file.js';\nimport { detectSourceMimeType } from './image/image-resampler.js';\nconst LAYOUT_EPSILON = 0.5;\nconst INTERNAL_OPERATION_TOKEN = Symbol.for('ImageEditorInternalOperation');\nconst INTERNAL_ALLOW_DURING_ANIMATION_QUEUE = Symbol.for('ImageEditorAllowDuringAnimationQueue');\nconst CROP_MODE_CONTROL_KEYS = [\n 'scalePercentageInput',\n 'rotateLeftDegreesInput',\n 'rotateRightDegreesInput',\n 'rotateLeftButton',\n 'rotateRightButton',\n 'createMaskButton',\n 'removeSelectedMaskButton',\n 'removeAllMasksButton',\n 'mergeMasksButton',\n 'downloadImageButton',\n 'zoomInButton',\n 'zoomOutButton',\n 'resetImageTransformButton',\n 'undoButton',\n 'redoButton',\n 'imageInput',\n 'enterCropModeButton',\n 'applyCropButton',\n 'cancelCropButton',\n];\nconst CROP_MODE_ENABLED_KEYS = ['applyCropButton', 'cancelCropButton'];\nconst CROP_SESSION_ALLOWED_OPERATIONS = new Set(['applyCrop', 'cancelCrop']);\nexport class ImageEditor {\n constructor(fabricModuleOrOptions = {}, options = {}) {\n var _a;\n Object.defineProperty(this, \"fabricModule\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"isFabricLoaded\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"options\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"canvas\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"canvasElement\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"containerElement\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"placeholderElement\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"elements\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {}\n });\n Object.defineProperty(this, \"elementOriginalDisabledMap\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Map()\n });\n Object.defineProperty(this, \"elementOriginalAriaDisabledMap\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Map()\n });\n Object.defineProperty(this, \"elementOriginalPointerEventsMap\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Map()\n });\n Object.defineProperty(this, \"originalImage\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"baseImageScale\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 1\n });\n Object.defineProperty(this, \"currentScale\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 1\n });\n Object.defineProperty(this, \"currentRotation\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\n });\n Object.defineProperty(this, \"isImageLoadedToCanvas\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"currentImageMimeType\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"maskCounter\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\n });\n Object.defineProperty(this, \"lastMask\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"lastSnapshot\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"historyManager\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"operationGuard\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"animQueue\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"transformController\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"viewportCache\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new ViewportCache()\n });\n Object.defineProperty(this, \"cropSession\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"domBindings\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"isDisposed\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"shouldSuppressSaveState\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"lastEmittedIsBusy\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"activeStateRestoreOperation\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"nextSelectionChangeContext\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n const detected = detectFabric(fabricModuleOrOptions, options);\n this.fabricModule = (_a = detected.fabric) !== null && _a !== void 0 ? _a : {};\n this.isFabricLoaded = detected.isFabricLoaded;\n this.options = resolveOptions(detected.options);\n const layoutConflict = detectLayoutConflict(this.options);\n if (layoutConflict) {\n reportWarning(this.options, null, layoutConflict.message);\n }\n this.operationGuard = new OperationGuard();\n this.animQueue = new AnimationQueue();\n this.historyManager = new HistoryManager(this.options.maxHistorySize);\n }\n init(idMap = {}) {\n if (!this.isFabricLoaded) {\n const globalFabric = globalThis.fabric;\n if (!globalFabric ||\n typeof globalFabric.Canvas !== 'function') {\n return;\n }\n this.fabricModule = globalFabric;\n this.isFabricLoaded = true;\n }\n if (this.isDisposed)\n return;\n const defaults = {\n canvas: 'canvas',\n canvasContainer: null,\n imagePlaceholder: 'imagePlaceholder',\n scalePercentageInput: 'scalePercentageInput',\n rotateLeftDegreesInput: 'rotateLeftDegreesInput',\n rotateRightDegreesInput: 'rotateRightDegreesInput',\n rotateLeftButton: 'rotateLeftButton',\n rotateRightButton: 'rotateRightButton',\n createMaskButton: 'createMaskButton',\n removeSelectedMaskButton: 'removeSelectedMaskButton',\n removeAllMasksButton: 'removeAllMasksButton',\n mergeMasksButton: 'mergeMasksButton',\n downloadImageButton: 'downloadImageButton',\n maskList: 'maskList',\n zoomInButton: 'zoomInButton',\n zoomOutButton: 'zoomOutButton',\n resetImageTransformButton: 'resetImageTransformButton',\n undoButton: 'undoButton',\n redoButton: 'redoButton',\n imageInput: 'imageInput',\n enterCropModeButton: 'enterCropModeButton',\n applyCropButton: 'applyCropButton',\n cancelCropButton: 'cancelCropButton',\n uploadArea: 'uploadArea',\n };\n this.elements = { ...defaults, ...idMap };\n this.domBindings = new DomBindings((key) => this.elements[key], () => this.isDisposed);\n this.initCanvas();\n this.transformController = new TransformController(this.buildTransformContext());\n this.bindDomEvents();\n this.updateInputs();\n this.updateMaskList();\n this.updateUi();\n if (this.options.initialImageBase64) {\n void this.loadImage(this.options.initialImageBase64).catch(() => {\n });\n }\n else {\n this.updatePlaceholderStatus();\n }\n }\n initCanvas() {\n var _a;\n const id = this.elements.canvas;\n const canvasElement = id ? document.getElementById(id) : null;\n if (!canvasElement)\n throw new Error(`[ImageEditor] Canvas element not found: \"${id}\"`);\n this.canvasElement = canvasElement;\n const containerId = this.elements.canvasContainer;\n if (containerId) {\n this.containerElement =\n (_a = document.getElementById(containerId)) !== null && _a !== void 0 ? _a : canvasElement.parentElement;\n }\n else {\n this.containerElement = canvasElement.parentElement;\n }\n const placeholderId = this.elements.imagePlaceholder;\n this.placeholderElement = placeholderId ? document.getElementById(placeholderId) : null;\n let initialWidth = this.options.canvasWidth;\n let initialHeight = this.options.canvasHeight;\n if (this.containerElement) {\n const containerWidth = Math.floor(this.containerElement.clientWidth);\n const containerHeight = Math.floor(this.containerElement.clientHeight);\n if (containerWidth > 0 && containerHeight > 0) {\n initialWidth = containerWidth;\n initialHeight = containerHeight;\n }\n }\n this.canvas = new this.fabricModule.Canvas(canvasElement, {\n width: initialWidth,\n height: initialHeight,\n backgroundColor: this.options.backgroundColor,\n selection: this.options.groupSelection,\n preserveObjectStacking: true,\n });\n this.canvas.on('selection:created', (e) => {\n this.handleSelectionChanged(e.selected);\n });\n this.canvas.on('selection:updated', (e) => {\n this.handleSelectionChanged(e.selected);\n });\n this.canvas.on('selection:cleared', () => this.handleSelectionChanged([]));\n const onObjectEvent = (e) => {\n if (e.target && isMaskObject(e.target))\n this.syncMaskLabel(e.target);\n };\n const onObjectModified = (e) => {\n if (!e.target || !isMaskObject(e.target))\n return;\n this.syncMaskLabel(e.target);\n this.saveState();\n };\n this.canvas.on('object:moving', onObjectEvent);\n this.canvas.on('object:scaling', onObjectEvent);\n this.canvas.on('object:rotating', onObjectEvent);\n this.canvas.on('object:modified', onObjectModified);\n }\n bindDomEvents() {\n this.bindElementIfExists('uploadArea', 'click', () => {\n var _a;\n const inputId = this.elements.imageInput;\n if (inputId)\n (_a = document.getElementById(inputId)) === null || _a === void 0 ? void 0 : _a.click();\n });\n this.bindElementIfExists('imageInput', 'change', (e) => {\n var _a;\n const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];\n if (file)\n void this.loadImageFile(file);\n });\n this.bindElementIfExists('zoomInButton', 'click', () => {\n void this.scaleImage(this.currentScale + this.options.scaleStep);\n });\n this.bindElementIfExists('zoomOutButton', 'click', () => {\n void this.scaleImage(this.currentScale - this.options.scaleStep);\n });\n this.bindElementIfExists('resetImageTransformButton', 'click', () => {\n void this.resetImageTransform();\n });\n this.bindElementIfExists('createMaskButton', 'click', () => {\n this.createMask();\n });\n this.bindElementIfExists('removeSelectedMaskButton', 'click', () => {\n this.removeSelectedMask();\n });\n this.bindElementIfExists('removeAllMasksButton', 'click', () => {\n this.removeAllMasks();\n });\n this.bindElementIfExists('mergeMasksButton', 'click', () => {\n void this.mergeMasks();\n });\n this.bindElementIfExists('downloadImageButton', 'click', () => {\n this.downloadImage();\n });\n this.bindElementIfExists('undoButton', 'click', () => {\n this.undo();\n });\n this.bindElementIfExists('redoButton', 'click', () => {\n this.redo();\n });\n this.bindElementIfExists('rotateLeftButton', 'click', () => {\n const inputId = this.elements.rotateLeftDegreesInput;\n const inputEl = inputId\n ? document.getElementById(inputId)\n : null;\n let step = this.options.rotationStep;\n if (inputEl) {\n const parsedStep = parseFloat(inputEl.value);\n if (!isNaN(parsedStep))\n step = parsedStep;\n }\n void this.rotateImage(this.currentRotation - step);\n });\n this.bindElementIfExists('rotateRightButton', 'click', () => {\n const inputId = this.elements.rotateRightDegreesInput;\n const inputEl = inputId\n ? document.getElementById(inputId)\n : null;\n let step = this.options.rotationStep;\n if (inputEl) {\n const parsedStep = parseFloat(inputEl.value);\n if (!isNaN(parsedStep))\n step = parsedStep;\n }\n void this.rotateImage(this.currentRotation + step);\n });\n this.bindElementIfExists('enterCropModeButton', 'click', () => {\n this.enterCropMode();\n });\n this.bindElementIfExists('applyCropButton', 'click', () => {\n void this.applyCrop().catch((error) => {\n reportError(this.options, error, 'Crop apply failed.');\n });\n });\n this.bindElementIfExists('cancelCropButton', 'click', () => {\n this.cancelCrop();\n });\n }\n bindElementIfExists(key, event, handler) {\n var _a;\n (_a = this.domBindings) === null || _a === void 0 ? void 0 : _a.bindIfExists(key, event, handler);\n }\n async loadImageFile(file) {\n const inputId = this.elements.imageInput;\n const inputEl = inputId\n ? document.getElementById(inputId)\n : null;\n const mime = inferImageMimeType(file);\n if (!mime) {\n reportWarning(this.options, null, `Unsupported image file type: ${file.type || file.name || 'unknown'}.`);\n resetFileInput(inputEl);\n return;\n }\n let dataUrl;\n try {\n dataUrl = await readFileAsDataUrl(file);\n }\n catch (error) {\n reportError(this.options, error, 'Failed to read selected image file.');\n resetFileInput(inputEl);\n return;\n }\n try {\n await this.loadImage(dataUrl);\n }\n catch {\n }\n finally {\n resetFileInput(inputEl);\n }\n }\n async loadImage(base64, options = {}) {\n if (!this.isFabricLoaded || !this.canvas)\n return;\n if (this.isDisposed)\n return;\n if (typeof base64 !== 'string' || !base64.startsWith('data:image/'))\n return;\n if (!this.canRunIdleOperation('loadImage', options))\n return;\n const callbackContext = this.getOperationContext('loadImage', options);\n const previousImage = this.originalImage;\n const hadMasks = this.getMasks().length > 0;\n this.emitOptionCallback('onImageLoadStart', [callbackContext]);\n this.operationGuard.beginLoading();\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n this.hideAllMaskLabels();\n const loadImageContext = {\n fabric: this.fabricModule,\n canvas: this.canvas,\n options: this.options,\n containerElement: this.containerElement,\n placeholderElement: this.placeholderElement,\n viewportCache: this.viewportCache,\n getOriginalImage: () => this.originalImage,\n setOriginalImage: (v) => {\n this.originalImage = v;\n },\n getIsImageLoadedToCanvas: () => this.isImageLoadedToCanvas,\n setIsImageLoadedToCanvas: (v) => {\n this.isImageLoadedToCanvas = v;\n },\n getLastSnapshot: () => this.lastSnapshot,\n setLastSnapshot: (v) => {\n this.lastSnapshot = v;\n },\n getMaskCounter: () => this.maskCounter,\n setMaskCounter: (v) => {\n this.maskCounter = v;\n },\n getCurrentScale: () => this.currentScale,\n setCurrentScale: (v) => {\n this.currentScale = v;\n },\n getCurrentRotation: () => this.currentRotation,\n setCurrentRotation: (v) => {\n this.currentRotation = v;\n },\n getBaseImageScale: () => this.baseImageScale,\n setBaseImageScale: (v) => {\n this.baseImageScale = v;\n },\n getCurrentImageMimeType: () => this.currentImageMimeType,\n setCurrentImageMimeType: (v) => {\n this.currentImageMimeType = v;\n },\n setPlaceholderVisible: (show) => {\n setPlaceholderVisibleImpl(this.placeholderElement, this.containerElement, this.options.showPlaceholder ? show : false);\n },\n };\n try {\n await loadImageImpl(loadImageContext, base64, options);\n }\n finally {\n this.operationGuard.endLoading();\n this.emitBusyChangeIfChanged(callbackContext);\n if (!this.isDisposed && this.canvas)\n this.updateUi();\n }\n this.lastMask = null;\n this.updateInputs();\n this.updateMaskList();\n this.updateUi();\n if (previousImage && previousImage !== this.originalImage) {\n this.emitOptionCallback('onImageCleared', [previousImage, callbackContext]);\n }\n const imageInfo = this.getImageInfo();\n if (imageInfo) {\n this.emitOptionCallback('onImageLoaded', [imageInfo, callbackContext]);\n }\n if (hadMasks) {\n this.emitMasksChanged(callbackContext);\n }\n this.emitImageChanged(callbackContext);\n }\n getInternalOperationToken(options) {\n var _a;\n return ((_a = options === null || options === void 0 ? void 0 : options[INTERNAL_OPERATION_TOKEN]) !== null && _a !== void 0 ? _a : null);\n }\n canRunDuringAnimationQueue(options) {\n return !!(options === null || options === void 0 ? void 0 : options[INTERNAL_ALLOW_DURING_ANIMATION_QUEUE]);\n }\n withInternalOperationOptions(token, options = {}) {\n return {\n ...options,\n ...(token ? { [INTERNAL_OPERATION_TOKEN]: token } : {}),\n };\n }\n withAnimationQueueBypass(options = {}) {\n return {\n ...options,\n [INTERNAL_ALLOW_DURING_ANIMATION_QUEUE]: true,\n };\n }\n assertIdleForOperation(operationName, options) {\n const token = this.getInternalOperationToken(options);\n this.operationGuard.assertIdleForOperation(operationName, token);\n if (this.cropSession &&\n !this.operationGuard.isOwnOperation(token) &&\n !CROP_SESSION_ALLOWED_OPERATIONS.has(operationName)) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" while crop mode is active.`);\n }\n if (this.animQueue.isBusy() && !this.canRunDuringAnimationQueue(options)) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" while an animation is queued.`);\n }\n }\n canRunIdleOperation(operationName, options) {\n try {\n this.assertIdleForOperation(operationName, options);\n return true;\n }\n catch {\n return false;\n }\n }\n assertCanQueueAnimation(operationName, options) {\n this.operationGuard.assertCanQueueAnimation(operationName, this.getInternalOperationToken(options));\n }\n isImageLoaded() {\n var _a, _b;\n return !!(this.originalImage &&\n this.originalImage instanceof this.fabricModule.FabricImage &&\n ((_a = this.originalImage.width) !== null && _a !== void 0 ? _a : 0) > 0 &&\n ((_b = this.originalImage.height) !== null && _b !== void 0 ? _b : 0) > 0);\n }\n isBusy() {\n return this.operationGuard.isBusy() || this.animQueue.isBusy() || this.cropSession !== null;\n }\n setLayoutMode(mode) {\n if (mode !== 'fit' && mode !== 'cover' && mode !== 'expand') {\n reportWarning(this.options, new TypeError(`[ImageEditor] Unsupported layout mode ${JSON.stringify(mode)}. ` +\n 'Expected \"fit\", \"cover\", or \"expand\".'), 'Ignored invalid layout mode.');\n return;\n }\n this.options.fitImageToCanvas = mode === 'fit';\n this.options.coverImageToCanvas = mode === 'cover';\n this.options.expandCanvasToImage = mode === 'expand';\n }\n buildCallbackContext(operation, isInternalOperation = false) {\n return { operation, isInternalOperation };\n }\n getOperationContext(fallback, options) {\n const internal = this.getInternalOperationToken(options);\n const activeOperation = this.operationGuard.activeOperationName();\n if (internal && activeOperation) {\n return this.buildCallbackContext(activeOperation, true);\n }\n return this.buildCallbackContext(fallback, false);\n }\n emitOptionCallback(callbackName, args) {\n const callback = this.options[callbackName];\n if (typeof callback !== 'function')\n return;\n try {\n callback(...args);\n }\n catch (error) {\n console.error(`[ImageEditor] ${callbackName} callback threw`, error);\n }\n }\n getImageInfo() {\n if (!this.canvas || !this.originalImage)\n return null;\n const canvasWidth = this.canvas.getWidth();\n const canvasHeight = this.canvas.getHeight();\n let displayWidth;\n let displayHeight;\n try {\n this.originalImage.setCoords();\n const bounds = this.originalImage.getBoundingRect();\n displayWidth = Math.max(0, Number(bounds.width) || 0);\n displayHeight = Math.max(0, Number(bounds.height) || 0);\n }\n catch {\n displayWidth = Math.max(0, (Number(this.originalImage.width) || 0) *\n Math.abs(Number(this.originalImage.scaleX) || 1));\n displayHeight = Math.max(0, (Number(this.originalImage.height) || 0) *\n Math.abs(Number(this.originalImage.scaleY) || 1));\n }\n return {\n width: Math.max(0, Number(this.originalImage.width) || 0),\n height: Math.max(0, Number(this.originalImage.height) || 0),\n displayWidth,\n displayHeight,\n scale: this.currentScale,\n rotation: this.currentRotation,\n canvasWidth,\n canvasHeight,\n };\n }\n getMasks() {\n if (!this.canvas)\n return [];\n return this.canvas.getObjects().filter(isMaskObject).slice();\n }\n getMaskCollectionSignature() {\n return this.getMasks()\n .map((mask) => `${mask.maskId}:${mask.maskName}`)\n .join('|');\n }\n getEditorState() {\n const canvasWidth = this.canvas ? this.canvas.getWidth() : 0;\n const canvasHeight = this.canvas ? this.canvas.getHeight() : 0;\n const image = this.getImageInfo();\n return {\n hasImage: image !== null,\n image,\n maskCount: this.getMasks().length,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n isBusy: this.isBusy(),\n isCropMode: this.cropSession !== null,\n canUndo: this.historyManager.canUndo(),\n canRedo: this.historyManager.canRedo(),\n canvasWidth,\n canvasHeight,\n };\n }\n emitImageChanged(context) {\n this.emitOptionCallback('onImageChanged', [this.getEditorState(), context]);\n }\n emitMasksChanged(context) {\n this.emitOptionCallback('onMasksChanged', [this.getMasks(), context]);\n }\n emitBusyChangeIfChanged(context) {\n const isBusy = this.isBusy();\n if (this.lastEmittedIsBusy === isBusy)\n return;\n this.lastEmittedIsBusy = isBusy;\n this.emitOptionCallback('onBusyChange', [isBusy, context]);\n }\n buildSelection(selected) {\n var _a;\n const selectedMasks = selected.filter(isMaskObject);\n return {\n selectedMask: (_a = selectedMasks[0]) !== null && _a !== void 0 ? _a : null,\n selectedMasks,\n };\n }\n withSelectionChangeContext(context, callback) {\n const previous = this.nextSelectionChangeContext;\n this.nextSelectionChangeContext = context;\n try {\n return callback();\n }\n finally {\n this.nextSelectionChangeContext = previous;\n }\n }\n isSupportedImageMimeType(mimeType) {\n return mimeType === 'image/jpeg' || mimeType === 'image/png' || mimeType === 'image/webp';\n }\n inferCurrentImageMimeType() {\n const image = this.originalImage;\n if (!image)\n return null;\n let source = null;\n try {\n if (typeof image.getSrc === 'function')\n source = image.getSrc();\n else if (typeof image.src === 'string')\n source = image.src;\n }\n catch {\n source = null;\n }\n const mimeType = source ? detectSourceMimeType(source) : null;\n return this.isSupportedImageMimeType(mimeType) ? mimeType : null;\n }\n setCanvasSizePx(widthPx, heightPx) {\n if (!this.canvas)\n return;\n applyCanvasDimensions(this.canvas, widthPx, heightPx, this.containerElement);\n }\n alignObjectBoundingBoxToCanvasTopLeft(object) {\n var _a, _b;\n object.setCoords();\n const boundingRect = object.getBoundingRect();\n object.set({\n left: ((_a = object.left) !== null && _a !== void 0 ? _a : 0) - boundingRect.left,\n top: ((_b = object.top) !== null && _b !== void 0 ? _b : 0) - boundingRect.top,\n });\n object.setCoords();\n this.canvas.renderAll();\n }\n measureLayoutViewport(scrollbarSize) {\n return this.viewportCache.measure(this.containerElement, {\n width: this.options.canvasWidth,\n height: this.options.canvasHeight,\n }, scrollbarSize);\n }\n updateCanvasSizeToImageBounds() {\n var _a, _b;\n if (!this.originalImage)\n return;\n this.originalImage.setCoords();\n const boundingRect = this.originalImage.getBoundingRect();\n const scrollbarSize = measureScrollbarSize((_b = (_a = this.containerElement) === null || _a === void 0 ? void 0 : _a.ownerDocument) !== null && _b !== void 0 ? _b : null);\n const viewport = this.measureLayoutViewport(scrollbarSize);\n if (this.options.fitImageToCanvas || this.options.coverImageToCanvas) {\n const canvasSize = computeScrollableCanvasSize(boundingRect.width, boundingRect.height, viewport, scrollbarSize);\n this.setCanvasSizePx(canvasSize.width, canvasSize.height);\n return;\n }\n if (boundingRect.width <= viewport.width && boundingRect.height <= viewport.height) {\n this.setCanvasSizePx(viewport.width, viewport.height);\n return;\n }\n this.setCanvasSizePx(Math.max(viewport.width, Math.ceil(boundingRect.width)), Math.max(viewport.height, Math.ceil(boundingRect.height)));\n }\n shouldNormalizeCanvasSizeAfterStateRestore() {\n var _a, _b;\n if (!this.canvas || !this.originalImage)\n return false;\n this.originalImage.setCoords();\n const boundingRect = this.originalImage.getBoundingRect();\n const viewport = this.measureLayoutViewport(measureScrollbarSize((_b = (_a = this.containerElement) === null || _a === void 0 ? void 0 : _a.ownerDocument) !== null && _b !== void 0 ? _b : null));\n const canvasW = Math.ceil(this.canvas.getWidth());\n const canvasH = Math.ceil(this.canvas.getHeight());\n const clipsImage = boundingRect.width > canvasW + LAYOUT_EPSILON ||\n boundingRect.height > canvasH + LAYOUT_EPSILON;\n if (this.options.fitImageToCanvas || this.options.coverImageToCanvas) {\n const staleOverflowWidth = canvasW > viewport.width + LAYOUT_EPSILON &&\n boundingRect.width <= viewport.width + LAYOUT_EPSILON;\n const staleOverflowHeight = canvasH > viewport.height + LAYOUT_EPSILON &&\n boundingRect.height <= viewport.height + LAYOUT_EPSILON;\n return clipsImage || staleOverflowWidth || staleOverflowHeight;\n }\n if (this.options.expandCanvasToImage) {\n const expectedW = Math.max(viewport.width, Math.ceil(boundingRect.width));\n const expectedH = Math.max(viewport.height, Math.ceil(boundingRect.height));\n return (Math.abs(canvasW - expectedW) > LAYOUT_EPSILON ||\n Math.abs(canvasH - expectedH) > LAYOUT_EPSILON);\n }\n return clipsImage;\n }\n captureImageDisplayGeometry() {\n if (!this.canvas || !this.originalImage)\n return null;\n this.originalImage.setCoords();\n const boundingRect = this.originalImage.getBoundingRect();\n return {\n canvasWidth: this.canvas.getWidth(),\n canvasHeight: this.canvas.getHeight(),\n imageDisplayWidth: Math.max(1, boundingRect.width),\n imageDisplayHeight: Math.max(1, boundingRect.height),\n };\n }\n restoreMergedImageDisplayGeometry(geometry) {\n if (!geometry || !this.canvas || !this.originalImage)\n return;\n this.setCanvasSizePx(geometry.canvasWidth, geometry.canvasHeight);\n const sourceW = Math.max(1, this.originalImage.width || geometry.imageDisplayWidth);\n const sourceH = Math.max(1, this.originalImage.height || geometry.imageDisplayHeight);\n const scale = Math.min(geometry.imageDisplayWidth / sourceW, geometry.imageDisplayHeight / sourceH);\n this.originalImage.set({\n left: 0,\n top: 0,\n angle: 0,\n scaleX: scale,\n scaleY: scale,\n originX: 'left',\n originY: 'top',\n selectable: false,\n evented: false,\n hasControls: false,\n hoverCursor: 'default',\n });\n this.originalImage.setCoords();\n this.canvas.sendObjectToBack(this.originalImage);\n this.currentScale = 1;\n this.currentRotation = 0;\n this.baseImageScale = scale;\n this.lastSnapshot = this.captureSnapshotInternal();\n this.canvas.renderAll();\n }\n buildTransformContext() {\n return {\n canvas: this.canvas,\n options: this.options,\n guard: this.operationGuard,\n getOriginalImage: () => this.originalImage,\n getCurrentScale: () => this.currentScale,\n setCurrentScale: (n) => {\n this.currentScale = n;\n },\n getCurrentRotation: () => this.currentRotation,\n setCurrentRotation: (n) => {\n this.currentRotation = n;\n },\n getBaseImageScale: () => this.baseImageScale,\n saveCanvasState: () => {\n this.saveStateInternal(this.withAnimationQueueBypass());\n },\n setSuppressSaveState: (suppress) => {\n this.shouldSuppressSaveState = suppress;\n },\n afterTransformSnap: () => {\n if (this.isDisposed || !this.canvas || !this.originalImage)\n return;\n if (this.options.expandCanvasToImage ||\n this.options.coverImageToCanvas ||\n this.options.fitImageToCanvas) {\n this.updateCanvasSizeToImageBounds();\n }\n this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage);\n this.canvas\n .getObjects()\n .filter(isMaskObject)\n .forEach((maskObject) => this.syncMaskLabel(maskObject));\n },\n };\n }\n scaleImage(factor) {\n if (this.isDisposed || !this.transformController)\n return Promise.resolve();\n if (!Number.isFinite(factor))\n return Promise.resolve();\n try {\n this.assertCanQueueAnimation('scaleImage');\n }\n catch (error) {\n return Promise.reject(error);\n }\n const controller = this.transformController;\n const context = this.buildCallbackContext('scaleImage', false);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.updateUi();\n try {\n await controller.scaleImage(factor);\n if (!this.isDisposed)\n this.emitImageChanged(context);\n }\n finally {\n if (!this.isDisposed) {\n this.updateInputs();\n }\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n rotateImage(degrees) {\n if (this.isDisposed || !this.transformController)\n return Promise.resolve();\n if (!Number.isFinite(degrees))\n return Promise.resolve();\n try {\n this.assertCanQueueAnimation('rotateImage');\n }\n catch (error) {\n return Promise.reject(error);\n }\n const controller = this.transformController;\n const context = this.buildCallbackContext('rotateImage', false);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.updateUi();\n try {\n await controller.rotateImage(degrees);\n if (!this.isDisposed)\n this.emitImageChanged(context);\n }\n finally {\n if (!this.isDisposed) {\n this.updateInputs();\n }\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n resetImageTransform() {\n if (this.isDisposed || !this.transformController)\n return Promise.resolve();\n try {\n this.assertCanQueueAnimation('resetImageTransform');\n }\n catch (error) {\n return Promise.reject(error);\n }\n const controller = this.transformController;\n const context = this.buildCallbackContext('resetImageTransform', false);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.updateUi();\n try {\n await controller.resetImageTransform();\n if (!this.isDisposed)\n this.emitImageChanged(context);\n }\n finally {\n if (!this.isDisposed) {\n this.updateInputs();\n }\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n refreshUiAfterQueuedAnimation() {\n if (this.isDisposed || !this.canvas)\n return;\n this.updateInputs();\n this.updateUi();\n }\n async loadFromState(jsonString) {\n return this.loadFromStateInternal(jsonString);\n }\n async loadFromStateInternal(jsonString, options) {\n var _a;\n if (!jsonString || !this.canvas)\n return;\n if (this.isDisposed)\n return;\n if (!this.canRunIdleOperation('loadFromState', options))\n return;\n const activeRestoreOperation = this.activeStateRestoreOperation;\n const context = this.buildCallbackContext(activeRestoreOperation !== null && activeRestoreOperation !== void 0 ? activeRestoreOperation : 'loadFromState', activeRestoreOperation === 'undo' || activeRestoreOperation === 'redo');\n const previousImage = this.originalImage;\n const previousMaskSignature = this.getMaskCollectionSignature();\n try {\n const restoredState = await loadFromStateImpl({\n canvas: this.canvas,\n jsonString,\n setCanvasSize: (widthPx, heightPx) => this.setCanvasSizePx(widthPx, heightPx),\n });\n if (this.isDisposed || !this.canvas)\n return;\n this.hideAllMaskLabels();\n this.originalImage = restoredState.originalImage;\n if (this.originalImage) {\n this.originalImage.set({\n originX: 'left',\n originY: 'top',\n selectable: false,\n evented: false,\n hasControls: false,\n hoverCursor: 'default',\n });\n this.canvas.sendObjectToBack(this.originalImage);\n }\n this.maskCounter = restoredState.maxMaskId;\n const editorState = restoredState.editorState;\n if (editorState) {\n this.currentScale = editorState.currentScale;\n this.currentRotation = editorState.currentRotation;\n this.baseImageScale = editorState.baseImageScale;\n }\n if (this.originalImage) {\n this.currentImageMimeType =\n editorState && 'currentImageMimeType' in editorState\n ? ((_a = editorState.currentImageMimeType) !== null && _a !== void 0 ? _a : null)\n : this.inferCurrentImageMimeType();\n }\n else {\n this.currentImageMimeType = null;\n }\n this.isImageLoadedToCanvas = !!this.originalImage;\n if (this.originalImage &&\n (this.options.expandCanvasToImage ||\n this.options.coverImageToCanvas ||\n this.options.fitImageToCanvas) &&\n this.shouldNormalizeCanvasSizeAfterStateRestore()) {\n this.updateCanvasSizeToImageBounds();\n this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage);\n }\n const restoredMasks = restoredState.objects.filter(isMaskObject);\n this.lastMask = restoredMasks.reduce((lastMask, maskObject) => !lastMask || maskObject.maskId > lastMask.maskId ? maskObject : lastMask, null);\n restoredMasks.forEach((maskObject) => {\n applyMaskUnselectedStyle(maskObject);\n reattachMaskHoverHandlers(maskObject);\n });\n this.lastSnapshot = this.captureSnapshotInternal();\n this.canvas.renderAll();\n this.updateInputs();\n this.updateMaskList();\n this.updateUi();\n if (previousImage && previousImage !== this.originalImage) {\n this.emitOptionCallback('onImageCleared', [previousImage, context]);\n }\n if (previousMaskSignature !== this.getMaskCollectionSignature()) {\n this.emitMasksChanged(context);\n }\n this.emitImageChanged(context);\n const activeMaskId = editorState === null || editorState === void 0 ? void 0 : editorState.activeMaskId;\n if (typeof activeMaskId === 'number') {\n const activeMask = restoredMasks.find((maskObject) => maskObject.maskId === activeMaskId);\n if (activeMask) {\n this.withSelectionChangeContext(context, () => {\n this.canvas.setActiveObject(activeMask);\n this.handleSelectionChanged([activeMask]);\n });\n }\n }\n }\n catch (error) {\n reportError(this.options, error, 'Failed to restore canvas state.');\n throw error;\n }\n }\n saveState() {\n this.saveStateInternal();\n }\n saveStateInternal(options) {\n var _a, _b;\n if (!this.canvas || this.shouldSuppressSaveState)\n return;\n if (!this.canRunIdleOperation('saveState', options))\n return;\n const activeObj = this.canvas.getActiveObject();\n const activeMask = this.getActiveMaskForSnapshot();\n this.hideAllMaskLabels();\n try {\n const after = saveStateImpl({\n canvas: this.canvas,\n activeMaskId: (_a = activeMask === null || activeMask === void 0 ? void 0 : activeMask.maskId) !== null && _a !== void 0 ? _a : null,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n baseImageScale: this.baseImageScale,\n currentImageMimeType: this.currentImageMimeType,\n });\n const before = (_b = this.lastSnapshot) !== null && _b !== void 0 ? _b : after;\n if (after === before) {\n return;\n }\n let executedOnce = false;\n const cmd = new Command(async () => {\n if (executedOnce) {\n await this.loadFromStateInternal(after, this.withAnimationQueueBypass());\n }\n executedOnce = true;\n }, async () => {\n await this.loadFromStateInternal(before, this.withAnimationQueueBypass());\n });\n this.historyManager.execute(cmd);\n this.lastSnapshot = after;\n }\n catch (error) {\n reportWarning(this.options, error, 'Failed to capture canvas snapshot.');\n }\n finally {\n this.restoreActiveMaskAfterSnapshot(activeObj, activeMask);\n this.updateUi();\n }\n }\n restoreActiveMaskAfterSnapshot(activeObj, activeMask) {\n if (!this.canvas)\n return;\n const maskToRestore = activeObj && isMaskObject(activeObj) ? activeObj : activeMask;\n if (!maskToRestore || !this.canvas.getObjects().includes(maskToRestore))\n return;\n this.canvas.setActiveObject(maskToRestore);\n this.showLabelForMask(maskToRestore);\n this.updateMaskListSelection(maskToRestore);\n }\n undo() {\n if (this.isDisposed)\n return Promise.resolve();\n if (!this.canRunIdleOperation('undo'))\n return Promise.resolve();\n const context = this.buildCallbackContext('undo', true);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.activeStateRestoreOperation = 'undo';\n try {\n await this.historyManager.undo();\n }\n finally {\n this.activeStateRestoreOperation = null;\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n redo() {\n if (this.isDisposed)\n return Promise.resolve();\n if (!this.canRunIdleOperation('redo'))\n return Promise.resolve();\n const context = this.buildCallbackContext('redo', true);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.activeStateRestoreOperation = 'redo';\n try {\n await this.historyManager.redo();\n }\n finally {\n this.activeStateRestoreOperation = null;\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n createMask(config = {}) {\n if (!this.canvas)\n return null;\n if (!this.canRunIdleOperation('createMask'))\n return null;\n const callbackContext = this.buildCallbackContext('createMask', false);\n const createMaskContext = this.buildCreateMaskContext();\n const mask = this.withSelectionChangeContext(callbackContext, () => createMaskImpl(createMaskContext, config));\n if (mask) {\n this.emitMasksChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n return mask;\n }\n removeSelectedMask() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('removeSelectedMask'))\n return;\n const before = this.getMasks().length;\n const callbackContext = this.buildCallbackContext('removeSelectedMask', false);\n const removeMaskContext = this.buildRemoveMaskContext();\n this.withSelectionChangeContext(callbackContext, () => removeSelectedMaskImpl(removeMaskContext));\n this.updateUi();\n if (this.getMasks().length !== before) {\n this.emitMasksChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n removeAllMasks(options = {}) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('removeAllMasks', options))\n return;\n const before = this.getMasks().length;\n const callbackContext = this.buildCallbackContext('removeAllMasks', false);\n const removeMaskContext = this.buildRemoveMaskContext();\n this.withSelectionChangeContext(callbackContext, () => removeAllMasksImpl(removeMaskContext, options));\n this.updateUi();\n if (this.getMasks().length !== before) {\n this.emitMasksChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n buildCreateMaskContext() {\n return {\n fabric: this.fabricModule,\n canvas: this.canvas,\n options: this.options,\n getLastMask: () => this.lastMask,\n setLastMask: (maskObject) => {\n this.lastMask = maskObject;\n },\n getMaskCounter: () => this.maskCounter,\n setMaskCounter: (n) => {\n this.maskCounter = n;\n },\n updateMaskList: () => {\n this.updateMaskList();\n },\n saveCanvasState: () => {\n this.saveState();\n },\n expandCanvasIfNeeded: (widthPx, heightPx) => {\n this.setCanvasSizePx(widthPx, heightPx);\n },\n };\n }\n buildRemoveMaskContext() {\n return {\n canvas: this.canvas,\n removeLabelForMask: (mask) => {\n this.removeLabelForMask(mask);\n },\n updateMaskList: () => {\n this.updateMaskList();\n },\n saveCanvasState: () => {\n this.saveState();\n },\n setLastMask: (maskObject) => {\n this.lastMask = maskObject;\n },\n };\n }\n buildMaskLabelContext() {\n if (!this.canvas)\n return null;\n return { fabric: this.fabricModule, canvas: this.canvas, options: this.options };\n }\n removeLabelForMask(mask) {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n removeLabelForMask(context, mask);\n }\n createLabelForMask(mask) {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n createLabelForMask(context, mask);\n }\n hideAllMaskLabels() {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n hideAllMaskLabels(context);\n }\n syncMaskLabel(mask) {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n syncMaskLabel(context, mask);\n }\n showLabelForMask(mask) {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n showLabelForMask(context, mask);\n }\n handleSelectionChanged(selected) {\n var _a, _b, _c;\n if (!this.canvas)\n return;\n const selectedMask = (_a = selected.find(isMaskObject)) !== null && _a !== void 0 ? _a : null;\n const masks = this.canvas.getObjects().filter(isMaskObject);\n masks.forEach((maskObject) => {\n if (maskObject !== selectedMask) {\n if (maskObject.labelObject) {\n this.removeLabelForMask(maskObject);\n }\n applyMaskUnselectedStyle(maskObject);\n }\n else {\n applyMaskSelectedStyle(maskObject);\n }\n });\n if (selectedMask)\n this.showLabelForMask(selectedMask);\n this.updateMaskListSelection(selectedMask);\n this.canvas.requestRenderAll();\n this.updateUi();\n const context = (_b = this.nextSelectionChangeContext) !== null && _b !== void 0 ? _b : this.buildCallbackContext((_c = this.activeStateRestoreOperation) !== null && _c !== void 0 ? _c : 'createMask', this.activeStateRestoreOperation === 'undo' ||\n this.activeStateRestoreOperation === 'redo');\n this.emitOptionCallback('onSelectionChange', [this.buildSelection(selected), context]);\n }\n buildMaskListContext() {\n return {\n canvas: this.canvas,\n getListElementId: () => this.elements.maskList,\n onMaskSelected: (mask) => this.handleSelectionChanged([mask]),\n };\n }\n updateMaskList() {\n renderMaskList(this.buildMaskListContext());\n }\n updateMaskListSelection(selectedMask) {\n updateMaskListSelection(this.buildMaskListContext(), selectedMask);\n }\n async mergeMasks() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('mergeMasks'))\n return;\n const hasMasks = this.canvas.getObjects().some(isMaskObject);\n if (!hasMasks)\n return;\n const callbackContext = this.buildCallbackContext('mergeMasks', false);\n const operationToken = this.operationGuard.beginBusyOperation('mergeMasks');\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n try {\n const mergeMasksContext = this.buildMergeMasksContext(operationToken);\n await mergeMasksImpl(mergeMasksContext);\n this.updateInputs();\n this.updateMaskList();\n this.emitMasksChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n }\n }\n downloadImage(fileName) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('downloadImage'))\n return;\n const callbackContext = this.buildCallbackContext('downloadImage', false);\n const operationToken = this.operationGuard.beginBusyOperation('downloadImage');\n this.emitBusyChangeIfChanged(callbackContext);\n const exportContext = this.buildExportServiceContext();\n try {\n downloadImageImpl(exportContext, fileName);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n }\n }\n async exportImageBase64(options) {\n if (!this.canvas)\n return '';\n if (!this.canRunIdleOperation('exportImageBase64', options))\n return '';\n const callbackContext = this.buildCallbackContext('exportImageBase64', false);\n const operationToken = this.operationGuard.beginBusyOperation('exportImageBase64');\n this.emitBusyChangeIfChanged(callbackContext);\n const exportContext = this.buildExportServiceContext();\n try {\n return await exportImageBase64Impl(exportContext, options);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n }\n }\n async exportImageFile(options) {\n this.assertIdleForOperation('exportImageFile', options);\n const callbackContext = this.buildCallbackContext('exportImageFile', false);\n const operationToken = this.operationGuard.beginBusyOperation('exportImageFile');\n this.emitBusyChangeIfChanged(callbackContext);\n const exportContext = this.buildExportServiceContext();\n try {\n return await exportImageFileImpl(exportContext, options);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n }\n }\n buildExportServiceContext() {\n return {\n fabric: this.fabricModule,\n canvas: this.canvas,\n options: this.options,\n isImageLoaded: () => this.isImageLoaded(),\n getOriginalImage: () => this.originalImage,\n };\n }\n buildMergeMasksContext(operationToken) {\n return {\n ...this.buildExportServiceContext(),\n historyManager: this.historyManager,\n containerElement: this.containerElement,\n loadImage: async (base64, providedOptions) => {\n const geometry = this.captureImageDisplayGeometry();\n await this.loadImage(base64, this.withInternalOperationOptions(operationToken, providedOptions));\n this.restoreMergedImageDisplayGeometry(geometry);\n },\n saveState: () => this.captureSnapshotInternal(),\n loadFromState: (snapshot) => this.loadFromStateInternal(snapshot, this.withInternalOperationOptions(operationToken, this.withAnimationQueueBypass())),\n removeAllMasksNoHistory: () => {\n const context = this.buildRemoveMaskContext();\n removeAllMasksImpl(context, { saveHistory: false });\n },\n };\n }\n captureSnapshotInternal() {\n var _a;\n if (!this.canvas)\n return '';\n const activeMask = this.getActiveMaskForSnapshot();\n this.hideAllMaskLabels();\n return saveStateImpl({\n canvas: this.canvas,\n activeMaskId: (_a = activeMask === null || activeMask === void 0 ? void 0 : activeMask.maskId) !== null && _a !== void 0 ? _a : null,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n baseImageScale: this.baseImageScale,\n currentImageMimeType: this.currentImageMimeType,\n });\n }\n getActiveMaskForSnapshot() {\n var _a;\n if (!this.canvas)\n return null;\n const activeObject = this.canvas.getActiveObject();\n if (activeObject && isMaskObject(activeObject))\n return activeObject;\n return ((_a = this.canvas\n .getObjects()\n .find((object) => isMaskObject(object) && !!object.labelObject)) !== null && _a !== void 0 ? _a : null);\n }\n enterCropMode() {\n if (!this.canvas || !this.originalImage)\n return;\n if (this.cropSession)\n return;\n if (!this.isImageLoaded())\n return;\n if (!this.canRunIdleOperation('enterCropMode'))\n return;\n const cropControllerContext = this.buildCropControllerContext();\n enterCropModeImpl(cropControllerContext);\n this.updateUi();\n const callbackContext = this.buildCallbackContext('enterCropMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n cancelCrop() {\n if (!this.canvas || !this.cropSession)\n return;\n if (!this.canRunIdleOperation('cancelCrop'))\n return;\n const cropControllerContext = this.buildCropControllerContext();\n cancelCropImpl(cropControllerContext);\n this.cropSession = null;\n this.updateUi();\n this.canvas.requestRenderAll();\n const callbackContext = this.buildCallbackContext('cancelCrop', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n async applyCrop() {\n if (!this.canvas || !this.cropSession)\n return;\n if (!this.canRunIdleOperation('applyCrop'))\n return;\n const callbackContext = this.buildCallbackContext('applyCrop', false);\n const hadMasks = this.getMasks().length > 0;\n const operationToken = this.operationGuard.beginBusyOperation('applyCrop');\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n try {\n const cropControllerContext = this.buildCropControllerContext(operationToken);\n await applyCropImpl(cropControllerContext);\n this.updateInputs();\n this.updateMaskList();\n if (hadMasks || this.getMasks().length > 0) {\n this.emitMasksChanged(callbackContext);\n }\n this.emitImageChanged(callbackContext);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n }\n }\n buildCropControllerContext(operationToken) {\n return {\n fabric: this.fabricModule,\n canvas: this.canvas,\n options: this.options,\n historyManager: this.historyManager,\n isImageLoaded: () => this.isImageLoaded(),\n getOriginalImage: () => this.originalImage,\n getCurrentImageMimeType: () => this.currentImageMimeType,\n getCropSession: () => this.cropSession,\n setCropSession: (s) => {\n this.cropSession = s;\n },\n saveState: () => this.captureSnapshotInternal(),\n loadFromState: (snapshot) => this.loadFromStateInternal(snapshot, this.withInternalOperationOptions(operationToken, this.withAnimationQueueBypass())),\n loadImage: (base64, providedOptions) => this.loadImage(base64, this.withInternalOperationOptions(operationToken, providedOptions)),\n getMaskCounter: () => this.maskCounter,\n setMaskCounter: (n) => {\n this.maskCounter = n;\n },\n updateMaskList: () => {\n this.updateMaskList();\n },\n };\n }\n updateInputs() {\n const scaleId = this.elements.scalePercentageInput;\n if (!scaleId)\n return;\n const scaleInputElement = document.getElementById(scaleId);\n if (scaleInputElement)\n scaleInputElement.value = String(Math.round(this.currentScale * 100));\n }\n updateUi() {\n if (!this.canvas)\n return;\n const hasImage = !!this.originalImage;\n const masks = hasImage ? this.canvas.getObjects().filter(isMaskObject) : [];\n const hasMasks = masks.length > 0;\n const activeObject = this.canvas.getActiveObject();\n const hasSelectedMask = !!(activeObject && isMaskObject(activeObject));\n const isDefaultTransform = this.currentScale === 1 && this.currentRotation === 0;\n const canUndo = this.historyManager.canUndo();\n const canRedo = this.historyManager.canRedo();\n const isInCropMode = this.cropSession !== null;\n const isBusy = this.operationGuard.isBusy() || this.animQueue.isBusy();\n if (isInCropMode) {\n CROP_MODE_CONTROL_KEYS.forEach((key) => {\n this.setControlEnabled(key, !isBusy && CROP_MODE_ENABLED_KEYS.includes(key));\n });\n return;\n }\n this.setControlEnabled('scalePercentageInput', hasImage && !isBusy);\n this.setControlEnabled('rotateLeftDegreesInput', hasImage && !isBusy);\n this.setControlEnabled('rotateRightDegreesInput', hasImage && !isBusy);\n this.setControlEnabled('zoomInButton', hasImage && !isBusy && this.currentScale < this.options.maxScale);\n this.setControlEnabled('zoomOutButton', hasImage && !isBusy && this.currentScale > this.options.minScale);\n this.setControlEnabled('rotateLeftButton', hasImage && !isBusy);\n this.setControlEnabled('rotateRightButton', hasImage && !isBusy);\n this.setControlEnabled('createMaskButton', hasImage && !isBusy);\n this.setControlEnabled('removeSelectedMaskButton', hasSelectedMask && !isBusy);\n this.setControlEnabled('removeAllMasksButton', hasMasks && !isBusy);\n this.setControlEnabled('mergeMasksButton', hasImage && hasMasks && !isBusy);\n this.setControlEnabled('downloadImageButton', hasImage && !isBusy);\n this.setControlEnabled('resetImageTransformButton', hasImage && !isDefaultTransform && !isBusy);\n this.setControlEnabled('undoButton', hasImage && !isBusy && canUndo);\n this.setControlEnabled('redoButton', hasImage && !isBusy && canRedo);\n this.setControlEnabled('enterCropModeButton', hasImage && !isBusy);\n this.setControlEnabled('imageInput', !isBusy);\n this.setControlEnabled('applyCropButton', false);\n this.setControlEnabled('cancelCropButton', false);\n }\n setControlEnabled(key, isEnabled) {\n var _a;\n const id = this.elements[key];\n if (!id)\n return;\n const controlElement = document.getElementById(id);\n if (!controlElement)\n return;\n this.recordElementOriginalState(key, controlElement);\n if ('disabled' in controlElement) {\n controlElement.disabled = !isEnabled;\n return;\n }\n if (!isEnabled) {\n controlElement.setAttribute('aria-disabled', 'true');\n controlElement.style.pointerEvents = 'none';\n }\n else {\n const originalAria = this.elementOriginalAriaDisabledMap.get(key);\n if (originalAria === null || originalAria === undefined) {\n controlElement.removeAttribute('aria-disabled');\n }\n else {\n controlElement.setAttribute('aria-disabled', originalAria);\n }\n controlElement.style.pointerEvents =\n (_a = this.elementOriginalPointerEventsMap.get(key)) !== null && _a !== void 0 ? _a : '';\n }\n }\n recordElementOriginalState(key, element) {\n if (!this.elementOriginalAriaDisabledMap.has(key)) {\n this.elementOriginalAriaDisabledMap.set(key, element.getAttribute('aria-disabled'));\n }\n if (!this.elementOriginalPointerEventsMap.has(key)) {\n this.elementOriginalPointerEventsMap.set(key, element.style.pointerEvents || '');\n }\n if ('disabled' in element && !this.elementOriginalDisabledMap.has(key)) {\n this.elementOriginalDisabledMap.set(key, !!element.disabled);\n }\n }\n restoreElementOriginalStates() {\n var _a, _b;\n for (const key of Object.keys(this.elements)) {\n const id = this.elements[key];\n if (!id)\n continue;\n const element = document.getElementById(id);\n if (!element)\n continue;\n if ('disabled' in element && this.elementOriginalDisabledMap.has(key)) {\n element.disabled =\n (_a = this.elementOriginalDisabledMap.get(key)) !== null && _a !== void 0 ? _a : false;\n }\n if (this.elementOriginalAriaDisabledMap.has(key)) {\n const originalAria = this.elementOriginalAriaDisabledMap.get(key);\n if (originalAria === null || originalAria === undefined) {\n element.removeAttribute('aria-disabled');\n }\n else {\n element.setAttribute('aria-disabled', originalAria);\n }\n }\n if (this.elementOriginalPointerEventsMap.has(key)) {\n element.style.pointerEvents = (_b = this.elementOriginalPointerEventsMap.get(key)) !== null && _b !== void 0 ? _b : '';\n }\n }\n this.elementOriginalDisabledMap.clear();\n this.elementOriginalAriaDisabledMap.clear();\n this.elementOriginalPointerEventsMap.clear();\n }\n updatePlaceholderStatus() {\n setPlaceholderVisibleImpl(this.placeholderElement, this.containerElement, this.options.showPlaceholder ? !this.originalImage : false);\n }\n dispose() {\n var _a;\n if (this.isDisposed)\n return;\n const context = this.buildCallbackContext('dispose', false);\n const previousImage = this.originalImage;\n this.isDisposed = true;\n this.operationGuard.markDisposed();\n this.animQueue.clear();\n (_a = this.domBindings) === null || _a === void 0 ? void 0 : _a.removeAll();\n this.restoreElementOriginalStates();\n if (this.cropSession && this.canvas) {\n try {\n const context = this.buildCropControllerContext();\n cancelCropImpl(context);\n }\n catch {\n }\n this.cropSession = null;\n }\n if (this.canvas) {\n try {\n void Promise.resolve(this.canvas.dispose()).catch(() => {\n });\n }\n catch {\n }\n this.canvas = null;\n this.canvasElement = null;\n this.isImageLoadedToCanvas = false;\n }\n this.originalImage = null;\n this.currentImageMimeType = null;\n this.lastMask = null;\n this.maskCounter = 0;\n this.currentScale = 1;\n this.currentRotation = 0;\n this.baseImageScale = 1;\n this.lastSnapshot = null;\n this.transformController = null;\n this.viewportCache.clear();\n if (previousImage) {\n this.emitOptionCallback('onImageCleared', [previousImage, context]);\n }\n this.emitImageChanged(context);\n this.emitBusyChangeIfChanged(context);\n this.emitOptionCallback('onEditorDisposed', [context]);\n }\n}\n//# sourceMappingURL=image-editor.js.map","import { isMaskObject } from '../core/public-types.js';\nexport function renderMaskList(context) {\n const listId = context.getListElementId();\n if (!listId)\n return;\n const listEl = document.getElementById(listId);\n if (!listEl || !context.canvas)\n return;\n listEl.innerHTML = '';\n const canvas = context.canvas;\n canvas\n .getObjects()\n .filter(isMaskObject)\n .forEach((mask) => {\n const listItemElement = document.createElement('li');\n listItemElement.className = 'list-group-item mask-item';\n listItemElement.textContent = mask.maskName;\n listItemElement.dataset.maskId = String(mask.maskId);\n listItemElement.onclick = () => {\n const id = Number(listItemElement.dataset.maskId);\n if (!Number.isFinite(id))\n return;\n const target = canvas\n .getObjects()\n .find((o) => isMaskObject(o) && o.maskId === id);\n if (!target)\n return;\n canvas.setActiveObject(target);\n context.onMaskSelected(target);\n };\n listEl.appendChild(listItemElement);\n });\n}\nexport function updateMaskListSelection(context, selectedMask) {\n const listId = context.getListElementId();\n if (!listId)\n return;\n const listEl = document.getElementById(listId);\n if (!listEl)\n return;\n const selectedId = selectedMask ? String(selectedMask.maskId) : null;\n listEl.querySelectorAll('.mask-item').forEach((item) => {\n const isSelected = selectedId !== null && item.dataset.maskId === selectedId;\n item.classList.toggle('active', isSelected);\n });\n}\n//# sourceMappingURL=mask-list.js.map"],"names":["AnimationQueue","constructor","Object","defineProperty","this","enumerable","configurable","writable","value","add","animationFn","Promise","resolve","reject","queue","push","run","running","drainQueue","clear","reason","pending","undefined","entry","isRunning","isBusy","length","waitForIdle","then","shift","error","reportWarning","options","message","warningCallback","onWarning","callbackError","console","warn","reportError","errorCallback","onError","DEFAULT_OPTIONS","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","DEFAULT_LABEL_TEXT_OPTIONS","fontSize","fill","padding","fontFamily","fontWeight","selectable","evented","originX","originY","DEFAULT_LABEL","getText","mask","DEFAULT_CROP","KNOWN_TOP_LEVEL_KEYS","Set","normalizeCallback","normalizePositiveInteger","fallback","numeric","Number","isFinite","Math","max","floor","normalizePositiveFiniteNumber","normalizeNonNegativeFiniteNumber","normalizeFiniteNumber","normalizeQualityOption","min","normalizeMaxExportPixels","normalizeExportArea","normalizeOptionalQuality","resolveOptions","input","_a","_b","_c","_d","raw","resolved","key","keys","has","normalizeMaxHistorySize","userLabel","label","mergedTextOptions","textOptions","create","freeze","userCrop","crop","minWidth","minHeight","hideMasksDuringCrop","preserveMasksAfterCrop","allowRotationOfCropRect","exportFileType","exportQuality","OperationGuard","isAnimating","isAnimationActive","isDisposed","isDisposedFlag","isLoading","isLoadingActive","activeOperationName","currentOperationName","currentOperationToken","beginAnimation","endAnimation","markDisposed","beginLoading","endLoading","beginBusyOperation","operationName","token","Symbol","endBusyOperation","isOwnOperation","runAnimation","animationTask","assertNotAnimating","operationLabel","Error","assertIdleForOperation","ownOperation","assertCanQueueAnimation","isMaskObject","object","maskId","SNAPSHOT_CUSTOM_KEYS","saveState","canvas","currentScale","currentRotation","baseImageScale","activeObject","getActiveObject","call","activeMaskId","type","toLowerCase","isType","isActiveSelectionObject","discardActiveObject","jsonObj","toJSON","canvasObjects","jsonObjects","Array","isArray","index","liveObject","jsonObject","maskUid","originalAlpha","originalStroke","originalStrokeWidth","hasControls","strokeUniform","lockRotation","transparentCorners","borderColor","cornerColor","cornerSize","isCropRect","maskLabel","copySnapshotCustomPropsFromCanvas","getObjects","objects","filter","o","_editorState","currentImageMimeType","JSON","stringify","async","loadFromState","jsonString","snapshotInput","setCanvasSize","json","parse","width","height","loadFromJSON","canvasObjs","jsonObjs","_e","consumedCanvasIndexes","jObj","jType","String","jLeft","left","jTop","top","jUid","matchIndex","findIndex","abs","maskObject","opacity","forEach","canvasObj","restoreMaskPropsFromJson","editorState","mimeType","maxMaskId","reduce","originalImage","find","isOriginalImageObject","Command","execute","undo","HistoryManager","maxSize","command","pushAndTrim","canUndo","currentIndex","canRedo","history","isProcessing","cmd","redo","slice","looksLikeFabricModule","Canvas","fixPrototype","self","ctor","setPrototypeOf","prototype","ImageDecodeError","originalError","super","ImageLoadTimeoutError","elapsedMs","DownsampleError","MergeMasksError","CropApplyError","ExportNotReadyError","operation","ExportError","DEFAULT_STROKE_FALLBACK","applyMaskUnselectedStyle","strokeWidth","set","stroke","attachMaskHoverHandlers","tagged","mouseover","baseAlpha","getMaskHoverStyle","requestRenderAll","mouseout","getMaskNormalStyle","on","imageEditorMaskHandlers","reattachMaskHoverHandlers","off","patch","sw","detachMaskHoverHandlers","captureMaskStyleBackup","_f","_g","restoreMaskStyleBackup","backup","setCoords","applyCropHideMaskStyle","hasMeaningfulCanvasRegion","rect","right","bottom","safeCanvasWidth","safeCanvasHeight","overlapWidth","overlapHeight","getClampedCanvasRegion","safeLeft","safeTop","safeWidth","safeHeight","roundEnd","includePartialPixels","ceil","hasCanvasWidth","hasCanvasHeight","round","POSITIVE_INFINITY","hasFractionalCanvasEdge","numericValue","getPartialExportEdges","bounds","angle","normalizedAngle","getObjectBBox","boundingRect","getBoundingRect","FORMAT_ALIAS_TABLE","jpeg","jpg","png","webp","MIME_TABLE","tryNormalizeImageFormat","hasOwnProperty","mimeTypeFor","format","clampQuality","quality","resolveExportFormat","providedOptions","fileType","formatAlias","normalizeImageFormat","CROP_RECT_DASH","CROPPED_EXPORT_QUALITY_FALLBACK","finiteNumberOrFallback","resolveLossyCropQuality","cropExportQuality","cropQuality","clampExportQuality","fallbackQuality","removeCropRect","context","session","targetHandlers","handlers","record","target","eventName","callback","cropRect","remove","restoreCropObjectState","prevEvented","teardownSession","maskBackups","restoreCropMaskBackups","selection","prevSelection","maskIntersectsRegion","region","bbox","cancelCrop","getCropSession","setCropSession","renderAll","applyCrop","beforeJson","preserveMasks","cropAngle","rectBounds","scaleX","scaleY","getCropRectContentBounds","getWidth","getHeight","cropRegion","preservedRecords","records","styleBackupByMask","Map","map","masks","styleBackup","get","capturePreservedMasks","cropFormat","requested","cropExportFileType","imageMimeToFormat","resolveCropExportFormat","getCurrentImageMimeType","exportOptions","multiplier","croppedBase64","toDataURL","loadImage","maxRestoredId","visible","bringObjectToFront","id","getMaskCounter","setMaskCounter","liveCounter","safeCounter","updateMaskList","reapplyPreservedMasks","afterJson","historyManager","rollbackError","resolveMultiplier","num","fallbackValue","readCanvasDimension","getterName","propertyName","canvasLike","getter","withMaskExportState","mergeMask","mutator","backups","withMaskStyleBackup","applyExportBakeInStyle","getCanvasObjects","withMasksHidden","isObjectOnCanvas","includes","getImageDimensions","imageElement","naturalWidth","naturalHeight","loadImageElement","dataUrl","Image","crossOrigin","cleanup","removeEventListener","handleLoad","handleError","onload","onerror","addEventListener","once","src","getJpegBackgroundColor","trim","normalized","hex","match","digits","alpha","test","commaAlpha","isZeroCssAlpha","slashAlpha","isTransparentCssColor","document","createElement","getContext","createColorValidationContext","fillStyle","firstSentinel","firstResolved","secondSentinel","secondResolved","resolveCanvasFillStyle","endsWith","numericPercent","parseFloat","numericAlpha","warnNoImageLoaded","exportImageBase64","isImageLoaded","canvasWithSelection","captureActiveObject","labelBackups","labelObject","wasOnCanvas","captureMaskLabelBackups","exportArea","resolveExportOptions","partialEdges","getOriginalImage","computeExportRegion","sourceWidth","sourceHeight","outputWidth","outputHeight","pixelCount","maxPixels","RangeError","assertExportPixelBudget","renderFormat","renderQuality","fabricOptions","renderCanvasToDataUrl","edges","hasPartialEdges","offscreenCanvas","canvasContext","drawImage","imageData","getImageData","pixels","data","sealPixel","x","y","fallbackX","fallbackY","fallbackIndex","fallbackAlpha","nextAlpha","putImageData","sealPartialTransparentEdges","fillRect","convertDataUrlToOpaqueJpeg","restoreMaskLabelBackups","setActiveObject","restoreActiveObject","requestRender","exportImageFile","fileName","base64","finalDataUrl","sourceDataUrl","startsWith","reencodeDataUrlAs","bytes","exec","commaAt","indexOf","replace","globalThis","atob","binary","buffer","ArrayBuffer","Uint8Array","i","charCodeAt","bufferCtor","Buffer","from","source","dataUrlToBytes","File","withTimeout","promise","ms","start","Date","now","timeoutId","setTimeout","clearTimeout","err","selectLayoutStrategy","ViewportCache","measure","container","scrollbarSize","containerWidth","clientWidth","containerHeight","clientHeight","lastVisible","overflow","style","computedOverflow","computedOverflowX","computedOverflowY","view","ownerDocument","defaultView","window","getComputedStyle","computed","overflowX","overflowY","normalizeOverflowValue","all","getContainerOverflowValues","scrollbar","normalizeScrollbarSize","canAutoScrollX","some","isAutoScrollableOverflow","canAutoScrollY","scrollWidth","scrollHeight","hasHorizontalScrollbar","OVERFLOW_EPSILON","measureContainerViewport","peek","measureScrollbarSize","doc","body","probe","position","visibility","pointerEvents","appendChild","offsetWidth","offsetHeight","computeScrollableCanvasSize","contentWidth","contentHeight","viewport","viewportW","viewportH","hasHorizontal","hasVertical","effectiveW","effectiveH","nextHorizontal","nextVertical","applyCanvasDimensions","containerElement","integerWidth","integerHeight","element","setDimensions","computeDownsampleDimensions","srcWidth","srcHeight","maxWidth","maxHeight","isPositiveFinite","needsResize","ratio","detectSourceMimeType","imageBase64","loadOptions","bundle","placeholderHidden","placeholderElement","hidden","containerScrollTop","scrollTop","containerScrollLeft","scrollLeft","containerOverflow","isImageLoadedToCanvas","getIsImageLoadedToCanvas","lastSnapshot","getLastSnapshot","canvasJson","serializeCanvas","maskCounter","getCurrentScale","getCurrentRotation","getBaseImageScale","setPlaceholderVisible","decode","clearSource","hasNaturalImageDimensions","rejectImage","resolveImage","e","startImageDecode","loadSource","originalDataUrl","originalMimeType","toSupportedImageMimeType","downsampleDimensions","sourceMime","resampledImage","selectDownsampleMimeType","resampleImage","actualMimeType","maybeDownsample","fabricImage","fabric","FabricImage","fromURL","layout","imageWidth","imageHeight","viewportCache","strategy","optionsCanvasWidth","optionsCanvasHeight","containerSize","fitScale","imageScale","imageLeft","imageTop","computeFitLayout","coverScale","scaledW","scaledH","nextHasHorizontal","nextHasVertical","canvasSize","computeCoverLayout","computeExpandLayout","computeLayout","scale","sendObjectToBack","setOriginalImage","setBaseImageScale","setCurrentScale","setCurrentRotation","setIsImageLoadedToCanvas","setCurrentImageMimeType","setLastSnapshot","preserveScroll","replayRollback","errorMessage","animateProps","props","guard","propCount","completed","animate","duration","onChange","onComplete","TransformController","scaleImage","factor","imageObject","clamped","targetAbs","topLeft","computeTopLeftPoint","setPositionByOrigin","afterTransformSnap","saveCanvasState","rotateImage","degrees","centre","getCenterPoint","animationFailed","restoreOrigin","newTopLeft","resetImageTransform","setSuppressSaveState","first","getCoords","resolveNumeric","val","axis","pct","dim","coercePoint","pt","nextMaskUid","warnInvalidMask","isResolvableNumericInput","isFiniteNumber","validateFiniteField","fieldName","validatePositiveField","validateNonNegativeField","resolvePolygonPoints","points","resolvedPoints","every","point","area","current","next","polygonArea","createMask","config","_h","_j","_k","_l","_m","_o","_p","_q","_r","fabricModule","shapeType","shape","fields","rx","ry","radius","validateNumericInputs","resolvedConfig","color","gap","previousMask","getLastMask","previousRight","getScaledWidth","polygonPoints","requiredWidth","requiredHeight","nextWidth","nextHeight","expandCanvasIfNeeded","fabricGenerator","generated","candidate","isFabricObjectLike","originProps","Circle","styles","Ellipse","polygon","Polygon","deltaX","deltaY","Rect","strokeDashArray","nextId","setLastMask","onCreate","removeAllMasks","removeLabelForMask","saveHistory","createLabelForMask","labelTextObject","indexForGetText","labelText","FabricText","syncMaskLabel","coords","tl","center","vx","vy","dist","sqrt","offset","DomBindings","resolveElementId","bindIfExists","eventType","handler","getElementById","wrapped","event","registry","elementKey","removeAll","size","show","setAttribute","SUPPORTED_IMAGE_EXTENSIONS","gif","bmp","SUPPORTED_IMAGE_MIME_TYPES","values","resetFileInput","LAYOUT_EPSILON","INTERNAL_OPERATION_TOKEN","for","INTERNAL_ALLOW_DURING_ANIMATION_QUEUE","CROP_MODE_CONTROL_KEYS","CROP_MODE_ENABLED_KEYS","CROP_SESSION_ALLOWED_OPERATIONS","ImageEditor","fabricModuleOrOptions","detected","fabricOrOptions","maybeOptions","globalScope","isFabricLoaded","globalFabric","readGlobalFabric","detectFabric","layoutConflict","enabled","selected","s","join","detectLayoutConflict","operationGuard","animQueue","init","idMap","elements","canvasContainer","imagePlaceholder","scalePercentageInput","rotateLeftDegreesInput","rotateRightDegreesInput","rotateLeftButton","rotateRightButton","createMaskButton","removeSelectedMaskButton","removeAllMasksButton","mergeMasksButton","downloadImageButton","maskList","zoomInButton","zoomOutButton","resetImageTransformButton","undoButton","redoButton","imageInput","enterCropModeButton","applyCropButton","cancelCropButton","uploadArea","domBindings","initCanvas","transformController","buildTransformContext","bindDomEvents","updateInputs","updateUi","catch","updatePlaceholderStatus","canvasElement","containerId","parentElement","placeholderId","initialWidth","initialHeight","preserveObjectStacking","handleSelectionChanged","onObjectEvent","bindElementIfExists","inputId","click","file","files","loadImageFile","removeSelectedMask","mergeMasks","downloadImage","inputEl","step","parsedStep","isNaN","enterCropMode","mime","name","ext","inferImageMimeType","reader","FileReader","fileReaderResult","result","onabort","readAsDataURL","readFileAsDataUrl","canRunIdleOperation","callbackContext","getOperationContext","previousImage","hadMasks","getMasks","emitOptionCallback","emitBusyChangeIfChanged","hideAllMaskLabels","loadImageContext","v","setPlaceholderVisibleImpl","loadImageImpl","lastMask","imageInfo","getImageInfo","emitMasksChanged","emitImageChanged","getInternalOperationToken","canRunDuringAnimationQueue","withInternalOperationOptions","withAnimationQueueBypass","cropSession","setLayoutMode","mode","TypeError","buildCallbackContext","isInternalOperation","internal","activeOperation","callbackName","args","displayWidth","displayHeight","rotation","getMaskCollectionSignature","getEditorState","image","hasImage","maskCount","isCropMode","lastEmittedIsBusy","buildSelection","selectedMasks","selectedMask","withSelectionChangeContext","previous","nextSelectionChangeContext","isSupportedImageMimeType","inferCurrentImageMimeType","getSrc","setCanvasSizePx","widthPx","heightPx","alignObjectBoundingBoxToCanvasTopLeft","measureLayoutViewport","updateCanvasSizeToImageBounds","shouldNormalizeCanvasSizeAfterStateRestore","canvasW","canvasH","clipsImage","staleOverflowWidth","staleOverflowHeight","expectedW","expectedH","captureImageDisplayGeometry","imageDisplayWidth","imageDisplayHeight","restoreMergedImageDisplayGeometry","geometry","sourceW","sourceH","hoverCursor","captureSnapshotInternal","n","saveStateInternal","suppress","shouldSuppressSaveState","controller","job","finally","refreshUiAfterQueuedAnimation","loadFromStateInternal","activeRestoreOperation","activeStateRestoreOperation","previousMaskSignature","restoredState","loadFromStateImpl","restoredMasks","activeMask","activeObj","getActiveMaskForSnapshot","after","saveStateImpl","before","executedOnce","restoreActiveMaskAfterSnapshot","maskToRestore","showLabelForMask","updateMaskListSelection","createMaskContext","buildCreateMaskContext","createMaskImpl","removeMaskContext","buildRemoveMaskContext","active","removeSelectedMaskImpl","removeAllMasksImpl","buildMaskLabelContext","objs","l","buildMaskListContext","getListElementId","onMaskSelected","listId","listEl","innerHTML","listItemElement","className","textContent","dataset","onclick","renderMaskList","selectedId","querySelectorAll","item","isSelected","classList","toggle","operationToken","mergeMasksContext","buildMergeMasksContext","beforeSnapshot","preScrollTop","preScrollLeft","merged","removeAllMasksNoHistory","afterSnapshot","scrollError","mergeMasksImpl","exportContext","buildExportServiceContext","resolvedFileName","link","download","href","removeChild","downloadImageImpl","exportImageBase64Impl","exportImageFileImpl","snapshot","imageBounds","boundsLeft","boundsTop","maxCropWidth","maxCropHeight","rectLeft","rectTop","configuredMinWidth","configuredMinHeight","minCropWidth","minCropHeight","allowRotation","objectCaching","lockScalingFlip","setControlVisible","hideMasks","handleCropRectModified","cropWidth","cropHeight","nextScaleX","nextScaleY","scaledWidth","scaledHeight","maxLeft","maxTop","nextLeft","nextTop","enterCropModeImpl","buildCropControllerContext","cancelCropImpl","cropControllerContext","applyCropImpl","scaleId","scaleInputElement","hasMasks","hasSelectedMask","isDefaultTransform","isInCropMode","setControlEnabled","isEnabled","controlElement","recordElementOriginalState","disabled","originalAria","elementOriginalAriaDisabledMap","removeAttribute","elementOriginalPointerEventsMap","getAttribute","elementOriginalDisabledMap","restoreElementOriginalStates","dispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"image-editor.umd.js","sources":["../esm/animation/animation-queue.js","../esm/core/callback-reporter.js","../esm/export/export-format.js","../esm/core/default-options.js","../esm/core/operation-guard.js","../esm/core/public-types.js","../esm/core/state-serializer.js","../esm/history/history-manager.js","../esm/fabric/fabric-adapter.js","../esm/core/errors.js","../esm/mask/mask-style.js","../esm/utils/canvas-region.js","../esm/crop/crop-controller.js","../esm/image/image-resampler.js","../esm/utils/timeout.js","../esm/mosaic/mosaic-geometry.js","../esm/mosaic/mosaic-pixelate.js","../esm/mosaic/mosaic-controller.js","../esm/export/export-service.js","../esm/image/layout-manager.js","../esm/utils/dom.js","../esm/image/image-loader.js","../esm/fabric/fabric-animation.js","../esm/image/transform-controller.js","../esm/utils/number.js","../esm/mask/mask-factory.js","../esm/mask/mask-label-manager.js","../esm/mask/mask-list.js","../esm/ui/dom-bindings.js","../esm/ui/visibility-state.js","../esm/utils/file.js","../esm/image-editor.js"],"sourcesContent":["export class AnimationQueue {\n constructor() {\n Object.defineProperty(this, \"queue\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n Object.defineProperty(this, \"running\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n }\n add(animationFn) {\n return new Promise((resolve, reject) => {\n this.queue.push({ run: animationFn, resolve, reject });\n if (!this.running) {\n void this.drainQueue();\n }\n });\n }\n clear(reason) {\n const pending = this.queue;\n this.queue = [];\n if (reason !== undefined) {\n for (const entry of pending) {\n entry.reject(reason);\n }\n }\n else {\n for (const entry of pending) {\n entry.resolve();\n }\n }\n }\n isRunning() {\n return this.running;\n }\n isBusy() {\n return this.running || this.queue.length > 0;\n }\n waitForIdle() {\n if (!this.running && this.queue.length === 0) {\n return Promise.resolve();\n }\n return this.add(() => Promise.resolve()).then(() => undefined, () => undefined);\n }\n async drainQueue() {\n if (this.running)\n return;\n this.running = true;\n try {\n while (this.queue.length > 0) {\n const entry = this.queue.shift();\n try {\n await entry.run();\n entry.resolve();\n }\n catch (error) {\n entry.reject(error);\n }\n }\n }\n finally {\n this.running = false;\n if (this.queue.length > 0) {\n void this.drainQueue();\n }\n }\n }\n}\n//# sourceMappingURL=animation-queue.js.map","export function reportWarning(options, error, message) {\n const warningCallback = options.onWarning;\n if (typeof warningCallback !== 'function')\n return;\n try {\n warningCallback(error, message);\n }\n catch (callbackError) {\n console.warn('[ImageEditor] onWarning callback threw', callbackError);\n }\n}\nexport function reportError(options, error, message) {\n const errorCallback = options.onError;\n if (typeof errorCallback !== 'function')\n return;\n try {\n errorCallback(error, message);\n }\n catch (callbackError) {\n console.error('[ImageEditor] onError callback threw', callbackError);\n }\n}\n//# sourceMappingURL=callback-reporter.js.map","const FORMAT_ALIAS_TABLE = Object.freeze({\n jpeg: 'jpeg',\n jpg: 'jpeg',\n 'image/jpeg': 'jpeg',\n png: 'png',\n 'image/png': 'png',\n webp: 'webp',\n 'image/webp': 'webp',\n});\nconst MIME_TABLE = Object.freeze({\n jpeg: 'image/jpeg',\n png: 'image/png',\n webp: 'image/webp',\n});\nexport function normalizeImageFormat(input) {\n var _a;\n return (_a = tryNormalizeImageFormat(input)) !== null && _a !== void 0 ? _a : 'jpeg';\n}\nexport function tryNormalizeImageFormat(input) {\n var _a;\n if (!input)\n return null;\n const key = String(input).toLowerCase();\n if (Object.prototype.hasOwnProperty.call(FORMAT_ALIAS_TABLE, key)) {\n return (_a = FORMAT_ALIAS_TABLE[key]) !== null && _a !== void 0 ? _a : null;\n }\n return null;\n}\nexport function mimeTypeFor(format) {\n return MIME_TABLE[format];\n}\nexport function clampQuality(quality, fallback) {\n const numeric = Number(quality);\n if (!Number.isFinite(numeric))\n return fallback;\n return Math.max(0, Math.min(1, numeric));\n}\nexport function resolveExportFormat(options, downsampleQuality) {\n var _a;\n const providedOptions = options !== null && options !== void 0 ? options : {};\n const fileType = providedOptions.fileType;\n const formatAlias = providedOptions.format;\n const requested = fileType || formatAlias;\n const format = normalizeImageFormat(requested);\n const mimeType = mimeTypeFor(format);\n if (format === 'png') {\n return { format, mimeType, quality: undefined };\n }\n const rawQuality = (_a = providedOptions.quality) !== null && _a !== void 0 ? _a : downsampleQuality;\n const quality = clampQuality(rawQuality, downsampleQuality);\n return { format, mimeType, quality };\n}\n//# sourceMappingURL=export-format.js.map","import { tryNormalizeImageFormat } from '../export/export-format.js';\nconst EMPTY_DEFAULT_MASK_CONFIG = Object.freeze({});\nconst DEFAULT_LAYOUT_MODE = 'expand';\nexport const DEFAULT_OPTIONS = {\n canvasWidth: 800,\n canvasHeight: 600,\n backgroundColor: 'transparent',\n animationDuration: 300,\n minScale: 0.1,\n maxScale: 5.0,\n scaleStep: 0.05,\n rotationStep: 90,\n defaultLayoutMode: DEFAULT_LAYOUT_MODE,\n layoutMode: DEFAULT_LAYOUT_MODE,\n downsampleOnLoad: true,\n downsampleMaxWidth: 4000,\n downsampleMaxHeight: 3000,\n downsampleQuality: 0.92,\n preserveSourceFormat: true,\n downsampleMimeType: null,\n imageLoadTimeoutMs: 30000,\n maxHistorySize: 50,\n exportMultiplier: 1,\n maxExportPixels: 50000000,\n exportAreaByDefault: 'image',\n mergeMaskByDefault: true,\n defaultMaskWidth: 50,\n defaultMaskHeight: 80,\n defaultMaskConfig: EMPTY_DEFAULT_MASK_CONFIG,\n maskRotatable: false,\n maskLabelOnSelect: true,\n maskLabelOffset: 3,\n maskName: 'mask',\n groupSelection: false,\n showPlaceholder: true,\n initialImageBase64: null,\n defaultDownloadFileName: 'edited_image.jpg',\n onImageLoadStart: null,\n onImageLoaded: null,\n onImageCleared: null,\n onImageChanged: null,\n onBusyChange: null,\n onEditorDisposed: null,\n onMasksChanged: null,\n onSelectionChange: null,\n onError: null,\n onWarning: null,\n};\nconst DEFAULT_LABEL_TEXT_OPTIONS = {\n fontSize: 12,\n fill: '#fff',\n backgroundColor: 'rgba(0,0,0,0.7)',\n padding: 2,\n fontFamily: 'monospace',\n fontWeight: 'bold',\n selectable: false,\n evented: false,\n originX: 'left',\n originY: 'top',\n};\nexport const DEFAULT_LABEL = {\n getText: (mask) => mask.maskName,\n textOptions: { ...DEFAULT_LABEL_TEXT_OPTIONS },\n};\nexport const DEFAULT_CROP = {\n minWidth: 100,\n minHeight: 100,\n padding: 10,\n hideMasksDuringCrop: true,\n preserveMasksAfterCrop: false,\n allowRotationOfCropRect: false,\n exportFileType: 'source',\n exportQuality: undefined,\n};\nexport const DEFAULT_MOSAIC_CONFIG = Object.freeze({\n brushSize: 48,\n blockSize: 8,\n previewStroke: '#333',\n previewStrokeWidth: 1,\n previewStrokeDashArray: Object.freeze([4, 4]),\n previewFill: 'rgba(0,0,0,0)',\n outputFileType: 'source',\n outputQuality: undefined,\n});\nconst KNOWN_TOP_LEVEL_KEYS = new Set([\n 'canvasWidth',\n 'canvasHeight',\n 'backgroundColor',\n 'animationDuration',\n 'minScale',\n 'maxScale',\n 'scaleStep',\n 'rotationStep',\n 'defaultLayoutMode',\n 'downsampleOnLoad',\n 'downsampleMaxWidth',\n 'downsampleMaxHeight',\n 'downsampleQuality',\n 'preserveSourceFormat',\n 'downsampleMimeType',\n 'imageLoadTimeoutMs',\n 'maxHistorySize',\n 'exportMultiplier',\n 'maxExportPixels',\n 'exportAreaByDefault',\n 'mergeMaskByDefault',\n 'defaultMaskWidth',\n 'defaultMaskHeight',\n 'defaultMaskConfig',\n 'maskRotatable',\n 'maskLabelOnSelect',\n 'maskLabelOffset',\n 'maskName',\n 'groupSelection',\n 'showPlaceholder',\n 'initialImageBase64',\n 'defaultDownloadFileName',\n 'onImageLoadStart',\n 'onImageLoaded',\n 'onImageCleared',\n 'onImageChanged',\n 'onBusyChange',\n 'onEditorDisposed',\n 'onMasksChanged',\n 'onSelectionChange',\n 'onError',\n 'onWarning',\n 'label',\n 'crop',\n 'defaultMosaicConfig',\n]);\nfunction normalizeCallback(value) {\n return typeof value === 'function' ? value : null;\n}\nexport function isLayoutMode(value) {\n return value === 'fit' || value === 'cover' || value === 'expand';\n}\nfunction normalizeLayoutMode(value) {\n return isLayoutMode(value) ? value : DEFAULT_LAYOUT_MODE;\n}\nfunction isConfigObject(value) {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction copyDefaultMaskConfigValue(value) {\n return Array.isArray(value) ? [...value] : value;\n}\nfunction normalizeDefaultMaskConfig(value) {\n if (!isConfigObject(value))\n return EMPTY_DEFAULT_MASK_CONFIG;\n const normalized = {};\n for (const [key, optionValue] of Object.entries(value)) {\n if (key === 'onCreate' || key === 'fabricGenerator' || key === 'styles')\n continue;\n normalized[key] = copyDefaultMaskConfigValue(optionValue);\n }\n const styles = value.styles;\n if (isConfigObject(styles)) {\n const copiedStyles = {};\n for (const [key, styleValue] of Object.entries(styles)) {\n copiedStyles[key] = copyDefaultMaskConfigValue(styleValue);\n }\n Object.freeze(copiedStyles);\n normalized.styles = copiedStyles;\n }\n Object.freeze(normalized);\n return normalized;\n}\nfunction normalizePositiveInteger(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0)\n return fallback;\n return Math.max(1, Math.floor(numeric));\n}\nfunction normalizePositiveFiniteNumber(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0)\n return fallback;\n return numeric;\n}\nfunction normalizeNonNegativeFiniteNumber(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric < 0)\n return fallback;\n return numeric;\n}\nfunction normalizeFiniteNumber(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric))\n return fallback;\n return numeric;\n}\nfunction normalizeMaxHistorySize(value) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric))\n return DEFAULT_OPTIONS.maxHistorySize;\n return Math.max(1, Math.floor(numeric));\n}\nfunction normalizeQualityOption(value) {\n if (value == null)\n return DEFAULT_OPTIONS.downsampleQuality;\n const numeric = Number(value);\n if (!Number.isFinite(numeric))\n return DEFAULT_OPTIONS.downsampleQuality;\n return Math.max(0, Math.min(1, numeric));\n}\nfunction normalizeMaxExportPixels(value) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0)\n return DEFAULT_OPTIONS.maxExportPixels;\n return Math.max(1, Math.floor(numeric));\n}\nfunction normalizeExportArea(value) {\n return value === 'canvas' || value === 'image' ? value : DEFAULT_OPTIONS.exportAreaByDefault;\n}\nfunction normalizeOptionalQuality(value) {\n if (value === undefined || value === null)\n return undefined;\n const numeric = Number(value);\n if (!Number.isFinite(numeric))\n return undefined;\n return Math.max(0, Math.min(1, numeric));\n}\nfunction hasOwn(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\nfunction isFiniteNumber(value) {\n return typeof value === 'number' && Number.isFinite(value);\n}\nfunction normalizeMosaicPositiveNumber(value, fallback) {\n return isFiniteNumber(value) && value > 0 ? value : fallback;\n}\nfunction normalizeMosaicBlockSize(value, fallback) {\n return isFiniteNumber(value) && value > 0 ? Math.max(1, Math.floor(value)) : fallback;\n}\nfunction normalizeMosaicNonNegativeNumber(value, fallback) {\n return isFiniteNumber(value) && value >= 0 ? value : fallback;\n}\nfunction normalizeMosaicDashArray(value, fallback) {\n if (value === null)\n return null;\n if (Array.isArray(value) &&\n value.every((entry) => typeof entry === 'number' && Number.isFinite(entry) && entry >= 0)) {\n return [...value];\n }\n return fallback ? [...fallback] : null;\n}\nfunction normalizeMosaicOutputFileType(value, fallback) {\n var _a;\n if (value === 'source')\n return 'source';\n if (typeof value !== 'string')\n return fallback;\n return (_a = tryNormalizeImageFormat(value)) !== null && _a !== void 0 ? _a : fallback;\n}\nfunction normalizeMosaicOutputQuality(value, fallback) {\n if (value === undefined || value === null)\n return undefined;\n if (!isFiniteNumber(value))\n return fallback;\n return Math.max(0, Math.min(1, value));\n}\nexport function cloneResolvedMosaicConfig(config) {\n return {\n ...config,\n previewStrokeDashArray: config.previewStrokeDashArray\n ? [...config.previewStrokeDashArray]\n : null,\n };\n}\nexport function normalizeMosaicConfig(input, fallback) {\n if (!isConfigObject(input))\n return cloneResolvedMosaicConfig(fallback);\n return mergeMosaicConfigPatch(fallback, input);\n}\nexport function mergeMosaicConfigPatch(current, patch, fallback = current) {\n const raw = isConfigObject(patch) ? patch : {};\n const next = cloneResolvedMosaicConfig(current);\n if (hasOwn(raw, 'brushSize')) {\n next.brushSize = normalizeMosaicPositiveNumber(raw.brushSize, fallback.brushSize);\n }\n if (hasOwn(raw, 'blockSize')) {\n next.blockSize = normalizeMosaicBlockSize(raw.blockSize, fallback.blockSize);\n }\n if (hasOwn(raw, 'previewStroke')) {\n next.previewStroke =\n typeof raw.previewStroke === 'string' ? raw.previewStroke : fallback.previewStroke;\n }\n if (hasOwn(raw, 'previewStrokeWidth')) {\n next.previewStrokeWidth = normalizeMosaicNonNegativeNumber(raw.previewStrokeWidth, fallback.previewStrokeWidth);\n }\n if (hasOwn(raw, 'previewStrokeDashArray')) {\n next.previewStrokeDashArray = normalizeMosaicDashArray(raw.previewStrokeDashArray, fallback.previewStrokeDashArray);\n }\n if (hasOwn(raw, 'previewFill')) {\n next.previewFill =\n typeof raw.previewFill === 'string' ? raw.previewFill : fallback.previewFill;\n }\n if (hasOwn(raw, 'outputFileType')) {\n next.outputFileType = normalizeMosaicOutputFileType(raw.outputFileType, fallback.outputFileType);\n }\n if (hasOwn(raw, 'outputQuality')) {\n next.outputQuality = normalizeMosaicOutputQuality(raw.outputQuality, fallback.outputQuality);\n }\n return next;\n}\nexport function getInvalidMosaicConfigFields(input) {\n const raw = isConfigObject(input) ? input : {};\n const invalid = [];\n if (hasOwn(raw, 'brushSize') &&\n !(typeof raw.brushSize === 'number' && Number.isFinite(raw.brushSize) && raw.brushSize > 0)) {\n invalid.push('brushSize');\n }\n if (hasOwn(raw, 'blockSize') &&\n !(typeof raw.blockSize === 'number' && Number.isFinite(raw.blockSize) && raw.blockSize > 0)) {\n invalid.push('blockSize');\n }\n if (hasOwn(raw, 'previewStroke') && typeof raw.previewStroke !== 'string') {\n invalid.push('previewStroke');\n }\n if (hasOwn(raw, 'previewStrokeWidth') &&\n !(typeof raw.previewStrokeWidth === 'number' &&\n Number.isFinite(raw.previewStrokeWidth) &&\n raw.previewStrokeWidth >= 0)) {\n invalid.push('previewStrokeWidth');\n }\n if (hasOwn(raw, 'previewStrokeDashArray')) {\n const value = raw.previewStrokeDashArray;\n const valid = value === null ||\n (Array.isArray(value) &&\n value.every((entry) => typeof entry === 'number' && Number.isFinite(entry) && entry >= 0));\n if (!valid)\n invalid.push('previewStrokeDashArray');\n }\n if (hasOwn(raw, 'previewFill') && typeof raw.previewFill !== 'string') {\n invalid.push('previewFill');\n }\n if (hasOwn(raw, 'outputFileType')) {\n const value = raw.outputFileType;\n const valid = value === 'source' || (typeof value === 'string' && tryNormalizeImageFormat(value));\n if (!valid)\n invalid.push('outputFileType');\n }\n if (hasOwn(raw, 'outputQuality') &&\n raw.outputQuality !== undefined &&\n raw.outputQuality !== null &&\n !(typeof raw.outputQuality === 'number' && Number.isFinite(raw.outputQuality))) {\n invalid.push('outputQuality');\n }\n return invalid;\n}\nexport function areResolvedMosaicConfigsEqual(left, right) {\n const leftDash = left.previewStrokeDashArray;\n const rightDash = right.previewStrokeDashArray;\n const dashEqual = leftDash === rightDash ||\n (Array.isArray(leftDash) &&\n Array.isArray(rightDash) &&\n leftDash.length === rightDash.length &&\n leftDash.every((value, index) => value === rightDash[index]));\n return (left.brushSize === right.brushSize &&\n left.blockSize === right.blockSize &&\n left.previewStroke === right.previewStroke &&\n left.previewStrokeWidth === right.previewStrokeWidth &&\n dashEqual &&\n left.previewFill === right.previewFill &&\n left.outputFileType === right.outputFileType &&\n left.outputQuality === right.outputQuality);\n}\nexport function resolveOptions(input) {\n var _a, _b, _c, _d;\n const raw = input !== null && input !== void 0 ? input : {};\n const resolved = { ...DEFAULT_OPTIONS };\n for (const key of Object.keys(raw)) {\n if (!KNOWN_TOP_LEVEL_KEYS.has(key))\n continue;\n if (key === 'label' || key === 'crop' || key === 'defaultMosaicConfig')\n continue;\n if (key === 'onImageLoadStart' ||\n key === 'onImageLoaded' ||\n key === 'onImageCleared' ||\n key === 'onImageChanged' ||\n key === 'onBusyChange' ||\n key === 'onEditorDisposed' ||\n key === 'onMasksChanged' ||\n key === 'onSelectionChange' ||\n key === 'onError' ||\n key === 'onWarning') {\n continue;\n }\n const value = raw[key];\n if (value === undefined)\n continue;\n if (key === 'downsampleQuality') {\n resolved.downsampleQuality = normalizeQualityOption(value);\n continue;\n }\n if (key === 'maxExportPixels') {\n resolved.maxExportPixels = normalizeMaxExportPixels(value);\n continue;\n }\n if (key === 'exportAreaByDefault') {\n resolved.exportAreaByDefault = normalizeExportArea(value);\n continue;\n }\n if (key === 'defaultLayoutMode') {\n const layoutMode = normalizeLayoutMode(value);\n resolved.defaultLayoutMode = layoutMode;\n resolved.layoutMode = layoutMode;\n continue;\n }\n if (key === 'canvasWidth') {\n resolved.canvasWidth = normalizePositiveInteger(value, DEFAULT_OPTIONS.canvasWidth);\n continue;\n }\n if (key === 'canvasHeight') {\n resolved.canvasHeight = normalizePositiveInteger(value, DEFAULT_OPTIONS.canvasHeight);\n continue;\n }\n if (key === 'animationDuration') {\n resolved.animationDuration = normalizeNonNegativeFiniteNumber(value, DEFAULT_OPTIONS.animationDuration);\n continue;\n }\n if (key === 'minScale') {\n resolved.minScale = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.minScale);\n continue;\n }\n if (key === 'maxScale') {\n resolved.maxScale = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.maxScale);\n continue;\n }\n if (key === 'scaleStep') {\n resolved.scaleStep = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.scaleStep);\n continue;\n }\n if (key === 'rotationStep') {\n resolved.rotationStep = normalizeFiniteNumber(value, DEFAULT_OPTIONS.rotationStep);\n continue;\n }\n if (key === 'downsampleMaxWidth') {\n resolved.downsampleMaxWidth = normalizePositiveInteger(value, DEFAULT_OPTIONS.downsampleMaxWidth);\n continue;\n }\n if (key === 'downsampleMaxHeight') {\n resolved.downsampleMaxHeight = normalizePositiveInteger(value, DEFAULT_OPTIONS.downsampleMaxHeight);\n continue;\n }\n if (key === 'imageLoadTimeoutMs') {\n resolved.imageLoadTimeoutMs = normalizePositiveInteger(value, DEFAULT_OPTIONS.imageLoadTimeoutMs);\n continue;\n }\n if (key === 'exportMultiplier') {\n resolved.exportMultiplier = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.exportMultiplier);\n continue;\n }\n if (key === 'defaultMaskWidth') {\n resolved.defaultMaskWidth = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.defaultMaskWidth);\n continue;\n }\n if (key === 'defaultMaskHeight') {\n resolved.defaultMaskHeight = normalizePositiveFiniteNumber(value, DEFAULT_OPTIONS.defaultMaskHeight);\n continue;\n }\n if (key === 'defaultMaskConfig') {\n resolved.defaultMaskConfig = normalizeDefaultMaskConfig(value);\n continue;\n }\n if (key === 'maskLabelOffset') {\n resolved.maskLabelOffset = normalizeNonNegativeFiniteNumber(value, DEFAULT_OPTIONS.maskLabelOffset);\n continue;\n }\n resolved[key] = value;\n }\n resolved.onImageLoadStart = normalizeCallback(raw.onImageLoadStart);\n resolved.onImageLoaded = normalizeCallback(raw.onImageLoaded);\n resolved.onImageCleared = normalizeCallback(raw.onImageCleared);\n resolved.onImageChanged = normalizeCallback(raw.onImageChanged);\n resolved.onBusyChange = normalizeCallback(raw.onBusyChange);\n resolved.onEditorDisposed = normalizeCallback(raw.onEditorDisposed);\n resolved.onMasksChanged = normalizeCallback(raw.onMasksChanged);\n resolved.onSelectionChange = normalizeCallback(raw.onSelectionChange);\n resolved.onError = normalizeCallback(raw.onError);\n resolved.onWarning = normalizeCallback(raw.onWarning);\n resolved.maxHistorySize = normalizeMaxHistorySize(resolved.maxHistorySize);\n resolved.maxExportPixels = normalizeMaxExportPixels(resolved.maxExportPixels);\n if (resolved.minScale > resolved.maxScale) {\n const minScale = resolved.minScale;\n resolved.minScale = resolved.maxScale;\n resolved.maxScale = minScale;\n }\n const userLabel = raw.label && typeof raw.label === 'object' ? raw.label : {};\n const mergedTextOptions = {\n ...DEFAULT_LABEL_TEXT_OPTIONS,\n ...(userLabel.textOptions && typeof userLabel.textOptions === 'object'\n ? userLabel.textOptions\n : {}),\n };\n const label = {\n getText: typeof userLabel.getText === 'function' ? userLabel.getText : DEFAULT_LABEL.getText,\n textOptions: mergedTextOptions,\n };\n if (typeof userLabel.create === 'function') {\n label.create = userLabel.create;\n }\n Object.freeze(label.textOptions);\n Object.freeze(label);\n const userCrop = raw.crop && typeof raw.crop === 'object' ? raw.crop : {};\n const crop = {\n minWidth: normalizePositiveFiniteNumber(userCrop.minWidth, DEFAULT_CROP.minWidth),\n minHeight: normalizePositiveFiniteNumber(userCrop.minHeight, DEFAULT_CROP.minHeight),\n padding: normalizeNonNegativeFiniteNumber(userCrop.padding, DEFAULT_CROP.padding),\n hideMasksDuringCrop: (_a = userCrop.hideMasksDuringCrop) !== null && _a !== void 0 ? _a : DEFAULT_CROP.hideMasksDuringCrop,\n preserveMasksAfterCrop: (_b = userCrop.preserveMasksAfterCrop) !== null && _b !== void 0 ? _b : DEFAULT_CROP.preserveMasksAfterCrop,\n allowRotationOfCropRect: (_c = userCrop.allowRotationOfCropRect) !== null && _c !== void 0 ? _c : DEFAULT_CROP.allowRotationOfCropRect,\n exportFileType: (_d = userCrop.exportFileType) !== null && _d !== void 0 ? _d : DEFAULT_CROP.exportFileType,\n exportQuality: normalizeOptionalQuality(userCrop.exportQuality),\n };\n Object.freeze(crop);\n const defaultMosaicConfig = normalizeMosaicConfig(raw.defaultMosaicConfig, DEFAULT_MOSAIC_CONFIG);\n if (defaultMosaicConfig.previewStrokeDashArray) {\n Object.freeze(defaultMosaicConfig.previewStrokeDashArray);\n }\n Object.freeze(defaultMosaicConfig);\n return Object.freeze({\n ...resolved,\n label,\n crop,\n defaultMosaicConfig,\n });\n}\n//# sourceMappingURL=default-options.js.map","export class OperationGuard {\n constructor() {\n Object.defineProperty(this, \"isAnimationActive\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"isDisposedFlag\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"isLoadingActive\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"currentOperationName\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"currentOperationToken\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"animationAborters\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Set()\n });\n }\n isAnimating() {\n return this.isAnimationActive;\n }\n isDisposed() {\n return this.isDisposedFlag;\n }\n isLoading() {\n return this.isLoadingActive;\n }\n activeOperationName() {\n return this.currentOperationName;\n }\n isBusy() {\n return (this.isAnimationActive || this.isLoadingActive || this.currentOperationToken !== null);\n }\n beginAnimation() {\n this.isAnimationActive = true;\n }\n endAnimation() {\n this.isAnimationActive = false;\n }\n markDisposed() {\n this.isDisposedFlag = true;\n this.isAnimationActive = false;\n this.isLoadingActive = false;\n this.currentOperationName = null;\n this.currentOperationToken = null;\n for (const abort of this.animationAborters) {\n try {\n abort();\n }\n catch {\n }\n }\n this.animationAborters.clear();\n }\n registerAnimationAborter(abort) {\n if (this.isDisposedFlag) {\n try {\n abort();\n }\n catch {\n }\n return () => undefined;\n }\n this.animationAborters.add(abort);\n return () => {\n this.animationAborters.delete(abort);\n };\n }\n beginLoading() {\n this.isLoadingActive = true;\n }\n endLoading() {\n this.isLoadingActive = false;\n }\n beginBusyOperation(operationName) {\n const token = Symbol(operationName);\n this.currentOperationName = operationName;\n this.currentOperationToken = token;\n return token;\n }\n endBusyOperation(token) {\n if (token && token === this.currentOperationToken) {\n this.currentOperationName = null;\n this.currentOperationToken = null;\n }\n }\n isOwnOperation(token) {\n return !!token && token === this.currentOperationToken;\n }\n async runAnimation(animationTask) {\n this.beginAnimation();\n try {\n return await animationTask();\n }\n finally {\n this.endAnimation();\n }\n }\n assertNotAnimating(operationLabel) {\n if (this.isAnimationActive) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while an animation is in progress.`);\n }\n }\n assertIdleForOperation(operationLabel, token) {\n var _a;\n if (this.isDisposedFlag) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" after dispose.`);\n }\n const ownOperation = this.isOwnOperation(token);\n if (this.isAnimationActive) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while an animation is in progress.`);\n }\n if (this.isLoadingActive && !ownOperation) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while an image is loading.`);\n }\n if (this.currentOperationToken && !ownOperation) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while ` +\n `${(_a = this.currentOperationName) !== null && _a !== void 0 ? _a : 'another operation'} is running.`);\n }\n }\n assertCanQueueAnimation(operationLabel, token) {\n var _a;\n if (this.isDisposedFlag) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" after dispose.`);\n }\n const ownOperation = this.isOwnOperation(token);\n if (this.isLoadingActive && !ownOperation) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while an image is loading.`);\n }\n if (this.currentOperationToken && !ownOperation) {\n throw new Error(`[ImageEditor] Cannot run \"${operationLabel}\" while ` +\n `${(_a = this.currentOperationName) !== null && _a !== void 0 ? _a : 'another operation'} is running.`);\n }\n }\n}\n//# sourceMappingURL=operation-guard.js.map","export function isMaskObject(object) {\n return 'maskId' in object && typeof object.maskId === 'number';\n}\n//# sourceMappingURL=public-types.js.map","import { isMaskObject } from './public-types.js';\nexport const SNAPSHOT_CUSTOM_KEYS = [\n 'maskId',\n 'maskUid',\n 'maskName',\n 'isCropRect',\n 'maskLabel',\n 'originalAlpha',\n 'originalStroke',\n 'originalStrokeWidth',\n 'hasControls',\n 'selectable',\n 'strokeUniform',\n 'lockRotation',\n 'transparentCorners',\n 'borderColor',\n 'cornerColor',\n 'cornerSize',\n 'isMosaicPreview',\n];\nfunction copySnapshotCustomPropsFromCanvas(canvasObjects, jsonObjects) {\n if (!Array.isArray(jsonObjects))\n return;\n for (let index = 0; index < jsonObjects.length; index += 1) {\n const liveObject = canvasObjects[index];\n const jsonObject = jsonObjects[index];\n if (!liveObject || !jsonObject)\n continue;\n if (typeof liveObject.maskId === 'number')\n jsonObject.maskId = liveObject.maskId;\n if (typeof liveObject.maskUid === 'string')\n jsonObject.maskUid = liveObject.maskUid;\n if (typeof liveObject.maskName === 'string')\n jsonObject.maskName = liveObject.maskName;\n if (typeof liveObject.originalAlpha === 'number') {\n jsonObject.originalAlpha = liveObject.originalAlpha;\n }\n if ('originalStroke' in liveObject)\n jsonObject.originalStroke = liveObject.originalStroke;\n if (typeof liveObject.originalStrokeWidth === 'number') {\n jsonObject.originalStrokeWidth = liveObject.originalStrokeWidth;\n }\n if (typeof liveObject.hasControls === 'boolean') {\n jsonObject.hasControls = liveObject.hasControls;\n }\n if (typeof liveObject.selectable === 'boolean') {\n jsonObject.selectable = liveObject.selectable;\n }\n if (typeof liveObject.strokeUniform === 'boolean') {\n jsonObject.strokeUniform = liveObject.strokeUniform;\n }\n if (typeof liveObject.lockRotation === 'boolean') {\n jsonObject.lockRotation = liveObject.lockRotation;\n }\n if (typeof liveObject.transparentCorners === 'boolean') {\n jsonObject.transparentCorners = liveObject.transparentCorners;\n }\n if (typeof liveObject.borderColor === 'string') {\n jsonObject.borderColor = liveObject.borderColor;\n }\n if (typeof liveObject.cornerColor === 'string') {\n jsonObject.cornerColor = liveObject.cornerColor;\n }\n if (typeof liveObject.cornerSize === 'number') {\n jsonObject.cornerSize = liveObject.cornerSize;\n }\n if (liveObject.isCropRect === true)\n jsonObject.isCropRect = true;\n if (liveObject.maskLabel === true)\n jsonObject.maskLabel = true;\n if (liveObject.isMosaicPreview === true)\n jsonObject.isMosaicPreview = true;\n }\n}\nfunction isActiveSelectionObject(object) {\n if (!object)\n return false;\n const type = typeof object.type === 'string' ? object.type.toLowerCase() : '';\n if (type === 'activeselection')\n return true;\n const isType = object.isType;\n return (typeof isType === 'function' &&\n (isType.call(object, 'ActiveSelection') || isType.call(object, 'activeSelection')));\n}\nexport function saveState(input) {\n var _a, _b, _c;\n const { canvas, currentScale, currentRotation, baseImageScale } = input;\n const activeObject = (_b = (_a = canvas).getActiveObject) === null || _b === void 0 ? void 0 : _b.call(_a);\n const activeMaskId = activeObject && isMaskObject(activeObject)\n ? activeObject.maskId\n : typeof input.activeMaskId === 'number'\n ? input.activeMaskId\n : null;\n if (isActiveSelectionObject(activeObject)) {\n canvas.discardActiveObject();\n }\n const jsonObj = canvas.toJSON(SNAPSHOT_CUSTOM_KEYS);\n copySnapshotCustomPropsFromCanvas(canvas.getObjects(), jsonObj.objects);\n if (Array.isArray(jsonObj.objects)) {\n jsonObj.objects = jsonObj.objects.filter((o) => o.isCropRect !== true && o.maskLabel !== true && o.isMosaicPreview !== true);\n }\n jsonObj._editorState = {\n currentScale,\n currentRotation,\n baseImageScale,\n currentImageMimeType: (_c = input.currentImageMimeType) !== null && _c !== void 0 ? _c : null,\n };\n if (activeMaskId !== null)\n jsonObj._editorState.activeMaskId = activeMaskId;\n return JSON.stringify(jsonObj);\n}\nexport async function loadFromState(input) {\n var _a, _b;\n const { canvas, jsonString: snapshotInput, setCanvasSize } = input;\n const jsonString = typeof snapshotInput === 'string' ? snapshotInput : JSON.stringify(snapshotInput);\n const json = JSON.parse(jsonString);\n if (typeof json.width === 'number' &&\n json.width > 0 &&\n typeof json.height === 'number' &&\n json.height > 0) {\n setCanvasSize(json.width, json.height);\n }\n await canvas.loadFromJSON(json);\n const objects = canvas.getObjects();\n restoreMaskPropsFromJson(objects, (_a = json.objects) !== null && _a !== void 0 ? _a : []);\n const editorState = json._editorState && typeof json._editorState === 'object'\n ? {\n currentScale: typeof json._editorState.currentScale === 'number'\n ? json._editorState.currentScale\n : 1,\n currentRotation: typeof json._editorState.currentRotation === 'number'\n ? json._editorState.currentRotation\n : 0,\n baseImageScale: typeof json._editorState.baseImageScale === 'number'\n ? json._editorState.baseImageScale\n : 1,\n }\n : null;\n if (editorState && json._editorState && typeof json._editorState.activeMaskId === 'number') {\n editorState.activeMaskId = json._editorState.activeMaskId;\n }\n if (editorState && json._editorState && 'currentImageMimeType' in json._editorState) {\n const mimeType = json._editorState.currentImageMimeType;\n editorState.currentImageMimeType =\n mimeType === 'image/jpeg' || mimeType === 'image/png' || mimeType === 'image/webp'\n ? mimeType\n : null;\n }\n const maxMaskId = objects\n .filter(isMaskObject)\n .reduce((max, maskObject) => Math.max(max, maskObject.maskId), 0);\n const originalImage = ((_b = objects.find(isOriginalImageObject)) !== null && _b !== void 0 ? _b : null);\n return {\n editorState,\n maxMaskId,\n originalImage,\n objects,\n jsonString,\n };\n}\nfunction isOriginalImageObject(object) {\n if (isMaskObject(object))\n return false;\n const type = typeof object.type === 'string' ? object.type.toLowerCase() : '';\n if (type === 'image')\n return true;\n const isType = object.isType;\n return typeof isType === 'function' && isType.call(object, 'image');\n}\nfunction restoreMaskPropsFromJson(canvasObjs, jsonObjs) {\n var _a, _b, _c, _d, _e;\n const consumedCanvasIndexes = new Set();\n for (const jObj of jsonObjs) {\n if (typeof jObj.maskId !== 'number')\n continue;\n const jType = String((_a = jObj.type) !== null && _a !== void 0 ? _a : '');\n const jLeft = Number((_b = jObj.left) !== null && _b !== void 0 ? _b : 0);\n const jTop = Number((_c = jObj.top) !== null && _c !== void 0 ? _c : 0);\n const jUid = typeof jObj.maskUid === 'string' ? jObj.maskUid : null;\n let matchIndex = -1;\n if (jUid) {\n matchIndex = canvasObjs.findIndex((o, index) => {\n if (consumedCanvasIndexes.has(index))\n return false;\n return o.maskUid === jUid;\n });\n }\n if (matchIndex < 0) {\n matchIndex = canvasObjs.findIndex((o, index) => {\n var _a, _b;\n if (consumedCanvasIndexes.has(index))\n return false;\n if (jType && o.type !== jType)\n return false;\n return Math.abs(((_a = o.left) !== null && _a !== void 0 ? _a : 0) - jLeft) < 0.5 && Math.abs(((_b = o.top) !== null && _b !== void 0 ? _b : 0) - jTop) < 0.5;\n });\n }\n if (matchIndex < 0)\n continue;\n consumedCanvasIndexes.add(matchIndex);\n const match = canvasObjs[matchIndex];\n const maskObject = match;\n maskObject.maskId = jObj.maskId;\n if (typeof jObj.maskUid === 'string') {\n maskObject.maskUid = jObj.maskUid;\n }\n maskObject.maskName = String((_d = jObj.maskName) !== null && _d !== void 0 ? _d : '');\n maskObject.originalAlpha =\n typeof jObj.originalAlpha === 'number'\n ? jObj.originalAlpha\n : ((_e = maskObject.opacity) !== null && _e !== void 0 ? _e : 0.5);\n if ('originalStroke' in jObj) {\n maskObject.originalStroke = jObj.originalStroke;\n }\n if (typeof jObj.originalStrokeWidth === 'number') {\n maskObject.originalStrokeWidth = jObj.originalStrokeWidth;\n }\n if (typeof jObj.hasControls === 'boolean') {\n maskObject.hasControls = jObj.hasControls;\n }\n if (typeof jObj.selectable === 'boolean') {\n maskObject.selectable = jObj.selectable;\n }\n if (typeof jObj.strokeUniform === 'boolean') {\n maskObject.strokeUniform = jObj.strokeUniform;\n }\n if (typeof jObj.lockRotation === 'boolean') {\n maskObject.lockRotation = jObj.lockRotation;\n }\n if (typeof jObj.transparentCorners === 'boolean') {\n maskObject.transparentCorners = jObj.transparentCorners;\n }\n if (typeof jObj.borderColor === 'string') {\n maskObject.borderColor = jObj.borderColor;\n }\n if (typeof jObj.cornerColor === 'string') {\n maskObject.cornerColor = jObj.cornerColor;\n }\n if (typeof jObj.cornerSize === 'number') {\n maskObject.cornerSize = jObj.cornerSize;\n }\n }\n jsonObjs.forEach((jObj, index) => {\n if (jObj.maskLabel !== true)\n return;\n const canvasObj = canvasObjs[index];\n if (canvasObj) {\n canvasObj.maskLabel = true;\n }\n });\n}\n//# sourceMappingURL=state-serializer.js.map","export class Command {\n constructor(execute, undo) {\n Object.defineProperty(this, \"execute\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"undo\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.execute = execute;\n this.undo = undo;\n }\n}\nexport class HistoryManager {\n constructor(maxSize = 50) {\n Object.defineProperty(this, \"history\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n Object.defineProperty(this, \"currentIndex\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: -1\n });\n Object.defineProperty(this, \"isProcessing\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"maxSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.maxSize = maxSize;\n }\n execute(command) {\n void command.execute();\n this.pushAndTrim(command);\n }\n push(command) {\n this.pushAndTrim(command);\n }\n canUndo() {\n return this.currentIndex >= 0;\n }\n canRedo() {\n return this.currentIndex < this.history.length - 1;\n }\n async undo() {\n if (this.isProcessing || !this.canUndo())\n return;\n this.isProcessing = true;\n try {\n const cmd = this.history[this.currentIndex];\n if (!cmd)\n return;\n await cmd.undo();\n this.currentIndex--;\n }\n finally {\n this.isProcessing = false;\n }\n }\n async redo() {\n if (this.isProcessing || !this.canRedo())\n return;\n this.isProcessing = true;\n try {\n const cmd = this.history[this.currentIndex + 1];\n if (!cmd)\n return;\n await cmd.execute();\n this.currentIndex++;\n }\n finally {\n this.isProcessing = false;\n }\n }\n pushAndTrim(command) {\n if (this.currentIndex < this.history.length - 1) {\n this.history = this.history.slice(0, this.currentIndex + 1);\n }\n this.history.push(command);\n if (this.history.length > this.maxSize) {\n this.history.shift();\n }\n else {\n this.currentIndex++;\n }\n }\n}\n//# sourceMappingURL=history-manager.js.map","function looksLikeFabricModule(value) {\n if (value === null || typeof value !== 'object')\n return false;\n const candidate = value.Canvas;\n return typeof candidate === 'function';\n}\nfunction readGlobalFabric(globalScope) {\n return globalScope.fabric;\n}\nexport function detectFabric(fabricOrOptions, maybeOptions, globalScope = globalThis) {\n var _a;\n if (looksLikeFabricModule(fabricOrOptions)) {\n return {\n fabric: fabricOrOptions,\n isFabricLoaded: true,\n options: maybeOptions !== null && maybeOptions !== void 0 ? maybeOptions : {},\n };\n }\n const options = (_a = fabricOrOptions) !== null && _a !== void 0 ? _a : {};\n const globalFabric = readGlobalFabric(globalScope);\n if (looksLikeFabricModule(globalFabric)) {\n return {\n fabric: globalFabric,\n isFabricLoaded: true,\n options,\n };\n }\n console.error('[ImageEditor] fabric.js v7 is not available. ' +\n 'Pass it as the first constructor argument (ESM) or ' +\n 'load it as a global <script> before instantiation.');\n return {\n fabric: null,\n isFabricLoaded: false,\n options,\n };\n}\n//# sourceMappingURL=fabric-adapter.js.map","function fixPrototype(self, ctor) {\n Object.setPrototypeOf(self, ctor.prototype);\n}\nexport class FabricUnavailableError extends Error {\n constructor(message = 'Fabric.js v7 is not available. Pass the Fabric module explicitly to the constructor or expose it as `globalThis.fabric`.') {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'FabricUnavailableError'\n });\n fixPrototype(this, FabricUnavailableError);\n }\n}\nexport class ImageDecodeError extends Error {\n constructor(message = 'Failed to decode image data URL.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'ImageDecodeError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, ImageDecodeError);\n }\n}\nexport class ImageLoadTimeoutError extends Error {\n constructor(label, elapsedMs) {\n super(`Image load timed out after ${elapsedMs}ms during ${label}`);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'ImageLoadTimeoutError'\n });\n Object.defineProperty(this, \"label\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"elapsedMs\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.label = label;\n this.elapsedMs = elapsedMs;\n fixPrototype(this, ImageLoadTimeoutError);\n }\n}\nexport class DownsampleError extends Error {\n constructor(message = 'Failed to obtain a 2D context for downsampling.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'DownsampleError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, DownsampleError);\n }\n}\nexport class MergeMasksError extends Error {\n constructor(message = 'Failed to merge masks into the image.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'MergeMasksError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, MergeMasksError);\n }\n}\nexport class CropApplyError extends Error {\n constructor(message = 'Failed to apply crop to the image.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'CropApplyError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, CropApplyError);\n }\n}\nexport class ExportNotReadyError extends Error {\n constructor(operation = 'exportImageFile') {\n super(`Cannot ${operation}: no image is loaded on the canvas.`);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'ExportNotReadyError'\n });\n Object.defineProperty(this, \"operation\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.operation = operation;\n fixPrototype(this, ExportNotReadyError);\n }\n}\nexport class ExportError extends Error {\n constructor(message = 'Failed to export image.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'ExportError'\n });\n Object.defineProperty(this, \"originalError\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.originalError = originalError;\n fixPrototype(this, ExportError);\n }\n}\n//# sourceMappingURL=errors.js.map","import { isMaskObject } from '../core/public-types.js';\nconst SELECTED_STROKE = '#ff0000';\nconst SELECTED_STROKE_WIDTH = 1;\nconst HOVER_STROKE = '#ff5500';\nconst HOVER_STROKE_WIDTH = 2;\nconst HOVER_OPACITY_BUMP = 0.2;\nconst DEFAULT_STROKE_FALLBACK = '#ccc';\nconst DEFAULT_STROKE_WIDTH_FALLBACK = 1;\nconst DEFAULT_ALPHA_FALLBACK = 0.5;\nexport function getMaskNormalStyle(mask) {\n var _a;\n const strokeWidth = Number(mask.originalStrokeWidth);\n const opacity = Number(mask.originalAlpha);\n return {\n stroke: (_a = mask.originalStroke) !== null && _a !== void 0 ? _a : DEFAULT_STROKE_FALLBACK,\n strokeWidth: Number.isFinite(strokeWidth) ? strokeWidth : DEFAULT_STROKE_WIDTH_FALLBACK,\n opacity: Number.isFinite(opacity) ? opacity : DEFAULT_ALPHA_FALLBACK,\n };\n}\nexport function getMaskHoverStyle(mask) {\n const opacity = Number(mask.originalAlpha);\n const baseAlpha = Number.isFinite(opacity) ? opacity : DEFAULT_ALPHA_FALLBACK;\n return {\n stroke: HOVER_STROKE,\n strokeWidth: HOVER_STROKE_WIDTH,\n opacity: Math.min(baseAlpha + HOVER_OPACITY_BUMP, 1),\n };\n}\nexport function applyMaskSelectedStyle(mask) {\n mask.set({ stroke: SELECTED_STROKE, strokeWidth: SELECTED_STROKE_WIDTH });\n}\nexport function applyMaskUnselectedStyle(mask) {\n var _a;\n const strokeWidth = Number(mask.originalStrokeWidth);\n mask.set({\n stroke: (_a = mask.originalStroke) !== null && _a !== void 0 ? _a : DEFAULT_STROKE_FALLBACK,\n strokeWidth: Number.isFinite(strokeWidth) ? strokeWidth : DEFAULT_STROKE_WIDTH_FALLBACK,\n });\n}\nexport function attachMaskHoverHandlers(mask) {\n const tagged = mask;\n const mouseover = () => {\n var _a;\n tagged.set(getMaskHoverStyle(tagged));\n (_a = tagged.canvas) === null || _a === void 0 ? void 0 : _a.requestRenderAll();\n };\n const mouseout = () => {\n var _a;\n tagged.set(getMaskNormalStyle(tagged));\n (_a = tagged.canvas) === null || _a === void 0 ? void 0 : _a.requestRenderAll();\n };\n tagged.on('mouseover', mouseover);\n tagged.on('mouseout', mouseout);\n tagged.imageEditorMaskHandlers = { mouseover, mouseout };\n}\nexport function reattachMaskHoverHandlers(mask) {\n var _a;\n const tagged = mask;\n if (tagged.imageEditorMaskHandlers) {\n try {\n tagged.off('mouseover', tagged.imageEditorMaskHandlers.mouseover);\n tagged.off('mouseout', tagged.imageEditorMaskHandlers.mouseout);\n }\n catch {\n }\n delete tagged.imageEditorMaskHandlers;\n }\n const patch = {};\n if (!Number.isFinite(Number(tagged.originalAlpha))) {\n const opacity = Number(tagged.opacity);\n patch.originalAlpha = Number.isFinite(opacity) ? opacity : DEFAULT_ALPHA_FALLBACK;\n }\n if (tagged.originalStroke == null) {\n patch.originalStroke = (_a = tagged.stroke) !== null && _a !== void 0 ? _a : DEFAULT_STROKE_FALLBACK;\n }\n if (!Number.isFinite(Number(tagged.originalStrokeWidth))) {\n const sw = Number(tagged.strokeWidth);\n patch.originalStrokeWidth = Number.isFinite(sw) ? sw : DEFAULT_STROKE_WIDTH_FALLBACK;\n }\n if (Object.keys(patch).length > 0)\n tagged.set(patch);\n attachMaskHoverHandlers(tagged);\n}\nexport function detachMaskHoverHandlers(mask) {\n const tagged = mask;\n if (!tagged.imageEditorMaskHandlers)\n return;\n try {\n tagged.off('mouseover', tagged.imageEditorMaskHandlers.mouseover);\n tagged.off('mouseout', tagged.imageEditorMaskHandlers.mouseout);\n }\n catch {\n }\n delete tagged.imageEditorMaskHandlers;\n}\nexport function captureMaskStyleBackup(mask) {\n var _a, _b, _c, _d, _e, _f, _g;\n return {\n object: mask,\n opacity: (_a = mask.opacity) !== null && _a !== void 0 ? _a : 1,\n fill: ((_b = mask.fill) !== null && _b !== void 0 ? _b : null),\n strokeWidth: (_c = mask.strokeWidth) !== null && _c !== void 0 ? _c : 0,\n stroke: ((_d = mask.stroke) !== null && _d !== void 0 ? _d : null),\n selectable: (_e = mask.selectable) !== null && _e !== void 0 ? _e : true,\n evented: (_f = mask.evented) !== null && _f !== void 0 ? _f : true,\n lockRotation: (_g = mask.lockRotation) !== null && _g !== void 0 ? _g : false,\n };\n}\nexport function restoreMaskStyleBackup(backup) {\n try {\n backup.object.set({\n opacity: backup.opacity,\n fill: backup.fill,\n strokeWidth: backup.strokeWidth,\n stroke: backup.stroke,\n selectable: backup.selectable,\n evented: backup.evented,\n lockRotation: backup.lockRotation,\n });\n if (typeof backup.object.setCoords === 'function') {\n backup.object.setCoords();\n }\n }\n catch {\n }\n}\nexport function withNormalizedMaskStyles(context, callback) {\n if (!context.canvas)\n return callback();\n const masks = context.canvas.getObjects().filter(isMaskObject);\n const patches = [];\n try {\n for (const mask of masks) {\n const normal = getMaskNormalStyle(mask);\n const snapshot = {};\n const stylePatch = {};\n Object.keys(normal).forEach((key) => {\n const live = mask[key];\n if (live !== normal[key]) {\n snapshot[key] = live;\n stylePatch[key] = normal[key];\n }\n });\n if (Object.keys(stylePatch).length === 0)\n continue;\n patches.push({ object: mask, snapshot });\n mask.set(stylePatch);\n }\n return callback();\n }\n finally {\n for (const patch of patches) {\n try {\n patch.object.set(patch.snapshot);\n }\n catch {\n }\n }\n }\n}\nexport async function withMaskStyleBackup(context, mutator, callback) {\n if (!context.canvas)\n return await callback();\n const masks = context.canvas.getObjects().filter(isMaskObject);\n const backups = masks.map(captureMaskStyleBackup);\n try {\n masks.forEach((mask, index) => mutator(mask, index));\n return await callback();\n }\n finally {\n for (const backup of backups)\n restoreMaskStyleBackup(backup);\n }\n}\nexport function applyCropHideMaskStyle(mask) {\n try {\n mask.set({ opacity: 0, evented: false, selectable: false });\n }\n catch {\n }\n}\n//# sourceMappingURL=mask-style.js.map","export function hasMeaningfulCanvasRegion(rect, canvasWidth, canvasHeight) {\n const left = Number(rect.left);\n const top = Number(rect.top);\n const width = Number(rect.width);\n const height = Number(rect.height);\n if (!Number.isFinite(left) ||\n !Number.isFinite(top) ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0) {\n return false;\n }\n const right = left + width;\n const bottom = top + height;\n if (!Number.isFinite(right) || !Number.isFinite(bottom))\n return false;\n const safeCanvasWidth = Number(canvasWidth);\n const safeCanvasHeight = Number(canvasHeight);\n if (!Number.isFinite(safeCanvasWidth) ||\n !Number.isFinite(safeCanvasHeight) ||\n safeCanvasWidth <= 0 ||\n safeCanvasHeight <= 0) {\n return true;\n }\n const overlapWidth = Math.min(right, safeCanvasWidth) - Math.max(left, 0);\n const overlapHeight = Math.min(bottom, safeCanvasHeight) - Math.max(top, 0);\n return overlapWidth > 0 && overlapHeight > 0;\n}\nexport function getClampedCanvasRegion(rect, canvasWidth, canvasHeight, options = {}) {\n const safeLeft = Number.isFinite(rect.left) ? rect.left : 0;\n const safeTop = Number.isFinite(rect.top) ? rect.top : 0;\n const safeWidth = Math.max(0, Number.isFinite(rect.width) ? rect.width : 0);\n const safeHeight = Math.max(0, Number.isFinite(rect.height) ? rect.height : 0);\n const includePartialPixels = options.includePartialPixels !== false;\n const roundEnd = includePartialPixels ? Math.ceil : Math.floor;\n const hasCanvasWidth = Number.isFinite(canvasWidth);\n const hasCanvasHeight = Number.isFinite(canvasHeight);\n const safeCanvasWidth = hasCanvasWidth\n ? Math.max(1, Math.round(Number(canvasWidth)))\n : Number.POSITIVE_INFINITY;\n const safeCanvasHeight = hasCanvasHeight\n ? Math.max(1, Math.round(Number(canvasHeight)))\n : Number.POSITIVE_INFINITY;\n const left = Math.min(safeCanvasWidth - 1, Math.max(0, Math.floor(safeLeft)));\n const top = Math.min(safeCanvasHeight - 1, Math.max(0, Math.floor(safeTop)));\n const right = Math.min(safeCanvasWidth, Math.max(left + 1, roundEnd(safeLeft + safeWidth)));\n const bottom = Math.min(safeCanvasHeight, Math.max(top + 1, roundEnd(safeTop + safeHeight)));\n return {\n left,\n top,\n width: Math.max(1, right - left),\n height: Math.max(1, bottom - top),\n };\n}\nexport function floorRegion(rect) {\n return getClampedCanvasRegion(rect, undefined, undefined, { includePartialPixels: false });\n}\nexport function hasFractionalCanvasEdge(value) {\n const numericValue = Number(value);\n if (!Number.isFinite(numericValue))\n return false;\n return Math.abs(numericValue - Math.round(numericValue)) > 0.01;\n}\nexport function getPartialExportEdges(bounds, angle = 0) {\n if (!bounds)\n return null;\n const normalizedAngle = Math.abs((Number(angle) || 0) % 90);\n const isAxisAligned = normalizedAngle < 0.01 || Math.abs(normalizedAngle - 90) < 0.01;\n if (!isAxisAligned)\n return null;\n const left = Number(bounds.left) || 0;\n const top = Number(bounds.top) || 0;\n return {\n left: hasFractionalCanvasEdge(left),\n top: hasFractionalCanvasEdge(top),\n right: hasFractionalCanvasEdge(left + (Number(bounds.width) || 0)),\n bottom: hasFractionalCanvasEdge(top + (Number(bounds.height) || 0)),\n };\n}\nexport function getObjectBBox(object) {\n object.setCoords();\n const boundingRect = object.getBoundingRect();\n return {\n left: boundingRect.left,\n top: boundingRect.top,\n width: boundingRect.width,\n height: boundingRect.height,\n };\n}\nexport function clampRegionToCanvas(region, canvasWidth, canvasHeight) {\n const safeCw = Math.max(1, Math.floor(Number.isFinite(canvasWidth) ? canvasWidth : 1));\n const safeCh = Math.max(1, Math.floor(Number.isFinite(canvasHeight) ? canvasHeight : 1));\n const left = Math.max(0, Math.min(region.left, safeCw - 1));\n const top = Math.max(0, Math.min(region.top, safeCh - 1));\n const width = Math.max(1, Math.min(region.width, safeCw - left));\n const height = Math.max(1, Math.min(region.height, safeCh - top));\n return { left, top, width, height };\n}\n//# sourceMappingURL=canvas-region.js.map","import { CropApplyError } from '../core/errors.js';\nimport { isMaskObject } from '../core/public-types.js';\nimport { Command } from '../history/history-manager.js';\nimport { applyCropHideMaskStyle, captureMaskStyleBackup, reattachMaskHoverHandlers, restoreMaskStyleBackup, } from '../mask/mask-style.js';\nimport { getClampedCanvasRegion, getObjectBBox, hasMeaningfulCanvasRegion, } from '../utils/canvas-region.js';\nimport { clampQuality as clampExportQuality, mimeTypeFor, tryNormalizeImageFormat, } from '../export/export-format.js';\nconst CROP_RECT_FILL = 'rgba(0,0,0,0.12)';\nconst CROP_RECT_STROKE = '#00aaff';\nconst CROP_RECT_DASH = [6, 4];\nconst CROP_RECT_CORNER_SIZE = 8;\nconst CROP_DEFAULT_PADDING = 10;\nconst CROPPED_EXPORT_QUALITY_FALLBACK = 0.92;\nfunction finiteNumberOrFallback(value, fallback) {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : fallback;\n}\nfunction imageMimeToFormat(mimeType) {\n if (mimeType === 'image/jpeg')\n return 'jpeg';\n if (mimeType === 'image/png')\n return 'png';\n if (mimeType === 'image/webp')\n return 'webp';\n return null;\n}\nfunction resolveLossyCropQuality(cropExportQuality, downsampleQuality) {\n const cropQuality = Number(cropExportQuality);\n if (Number.isFinite(cropQuality)) {\n return clampExportQuality(cropQuality, CROPPED_EXPORT_QUALITY_FALLBACK);\n }\n const fallbackQuality = Number(downsampleQuality);\n if (Number.isFinite(fallbackQuality)) {\n return clampExportQuality(fallbackQuality, CROPPED_EXPORT_QUALITY_FALLBACK);\n }\n return CROPPED_EXPORT_QUALITY_FALLBACK;\n}\nfunction resolveCropExportFormat(input) {\n var _a, _b;\n const requested = input.cropExportFileType;\n const format = requested === undefined || requested === null || requested === 'source'\n ? ((_a = imageMimeToFormat(input.currentImageMimeType)) !== null && _a !== void 0 ? _a : 'png')\n : ((_b = tryNormalizeImageFormat(String(requested))) !== null && _b !== void 0 ? _b : 'png');\n const mimeType = mimeTypeFor(format);\n if (format === 'png')\n return { format, mimeType };\n return {\n format,\n mimeType,\n quality: resolveLossyCropQuality(input.cropExportQuality, input.downsampleQuality),\n };\n}\nfunction getCropRectContentBounds(cropRect) {\n const angle = Number(cropRect.angle) || 0;\n const normalizedAngle = Math.abs(angle % 360);\n if (normalizedAngle > 0.01 && Math.abs(normalizedAngle - 360) > 0.01) {\n return getObjectBBox(cropRect);\n }\n return {\n left: Number(cropRect.left) || 0,\n top: Number(cropRect.top) || 0,\n width: Math.max(0, (Number(cropRect.width) || 0) * Math.abs(Number(cropRect.scaleX) || 1)),\n height: Math.max(0, (Number(cropRect.height) || 0) * Math.abs(Number(cropRect.scaleY) || 1)),\n };\n}\nfunction removeCropRect(context, session) {\n for (const targetHandlers of session.handlers) {\n for (const record of targetHandlers.handlers) {\n try {\n targetHandlers.target.off(record.eventName, record.callback);\n }\n catch {\n }\n }\n }\n session.handlers = [];\n if (session.cropRect) {\n try {\n context.canvas.remove(session.cropRect);\n }\n catch {\n }\n session.cropRect = null;\n }\n}\nfunction restoreCropObjectState(session) {\n for (const record of session.prevEvented) {\n try {\n record.object.set({ evented: record.evented, selectable: record.selectable });\n }\n catch {\n }\n }\n session.prevEvented = [];\n}\nfunction restoreCropMaskBackups(session) {\n for (const backup of session.maskBackups) {\n restoreMaskStyleBackup(backup);\n }\n session.maskBackups = [];\n}\nfunction teardownSession(context, session) {\n removeCropRect(context, session);\n restoreCropObjectState(session);\n restoreCropMaskBackups(session);\n try {\n context.canvas.selection = !!session.prevSelection;\n }\n catch {\n }\n}\nfunction maskIntersectsRegion(mask, region) {\n const bbox = getObjectBBox(mask);\n return (bbox.left < region.left + region.width &&\n bbox.left + bbox.width > region.left &&\n bbox.top < region.top + region.height &&\n bbox.top + bbox.height > region.top);\n}\nfunction capturePreservedMasks(canvas, cropRegion, maskBackups = []) {\n var _a;\n const records = [];\n const styleBackupByMask = maskBackups.length > 0\n ? new Map(maskBackups.map((backup) => [backup.object, backup]))\n : null;\n const masks = canvas.getObjects().filter(isMaskObject);\n for (const mask of masks) {\n try {\n mask.setCoords();\n const intersects = maskIntersectsRegion(mask, cropRegion);\n if (intersects) {\n const styleBackup = (_a = styleBackupByMask === null || styleBackupByMask === void 0 ? void 0 : styleBackupByMask.get(mask)) !== null && _a !== void 0 ? _a : captureMaskStyleBackup(mask);\n records.push({\n mask,\n left: finiteNumberOrFallback(mask.left, 0),\n top: finiteNumberOrFallback(mask.top, 0),\n angle: finiteNumberOrFallback(mask.angle, 0),\n scaleX: finiteNumberOrFallback(mask.scaleX, 1),\n scaleY: finiteNumberOrFallback(mask.scaleY, 1),\n styleBackup,\n });\n }\n canvas.remove(mask);\n }\n catch {\n }\n }\n return records;\n}\nfunction reapplyPreservedMasks(context, cropRegion, records) {\n var _a;\n if (records.length === 0)\n return;\n const { canvas } = context;\n let maxRestoredId = 0;\n for (const record of records) {\n try {\n restoreMaskStyleBackup(record.styleBackup);\n record.mask.set({\n left: record.left - cropRegion.left,\n top: record.top - cropRegion.top,\n angle: record.angle,\n scaleX: record.scaleX,\n scaleY: record.scaleY,\n visible: true,\n });\n record.mask.setCoords();\n canvas.add(record.mask);\n canvas.bringObjectToFront(record.mask);\n reattachMaskHoverHandlers(record.mask);\n const id = Number(record.mask.maskId);\n if (Number.isFinite(id) && id > maxRestoredId)\n maxRestoredId = id;\n }\n catch {\n }\n }\n if (typeof context.getMaskCounter === 'function' &&\n typeof context.setMaskCounter === 'function') {\n const liveCounter = Number(context.getMaskCounter());\n const safeCounter = Number.isFinite(liveCounter) ? liveCounter : 0;\n context.setMaskCounter(Math.max(safeCounter, maxRestoredId));\n }\n try {\n (_a = context.updateMaskList) === null || _a === void 0 ? void 0 : _a.call(context);\n }\n catch {\n }\n}\nexport function enterCropMode(context) {\n const { canvas, options } = context;\n if (context.getCropSession())\n return;\n const originalImage = context.getOriginalImage();\n if (!originalImage)\n return;\n if (!context.isImageLoaded())\n return;\n canvas.discardActiveObject();\n const beforeJson = context.saveState();\n const prevSelection = !!canvas.selection;\n canvas.selection = false;\n originalImage.setCoords();\n const imageBounds = originalImage.getBoundingRect();\n const padding = Number.isFinite(Number(options.crop.padding))\n ? Number(options.crop.padding)\n : CROP_DEFAULT_PADDING;\n const boundsLeft = Math.max(0, Math.floor(imageBounds.left));\n const boundsTop = Math.max(0, Math.floor(imageBounds.top));\n const maxCropWidth = Math.max(1, Math.floor(imageBounds.width));\n const maxCropHeight = Math.max(1, Math.floor(imageBounds.height));\n const rectLeft = Math.min(boundsLeft + maxCropWidth - 1, Math.max(boundsLeft, Math.floor(imageBounds.left + padding)));\n const rectTop = Math.min(boundsTop + maxCropHeight - 1, Math.max(boundsTop, Math.floor(imageBounds.top + padding)));\n const configuredMinWidth = Math.max(1, Number(options.crop.minWidth) || 1);\n const configuredMinHeight = Math.max(1, Number(options.crop.minHeight) || 1);\n const minCropWidth = Math.min(configuredMinWidth, maxCropWidth);\n const minCropHeight = Math.min(configuredMinHeight, maxCropHeight);\n const allowRotation = !!options.crop.allowRotationOfCropRect;\n const cropRect = new context.fabric.Rect({\n left: rectLeft,\n top: rectTop,\n width: minCropWidth,\n height: minCropHeight,\n originX: 'left',\n originY: 'top',\n fill: CROP_RECT_FILL,\n stroke: CROP_RECT_STROKE,\n strokeDashArray: CROP_RECT_DASH,\n strokeWidth: 1,\n strokeUniform: true,\n selectable: true,\n lockRotation: !allowRotation,\n cornerSize: CROP_RECT_CORNER_SIZE,\n objectCaching: false,\n lockScalingFlip: true,\n });\n if (!allowRotation) {\n cropRect.setControlVisible('mtr', false);\n }\n canvas.add(cropRect);\n cropRect.isCropRect = true;\n canvas.bringObjectToFront(cropRect);\n canvas.setActiveObject(cropRect);\n const hideMasks = !!options.crop.hideMasksDuringCrop;\n const maskBackups = [];\n if (hideMasks) {\n canvas.getObjects().forEach((object) => {\n if (object === cropRect)\n return;\n if (!isMaskObject(object))\n return;\n maskBackups.push(captureMaskStyleBackup(object));\n });\n }\n const prevEvented = [];\n canvas.getObjects().forEach((object) => {\n var _a, _b;\n if (object === cropRect)\n return;\n prevEvented.push({\n object,\n evented: (_a = object.evented) !== null && _a !== void 0 ? _a : true,\n selectable: (_b = object.selectable) !== null && _b !== void 0 ? _b : true,\n });\n try {\n object.set({ evented: false, selectable: false });\n }\n catch {\n }\n });\n if (hideMasks) {\n for (const backup of maskBackups) {\n applyCropHideMaskStyle(backup.object);\n }\n }\n const handleCropRectModified = () => {\n try {\n const cropWidth = Math.max(1, Number(cropRect.width) || 1);\n const cropHeight = Math.max(1, Number(cropRect.height) || 1);\n const nextScaleX = Math.min(maxCropWidth / cropWidth, Math.max(minCropWidth / cropWidth, Number(cropRect.scaleX) || 1));\n const nextScaleY = Math.min(maxCropHeight / cropHeight, Math.max(minCropHeight / cropHeight, Number(cropRect.scaleY) || 1));\n const scaledWidth = cropWidth * nextScaleX;\n const scaledHeight = cropHeight * nextScaleY;\n const maxLeft = Math.max(boundsLeft, boundsLeft + maxCropWidth - scaledWidth);\n const maxTop = Math.max(boundsTop, boundsTop + maxCropHeight - scaledHeight);\n const nextLeft = Math.min(maxLeft, Math.max(boundsLeft, Number(cropRect.left) || boundsLeft));\n const nextTop = Math.min(maxTop, Math.max(boundsTop, Number(cropRect.top) || boundsTop));\n cropRect.set({\n left: nextLeft,\n top: nextTop,\n scaleX: nextScaleX,\n scaleY: nextScaleY,\n });\n cropRect.setCoords();\n canvas.requestRenderAll();\n }\n catch {\n }\n };\n cropRect.on('modified', handleCropRectModified);\n cropRect.on('moving', handleCropRectModified);\n cropRect.on('scaling', handleCropRectModified);\n const session = {\n beforeJson,\n prevSelection,\n prevEvented,\n maskBackups,\n cropRect,\n handlers: [\n {\n target: cropRect,\n handlers: [\n { eventName: 'modified', callback: handleCropRectModified },\n { eventName: 'moving', callback: handleCropRectModified },\n { eventName: 'scaling', callback: handleCropRectModified },\n ],\n },\n ],\n };\n context.setCropSession(session);\n canvas.renderAll();\n}\nexport function cancelCrop(context) {\n const session = context.getCropSession();\n if (!session)\n return;\n context.canvas.discardActiveObject();\n teardownSession(context, session);\n context.setCropSession(null);\n try {\n context.canvas.renderAll();\n }\n catch {\n }\n}\nexport async function applyCrop(context) {\n var _a, _b;\n const session = context.getCropSession();\n if (!session || !session.cropRect)\n return;\n const { canvas } = context;\n canvas.discardActiveObject();\n const beforeJson = session.beforeJson;\n const cropRect = session.cropRect;\n const preserveMasks = !!context.options.crop.preserveMasksAfterCrop;\n try {\n cropRect.setCoords();\n const cropAngle = Number(cropRect.angle) || 0;\n if (!context.options.crop.allowRotationOfCropRect && Math.abs(cropAngle % 360) > 0.01) {\n throw new CropApplyError('applyCrop failed: rotated crop rectangles are disabled.');\n }\n const rectBounds = getCropRectContentBounds(cropRect);\n if (!hasMeaningfulCanvasRegion(rectBounds, canvas.getWidth(), canvas.getHeight())) {\n throw new CropApplyError('applyCrop failed: crop region is empty or outside the canvas.');\n }\n const cropRegion = getClampedCanvasRegion(rectBounds, canvas.getWidth(), canvas.getHeight(), { includePartialPixels: false });\n const preservedRecords = preserveMasks\n ? capturePreservedMasks(canvas, cropRegion, session.maskBackups)\n : [];\n restoreCropObjectState(session);\n removeCropRect(context, session);\n canvas.selection = !!session.prevSelection;\n const cropFormat = resolveCropExportFormat({\n cropExportFileType: context.options.crop.exportFileType,\n currentImageMimeType: (_b = (_a = context.getCurrentImageMimeType) === null || _a === void 0 ? void 0 : _a.call(context)) !== null && _b !== void 0 ? _b : null,\n cropExportQuality: context.options.crop.exportQuality,\n downsampleQuality: context.options.downsampleQuality,\n });\n const exportOptions = {\n format: cropFormat.format,\n multiplier: 1,\n left: cropRegion.left,\n top: cropRegion.top,\n width: cropRegion.width,\n height: cropRegion.height,\n };\n if (cropFormat.quality !== undefined) {\n exportOptions.quality = cropFormat.quality;\n }\n const croppedBase64 = canvas.toDataURL(exportOptions);\n await context.loadImage(croppedBase64);\n if (preservedRecords.length > 0) {\n reapplyPreservedMasks(context, cropRegion, preservedRecords);\n canvas.renderAll();\n }\n const afterJson = context.saveState();\n context.setCropSession(null);\n if (beforeJson && afterJson && beforeJson !== afterJson) {\n context.historyManager.push(new Command(() => context.loadFromState(afterJson), () => context.loadFromState(beforeJson)));\n }\n }\n catch (error) {\n teardownSession(context, session);\n context.setCropSession(null);\n try {\n await context.loadFromState(beforeJson);\n }\n catch (rollbackError) {\n console.warn('[ImageEditor] applyCrop: rollback failed', rollbackError);\n }\n if (error instanceof CropApplyError)\n throw error;\n const message = error instanceof Error ? `applyCrop failed: ${error.message}` : 'applyCrop failed';\n throw new CropApplyError(message, error);\n }\n}\n//# sourceMappingURL=crop-controller.js.map","import { DownsampleError } from '../core/errors.js';\nexport function computeDownsampleDimensions(srcWidth, srcHeight, maxWidth, maxHeight) {\n if (!isPositiveFinite(srcWidth) ||\n !isPositiveFinite(srcHeight) ||\n !isPositiveFinite(maxWidth) ||\n !isPositiveFinite(maxHeight)) {\n return {\n width: Math.max(1, Math.round(srcWidth) || 1),\n height: Math.max(1, Math.round(srcHeight) || 1),\n needsResize: false,\n };\n }\n const needsResize = srcWidth > maxWidth || srcHeight > maxHeight;\n if (!needsResize) {\n return { width: srcWidth, height: srcHeight, needsResize: false };\n }\n const ratio = Math.min(maxWidth / srcWidth, maxHeight / srcHeight);\n return {\n width: Math.max(1, Math.round(srcWidth * ratio)),\n height: Math.max(1, Math.round(srcHeight * ratio)),\n needsResize: true,\n };\n}\nfunction isPositiveFinite(value) {\n return Number.isFinite(value) && value > 0;\n}\nexport function selectDownsampleMimeType(sourceMime, preserveSourceFormat, downsampleMimeType) {\n if (downsampleMimeType)\n return downsampleMimeType;\n if (preserveSourceFormat && (sourceMime === 'image/png' || sourceMime === 'image/webp')) {\n return sourceMime;\n }\n return 'image/jpeg';\n}\nexport function detectSourceMimeType(dataUrl) {\n const match = /^data:(image\\/[a-z0-9+\\-.]+)\\s*;/i.exec(dataUrl);\n return match ? match[1].toLowerCase() : null;\n}\nexport function resampleImage(imageElement, maxWidth, maxHeight, sourceMime, preserveSourceFormat, downsampleMimeType, quality, ownerDocument) {\n var _a;\n const { width, height } = computeDownsampleDimensions(imageElement.naturalWidth, imageElement.naturalHeight, maxWidth, maxHeight);\n const mimeType = selectDownsampleMimeType(sourceMime, preserveSourceFormat, downsampleMimeType);\n const documentForCanvas = (_a = ownerDocument !== null && ownerDocument !== void 0 ? ownerDocument : imageElement.ownerDocument) !== null && _a !== void 0 ? _a : (typeof document !== 'undefined' ? document : null);\n if (!documentForCanvas) {\n throw new DownsampleError('Failed to obtain an owner document for downsampling.');\n }\n const offscreenCanvas = documentForCanvas.createElement('canvas');\n offscreenCanvas.width = width;\n offscreenCanvas.height = height;\n const context = offscreenCanvas.getContext('2d');\n if (!context) {\n throw new DownsampleError('Failed to obtain a 2D context for downsampling.');\n }\n context.drawImage(imageElement, 0, 0, imageElement.naturalWidth, imageElement.naturalHeight, 0, 0, width, height);\n const dataUrl = mimeType === 'image/png'\n ? offscreenCanvas.toDataURL(mimeType)\n : offscreenCanvas.toDataURL(mimeType, quality);\n return { dataUrl, width, height, mimeType };\n}\n//# sourceMappingURL=image-resampler.js.map","import { ImageLoadTimeoutError } from '../core/errors.js';\nexport function withTimeout(promise, ms, label) {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n const timeoutId = setTimeout(() => {\n reject(new ImageLoadTimeoutError(label, Date.now() - start));\n }, ms);\n promise.then((value) => {\n clearTimeout(timeoutId);\n resolve(value);\n }, (err) => {\n clearTimeout(timeoutId);\n reject(err);\n });\n });\n}\n//# sourceMappingURL=timeout.js.map","const MATRIX_DETERMINANT_EPSILON = 1e-8;\nconst MATRIX_SCALE_EPSILON = 1e-8;\nfunction toMatrix2D(matrix) {\n if (matrix.length < 6)\n return null;\n const a = matrix[0];\n const b = matrix[1];\n const c = matrix[2];\n const d = matrix[3];\n const e = matrix[4];\n const f = matrix[5];\n if (!Number.isFinite(a) ||\n !Number.isFinite(b) ||\n !Number.isFinite(c) ||\n !Number.isFinite(d) ||\n !Number.isFinite(e) ||\n !Number.isFinite(f)) {\n return null;\n }\n return { a: a, b: b, c: c, d: d, e: e, f: f };\n}\nfunction invertMatrix(matrix) {\n const determinant = matrix.a * matrix.d - matrix.b * matrix.c;\n if (!Number.isFinite(determinant) || Math.abs(determinant) < MATRIX_DETERMINANT_EPSILON) {\n return null;\n }\n return {\n a: matrix.d / determinant,\n b: -matrix.b / determinant,\n c: -matrix.c / determinant,\n d: matrix.a / determinant,\n e: (matrix.c * matrix.f - matrix.d * matrix.e) / determinant,\n f: (matrix.b * matrix.e - matrix.a * matrix.f) / determinant,\n };\n}\nfunction transformPoint(point, matrix) {\n return {\n x: matrix.a * point.x + matrix.c * point.y + matrix.e,\n y: matrix.b * point.x + matrix.d * point.y + matrix.f,\n };\n}\nfunction getSourceRadiusFromMatrix(matrix, canvasRadius) {\n const scaleX = Math.hypot(matrix.a, matrix.b);\n const scaleY = Math.hypot(matrix.c, matrix.d);\n const minScale = Math.min(scaleX > MATRIX_SCALE_EPSILON ? scaleX : Number.POSITIVE_INFINITY, scaleY > MATRIX_SCALE_EPSILON ? scaleY : Number.POSITIVE_INFINITY);\n if (!Number.isFinite(minScale) || minScale <= 0)\n return canvasRadius;\n return canvasRadius / minScale;\n}\nexport function getMosaicImagePoint(fabric, image, canvasPoint, brushDiameterCanvasPx) {\n void fabric;\n const width = Number(image.width) || 0;\n const height = Number(image.height) || 0;\n const brushDiameter = Number(brushDiameterCanvasPx);\n if (width <= 0 ||\n height <= 0 ||\n !Number.isFinite(canvasPoint.x) ||\n !Number.isFinite(canvasPoint.y) ||\n !Number.isFinite(brushDiameter) ||\n brushDiameter <= 0) {\n return null;\n }\n const matrix = toMatrix2D(image.calcTransformMatrix());\n if (!matrix)\n return null;\n const inverse = invertMatrix(matrix);\n if (!inverse)\n return null;\n const localPoint = transformPoint(canvasPoint, inverse);\n const sourceX = localPoint.x + width / 2;\n const sourceY = localPoint.y + height / 2;\n if (sourceX < 0 || sourceY < 0 || sourceX > width || sourceY > height) {\n return null;\n }\n return {\n sourceX,\n sourceY,\n sourceRadius: getSourceRadiusFromMatrix(matrix, brushDiameter / 2),\n };\n}\n//# sourceMappingURL=mosaic-geometry.js.map","function normalizeBlockSize(value) {\n return Number.isFinite(value) && value > 0 ? Math.max(1, Math.floor(value)) : 1;\n}\nfunction isInsideCircle(x, y, centerX, centerY, radiusSquared) {\n const dx = x - centerX;\n const dy = y - centerY;\n return dx * dx + dy * dy <= radiusSquared;\n}\nfunction pixelOffset(width, x, y) {\n return (y * width + x) * 4;\n}\nexport function applyCircularMosaicToImageData(options) {\n var _a, _b, _c, _d;\n const { imageData } = options;\n const { width, height, data } = imageData;\n const centerX = Number(options.centerX);\n const centerY = Number(options.centerY);\n const radius = Number(options.radius);\n if (!Number.isFinite(centerX) ||\n !Number.isFinite(centerY) ||\n !Number.isFinite(radius) ||\n radius <= 0 ||\n width <= 0 ||\n height <= 0) {\n return false;\n }\n const blockSize = normalizeBlockSize(options.blockSize);\n const minX = Math.max(0, Math.floor(centerX - radius));\n const maxX = Math.min(width - 1, Math.ceil(centerX + radius));\n const minY = Math.max(0, Math.floor(centerY - radius));\n const maxY = Math.min(height - 1, Math.ceil(centerY + radius));\n if (minX > maxX || minY > maxY)\n return false;\n const radiusSquared = radius * radius;\n let processed = false;\n for (let blockY = minY; blockY <= maxY; blockY += blockSize) {\n for (let blockX = minX; blockX <= maxX; blockX += blockSize) {\n const blockMaxX = Math.min(maxX, blockX + blockSize - 1);\n const blockMaxY = Math.min(maxY, blockY + blockSize - 1);\n let sampleOffset = -1;\n for (let y = blockY; y <= blockMaxY && sampleOffset < 0; y += 1) {\n for (let x = blockX; x <= blockMaxX; x += 1) {\n if (!isInsideCircle(x, y, centerX, centerY, radiusSquared))\n continue;\n sampleOffset = pixelOffset(width, x, y);\n break;\n }\n }\n if (sampleOffset < 0)\n continue;\n const red = (_a = data[sampleOffset]) !== null && _a !== void 0 ? _a : 0;\n const green = (_b = data[sampleOffset + 1]) !== null && _b !== void 0 ? _b : 0;\n const blue = (_c = data[sampleOffset + 2]) !== null && _c !== void 0 ? _c : 0;\n const alpha = (_d = data[sampleOffset + 3]) !== null && _d !== void 0 ? _d : 0;\n for (let y = blockY; y <= blockMaxY; y += 1) {\n for (let x = blockX; x <= blockMaxX; x += 1) {\n if (!isInsideCircle(x, y, centerX, centerY, radiusSquared))\n continue;\n const offset = pixelOffset(width, x, y);\n data[offset] = red;\n data[offset + 1] = green;\n data[offset + 2] = blue;\n data[offset + 3] = alpha;\n processed = true;\n }\n }\n }\n }\n return processed;\n}\n//# sourceMappingURL=mosaic-pixelate.js.map","import { reportError, reportWarning } from '../core/callback-reporter.js';\nimport { mimeTypeFor, tryNormalizeImageFormat } from '../export/export-format.js';\nimport { Command } from '../history/history-manager.js';\nimport { detectSourceMimeType } from '../image/image-resampler.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { getMosaicImagePoint } from './mosaic-geometry.js';\nimport { applyCircularMosaicToImageData } from './mosaic-pixelate.js';\nconst MAX_PENDING_MOSAIC_POINTS = 4096;\nfunction getCanvasDocument(context) {\n var _a, _b, _c, _d, _e;\n const element = (_b = (_a = context.canvas).getElement) === null || _b === void 0 ? void 0 : _b.call(_a);\n return ((_e = (_c = element === null || element === void 0 ? void 0 : element.ownerDocument) !== null && _c !== void 0 ? _c : (_d = context.canvas.lowerCanvasEl) === null || _d === void 0 ? void 0 : _d.ownerDocument) !== null && _e !== void 0 ? _e : document);\n}\nfunction isFinitePoint(value) {\n const point = value;\n return (!!point &&\n typeof point.x === 'number' &&\n Number.isFinite(point.x) &&\n typeof point.y === 'number' &&\n Number.isFinite(point.y));\n}\nfunction getPointerFromFabricEvent(canvas, event) {\n const fabricEvent = event;\n if (isFinitePoint(fabricEvent.scenePoint))\n return fabricEvent.scenePoint;\n if (isFinitePoint(fabricEvent.pointer))\n return fabricEvent.pointer;\n if (isFinitePoint(fabricEvent.absolutePointer))\n return fabricEvent.absolutePointer;\n if (fabricEvent.e && typeof canvas.getPointer === 'function') {\n const pointer = canvas.getPointer(fabricEvent.e);\n if (isFinitePoint(pointer))\n return pointer;\n }\n return null;\n}\nfunction safeRender(canvas) {\n try {\n canvas.requestRenderAll();\n }\n catch {\n try {\n canvas.renderAll();\n }\n catch {\n }\n }\n}\nfunction createPreviewCircle(context) {\n var _a;\n const config = context.getMosaicConfig();\n const circle = new context.fabric.Circle({\n left: 0,\n top: 0,\n radius: config.brushSize / 2,\n originX: 'center',\n originY: 'center',\n fill: config.previewFill,\n stroke: config.previewStroke,\n strokeWidth: config.previewStrokeWidth,\n strokeDashArray: (_a = config.previewStrokeDashArray) !== null && _a !== void 0 ? _a : undefined,\n selectable: false,\n evented: false,\n excludeFromExport: true,\n objectCaching: false,\n visible: false,\n });\n circle.isMosaicPreview = true;\n return circle;\n}\nfunction ensurePreviewCircle(context, session) {\n var _a;\n const { canvas } = context;\n const circle = (_a = session.previewCircle) !== null && _a !== void 0 ? _a : createPreviewCircle(context);\n session.previewCircle = circle;\n if (!canvas.getObjects().includes(circle)) {\n canvas.add(circle);\n }\n canvas.bringObjectToFront(circle);\n updateMosaicPreview(context);\n return circle;\n}\nfunction removePreviewCircle(context, session) {\n const circle = session.previewCircle;\n if (!circle)\n return;\n try {\n context.canvas.remove(circle);\n }\n catch {\n }\n session.previewCircle = null;\n}\nfunction createPreviewImage(context, sourceImage, rasterCache) {\n const image = new context.fabric.FabricImage(rasterCache.offscreenCanvas, {\n selectable: false,\n evented: false,\n excludeFromExport: true,\n objectCaching: false,\n visible: true,\n });\n copyBaseImageProperties(image, sourceImage);\n image.set({\n selectable: false,\n evented: false,\n excludeFromExport: true,\n objectCaching: false,\n visible: true,\n });\n image.isMosaicPreview = true;\n return image;\n}\nfunction placePreviewImageAfterBase(context, previewImage, sourceImage) {\n var _a, _b;\n const sourceIndex = context.canvas.getObjects().indexOf(sourceImage);\n if (sourceIndex < 0)\n return;\n try {\n (_b = (_a = context.canvas).moveObjectTo) === null || _b === void 0 ? void 0 : _b.call(_a, previewImage, sourceIndex + 1);\n }\n catch {\n }\n}\nfunction ensurePreviewImage(context, session, sourceImage) {\n var _a;\n const rasterCache = session.rasterCache;\n if (!rasterCache)\n return null;\n const previewImage = (_a = session.previewImage) !== null && _a !== void 0 ? _a : createPreviewImage(context, sourceImage, rasterCache);\n session.previewImage = previewImage;\n copyBaseImageProperties(previewImage, sourceImage);\n previewImage.set({\n selectable: false,\n evented: false,\n excludeFromExport: true,\n objectCaching: false,\n visible: true,\n });\n previewImage.dirty = true;\n if (!context.canvas.getObjects().includes(previewImage)) {\n context.canvas.add(previewImage);\n }\n placePreviewImageAfterBase(context, previewImage, sourceImage);\n const circle = session.previewCircle;\n if (circle && context.canvas.getObjects().includes(circle)) {\n context.canvas.bringObjectToFront(circle);\n }\n return previewImage;\n}\nfunction removePreviewImage(context, session) {\n const image = session.previewImage;\n if (!image)\n return;\n try {\n context.canvas.remove(image);\n }\n catch {\n }\n session.previewImage = null;\n}\nfunction hidePreview(context) {\n var _a;\n const circle = (_a = context.getMosaicSession()) === null || _a === void 0 ? void 0 : _a.previewCircle;\n if (!circle)\n return;\n circle.set({ visible: false });\n safeRender(context.canvas);\n}\nfunction movePreview(context, point) {\n const session = context.getMosaicSession();\n if (!session)\n return;\n const circle = ensurePreviewCircle(context, session);\n circle.set({ left: point.x, top: point.y, visible: true });\n safeRender(context.canvas);\n}\nfunction attachCanvasHandler(context, session, eventName, callback) {\n context.canvas.on(eventName, callback);\n session.handlers.push({ eventName, callback });\n}\nfunction detachCanvasHandlers(context, session) {\n for (const record of session.handlers) {\n try {\n context.canvas.off(record.eventName, record.callback);\n }\n catch {\n }\n }\n session.handlers = [];\n}\nfunction restoreObjectStates(session) {\n for (const record of session.prevObjectStates) {\n try {\n record.object.set({ evented: record.evented, selectable: record.selectable });\n }\n catch {\n }\n }\n session.prevObjectStates = [];\n}\nfunction getImageSource(image) {\n var _a;\n const imageWithSource = image;\n try {\n const src = (_a = imageWithSource.getSrc) === null || _a === void 0 ? void 0 : _a.call(imageWithSource);\n if (typeof src === 'string' && src.length > 0)\n return src;\n }\n catch {\n }\n return typeof imageWithSource.src === 'string' && imageWithSource.src.length > 0\n ? imageWithSource.src\n : null;\n}\nfunction imageDimension(value) {\n const numeric = Number(value);\n return Number.isFinite(numeric) && numeric > 0 ? Math.floor(numeric) : 0;\n}\nfunction decodeImageSource(ownerDocument, source) {\n return new Promise((resolve, reject) => {\n const imageElement = ownerDocument.createElement('img');\n const cleanup = () => {\n if (typeof imageElement.removeEventListener === 'function') {\n imageElement.removeEventListener('load', handleLoad);\n imageElement.removeEventListener('error', handleError);\n }\n else {\n imageElement.onload = null;\n imageElement.onerror = null;\n }\n };\n const handleLoad = () => {\n const width = imageDimension(imageElement.naturalWidth || imageElement.width);\n const height = imageDimension(imageElement.naturalHeight || imageElement.height);\n cleanup();\n if (width <= 0 || height <= 0) {\n reject(new Error('Mosaic image decode failed: source image has no dimensions.'));\n return;\n }\n resolve({ element: imageElement, width, height });\n };\n const handleError = (event) => {\n cleanup();\n const message = typeof event === 'string'\n ? `Mosaic image decode failed: ${event}`\n : 'Mosaic image decode failed.';\n reject(new Error(message));\n };\n if (!source.startsWith('data:')) {\n imageElement.crossOrigin = 'anonymous';\n }\n if (typeof imageElement.addEventListener === 'function') {\n imageElement.addEventListener('load', handleLoad, { once: true });\n imageElement.addEventListener('error', handleError, { once: true });\n }\n else {\n imageElement.onload = handleLoad;\n imageElement.onerror = handleError;\n }\n imageElement.src = source;\n });\n}\nfunction toSupportedMimeType(mimeType) {\n return mimeType === 'image/jpeg' || mimeType === 'image/png' || mimeType === 'image/webp'\n ? mimeType\n : null;\n}\nfunction mimeToFormat(mimeType) {\n if (mimeType === 'image/jpeg')\n return 'jpeg';\n if (mimeType === 'image/webp')\n return 'webp';\n return 'png';\n}\nfunction resolveMosaicOutputFormat(context, source) {\n var _a, _b, _c, _d;\n const config = context.getMosaicConfig();\n const requested = config.outputFileType;\n const format = requested === 'source'\n ? mimeToFormat((_b = (_a = context.getCurrentImageMimeType()) !== null && _a !== void 0 ? _a : toSupportedMimeType(detectSourceMimeType(source))) !== null && _b !== void 0 ? _b : 'image/png')\n : ((_c = tryNormalizeImageFormat(String(requested))) !== null && _c !== void 0 ? _c : 'png');\n const mimeType = mimeTypeFor(format);\n if (format === 'png')\n return { mimeType };\n return {\n mimeType,\n quality: (_d = config.outputQuality) !== null && _d !== void 0 ? _d : context.options.downsampleQuality,\n };\n}\nasync function createFabricImageFromDataUrl(context, dataUrl) {\n return await withTimeout(context.fabric.FabricImage.fromURL(dataUrl, { crossOrigin: 'anonymous' }), context.options.imageLoadTimeoutMs, 'Mosaic FabricImage.fromURL');\n}\nfunction copyBaseImageProperties(target, source) {\n target.set({\n left: source.left,\n top: source.top,\n scaleX: source.scaleX,\n scaleY: source.scaleY,\n angle: source.angle,\n skewX: source.skewX,\n skewY: source.skewY,\n flipX: source.flipX,\n flipY: source.flipY,\n originX: source.originX,\n originY: source.originY,\n selectable: source.selectable,\n evented: source.evented,\n hasControls: source.hasControls,\n hoverCursor: source.hoverCursor,\n });\n target.setCoords();\n}\nfunction replaceBaseImage(context, oldImage, newImage, mimeType) {\n const { canvas } = context;\n let oldRemoved = false;\n let newAdded = false;\n try {\n copyBaseImageProperties(newImage, oldImage);\n canvas.remove(oldImage);\n oldRemoved = true;\n canvas.add(newImage);\n newAdded = true;\n canvas.sendObjectToBack(newImage);\n context.setOriginalImage(newImage);\n context.setCurrentImageMimeType(mimeType);\n canvas.renderAll();\n }\n catch (error) {\n try {\n if (newAdded)\n canvas.remove(newImage);\n if (oldRemoved && !canvas.getObjects().includes(oldImage)) {\n canvas.add(oldImage);\n canvas.sendObjectToBack(oldImage);\n }\n context.setOriginalImage(oldImage);\n }\n catch {\n }\n throw error;\n }\n}\nfunction pushMosaicHistory(context, after) {\n var _a;\n const before = (_a = context.getLastSnapshot()) !== null && _a !== void 0 ? _a : after;\n if (!before || !after || before === after)\n return;\n context.historyManager.push(new Command(async () => {\n await context.loadFromState(after);\n }, async () => {\n await context.loadFromState(before);\n }));\n context.setLastSnapshot(after);\n}\nasync function getOrCreateRasterCache(context, session, source) {\n if (session.rasterCache)\n return session.rasterCache;\n const ownerDocument = getCanvasDocument(context);\n const decoded = await decodeImageSource(ownerDocument, source);\n const offscreenCanvas = ownerDocument.createElement('canvas');\n offscreenCanvas.width = decoded.width;\n offscreenCanvas.height = decoded.height;\n const renderingContext = offscreenCanvas.getContext('2d');\n if (!renderingContext) {\n reportError(context.options, new Error('Mosaic could not obtain a 2D canvas context.'), 'Mosaic apply failed.');\n return null;\n }\n renderingContext.drawImage(decoded.element, 0, 0, decoded.width, decoded.height);\n let imageData;\n try {\n imageData = renderingContext.getImageData(0, 0, decoded.width, decoded.height);\n }\n catch (error) {\n reportError(context.options, error, 'Mosaic apply failed because the source image pixels could not be read.');\n return null;\n }\n const rasterCache = {\n offscreenCanvas,\n renderingContext,\n imageData,\n source,\n width: decoded.width,\n height: decoded.height,\n };\n session.rasterCache = rasterCache;\n return rasterCache;\n}\nfunction applyMosaicImagePoint(context, session, sourceImage, imagePoint) {\n const rasterCache = session.rasterCache;\n if (!rasterCache)\n return false;\n const config = context.getMosaicConfig();\n const previousPoint = session.lastImagePoint;\n const points = previousPoint\n ? interpolateMosaicPoints(previousPoint, imagePoint)\n : [imagePoint];\n let changed = false;\n for (const point of points) {\n changed =\n applyCircularMosaicToImageData({\n imageData: rasterCache.imageData,\n centerX: point.sourceX,\n centerY: point.sourceY,\n radius: point.sourceRadius,\n blockSize: config.blockSize,\n }) || changed;\n }\n session.lastImagePoint = imagePoint;\n if (changed) {\n session.hasUncommittedChanges = true;\n rasterCache.renderingContext.putImageData(rasterCache.imageData, 0, 0);\n ensurePreviewImage(context, session, sourceImage);\n safeRender(context.canvas);\n }\n return changed;\n}\nfunction interpolateMosaicPoints(start, end) {\n const dx = end.sourceX - start.sourceX;\n const dy = end.sourceY - start.sourceY;\n const distance = Math.hypot(dx, dy);\n const minRadius = Math.min(start.sourceRadius, end.sourceRadius);\n const spacing = Math.max(1, minRadius / 2);\n const steps = Math.max(1, Math.ceil(distance / spacing));\n const points = [];\n for (let index = 1; index <= steps; index += 1) {\n const t = index / steps;\n points.push({\n sourceX: start.sourceX + dx * t,\n sourceY: start.sourceY + dy * t,\n sourceRadius: start.sourceRadius + (end.sourceRadius - start.sourceRadius) * t,\n });\n }\n return points;\n}\nasync function applyMosaicPointToCache(context, expectedSession, canvasPoint) {\n const session = context.getMosaicSession();\n if (!session || session !== expectedSession)\n return;\n const originalImage = context.getOriginalImage();\n if (!originalImage || !context.isImageLoaded())\n return;\n const config = context.getMosaicConfig();\n const imagePoint = getMosaicImagePoint(context.fabric, originalImage, canvasPoint, config.brushSize);\n if (!imagePoint) {\n session.lastImagePoint = null;\n return;\n }\n const source = getImageSource(originalImage);\n if (!source) {\n reportWarning(context.options, new Error('Mosaic cannot read the current image source.'), 'Mosaic skipped because the image source is unavailable.');\n return;\n }\n const rasterCache = await getOrCreateRasterCache(context, session, source);\n if (!rasterCache)\n return;\n applyMosaicImagePoint(context, session, originalImage, imagePoint);\n}\nasync function commitMosaicChanges(context, session, callbackContext) {\n var _a;\n session.commitRequested = false;\n session.lastImagePoint = null;\n if (!session.hasUncommittedChanges || !session.rasterCache)\n return;\n const originalImage = context.getOriginalImage();\n if (!originalImage || !context.isImageLoaded())\n return;\n const source = (_a = getImageSource(originalImage)) !== null && _a !== void 0 ? _a : session.rasterCache.source;\n const rasterCache = session.rasterCache;\n rasterCache.renderingContext.putImageData(rasterCache.imageData, 0, 0);\n const output = resolveMosaicOutputFormat(context, source);\n const nextDataUrl = output.quality === undefined\n ? rasterCache.offscreenCanvas.toDataURL(output.mimeType)\n : rasterCache.offscreenCanvas.toDataURL(output.mimeType, output.quality);\n const nextImage = await createFabricImageFromDataUrl(context, nextDataUrl);\n removePreviewCircle(context, session);\n removePreviewImage(context, session);\n try {\n replaceBaseImage(context, originalImage, nextImage, output.mimeType);\n const after = context.captureSnapshot();\n pushMosaicHistory(context, after);\n rasterCache.source = nextDataUrl;\n session.hasUncommittedChanges = false;\n }\n finally {\n if (context.getMosaicSession() === session) {\n ensurePreviewCircle(context, session);\n }\n }\n context.updateInputs();\n context.updateUi();\n context.emitImageChanged(callbackContext);\n}\nasync function drainMosaicQueue(context, expectedSession) {\n const session = context.getMosaicSession();\n if (!session || session !== expectedSession || session.isApplying)\n return;\n session.isApplying = true;\n const callbackContext = context.buildCallbackContext('applyMosaic', false);\n context.emitBusyChangeIfChanged(callbackContext);\n context.updateUi();\n try {\n while (context.getMosaicSession() === session && session.pendingCanvasPoints.length > 0) {\n const point = session.pendingCanvasPoints.shift();\n if (point) {\n await applyMosaicPointToCache(context, session, point);\n }\n }\n if (context.getMosaicSession() === session && session.commitRequested) {\n await commitMosaicChanges(context, session, callbackContext);\n }\n }\n finally {\n if (context.getMosaicSession() === session) {\n session.isApplying = false;\n }\n context.emitBusyChangeIfChanged(callbackContext);\n context.updateUi();\n if (context.getMosaicSession() === session &&\n (session.pendingCanvasPoints.length > 0 || session.commitRequested)) {\n void drainMosaicQueue(context, session).catch((error) => {\n reportError(context.options, error, 'Mosaic apply failed.');\n });\n }\n }\n}\nfunction enqueueMosaicPoint(context, canvasPoint) {\n const session = context.getMosaicSession();\n if (!session)\n return;\n session.pendingCanvasPoints.push(canvasPoint);\n if (session.pendingCanvasPoints.length > MAX_PENDING_MOSAIC_POINTS) {\n session.pendingCanvasPoints.splice(0, session.pendingCanvasPoints.length - MAX_PENDING_MOSAIC_POINTS);\n }\n void drainMosaicQueue(context, session).catch((error) => {\n reportError(context.options, error, 'Mosaic apply failed.');\n });\n}\nfunction requestMosaicCommit(context, session) {\n session.commitRequested = true;\n void drainMosaicQueue(context, session).catch((error) => {\n reportError(context.options, error, 'Mosaic apply failed.');\n });\n}\nfunction installMosaicHandlers(context, session) {\n attachCanvasHandler(context, session, 'mouse:move', (event) => {\n const pointer = getPointerFromFabricEvent(context.canvas, event);\n if (!pointer) {\n hidePreview(context);\n return;\n }\n movePreview(context, pointer);\n const currentSession = context.getMosaicSession();\n if (currentSession === null || currentSession === void 0 ? void 0 : currentSession.isPointerDown) {\n enqueueMosaicPoint(context, pointer);\n }\n });\n attachCanvasHandler(context, session, 'mouse:out', () => {\n hidePreview(context);\n const currentSession = context.getMosaicSession();\n if (currentSession === null || currentSession === void 0 ? void 0 : currentSession.isPointerDown) {\n currentSession.isPointerDown = false;\n requestMosaicCommit(context, currentSession);\n }\n });\n attachCanvasHandler(context, session, 'mouse:down', (event) => {\n const pointer = getPointerFromFabricEvent(context.canvas, event);\n if (!pointer)\n return;\n const currentSession = context.getMosaicSession();\n if (!currentSession)\n return;\n currentSession.isPointerDown = true;\n currentSession.lastImagePoint = null;\n enqueueMosaicPoint(context, pointer);\n });\n attachCanvasHandler(context, session, 'mouse:up', (event) => {\n const currentSession = context.getMosaicSession();\n if (!currentSession)\n return;\n const pointer = getPointerFromFabricEvent(context.canvas, event);\n if (pointer) {\n movePreview(context, pointer);\n enqueueMosaicPoint(context, pointer);\n }\n currentSession.isPointerDown = false;\n requestMosaicCommit(context, currentSession);\n });\n}\nexport function enterMosaicMode(context) {\n if (context.getMosaicSession())\n return;\n if (!context.isImageLoaded() || !context.getOriginalImage())\n return;\n const { canvas } = context;\n context.hideAllMaskLabels();\n canvas.discardActiveObject();\n const prevSelection = !!canvas.selection;\n const prevDefaultCursor = canvas.defaultCursor;\n const prevObjectStates = canvas.getObjects().map((object) => {\n var _a, _b;\n return ({\n object,\n evented: (_a = object.evented) !== null && _a !== void 0 ? _a : true,\n selectable: (_b = object.selectable) !== null && _b !== void 0 ? _b : true,\n });\n });\n for (const record of prevObjectStates) {\n try {\n record.object.set({ evented: false, selectable: false });\n }\n catch {\n }\n }\n canvas.selection = false;\n canvas.defaultCursor = 'crosshair';\n const session = {\n previewCircle: null,\n previewImage: null,\n prevSelection,\n prevDefaultCursor,\n prevObjectStates,\n handlers: [],\n rasterCache: null,\n pendingCanvasPoints: [],\n isPointerDown: false,\n isApplying: false,\n commitRequested: false,\n hasUncommittedChanges: false,\n lastImagePoint: null,\n };\n context.setMosaicSession(session);\n ensurePreviewCircle(context, session);\n installMosaicHandlers(context, session);\n canvas.renderAll();\n}\nexport function exitMosaicMode(context) {\n var _a;\n const session = context.getMosaicSession();\n if (!session)\n return;\n detachCanvasHandlers(context, session);\n removePreviewCircle(context, session);\n removePreviewImage(context, session);\n restoreObjectStates(session);\n context.canvas.selection = !!session.prevSelection;\n context.canvas.defaultCursor = (_a = session.prevDefaultCursor) !== null && _a !== void 0 ? _a : 'default';\n context.setMosaicSession(null);\n context.canvas.renderAll();\n}\nexport function updateMosaicPreview(context) {\n var _a;\n const session = context.getMosaicSession();\n const circle = session === null || session === void 0 ? void 0 : session.previewCircle;\n if (!session || !circle)\n return;\n const config = context.getMosaicConfig();\n circle.set({\n radius: config.brushSize / 2,\n fill: config.previewFill,\n stroke: config.previewStroke,\n strokeWidth: config.previewStrokeWidth,\n strokeDashArray: (_a = config.previewStrokeDashArray) !== null && _a !== void 0 ? _a : undefined,\n });\n context.canvas.bringObjectToFront(circle);\n safeRender(context.canvas);\n}\nexport function isMosaicPreviewObject(object) {\n return object.isMosaicPreview === true;\n}\n//# sourceMappingURL=mosaic-controller.js.map","import { isMaskObject } from '../core/public-types.js';\nimport { reportError } from '../core/callback-reporter.js';\nimport { ExportError, ExportNotReadyError, MergeMasksError } from '../core/errors.js';\nimport { Command } from '../history/history-manager.js';\nimport { withMaskStyleBackup } from '../mask/mask-style.js';\nimport { getClampedCanvasRegion, getObjectBBox, getPartialExportEdges, hasMeaningfulCanvasRegion, } from '../utils/canvas-region.js';\nimport { resolveExportFormat } from './export-format.js';\nfunction resolveMultiplier(requested, fallback) {\n const num = Number(requested);\n if (Number.isFinite(num) && num > 0)\n return num;\n const fallbackValue = Number(fallback);\n return Number.isFinite(fallbackValue) && fallbackValue > 0 ? fallbackValue : 1;\n}\nfunction resolveExportArea(requested, fallback) {\n if (requested === 'canvas' || requested === 'image')\n return requested;\n return fallback === 'canvas' ? 'canvas' : 'image';\n}\nfunction resolveExportOptions(context, options) {\n const providedOptions = options !== null && options !== void 0 ? options : {};\n return {\n exportArea: resolveExportArea(providedOptions.exportArea, context.options.exportAreaByDefault),\n mergeMask: typeof providedOptions.mergeMask === 'boolean'\n ? providedOptions.mergeMask\n : context.options.mergeMaskByDefault,\n multiplier: resolveMultiplier(providedOptions.multiplier, context.options.exportMultiplier),\n format: resolveExportFormat(providedOptions, context.options.downsampleQuality),\n };\n}\nfunction readCanvasDimension(canvas, getterName, propertyName) {\n const canvasLike = canvas;\n const getter = canvasLike[getterName];\n const value = typeof getter === 'function' ? getter.call(canvasLike) : canvasLike[propertyName];\n return Math.max(1, Math.ceil(Number.isFinite(value) ? Number(value) : 1));\n}\nfunction assertExportPixelBudget(context, multiplier, region) {\n var _a, _b;\n const sourceWidth = (_a = region === null || region === void 0 ? void 0 : region.width) !== null && _a !== void 0 ? _a : readCanvasDimension(context.canvas, 'getWidth', 'width');\n const sourceHeight = (_b = region === null || region === void 0 ? void 0 : region.height) !== null && _b !== void 0 ? _b : readCanvasDimension(context.canvas, 'getHeight', 'height');\n const outputWidth = Math.max(1, Math.ceil(sourceWidth * multiplier));\n const outputHeight = Math.max(1, Math.ceil(sourceHeight * multiplier));\n const pixelCount = outputWidth * outputHeight;\n const maxPixels = context.options.maxExportPixels;\n if (!Number.isFinite(pixelCount) || pixelCount > maxPixels) {\n throw new RangeError(`[ImageEditor] Export size ${outputWidth}x${outputHeight} ` +\n `(${pixelCount} pixels) exceeds maxExportPixels (${maxPixels}).`);\n }\n}\nfunction computeExportRegion(context, exportArea) {\n if (exportArea === 'canvas')\n return { region: null, partialEdges: null };\n const originalImage = context.getOriginalImage();\n if (!originalImage)\n return { region: null, partialEdges: null };\n const bounds = getObjectBBox(originalImage);\n const canvasLike = context.canvas;\n const canvasWidth = typeof canvasLike.getWidth === 'function' ? canvasLike.getWidth() : canvasLike.width;\n const canvasHeight = typeof canvasLike.getHeight === 'function' ? canvasLike.getHeight() : canvasLike.height;\n if (!hasMeaningfulCanvasRegion(bounds, canvasWidth, canvasHeight)) {\n throw new ExportError('exportImageBase64 failed: image export region is empty.');\n }\n return {\n region: getClampedCanvasRegion(bounds, canvasWidth, canvasHeight, {\n includePartialPixels: true,\n }),\n partialEdges: getPartialExportEdges(bounds, Number(originalImage.angle) || 0),\n };\n}\nasync function withMaskExportState(context, mergeMask, callback) {\n if (!mergeMask)\n return withMasksHidden(context, callback);\n return withMaskStyleBackup({ canvas: context.canvas, options: context.options }, applyExportBakeInStyle, callback);\n}\nasync function withMasksHidden(context, callback) {\n const backups = getCanvasObjects(context.canvas)\n .filter(isMaskObject)\n .map((mask) => ({\n mask,\n visible: mask.visible,\n }));\n for (const backup of backups) {\n try {\n if (typeof backup.mask.set === 'function') {\n backup.mask.set({ visible: false });\n }\n else {\n backup.mask.visible = false;\n }\n }\n catch {\n }\n }\n try {\n return await callback();\n }\n finally {\n for (const backup of backups) {\n try {\n if (typeof backup.mask.set === 'function') {\n backup.mask.set({ visible: backup.visible });\n }\n else {\n backup.mask.visible = backup.visible;\n }\n }\n catch {\n }\n }\n }\n}\nfunction getCanvasObjects(canvas) {\n try {\n return canvas.getObjects();\n }\n catch {\n return [];\n }\n}\nfunction isObjectOnCanvas(canvas, object) {\n return getCanvasObjects(canvas).includes(object);\n}\nfunction captureMaskLabelBackups(canvas) {\n const backups = [];\n for (const object of getCanvasObjects(canvas)) {\n if (!isMaskObject(object))\n continue;\n const label = object.labelObject;\n if (!label)\n continue;\n const wasOnCanvas = isObjectOnCanvas(canvas, label);\n backups.push({\n mask: object,\n label,\n wasOnCanvas,\n visible: label.visible,\n });\n try {\n if (typeof label.set === 'function')\n label.set({ visible: false });\n if (wasOnCanvas)\n canvas.remove(label);\n }\n catch {\n }\n }\n return backups;\n}\nfunction restoreMaskLabelBackups(canvas, backups) {\n for (const backup of backups) {\n try {\n backup.mask.labelObject = backup.label;\n if (typeof backup.label.set === 'function') {\n backup.label.set({ visible: backup.visible });\n }\n else {\n backup.label.visible = backup.visible;\n }\n if (backup.wasOnCanvas && !isObjectOnCanvas(canvas, backup.label)) {\n canvas.add(backup.label);\n canvas.bringObjectToFront(backup.label);\n }\n }\n catch {\n }\n }\n}\nfunction captureActiveObject(canvas) {\n var _a;\n try {\n const canvasWithSelection = canvas;\n if (typeof canvasWithSelection.getActiveObject !== 'function')\n return null;\n return (_a = canvasWithSelection.getActiveObject()) !== null && _a !== void 0 ? _a : null;\n }\n catch {\n return null;\n }\n}\nfunction restoreActiveObject(canvas, activeObject) {\n if (!activeObject)\n return;\n try {\n const canvasWithSelection = canvas;\n if (typeof canvasWithSelection.setActiveObject === 'function') {\n canvasWithSelection.setActiveObject(activeObject);\n }\n }\n catch {\n }\n}\nfunction requestRender(canvas) {\n try {\n if (typeof canvas.requestRenderAll === 'function') {\n canvas.requestRenderAll();\n }\n else {\n canvas.renderAll();\n }\n }\n catch {\n }\n}\nfunction applyExportBakeInStyle(mask) {\n try {\n mask.set({\n opacity: 1,\n fill: '#000',\n strokeWidth: 0,\n stroke: null,\n selectable: false,\n });\n if (typeof mask.setCoords === 'function')\n mask.setCoords();\n }\n catch {\n }\n}\nfunction renderCanvasToDataUrl(canvas, format, quality, multiplier, region) {\n const fabricOptions = {\n format,\n multiplier,\n };\n if (quality !== undefined)\n fabricOptions.quality = quality;\n if (region) {\n fabricOptions.left = region.left;\n fabricOptions.top = region.top;\n fabricOptions.width = region.width;\n fabricOptions.height = region.height;\n }\n return canvas.toDataURL(fabricOptions);\n}\nfunction hasPartialEdges(edges) {\n return !!edges && (edges.left || edges.top || edges.right || edges.bottom);\n}\nfunction getImageDimensions(imageElement) {\n return {\n width: Math.max(1, imageElement.naturalWidth || imageElement.width || 1),\n height: Math.max(1, imageElement.naturalHeight || imageElement.height || 1),\n };\n}\nfunction loadImageElement(dataUrl) {\n return new Promise((resolve, reject) => {\n const imageElement = new Image();\n imageElement.crossOrigin = 'anonymous';\n const cleanup = () => {\n if (typeof imageElement.removeEventListener === 'function') {\n imageElement.removeEventListener('load', handleLoad);\n imageElement.removeEventListener('error', handleError);\n }\n else {\n imageElement.onload = null;\n imageElement.onerror = null;\n }\n };\n const handleLoad = () => {\n cleanup();\n resolve(imageElement);\n };\n const handleError = () => {\n cleanup();\n reject(new Error('Failed to decode export data URL'));\n };\n if (typeof imageElement.addEventListener === 'function') {\n imageElement.addEventListener('load', handleLoad, { once: true });\n imageElement.addEventListener('error', handleError, { once: true });\n }\n else {\n imageElement.onload = handleLoad;\n imageElement.onerror = handleError;\n }\n imageElement.src = dataUrl;\n });\n}\nasync function sealPartialTransparentEdges(dataUrl, edges, target) {\n if (!hasPartialEdges(edges))\n return dataUrl;\n const imageElement = await loadImageElement(dataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = document.createElement('canvas');\n offscreenCanvas.width = width;\n offscreenCanvas.height = height;\n const canvasContext = offscreenCanvas.getContext('2d');\n if (!canvasContext)\n throw new Error('2D canvas context is unavailable');\n canvasContext.drawImage(imageElement, 0, 0, width, height);\n const imageData = canvasContext.getImageData(0, 0, width, height);\n const pixels = imageData.data;\n const sealPixel = (x, y, fallbackX, fallbackY) => {\n var _a, _b, _c, _d, _e, _f;\n const index = (y * width + x) * 4;\n const fallbackIndex = (fallbackY * width + fallbackX) * 4;\n const alpha = (_a = pixels[index + 3]) !== null && _a !== void 0 ? _a : 0;\n const fallbackAlpha = (_b = pixels[fallbackIndex + 3]) !== null && _b !== void 0 ? _b : 0;\n if (alpha === 0 && fallbackAlpha > 0) {\n pixels[index] = (_c = pixels[fallbackIndex]) !== null && _c !== void 0 ? _c : 0;\n pixels[index + 1] = (_d = pixels[fallbackIndex + 1]) !== null && _d !== void 0 ? _d : 0;\n pixels[index + 2] = (_e = pixels[fallbackIndex + 2]) !== null && _e !== void 0 ? _e : 0;\n pixels[index + 3] = fallbackAlpha;\n }\n const nextAlpha = (_f = pixels[index + 3]) !== null && _f !== void 0 ? _f : 0;\n if (nextAlpha > 0 && nextAlpha < 255) {\n pixels[index + 3] = 255;\n }\n };\n if ((edges === null || edges === void 0 ? void 0 : edges.left) && width > 1) {\n for (let y = 0; y < height; y += 1)\n sealPixel(0, y, 1, y);\n }\n if ((edges === null || edges === void 0 ? void 0 : edges.right) && width > 1) {\n for (let y = 0; y < height; y += 1)\n sealPixel(width - 1, y, width - 2, y);\n }\n if ((edges === null || edges === void 0 ? void 0 : edges.top) && height > 1) {\n for (let x = 0; x < width; x += 1)\n sealPixel(x, 0, x, 1);\n }\n if ((edges === null || edges === void 0 ? void 0 : edges.bottom) && height > 1) {\n for (let x = 0; x < width; x += 1)\n sealPixel(x, height - 1, x, height - 2);\n }\n canvasContext.putImageData(imageData, 0, 0);\n return target.quality === undefined\n ? offscreenCanvas.toDataURL(target.mimeType)\n : offscreenCanvas.toDataURL(target.mimeType, target.quality);\n}\nfunction getJpegBackgroundColor(backgroundColor) {\n return resolveCanvasFillStyle(backgroundColor);\n}\nfunction resolveCanvasFillStyle(backgroundColor, fallback = '#ffffff') {\n const value = String(backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : '').trim();\n if (!value || isTransparentCssColor(value))\n return '#ffffff';\n const context = createColorValidationContext();\n if (!context)\n return fallback;\n context.fillStyle = '#000001';\n const firstSentinel = context.fillStyle;\n context.fillStyle = value;\n const firstResolved = context.fillStyle;\n if (firstResolved !== firstSentinel)\n return firstResolved;\n context.fillStyle = '#000002';\n const secondSentinel = context.fillStyle;\n context.fillStyle = value;\n const secondResolved = context.fillStyle;\n if (secondResolved !== secondSentinel)\n return secondResolved;\n return fallback;\n}\nfunction createColorValidationContext() {\n try {\n if (typeof document === 'undefined' || typeof document.createElement !== 'function') {\n return null;\n }\n return document.createElement('canvas').getContext('2d');\n }\n catch {\n return null;\n }\n}\nfunction getCanvasDocument(canvas) {\n var _a, _b, _c, _d, _e;\n const canvasLike = canvas;\n return ((_e = (_c = (_b = (_a = canvasLike.getElement) === null || _a === void 0 ? void 0 : _a.call(canvasLike)) === null || _b === void 0 ? void 0 : _b.ownerDocument) !== null && _c !== void 0 ? _c : (_d = canvasLike.lowerCanvasEl) === null || _d === void 0 ? void 0 : _d.ownerDocument) !== null && _e !== void 0 ? _e : document);\n}\nfunction isTransparentCssColor(value) {\n const normalized = value.trim().toLowerCase();\n if (normalized === 'transparent')\n return true;\n const hex = normalized.match(/^#([0-9a-f]{4}|[0-9a-f]{8})$/i);\n if (hex) {\n const digits = hex[1];\n const alpha = digits.length === 4 ? digits[3] : digits.slice(6, 8);\n return /^0+$/.test(alpha);\n }\n const commaAlpha = normalized.match(/^(?:rgba|hsla)\\((.*),\\s*([^,/)]+)\\)$/i);\n if (commaAlpha && isZeroCssAlpha(commaAlpha[2]))\n return true;\n const slashAlpha = normalized.match(/^[a-z][a-z0-9-]*\\([^/]+\\/\\s*([^)]+)\\)$/i);\n if (slashAlpha && isZeroCssAlpha(slashAlpha[1]))\n return true;\n return false;\n}\nfunction isZeroCssAlpha(value) {\n const alpha = value.trim();\n if (alpha.endsWith('%')) {\n const numericPercent = Number.parseFloat(alpha.slice(0, -1));\n return Number.isFinite(numericPercent) && numericPercent === 0;\n }\n const numericAlpha = Number.parseFloat(alpha);\n return Number.isFinite(numericAlpha) && numericAlpha === 0;\n}\nasync function convertDataUrlToOpaqueJpeg(dataUrl, backgroundColor, quality) {\n const imageElement = await loadImageElement(dataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = document.createElement('canvas');\n offscreenCanvas.width = width;\n offscreenCanvas.height = height;\n const canvasContext = offscreenCanvas.getContext('2d');\n if (!canvasContext)\n throw new Error('2D canvas context is unavailable');\n canvasContext.fillStyle = getJpegBackgroundColor(backgroundColor);\n canvasContext.fillRect(0, 0, width, height);\n canvasContext.drawImage(imageElement, 0, 0, width, height);\n return offscreenCanvas.toDataURL('image/jpeg', quality);\n}\nfunction dataUrlToBytes(dataUrl) {\n var _a;\n const match = /^data:image\\/[a-z0-9.+-]+;base64,([A-Za-z0-9+/=]+)$/i.exec(dataUrl);\n const base64 = (_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : '';\n if (!base64) {\n throw new Error('exportImageFile received a malformed or empty image data URL.');\n }\n if (typeof globalThis.atob === 'function') {\n const binary = globalThis.atob(base64);\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = binary.length - 1; i >= 0; i -= 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n const bufferCtor = globalThis.Buffer;\n if (bufferCtor && typeof bufferCtor.from === 'function') {\n const source = bufferCtor.from(base64, 'base64');\n const buffer = new ArrayBuffer(source.length);\n const bytes = new Uint8Array(buffer);\n bytes.set(source);\n return bytes;\n }\n throw new Error('No base64 decoder is available for exportImageFile.');\n}\nasync function reencodeDataUrlAs(sourceDataUrl, target, backgroundColor) {\n if (sourceDataUrl.startsWith(`data:${target.mimeType}`)) {\n return sourceDataUrl;\n }\n const imageElement = await loadImageElement(sourceDataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = document.createElement('canvas');\n offscreenCanvas.width = width;\n offscreenCanvas.height = height;\n const canvasContext = offscreenCanvas.getContext('2d');\n if (!canvasContext) {\n throw new Error('Unable to acquire 2D context for export conversion');\n }\n if (target.format === 'jpeg') {\n canvasContext.fillStyle = getJpegBackgroundColor(backgroundColor);\n canvasContext.fillRect(0, 0, width, height);\n }\n canvasContext.drawImage(imageElement, 0, 0, width, height);\n return offscreenCanvas.toDataURL(target.mimeType, target.quality);\n}\nfunction warnNoImageLoaded(operation) {\n console.warn(`[ImageEditor] ${operation} skipped: no image is loaded on the canvas.`);\n}\nexport async function exportImageBase64(context, options) {\n if (!context.isImageLoaded()) {\n warnNoImageLoaded('exportImageBase64');\n return '';\n }\n const activeObject = captureActiveObject(context.canvas);\n const labelBackups = captureMaskLabelBackups(context.canvas);\n try {\n context.canvas.discardActiveObject();\n const resolved = resolveExportOptions(context, options);\n const { region, partialEdges } = computeExportRegion(context, resolved.exportArea);\n assertExportPixelBudget(context, resolved.multiplier, region);\n const renderFormat = region && resolved.format.format === 'jpeg' ? 'png' : resolved.format.format;\n const renderQuality = renderFormat === 'png' ? undefined : resolved.format.quality;\n let dataUrl = await withMaskExportState(context, resolved.mergeMask, async () => renderCanvasToDataUrl(context.canvas, renderFormat, renderQuality, resolved.multiplier, region));\n if (region) {\n const sealedFormat = resolved.format.format === 'jpeg'\n ? { format: 'png', mimeType: 'image/png', quality: undefined }\n : resolved.format;\n dataUrl = await sealPartialTransparentEdges(dataUrl, partialEdges, sealedFormat);\n if (resolved.format.format === 'jpeg') {\n dataUrl = await convertDataUrlToOpaqueJpeg(dataUrl, context.options.backgroundColor, resolved.format.quality);\n }\n }\n return dataUrl;\n }\n finally {\n restoreMaskLabelBackups(context.canvas, labelBackups);\n restoreActiveObject(context.canvas, activeObject);\n requestRender(context.canvas);\n }\n}\nexport async function exportImageFile(context, options) {\n var _a;\n if (!context.isImageLoaded()) {\n warnNoImageLoaded('exportImageFile');\n throw new ExportNotReadyError('exportImageFile');\n }\n const providedOptions = options !== null && options !== void 0 ? options : {};\n const fileName = (_a = providedOptions.fileName) !== null && _a !== void 0 ? _a : context.options.defaultDownloadFileName;\n const resolved = resolveExportFormat(providedOptions, context.options.downsampleQuality);\n const base64 = await exportImageBase64(context, {\n exportArea: providedOptions.exportArea,\n mergeMask: providedOptions.mergeMask,\n multiplier: providedOptions.multiplier,\n quality: providedOptions.quality,\n fileType: providedOptions.fileType,\n });\n if (!base64) {\n throw new ExportNotReadyError('exportImageFile');\n }\n const finalDataUrl = await reencodeDataUrlAs(base64, resolved, context.options.backgroundColor);\n let bytes;\n try {\n bytes = dataUrlToBytes(finalDataUrl);\n }\n catch (error) {\n throw new ExportError('exportImageFile failed to decode rendered data URL.', error);\n }\n return new File([bytes], fileName, { type: resolved.mimeType });\n}\nexport function downloadImage(context, fileName) {\n if (!context.isImageLoaded()) {\n warnNoImageLoaded('downloadImage');\n return;\n }\n const resolvedFileName = fileName !== null && fileName !== void 0 ? fileName : context.options.defaultDownloadFileName;\n void exportImageBase64(context, {\n exportArea: context.options.exportAreaByDefault,\n mergeMask: context.options.mergeMaskByDefault,\n multiplier: context.options.exportMultiplier,\n })\n .then((dataUrl) => {\n if (!dataUrl)\n return;\n const ownerDocument = getCanvasDocument(context.canvas);\n const link = ownerDocument.createElement('a');\n link.download = resolvedFileName;\n link.href = dataUrl;\n const body = ownerDocument.body;\n body.appendChild(link);\n try {\n link.click();\n }\n finally {\n body.removeChild(link);\n }\n })\n .catch((error) => {\n reportError(context.options, error, 'downloadImage failed.');\n console.error('[ImageEditor] downloadImage failed', error);\n });\n}\nexport async function mergeMasks(context) {\n if (!context.isImageLoaded())\n return;\n const masks = context.canvas\n .getObjects()\n .filter((o) => 'maskId' in o && typeof o.maskId === 'number');\n if (masks.length === 0)\n return;\n const beforeSnapshot = context.saveState();\n context.canvas.discardActiveObject();\n context.canvas.renderAll();\n const preScrollTop = context.containerElement ? context.containerElement.scrollTop : null;\n const preScrollLeft = context.containerElement ? context.containerElement.scrollLeft : null;\n try {\n const merged = await exportImageBase64(context, {\n exportArea: 'image',\n mergeMask: true,\n multiplier: context.options.exportMultiplier,\n fileType: 'png',\n });\n if (!merged) {\n throw new MergeMasksError('mergeMasks: exportImageBase64 returned an empty data URL.');\n }\n context.removeAllMasksNoHistory();\n await context.loadImage(merged, { preserveScroll: true });\n const afterSnapshot = context.saveState();\n if (context.containerElement) {\n try {\n if (preScrollTop !== null) {\n context.containerElement.scrollTop = preScrollTop;\n }\n if (preScrollLeft !== null) {\n context.containerElement.scrollLeft = preScrollLeft;\n }\n }\n catch (scrollError) {\n console.warn('[ImageEditor] mergeMasks: scroll restore failed', scrollError);\n }\n }\n if (beforeSnapshot && afterSnapshot && beforeSnapshot !== afterSnapshot) {\n context.historyManager.push(new Command(() => context.loadFromState(afterSnapshot), () => context.loadFromState(beforeSnapshot)));\n }\n }\n catch (error) {\n try {\n await context.loadFromState(beforeSnapshot);\n }\n catch (rollbackError) {\n console.warn('[ImageEditor] mergeMasks: rollback failed', rollbackError);\n }\n if (error instanceof MergeMasksError)\n throw error;\n const message = error instanceof Error ? `mergeMasks failed: ${error.message}` : 'mergeMasks failed';\n throw new MergeMasksError(message, error);\n }\n}\n//# sourceMappingURL=export-service.js.map","import { forceReflow } from '../utils/dom.js';\nexport function selectLayoutStrategy(mode) {\n return mode;\n}\nexport class ViewportCache {\n constructor() {\n Object.defineProperty(this, \"lastVisible\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n }\n measure(container, fallback, scrollbarSize) {\n var _a;\n if (!container)\n return fallback;\n const containerWidth = Math.floor(container.clientWidth);\n const containerHeight = Math.floor(container.clientHeight);\n if (containerWidth > 0 && containerHeight > 0) {\n this.lastVisible = measureContainerViewport(container, fallback, scrollbarSize);\n return this.lastVisible;\n }\n return (_a = this.lastVisible) !== null && _a !== void 0 ? _a : fallback;\n }\n peek() {\n return this.lastVisible;\n }\n clear() {\n this.lastVisible = null;\n }\n}\nconst OVERFLOW_EPSILON = 0.5;\nfunction normalizeOverflowValue(value) {\n return String(value !== null && value !== void 0 ? value : '')\n .trim()\n .toLowerCase();\n}\nfunction getContainerOverflowValues(container) {\n var _a, _b;\n const style = container.style;\n let computedOverflow = '';\n let computedOverflowX = '';\n let computedOverflowY = '';\n const view = (_b = (_a = container.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) !== null && _b !== void 0 ? _b : (typeof window === 'undefined' ? null : window);\n if (typeof (view === null || view === void 0 ? void 0 : view.getComputedStyle) === 'function') {\n const computed = view.getComputedStyle(container);\n computedOverflow = computed.overflow;\n computedOverflowX = computed.overflowX;\n computedOverflowY = computed.overflowY;\n }\n const x = [\n normalizeOverflowValue(style === null || style === void 0 ? void 0 : style.overflow),\n normalizeOverflowValue(style === null || style === void 0 ? void 0 : style.overflowX),\n normalizeOverflowValue(computedOverflow),\n normalizeOverflowValue(computedOverflowX),\n ];\n const y = [\n normalizeOverflowValue(style === null || style === void 0 ? void 0 : style.overflow),\n normalizeOverflowValue(style === null || style === void 0 ? void 0 : style.overflowY),\n normalizeOverflowValue(computedOverflow),\n normalizeOverflowValue(computedOverflowY),\n ];\n return { x, y, all: [...x, ...y] };\n}\nfunction isAutoScrollableOverflow(value) {\n return value === 'auto' || value === 'overlay';\n}\nexport function measureScrollbarSize(ownerDocument) {\n const doc = ownerDocument !== null && ownerDocument !== void 0 ? ownerDocument : (typeof document === 'undefined' ? null : document);\n if (!(doc === null || doc === void 0 ? void 0 : doc.body))\n return { width: 0, height: 0 };\n const probe = doc.createElement('div');\n probe.style.position = 'absolute';\n probe.style.left = '-9999px';\n probe.style.top = '-9999px';\n probe.style.width = '100px';\n probe.style.height = '100px';\n probe.style.overflow = 'scroll';\n probe.style.visibility = 'hidden';\n probe.style.pointerEvents = 'none';\n doc.body.appendChild(probe);\n const width = Math.max(0, probe.offsetWidth - probe.clientWidth);\n const height = Math.max(0, probe.offsetHeight - probe.clientHeight);\n probe.remove();\n return { width, height };\n}\nfunction normalizeScrollbarSize(scrollbarSize) {\n return {\n width: Math.max(0, Number(scrollbarSize === null || scrollbarSize === void 0 ? void 0 : scrollbarSize.width) || 0),\n height: Math.max(0, Number(scrollbarSize === null || scrollbarSize === void 0 ? void 0 : scrollbarSize.height) || 0),\n };\n}\nexport function measureContainerViewport(container, fallback, scrollbarSize) {\n if (!container)\n return fallback;\n const clientWidth = Math.floor(container.clientWidth || 0);\n const clientHeight = Math.floor(container.clientHeight || 0);\n if (clientWidth <= 0 || clientHeight <= 0)\n return fallback;\n const overflow = getContainerOverflowValues(container);\n if (overflow.all.includes('scroll')) {\n return { width: clientWidth, height: clientHeight };\n }\n const scrollbar = normalizeScrollbarSize(scrollbarSize);\n const canAutoScrollX = overflow.x.some(isAutoScrollableOverflow);\n const canAutoScrollY = overflow.y.some(isAutoScrollableOverflow);\n const scrollWidth = Math.ceil(container.scrollWidth || 0);\n const scrollHeight = Math.ceil(container.scrollHeight || 0);\n const hasHorizontalScrollbar = canAutoScrollX && scrollWidth > clientWidth + OVERFLOW_EPSILON;\n const hasVerticalScrollbar = canAutoScrollY && scrollHeight > clientHeight + OVERFLOW_EPSILON;\n return {\n width: clientWidth + (hasVerticalScrollbar ? scrollbar.width : 0),\n height: clientHeight + (hasHorizontalScrollbar ? scrollbar.height : 0),\n };\n}\nexport function computeScrollableCanvasSize(contentWidth, contentHeight, viewport, scrollbarSize) {\n const viewportW = Math.max(1, viewport.width || 1);\n const viewportH = Math.max(1, viewport.height || 1);\n const scrollbar = normalizeScrollbarSize(scrollbarSize);\n let hasHorizontal = false;\n let hasVertical = false;\n for (let i = 0; i < 4; i += 1) {\n const effectiveW = Math.max(1, viewportW - (hasVertical ? scrollbar.width : 0));\n const effectiveH = Math.max(1, viewportH - (hasHorizontal ? scrollbar.height : 0));\n const nextHorizontal = contentWidth > effectiveW + OVERFLOW_EPSILON;\n const nextVertical = contentHeight > effectiveH + OVERFLOW_EPSILON;\n if (nextHorizontal === hasHorizontal && nextVertical === hasVertical)\n break;\n hasHorizontal = nextHorizontal;\n hasVertical = nextVertical;\n }\n const effectiveW = Math.max(1, viewportW - (hasVertical ? scrollbar.width : 0));\n const effectiveH = Math.max(1, viewportH - (hasHorizontal ? scrollbar.height : 0));\n return {\n width: hasHorizontal ? Math.ceil(contentWidth) : effectiveW,\n height: hasVertical ? Math.ceil(contentHeight) : effectiveH,\n };\n}\nexport function computeFitLayout(imageWidth, imageHeight, optionsCanvasWidth, optionsCanvasHeight, containerSize) {\n const canvasWidth = Math.max(1, (containerSize.width || optionsCanvasWidth) - 1);\n const canvasHeight = Math.max(1, (containerSize.height || optionsCanvasHeight) - 1);\n const fitScale = Math.min(canvasWidth / imageWidth, canvasHeight / imageHeight, 1);\n return {\n canvasWidth,\n canvasHeight,\n imageScale: fitScale,\n imageLeft: 0,\n imageTop: 0,\n baseImageScale: fitScale,\n };\n}\nexport function computeCoverLayout(imageWidth, imageHeight, optionsCanvasWidth, optionsCanvasHeight, containerSize, scrollbarSize) {\n const viewportW = containerSize.width || optionsCanvasWidth;\n const viewportH = containerSize.height || optionsCanvasHeight;\n const scrollbar = normalizeScrollbarSize(scrollbarSize);\n let hasHorizontal = false;\n let hasVertical = false;\n let coverScale = 1;\n let scaledW = imageWidth;\n let scaledH = imageHeight;\n for (let i = 0; i < 4; i += 1) {\n const effectiveW = Math.max(1, viewportW - (hasVertical ? scrollbar.width : 0));\n const effectiveH = Math.max(1, viewportH - (hasHorizontal ? scrollbar.height : 0));\n coverScale = Math.min(1, Math.max(effectiveW / imageWidth, effectiveH / imageHeight));\n scaledW = imageWidth * coverScale;\n scaledH = imageHeight * coverScale;\n const nextHasHorizontal = scaledW > effectiveW + OVERFLOW_EPSILON;\n const nextHasVertical = scaledH > effectiveH + OVERFLOW_EPSILON;\n if (nextHasHorizontal === hasHorizontal && nextHasVertical === hasVertical)\n break;\n hasHorizontal = nextHasHorizontal;\n hasVertical = nextHasVertical;\n }\n const canvasSize = computeScrollableCanvasSize(scaledW, scaledH, {\n width: viewportW,\n height: viewportH,\n }, scrollbar);\n return {\n canvasWidth: canvasSize.width,\n canvasHeight: canvasSize.height,\n imageScale: coverScale,\n imageLeft: 0,\n imageTop: 0,\n baseImageScale: coverScale,\n };\n}\nexport function computeExpandLayout(imageWidth, imageHeight, optionsCanvasWidth, optionsCanvasHeight, containerSize) {\n const canvasWidth = Math.max(containerSize.width, Math.floor(imageWidth));\n const canvasHeight = Math.max(containerSize.height, Math.floor(imageHeight));\n return {\n canvasWidth,\n canvasHeight,\n imageScale: 1,\n imageLeft: 0,\n imageTop: 0,\n baseImageScale: 1,\n };\n}\nexport function applyCanvasDimensions(canvas, width, height, containerElement) {\n const integerWidth = Math.max(1, Math.round(Number(width) || 1));\n const integerHeight = Math.max(1, Math.round(Number(height) || 1));\n canvas.setDimensions({ width: integerWidth, height: integerHeight });\n forceReflow(containerElement);\n}\n//# sourceMappingURL=layout-manager.js.map","export function forceReflow(element) {\n if (!element)\n return;\n void element.offsetWidth;\n}\n//# sourceMappingURL=dom.js.map","import { reportError, reportWarning } from '../core/callback-reporter.js';\nimport { ImageDecodeError } from '../core/errors.js';\nimport { saveState, SNAPSHOT_CUSTOM_KEYS } from '../core/state-serializer.js';\nimport { withTimeout } from '../utils/timeout.js';\nimport { computeCoverLayout, computeExpandLayout, computeFitLayout, selectLayoutStrategy, applyCanvasDimensions, measureScrollbarSize, } from './layout-manager.js';\nimport { computeDownsampleDimensions, detectSourceMimeType, resampleImage, } from './image-resampler.js';\nexport async function loadImage(context, imageBase64, loadOptions = {}) {\n if (typeof imageBase64 !== 'string' || !imageBase64.startsWith('data:image/')) {\n return;\n }\n const placeholderHidden = context.placeholderElement\n ? !!context.placeholderElement.hidden\n : null;\n const containerScrollTop = context.containerElement ? context.containerElement.scrollTop : null;\n const containerScrollLeft = context.containerElement\n ? context.containerElement.scrollLeft\n : null;\n const bundle = {\n placeholderHidden,\n containerScrollTop,\n containerScrollLeft,\n originalImage: context.getOriginalImage(),\n isImageLoadedToCanvas: context.getIsImageLoadedToCanvas(),\n lastSnapshot: context.getLastSnapshot(),\n canvasJson: serializeCanvas(context.canvas),\n maskCounter: context.getMaskCounter(),\n currentScale: context.getCurrentScale(),\n currentRotation: context.getCurrentRotation(),\n baseImageScale: context.getBaseImageScale(),\n currentImageMimeType: context.getCurrentImageMimeType(),\n };\n try {\n context.setPlaceholderVisible(false);\n const decode = startImageDecode(imageBase64);\n let imageElement;\n try {\n imageElement = await withTimeout(decode.promise, context.options.imageLoadTimeoutMs, 'image decode');\n }\n catch (error) {\n decode.cleanup(true);\n throw error;\n }\n const loadSource = maybeDownsample(imageElement, imageBase64, context.options, getCanvasDocument(context.canvas));\n const fabricImage = await withTimeout(context.fabric.FabricImage.fromURL(loadSource.dataUrl, { crossOrigin: 'anonymous' }), context.options.imageLoadTimeoutMs, 'FabricImage.fromURL');\n context.canvas.discardActiveObject();\n context.canvas.clear();\n context.canvas.backgroundColor = context.options.backgroundColor;\n fabricImage.set({\n originX: 'left',\n originY: 'top',\n selectable: false,\n evented: false,\n });\n const layout = computeLayout(context, fabricImage);\n applyCanvasDimensions(context.canvas, layout.canvasWidth, layout.canvasHeight, context.containerElement);\n fabricImage.set({ left: layout.imageLeft, top: layout.imageTop });\n fabricImage.scale(layout.imageScale);\n context.canvas.add(fabricImage);\n context.canvas.sendObjectToBack(fabricImage);\n context.setOriginalImage(fabricImage);\n context.setBaseImageScale(layout.baseImageScale);\n context.setCurrentScale(1);\n context.setCurrentRotation(0);\n context.setMaskCounter(0);\n context.setIsImageLoadedToCanvas(true);\n context.setCurrentImageMimeType(loadSource.mimeType);\n context.canvas.renderAll();\n context.setLastSnapshot(saveState({\n canvas: context.canvas,\n currentScale: 1,\n currentRotation: 0,\n baseImageScale: layout.baseImageScale,\n currentImageMimeType: loadSource.mimeType,\n }));\n if (loadOptions.preserveScroll === true && context.containerElement) {\n try {\n if (bundle.containerScrollTop !== null) {\n context.containerElement.scrollTop = bundle.containerScrollTop;\n }\n if (bundle.containerScrollLeft !== null) {\n context.containerElement.scrollLeft = bundle.containerScrollLeft;\n }\n }\n catch (error) {\n console.warn('[ImageEditor] preserveScroll restore failed', error);\n }\n }\n }\n catch (error) {\n await replayRollback(context, bundle);\n const errorMessage = error instanceof Error ? `loadImage failed: ${error.message}` : 'loadImage failed';\n reportError(context.options, error, errorMessage);\n throw error;\n }\n}\nfunction startImageDecode(dataUrl) {\n const imageElement = new Image();\n const cleanup = (clearSource = false) => {\n if (typeof imageElement.removeEventListener === 'function') {\n imageElement.removeEventListener('load', handleLoad);\n imageElement.removeEventListener('error', handleError);\n }\n else {\n imageElement.onload = null;\n imageElement.onerror = null;\n }\n if (clearSource) {\n imageElement.src = '';\n }\n };\n const handleLoad = () => {\n if (!hasNaturalImageDimensions(imageElement)) {\n cleanup(true);\n rejectImage(new ImageDecodeError('Failed to decode image data URL: image has no natural dimensions.', null));\n return;\n }\n cleanup(false);\n resolveImage(imageElement);\n };\n const handleError = (e) => {\n cleanup(true);\n rejectImage(new ImageDecodeError('Failed to decode image data URL.', e));\n };\n let resolveImage;\n let rejectImage;\n const promise = new Promise((resolve, reject) => {\n resolveImage = resolve;\n rejectImage = reject;\n if (typeof imageElement.addEventListener === 'function') {\n imageElement.addEventListener('load', handleLoad, { once: true });\n imageElement.addEventListener('error', handleError, { once: true });\n }\n else {\n imageElement.onload = handleLoad;\n imageElement.onerror = handleError;\n }\n imageElement.src = dataUrl;\n });\n return { promise, cleanup };\n}\nfunction hasNaturalImageDimensions(imageElement) {\n return (Number.isFinite(imageElement.naturalWidth) &&\n Number.isFinite(imageElement.naturalHeight) &&\n imageElement.naturalWidth > 0 &&\n imageElement.naturalHeight > 0);\n}\nfunction isPositiveFinite(value) {\n return Number.isFinite(value) && value > 0;\n}\nfunction toSupportedImageMimeType(mimeType) {\n return mimeType === 'image/jpeg' || mimeType === 'image/png' || mimeType === 'image/webp'\n ? mimeType\n : null;\n}\nfunction maybeDownsample(imageElement, originalDataUrl, options, ownerDocument) {\n const originalMimeType = toSupportedImageMimeType(detectSourceMimeType(originalDataUrl));\n if (!options.downsampleOnLoad) {\n return { dataUrl: originalDataUrl, mimeType: originalMimeType };\n }\n if (!isPositiveFinite(options.downsampleMaxWidth) ||\n !isPositiveFinite(options.downsampleMaxHeight)) {\n reportWarning(options, null, 'loadImage skipped downsampling because downsample bounds are invalid.');\n return { dataUrl: originalDataUrl, mimeType: originalMimeType };\n }\n const downsampleDimensions = computeDownsampleDimensions(imageElement.naturalWidth, imageElement.naturalHeight, options.downsampleMaxWidth, options.downsampleMaxHeight);\n if (!downsampleDimensions.needsResize) {\n return { dataUrl: originalDataUrl, mimeType: originalMimeType };\n }\n const sourceMime = detectSourceMimeType(originalDataUrl);\n const resampledImage = resampleImage(imageElement, options.downsampleMaxWidth, options.downsampleMaxHeight, sourceMime, options.preserveSourceFormat, options.downsampleMimeType, options.downsampleQuality, ownerDocument);\n const actualMimeType = toSupportedImageMimeType(detectSourceMimeType(resampledImage.dataUrl));\n return {\n dataUrl: resampledImage.dataUrl,\n mimeType: actualMimeType !== null && actualMimeType !== void 0 ? actualMimeType : resampledImage.mimeType,\n };\n}\nfunction getCanvasDocument(canvas) {\n var _a, _b, _c, _d, _e;\n const canvasLike = canvas;\n return ((_e = (_c = (_b = (_a = canvasLike.getElement) === null || _a === void 0 ? void 0 : _a.call(canvasLike)) === null || _b === void 0 ? void 0 : _b.ownerDocument) !== null && _c !== void 0 ? _c : (_d = canvasLike.lowerCanvasEl) === null || _d === void 0 ? void 0 : _d.ownerDocument) !== null && _e !== void 0 ? _e : (typeof document !== 'undefined' ? document : undefined));\n}\nfunction computeLayout(context, fabricImage) {\n var _a, _b, _c, _d;\n const imageWidth = (_a = fabricImage.width) !== null && _a !== void 0 ? _a : 0;\n const imageHeight = (_b = fabricImage.height) !== null && _b !== void 0 ? _b : 0;\n const scrollbarSize = measureScrollbarSize((_d = (_c = context.containerElement) === null || _c === void 0 ? void 0 : _c.ownerDocument) !== null && _d !== void 0 ? _d : null);\n const viewport = context.viewportCache.measure(context.containerElement, {\n width: context.options.canvasWidth,\n height: context.options.canvasHeight,\n }, scrollbarSize);\n const strategy = selectLayoutStrategy(context.options.layoutMode);\n if (strategy === 'fit') {\n return computeFitLayout(imageWidth, imageHeight, context.options.canvasWidth, context.options.canvasHeight, viewport);\n }\n if (strategy === 'cover') {\n return computeCoverLayout(imageWidth, imageHeight, context.options.canvasWidth, context.options.canvasHeight, viewport, scrollbarSize);\n }\n return computeExpandLayout(imageWidth, imageHeight, context.options.canvasWidth, context.options.canvasHeight, viewport);\n}\nfunction serializeCanvas(canvas) {\n canvas.discardActiveObject();\n const json = canvas.toJSON(SNAPSHOT_CUSTOM_KEYS);\n return JSON.stringify(json);\n}\nasync function replayRollback(context, bundle) {\n try {\n await context.canvas.loadFromJSON(JSON.parse(bundle.canvasJson));\n context.canvas.renderAll();\n }\n catch (rollbackError) {\n console.warn('[ImageEditor] rollback: loadFromJSON failed', rollbackError);\n }\n context.setOriginalImage(bundle.originalImage);\n context.setIsImageLoadedToCanvas(bundle.isImageLoadedToCanvas);\n context.setLastSnapshot(bundle.lastSnapshot);\n context.setMaskCounter(bundle.maskCounter);\n context.setCurrentScale(bundle.currentScale);\n context.setCurrentRotation(bundle.currentRotation);\n context.setBaseImageScale(bundle.baseImageScale);\n context.setCurrentImageMimeType(bundle.currentImageMimeType);\n if (context.containerElement) {\n try {\n if (bundle.containerScrollTop !== null) {\n context.containerElement.scrollTop = bundle.containerScrollTop;\n }\n if (bundle.containerScrollLeft !== null) {\n context.containerElement.scrollLeft = bundle.containerScrollLeft;\n }\n }\n catch (rollbackError) {\n console.warn('[ImageEditor] rollback: scroll restore failed', rollbackError);\n }\n }\n if (bundle.placeholderHidden !== null) {\n context.setPlaceholderVisible(!bundle.placeholderHidden);\n }\n}\n//# sourceMappingURL=image-loader.js.map","const ANIMATION_SETTLE_GRACE_MS = 1000;\nexport function animateProps(object, props, options, guard) {\n return new Promise((resolve, reject) => {\n const propCount = Object.keys(props).length;\n if (propCount === 0 || guard.isDisposed()) {\n resolve();\n return;\n }\n let completed = 0;\n let settled = false;\n let aborters = [];\n let timeoutId = null;\n let unregisterAborter = null;\n const cleanup = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n unregisterAborter === null || unregisterAborter === void 0 ? void 0 : unregisterAborter();\n unregisterAborter = null;\n };\n const settle = () => {\n if (settled)\n return;\n settled = true;\n cleanup();\n resolve();\n };\n const fail = (error) => {\n if (settled)\n return;\n settled = true;\n cleanup();\n reject(error);\n };\n const abortAndSettle = () => {\n for (const abort of aborters) {\n try {\n abort();\n }\n catch {\n }\n }\n settle();\n };\n const duration = Number.isFinite(options.duration) ? Math.max(0, options.duration) : 0;\n timeoutId = setTimeout(abortAndSettle, duration + ANIMATION_SETTLE_GRACE_MS);\n unregisterAborter = guard.registerAnimationAborter(abortAndSettle);\n try {\n const animationResult = object.animate(props, {\n duration: options.duration,\n onChange: () => {\n var _a;\n if (guard.isDisposed())\n return;\n (_a = options.onChange) === null || _a === void 0 ? void 0 : _a.call(options);\n },\n onComplete: () => {\n if (++completed >= propCount)\n settle();\n },\n });\n aborters = collectAnimationAborters(animationResult);\n }\n catch (error) {\n fail(error);\n }\n });\n}\nfunction collectAnimationAborters(animationResult) {\n const handles = Array.isArray(animationResult)\n ? animationResult\n : animationResult && typeof animationResult === 'object'\n ? Object.values(animationResult)\n : [animationResult];\n return handles.flatMap((handle) => {\n const abort = handle === null || handle === void 0 ? void 0 : handle.abort;\n return typeof abort === 'function' ? [() => abort.call(handle)] : [];\n });\n}\nexport function restoreOrigin(object, originX, originY) {\n try {\n object.set({ originX, originY });\n object.setCoords();\n }\n catch {\n }\n}\n//# sourceMappingURL=fabric-animation.js.map","import { animateProps, restoreOrigin } from '../fabric/fabric-animation.js';\nexport class TransformController {\n constructor(context) {\n Object.defineProperty(this, \"context\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.context = context;\n }\n async scaleImage(factor) {\n if (!Number.isFinite(factor))\n return;\n const imageObject = this.context.getOriginalImage();\n if (!imageObject)\n return;\n if (this.context.guard.isAnimating())\n return;\n if (this.context.guard.isDisposed())\n return;\n const clamped = Math.max(this.context.options.minScale, Math.min(this.context.options.maxScale, factor));\n this.context.setCurrentScale(clamped);\n const targetAbs = this.context.getBaseImageScale() * clamped;\n try {\n const topLeft = computeTopLeftPoint(imageObject);\n imageObject.set({ originX: 'left', originY: 'top' });\n imageObject.setPositionByOrigin(topLeft, 'left', 'top');\n imageObject.setCoords();\n }\n catch (error) {\n console.warn('[ImageEditor] scaleImage: origin pre-anchor failed', error);\n }\n try {\n await this.context.guard.runAnimation(() => animateProps(imageObject, { scaleX: targetAbs, scaleY: targetAbs }, {\n duration: this.context.options.animationDuration,\n onChange: () => this.context.canvas.requestRenderAll(),\n }, this.context.guard));\n }\n catch (error) {\n console.warn('[ImageEditor] scaleImage animation error', error);\n return;\n }\n if (this.context.guard.isDisposed())\n return;\n imageObject.set({ scaleX: targetAbs, scaleY: targetAbs });\n imageObject.setCoords();\n if (this.context.afterTransformSnap)\n this.context.afterTransformSnap();\n this.context.saveCanvasState();\n }\n async rotateImage(degrees) {\n if (!Number.isFinite(degrees))\n return;\n const imageObject = this.context.getOriginalImage();\n if (!imageObject)\n return;\n if (this.context.guard.isAnimating())\n return;\n if (this.context.guard.isDisposed())\n return;\n this.context.setCurrentRotation(degrees);\n try {\n const centre = imageObject.getCenterPoint();\n imageObject.set({ originX: 'center', originY: 'center' });\n imageObject.setPositionByOrigin(centre, 'center', 'center');\n imageObject.setCoords();\n }\n catch (error) {\n console.warn('[ImageEditor] rotateImage: origin pre-anchor failed', error);\n }\n let animationFailed = false;\n try {\n await this.context.guard.runAnimation(() => animateProps(imageObject, { angle: degrees }, {\n duration: this.context.options.animationDuration,\n onChange: () => this.context.canvas.requestRenderAll(),\n }, this.context.guard));\n }\n catch (error) {\n animationFailed = true;\n console.warn('[ImageEditor] rotateImage animation error', error);\n }\n finally {\n if (this.context.guard.isDisposed()) {\n restoreOrigin(imageObject, 'left', 'top');\n }\n }\n if (animationFailed)\n return;\n if (this.context.guard.isDisposed())\n return;\n imageObject.set('angle', degrees);\n imageObject.setCoords();\n if (this.context.afterTransformSnap)\n this.context.afterTransformSnap();\n try {\n const newTopLeft = computeTopLeftPoint(imageObject);\n imageObject.set({ originX: 'left', originY: 'top' });\n imageObject.setPositionByOrigin(newTopLeft, 'left', 'top');\n imageObject.setCoords();\n }\n catch (error) {\n console.warn('[ImageEditor] rotateImage: origin post-restore failed', error);\n }\n this.context.saveCanvasState();\n }\n async resetImageTransform() {\n if (!this.context.getOriginalImage())\n return;\n this.context.setSuppressSaveState(true);\n try {\n await this.scaleImage(1);\n await this.rotateImage(0);\n }\n finally {\n this.context.setSuppressSaveState(false);\n }\n if (this.context.guard.isDisposed())\n return;\n this.context.saveCanvasState();\n }\n}\nfunction computeTopLeftPoint(object) {\n object.setCoords();\n const coords = object.getCoords();\n const first = coords[0];\n if (first)\n return first;\n const boundingRect = object.getBoundingRect();\n return { x: boundingRect.left, y: boundingRect.top };\n}\n//# sourceMappingURL=transform-controller.js.map","export function resolveNumeric(val, axis, fallback, canvas, options) {\n if (typeof val === 'number') {\n return val;\n }\n if (typeof val === 'function') {\n return val(canvas, options);\n }\n if (typeof val === 'string' && val.endsWith('%')) {\n const pct = parseFloat(val);\n if (!Number.isFinite(pct)) {\n return fallback;\n }\n const dim = axis === 'x' ? canvas.getWidth() : canvas.getHeight();\n return Math.floor(dim * (pct / 100));\n }\n return fallback;\n}\nexport function coercePoint(pt) {\n if (Array.isArray(pt)) {\n return { x: Number(pt[0]), y: Number(pt[1]) };\n }\n return { x: Number(pt.x), y: Number(pt.y) };\n}\n//# sourceMappingURL=number.js.map","import { isMaskObject } from '../core/public-types.js';\nimport { reportWarning } from '../core/callback-reporter.js';\nimport { attachMaskHoverHandlers, detachMaskHoverHandlers } from './mask-style.js';\nimport { coercePoint, resolveNumeric } from '../utils/number.js';\nconst POLYGON_AREA_EPSILON = 1e-6;\nfunction createMaskUid(maskId) {\n return `mask-${maskId}`;\n}\nfunction isFabricObjectLike(value) {\n if (!value || typeof value !== 'object')\n return false;\n const candidate = value;\n return typeof candidate.set === 'function' && typeof candidate.on === 'function';\n}\nfunction isStyleObject(value) {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction mergeMaskConfig(defaultMaskConfig, config) {\n const safeDefaultConfig = { ...defaultMaskConfig };\n const defaultStyles = safeDefaultConfig.styles;\n delete safeDefaultConfig.onCreate;\n delete safeDefaultConfig.fabricGenerator;\n delete safeDefaultConfig.styles;\n const configStyles = isStyleObject(config.styles) ? config.styles : {};\n const safeDefaultStyles = isStyleObject(defaultStyles) ? defaultStyles : {};\n return {\n ...safeDefaultConfig,\n ...config,\n styles: {\n ...safeDefaultStyles,\n ...configStyles,\n },\n };\n}\nfunction warnInvalidMask(options, reason) {\n reportWarning(options, null, `createMask skipped: ${reason}.`);\n}\nfunction isResolvableNumericInput(value) {\n if (value === undefined)\n return true;\n if (typeof value === 'number')\n return Number.isFinite(value);\n if (typeof value === 'function')\n return true;\n if (typeof value === 'string' && value.endsWith('%')) {\n return Number.isFinite(Number.parseFloat(value));\n }\n return false;\n}\nfunction isFiniteNumber(value) {\n return typeof value === 'number' && Number.isFinite(value);\n}\nfunction validateFiniteField(options, fieldName, value) {\n if (isFiniteNumber(value))\n return true;\n warnInvalidMask(options, `${fieldName} must resolve to a finite number`);\n return false;\n}\nfunction validatePositiveField(options, fieldName, value) {\n if (isFiniteNumber(value) && value > 0)\n return true;\n warnInvalidMask(options, `${fieldName} must resolve to a positive number`);\n return false;\n}\nfunction validateNonNegativeField(options, fieldName, value) {\n if (isFiniteNumber(value) && value >= 0)\n return true;\n warnInvalidMask(options, `${fieldName} must resolve to a non-negative number`);\n return false;\n}\nfunction validateNumericInputs(options, config) {\n const fields = [\n ['width', config.width],\n ['height', config.height],\n ['rx', config.rx],\n ['ry', config.ry],\n ['radius', config.radius],\n ['left', config.left],\n ['top', config.top],\n ];\n for (const [fieldName, value] of fields) {\n if (!isResolvableNumericInput(value)) {\n warnInvalidMask(options, `${fieldName} is not a supported numeric value`);\n return false;\n }\n }\n return true;\n}\nfunction resolvePolygonPoints(options, points) {\n if (!Array.isArray(points) || points.length < 3) {\n warnInvalidMask(options, 'polygon masks require at least three points');\n return null;\n }\n const resolvedPoints = points.map(coercePoint);\n const allFinite = resolvedPoints.every((point) => Number.isFinite(point.x) && Number.isFinite(point.y));\n if (!allFinite) {\n warnInvalidMask(options, 'polygon points must contain finite x/y values');\n return null;\n }\n if (polygonArea(resolvedPoints) <= POLYGON_AREA_EPSILON) {\n warnInvalidMask(options, 'polygon points must describe a non-zero area');\n return null;\n }\n return resolvedPoints;\n}\nfunction polygonArea(points) {\n let area = 0;\n for (let index = 0; index < points.length; index += 1) {\n const current = points[index];\n const next = points[(index + 1) % points.length];\n area += current.x * next.y - next.x * current.y;\n }\n return Math.abs(area) / 2;\n}\nexport function createMask(context, config = {}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;\n const { canvas, options, fabric: fabricModule } = context;\n if (!canvas)\n return null;\n const mergedConfig = mergeMaskConfig(options.defaultMaskConfig, config);\n const shapeType = (_a = mergedConfig.shape) !== null && _a !== void 0 ? _a : 'rect';\n if (!validateNumericInputs(options, mergedConfig))\n return null;\n const resolvedConfig = {\n width: options.defaultMaskWidth,\n height: options.defaultMaskHeight,\n color: 'rgba(0,0,0,0.5)',\n alpha: 0.5,\n gap: 5,\n left: undefined,\n top: undefined,\n angle: 0,\n selectable: true,\n ...mergedConfig,\n shape: shapeType,\n };\n const firstOffset = 10;\n let left;\n let top;\n const previousMask = context.getLastMask();\n if (mergedConfig.left === undefined && previousMask) {\n const previousRight = ((_b = previousMask.left) !== null && _b !== void 0 ? _b : 0) +\n (typeof previousMask.getScaledWidth === 'function'\n ? previousMask.getScaledWidth()\n : ((_c = previousMask.width) !== null && _c !== void 0 ? _c : 0) * ((_d = previousMask.scaleX) !== null && _d !== void 0 ? _d : 1));\n left = Math.round(previousRight + ((_e = resolvedConfig.gap) !== null && _e !== void 0 ? _e : 5));\n top = (_f = previousMask.top) !== null && _f !== void 0 ? _f : firstOffset;\n }\n else {\n left = resolveNumeric(mergedConfig.left, 'x', firstOffset, canvas, options);\n top = resolveNumeric(mergedConfig.top, 'y', firstOffset, canvas, options);\n }\n resolvedConfig.width = resolveNumeric(mergedConfig.width, 'x', options.defaultMaskWidth, canvas, options);\n resolvedConfig.height = resolveNumeric(mergedConfig.height, 'y', options.defaultMaskHeight, canvas, options);\n const rx = mergedConfig.rx !== undefined\n ? resolveNumeric(mergedConfig.rx, 'x', 0, canvas, options)\n : undefined;\n const ry = mergedConfig.ry !== undefined\n ? resolveNumeric(mergedConfig.ry, 'y', 0, canvas, options)\n : undefined;\n const radius = shapeType === 'circle'\n ? resolveNumeric(mergedConfig.radius, 'x', Math.min(resolvedConfig.width, resolvedConfig.height) / 2, canvas, options)\n : undefined;\n const polygonPoints = shapeType === 'polygon' ? resolvePolygonPoints(options, mergedConfig.points) : null;\n if (!validateFiniteField(options, 'left', left) ||\n !validateFiniteField(options, 'top', top) ||\n !validatePositiveField(options, 'width', resolvedConfig.width) ||\n !validatePositiveField(options, 'height', resolvedConfig.height) ||\n !validateFiniteField(options, 'gap', resolvedConfig.gap) ||\n !validateFiniteField(options, 'angle', resolvedConfig.angle) ||\n !validateFiniteField(options, 'alpha', resolvedConfig.alpha)) {\n return null;\n }\n if ((rx !== undefined && !validateNonNegativeField(options, 'rx', rx)) ||\n (ry !== undefined && !validateNonNegativeField(options, 'ry', ry)) ||\n (radius !== undefined && !validatePositiveField(options, 'radius', radius)) ||\n (shapeType === 'polygon' && polygonPoints === null)) {\n return null;\n }\n if (options.layoutMode === 'expand') {\n const requiredWidth = Math.ceil(left + resolvedConfig.width + 10);\n const requiredHeight = Math.ceil(top + resolvedConfig.height + 10);\n const nextWidth = Math.max(canvas.getWidth(), requiredWidth);\n const nextHeight = Math.max(canvas.getHeight(), requiredHeight);\n if (nextWidth !== canvas.getWidth() || nextHeight !== canvas.getHeight()) {\n if (context.expandCanvasIfNeeded) {\n context.expandCanvasIfNeeded(nextWidth, nextHeight);\n }\n else {\n canvas.setDimensions({ width: nextWidth, height: nextHeight });\n }\n }\n }\n let mask;\n if (typeof config.fabricGenerator === 'function') {\n const generated = config.fabricGenerator(resolvedConfig, canvas, options);\n if (!isFabricObjectLike(generated)) {\n reportWarning(options, generated, 'createMask skipped: fabricGenerator did not return a Fabric object.');\n return null;\n }\n mask = generated;\n }\n else {\n const originProps = {\n originX: 'left',\n originY: 'top',\n };\n switch (shapeType) {\n case 'circle':\n mask = new fabricModule.Circle({\n left,\n top,\n ...originProps,\n radius,\n fill: resolvedConfig.color,\n opacity: resolvedConfig.alpha,\n angle: (_g = resolvedConfig.angle) !== null && _g !== void 0 ? _g : 0,\n ...resolvedConfig.styles,\n });\n break;\n case 'ellipse':\n mask = new fabricModule.Ellipse({\n left,\n top,\n ...originProps,\n rx: rx !== null && rx !== void 0 ? rx : resolvedConfig.width / 2,\n ry: ry !== null && ry !== void 0 ? ry : resolvedConfig.height / 2,\n fill: resolvedConfig.color,\n opacity: resolvedConfig.alpha,\n angle: (_h = resolvedConfig.angle) !== null && _h !== void 0 ? _h : 0,\n ...resolvedConfig.styles,\n });\n break;\n case 'polygon': {\n const polygon = new fabricModule.Polygon(polygonPoints, {\n ...originProps,\n fill: resolvedConfig.color,\n opacity: resolvedConfig.alpha,\n angle: (_j = resolvedConfig.angle) !== null && _j !== void 0 ? _j : 0,\n ...resolvedConfig.styles,\n });\n polygon.setCoords();\n const boundingRect = polygon.getBoundingRect();\n const deltaX = left - boundingRect.left;\n const deltaY = top - boundingRect.top;\n polygon.set({\n left: ((_k = polygon.left) !== null && _k !== void 0 ? _k : 0) + deltaX,\n top: ((_l = polygon.top) !== null && _l !== void 0 ? _l : 0) + deltaY,\n });\n polygon.setCoords();\n mask = polygon;\n break;\n }\n case 'rect':\n default:\n mask = new fabricModule.Rect({\n left,\n top,\n ...originProps,\n width: resolvedConfig.width,\n height: resolvedConfig.height,\n fill: resolvedConfig.color,\n opacity: resolvedConfig.alpha,\n angle: (_m = resolvedConfig.angle) !== null && _m !== void 0 ? _m : 0,\n ...(rx !== undefined ? { rx } : {}),\n ...(ry !== undefined ? { ry } : {}),\n ...resolvedConfig.styles,\n });\n }\n }\n const maskObject = mask;\n maskObject.selectable = 'selectable' in mergedConfig ? !!mergedConfig.selectable : true;\n maskObject.evented = 'evented' in mergedConfig ? !!mergedConfig.evented : true;\n maskObject.hasControls = 'hasControls' in mergedConfig ? !!mergedConfig.hasControls : true;\n maskObject.transparentCorners =\n 'transparentCorners' in mergedConfig ? !!mergedConfig.transparentCorners : false;\n maskObject.strokeUniform =\n 'strokeUniform' in mergedConfig ? !!mergedConfig.strokeUniform : true;\n maskObject.lockRotation = !options.maskRotatable;\n maskObject.borderColor = (_o = mergedConfig.borderColor) !== null && _o !== void 0 ? _o : 'red';\n maskObject.cornerColor = (_p = mergedConfig.cornerColor) !== null && _p !== void 0 ? _p : 'black';\n maskObject.cornerSize = (_q = mergedConfig.cornerSize) !== null && _q !== void 0 ? _q : 8;\n const styles = ((_r = resolvedConfig.styles) !== null && _r !== void 0 ? _r : {});\n if ('stroke' in styles) {\n maskObject.stroke = styles.stroke;\n }\n else {\n maskObject.stroke = '#ccc';\n }\n if ('strokeWidth' in styles) {\n maskObject.strokeWidth = styles.strokeWidth;\n }\n else {\n maskObject.strokeWidth = 1;\n }\n if ('strokeDashArray' in styles) {\n maskObject.strokeDashArray = styles.strokeDashArray;\n }\n maskObject.originalAlpha = resolvedConfig.alpha;\n maskObject.originalStroke = maskObject.stroke;\n maskObject.originalStrokeWidth = maskObject.strokeWidth;\n attachMaskHoverHandlers(maskObject);\n const nextId = context.getMaskCounter() + 1;\n context.setMaskCounter(nextId);\n maskObject.maskId = nextId;\n maskObject.maskUid = createMaskUid(nextId);\n maskObject.maskName = `${options.maskName}${nextId}`;\n context.setLastMask(maskObject);\n canvas.add(maskObject);\n canvas.bringObjectToFront(maskObject);\n context.updateMaskList();\n if (resolvedConfig.selectable !== false) {\n canvas.setActiveObject(maskObject);\n }\n canvas.renderAll();\n context.saveCanvasState();\n if (typeof config.onCreate === 'function') {\n try {\n config.onCreate(maskObject, canvas);\n }\n catch (error) {\n reportWarning(options, error, 'createMask onCreate callback threw.');\n }\n }\n return maskObject;\n}\nexport function removeSelectedMask(context) {\n const active = context.canvas.getActiveObject();\n if (!active || !isMaskObject(active))\n return;\n context.removeLabelForMask(active);\n detachMaskHoverHandlers(active);\n context.canvas.remove(active);\n context.canvas.discardActiveObject();\n context.updateMaskList();\n context.canvas.renderAll();\n context.saveCanvasState();\n}\nexport function removeAllMasks(context, options = {}) {\n const masks = context.canvas.getObjects().filter(isMaskObject);\n if (masks.length === 0)\n return;\n for (const maskObject of masks) {\n context.removeLabelForMask(maskObject);\n detachMaskHoverHandlers(maskObject);\n context.canvas.remove(maskObject);\n }\n context.canvas.discardActiveObject();\n context.setLastMask(null);\n context.updateMaskList();\n context.canvas.renderAll();\n if (options.saveHistory !== false) {\n context.saveCanvasState();\n }\n}\n//# sourceMappingURL=mask-factory.js.map","import { isMaskObject } from '../core/public-types.js';\nimport { reportWarning } from '../core/callback-reporter.js';\nexport function removeLabelForMask(context, mask) {\n if (!context.canvas || !mask.labelObject)\n return;\n try {\n if (context.canvas.getObjects().includes(mask.labelObject)) {\n context.canvas.remove(mask.labelObject);\n }\n }\n catch {\n }\n try {\n delete mask.labelObject;\n }\n catch {\n }\n}\nexport function createLabelForMask(context, mask) {\n var _a;\n const { canvas, options, fabric: fabricModule } = context;\n if (!canvas || !options.maskLabelOnSelect)\n return;\n removeLabelForMask(context, mask);\n let labelTextObject = null;\n if (typeof options.label.create === 'function') {\n try {\n labelTextObject = options.label.create(mask, fabricModule);\n }\n catch (error) {\n reportWarning(options, error, 'label.create callback threw.');\n labelTextObject = null;\n }\n }\n if (!labelTextObject) {\n const indexForGetText = mask.maskId - 1;\n let labelText = mask.maskName;\n if (typeof options.label.getText === 'function') {\n try {\n labelText = options.label.getText(mask, indexForGetText);\n }\n catch (error) {\n reportWarning(options, error, 'label.getText callback threw.');\n labelText = mask.maskName;\n }\n }\n const textOptions = {\n left: 0,\n top: 0,\n ...((_a = options.label.textOptions) !== null && _a !== void 0 ? _a : {}),\n originX: 'left',\n originY: 'top',\n };\n labelTextObject = new fabricModule.FabricText(labelText, textOptions);\n }\n labelTextObject.maskLabel = true;\n mask.labelObject = labelTextObject;\n canvas.add(labelTextObject);\n canvas.bringObjectToFront(labelTextObject);\n syncMaskLabel(context, mask);\n}\nexport function syncMaskLabel(context, mask) {\n var _a, _b, _c;\n const { canvas, options } = context;\n if (!canvas || !options.maskLabelOnSelect || !mask.labelObject)\n return;\n const coords = (_a = mask.getCoords) === null || _a === void 0 ? void 0 : _a.call(mask);\n if (!(coords === null || coords === void 0 ? void 0 : coords.length))\n return;\n const tl = coords[0];\n if (!tl)\n return;\n const center = mask.getCenterPoint();\n const vx = center.x - tl.x;\n const vy = center.y - tl.y;\n const dist = Math.sqrt(vx * vx + vy * vy) || 1;\n const offset = Math.max(0, (_b = options.maskLabelOffset) !== null && _b !== void 0 ? _b : 3);\n mask.labelObject.set({\n left: Math.round(tl.x + (vx / dist) * offset),\n top: Math.round(tl.y + (vy / dist) * offset),\n angle: (_c = mask.angle) !== null && _c !== void 0 ? _c : 0,\n originX: 'left',\n originY: 'top',\n visible: true,\n });\n mask.labelObject.setCoords();\n canvas.renderAll();\n}\nexport function showLabelForMask(context, mask) {\n if (!context.options.maskLabelOnSelect)\n return;\n if (!mask.labelObject) {\n createLabelForMask(context, mask);\n }\n if (mask.labelObject) {\n mask.labelObject.visible = true;\n syncMaskLabel(context, mask);\n }\n}\nexport function hideAllMaskLabels(context) {\n const { canvas } = context;\n if (!canvas)\n return;\n const objs = canvas.getObjects();\n objs.filter((o) => o.maskLabel).forEach((l) => {\n try {\n canvas.remove(l);\n }\n catch {\n }\n });\n objs.filter(isMaskObject).forEach((o) => {\n try {\n delete o.labelObject;\n }\n catch {\n }\n });\n}\n//# sourceMappingURL=mask-label-manager.js.map","import { isMaskObject } from '../core/public-types.js';\nfunction getMaskListDocument(context) {\n var _a, _b, _c, _d, _e;\n const canvasLike = context.canvas;\n return ((_e = (_c = (_b = (_a = canvasLike === null || canvasLike === void 0 ? void 0 : canvasLike.getElement) === null || _a === void 0 ? void 0 : _a.call(canvasLike)) === null || _b === void 0 ? void 0 : _b.ownerDocument) !== null && _c !== void 0 ? _c : (_d = canvasLike === null || canvasLike === void 0 ? void 0 : canvasLike.lowerCanvasEl) === null || _d === void 0 ? void 0 : _d.ownerDocument) !== null && _e !== void 0 ? _e : document);\n}\nexport function renderMaskList(context) {\n const listId = context.getListElementId();\n if (!listId)\n return;\n const ownerDocument = getMaskListDocument(context);\n const listEl = ownerDocument.getElementById(listId);\n if (!listEl || !context.canvas)\n return;\n listEl.innerHTML = '';\n const canvas = context.canvas;\n canvas\n .getObjects()\n .filter(isMaskObject)\n .forEach((mask) => {\n const listItemElement = ownerDocument.createElement('li');\n listItemElement.className = 'list-group-item mask-item';\n listItemElement.textContent = mask.maskName;\n listItemElement.dataset.maskId = String(mask.maskId);\n listItemElement.onclick = () => {\n const id = Number(listItemElement.dataset.maskId);\n if (!Number.isFinite(id))\n return;\n const target = canvas\n .getObjects()\n .find((o) => isMaskObject(o) && o.maskId === id);\n if (!target)\n return;\n canvas.setActiveObject(target);\n context.onMaskSelected(target);\n };\n listEl.appendChild(listItemElement);\n });\n}\nexport function updateMaskListSelection(context, selectedMask) {\n const listId = context.getListElementId();\n if (!listId)\n return;\n const listEl = getMaskListDocument(context).getElementById(listId);\n if (!listEl)\n return;\n const selectedId = selectedMask ? String(selectedMask.maskId) : null;\n listEl.querySelectorAll('.mask-item').forEach((item) => {\n const isSelected = selectedId !== null && item.dataset.maskId === selectedId;\n item.classList.toggle('active', isSelected);\n });\n}\n//# sourceMappingURL=mask-list.js.map","export class DomBindings {\n constructor(resolveElementId, isDisposed, resolveDocument = () => document) {\n Object.defineProperty(this, \"registry\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n Object.defineProperty(this, \"resolveElementId\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"isDisposed\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"resolveDocument\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.resolveElementId = resolveElementId;\n this.isDisposed = isDisposed;\n this.resolveDocument = resolveDocument;\n }\n bindIfExists(key, eventType, handler) {\n const id = this.resolveElementId(key);\n if (!id)\n return false;\n const element = this.resolveDocument().getElementById(id);\n if (!element)\n return false;\n const wrapped = (event) => {\n if (this.isDisposed())\n return;\n handler(event);\n };\n element.addEventListener(eventType, wrapped);\n this.registry.push({ elementKey: key, eventType, handler: wrapped });\n return true;\n }\n removeAll() {\n for (const entry of this.registry) {\n const id = this.resolveElementId(entry.elementKey);\n if (!id)\n continue;\n const element = this.resolveDocument().getElementById(id);\n if (!element)\n continue;\n try {\n element.removeEventListener(entry.eventType, entry.handler);\n }\n catch {\n }\n }\n this.registry = [];\n }\n size() {\n return this.registry.length;\n }\n}\n//# sourceMappingURL=dom-bindings.js.map","export function setPlaceholderVisible(placeholderElement, containerElement, show) {\n if (placeholderElement) {\n placeholderElement.hidden = !show;\n placeholderElement.setAttribute('aria-hidden', show ? 'false' : 'true');\n }\n if (containerElement) {\n containerElement.hidden = show;\n containerElement.setAttribute('aria-hidden', show ? 'true' : 'false');\n }\n}\n//# sourceMappingURL=visibility-state.js.map","export const SUPPORTED_IMAGE_EXTENSIONS = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n gif: 'image/gif',\n bmp: 'image/bmp',\n};\nexport const SUPPORTED_IMAGE_MIME_TYPES = new Set(Object.values(SUPPORTED_IMAGE_EXTENSIONS));\nexport function inferImageMimeType(file) {\n var _a, _b;\n if (file.type && SUPPORTED_IMAGE_MIME_TYPES.has(file.type))\n return file.type;\n if (file.type)\n return null;\n const match = /\\.([a-z0-9]+)$/i.exec(file.name);\n const ext = (_a = match === null || match === void 0 ? void 0 : match[1]) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n if (!ext)\n return null;\n return (_b = SUPPORTED_IMAGE_EXTENSIONS[ext]) !== null && _b !== void 0 ? _b : null;\n}\nexport function readFileAsDataUrl(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const fileReaderResult = reader.result;\n if (typeof fileReaderResult === 'string') {\n resolve(fileReaderResult);\n }\n else {\n reject(new Error('FileReader returned a non-string result'));\n }\n };\n reader.onerror = () => {\n var _a;\n reject((_a = reader.error) !== null && _a !== void 0 ? _a : new Error('FileReader error'));\n };\n reader.onabort = () => {\n reject(new Error('FileReader read aborted'));\n };\n reader.readAsDataURL(file);\n });\n}\nexport function resetFileInput(input) {\n if (!input)\n return;\n try {\n input.value = '';\n }\n catch {\n }\n}\n//# sourceMappingURL=file.js.map","import { AnimationQueue } from './animation/animation-queue.js';\nimport { reportError, reportWarning } from './core/callback-reporter.js';\nimport { areResolvedMosaicConfigsEqual, cloneResolvedMosaicConfig, getInvalidMosaicConfigFields, isLayoutMode, mergeMosaicConfigPatch, resolveOptions, } from './core/default-options.js';\nimport { OperationGuard } from './core/operation-guard.js';\nimport { loadFromState as loadFromStateImpl, saveState as saveStateImpl, } from './core/state-serializer.js';\nimport { Command, HistoryManager } from './history/history-manager.js';\nimport { detectFabric } from './fabric/fabric-adapter.js';\nimport { isMaskObject } from './core/public-types.js';\nimport { applyCrop as applyCropImpl, cancelCrop as cancelCropImpl, enterCropMode as enterCropModeImpl, } from './crop/crop-controller.js';\nimport { enterMosaicMode as enterMosaicModeImpl, exitMosaicMode as exitMosaicModeImpl, updateMosaicPreview, } from './mosaic/mosaic-controller.js';\nimport { downloadImage as downloadImageImpl, exportImageBase64 as exportImageBase64Impl, exportImageFile as exportImageFileImpl, mergeMasks as mergeMasksImpl, } from './export/export-service.js';\nimport { loadImage as loadImageImpl } from './image/image-loader.js';\nimport { ViewportCache, applyCanvasDimensions, computeScrollableCanvasSize, measureScrollbarSize, } from './image/layout-manager.js';\nimport { TransformController } from './image/transform-controller.js';\nimport { createMask as createMaskImpl, removeAllMasks as removeAllMasksImpl, removeSelectedMask as removeSelectedMaskImpl, } from './mask/mask-factory.js';\nimport { createLabelForMask, hideAllMaskLabels, removeLabelForMask, showLabelForMask, syncMaskLabel, } from './mask/mask-label-manager.js';\nimport { renderMaskList, updateMaskListSelection } from './mask/mask-list.js';\nimport { applyMaskSelectedStyle, applyMaskUnselectedStyle, reattachMaskHoverHandlers, } from './mask/mask-style.js';\nimport { DomBindings } from './ui/dom-bindings.js';\nimport { setPlaceholderVisible as setPlaceholderVisibleImpl } from './ui/visibility-state.js';\nimport { inferImageMimeType, readFileAsDataUrl, resetFileInput } from './utils/file.js';\nimport { detectSourceMimeType } from './image/image-resampler.js';\nconst LAYOUT_EPSILON = 0.5;\nconst INTERNAL_OPERATION_TOKEN = Symbol('ImageEditorInternalOperation');\nconst INTERNAL_ALLOW_DURING_ANIMATION_QUEUE = Symbol('ImageEditorAllowDuringAnimationQueue');\nconst CROP_MODE_CONTROL_KEYS = [\n 'scalePercentageInput',\n 'rotateLeftDegreesInput',\n 'rotateRightDegreesInput',\n 'rotateLeftButton',\n 'rotateRightButton',\n 'createMaskButton',\n 'removeSelectedMaskButton',\n 'removeAllMasksButton',\n 'mergeMasksButton',\n 'downloadImageButton',\n 'zoomInButton',\n 'zoomOutButton',\n 'resetImageTransformButton',\n 'undoButton',\n 'redoButton',\n 'imageInput',\n 'enterCropModeButton',\n 'applyCropButton',\n 'cancelCropButton',\n 'enterMosaicModeButton',\n 'exitMosaicModeButton',\n 'mosaicBrushSizeInput',\n 'mosaicBlockSizeInput',\n];\nconst CROP_MODE_ENABLED_KEYS = ['applyCropButton', 'cancelCropButton'];\nconst CROP_SESSION_ALLOWED_OPERATIONS = new Set(['applyCrop', 'cancelCrop']);\nconst MOSAIC_MODE_CONTROL_KEYS = [\n 'scalePercentageInput',\n 'rotateLeftDegreesInput',\n 'rotateRightDegreesInput',\n 'rotateLeftButton',\n 'rotateRightButton',\n 'createMaskButton',\n 'removeSelectedMaskButton',\n 'removeAllMasksButton',\n 'mergeMasksButton',\n 'downloadImageButton',\n 'zoomInButton',\n 'zoomOutButton',\n 'resetImageTransformButton',\n 'undoButton',\n 'redoButton',\n 'imageInput',\n 'enterCropModeButton',\n 'applyCropButton',\n 'cancelCropButton',\n 'enterMosaicModeButton',\n 'exitMosaicModeButton',\n 'mosaicBrushSizeInput',\n 'mosaicBlockSizeInput',\n];\nconst MOSAIC_MODE_ENABLED_KEYS = [\n 'exitMosaicModeButton',\n 'mosaicBrushSizeInput',\n 'mosaicBlockSizeInput',\n];\nconst MOSAIC_SESSION_ALLOWED_OPERATIONS = new Set([\n 'exitMosaicMode',\n 'applyMosaic',\n 'setMosaicConfig',\n 'resetMosaicConfig',\n 'setMosaicBrushSize',\n 'setMosaicBlockSize',\n 'saveState',\n]);\nconst SCROLLBAR_SETTLE_EPSILON = 1;\nconst IMAGE_EDITOR_OPERATIONS = new Set([\n 'init',\n 'loadImage',\n 'loadFromState',\n 'saveState',\n 'scaleImage',\n 'rotateImage',\n 'resetImageTransform',\n 'createMask',\n 'removeSelectedMask',\n 'removeAllMasks',\n 'mergeMasks',\n 'enterCropMode',\n 'applyCrop',\n 'cancelCrop',\n 'enterMosaicMode',\n 'exitMosaicMode',\n 'applyMosaic',\n 'setMosaicConfig',\n 'resetMosaicConfig',\n 'setMosaicBrushSize',\n 'setMosaicBlockSize',\n 'undo',\n 'redo',\n 'exportImageBase64',\n 'exportImageFile',\n 'downloadImage',\n 'dispose',\n]);\nfunction isImageEditorOperation(value) {\n return value !== null && IMAGE_EDITOR_OPERATIONS.has(value);\n}\nexport class ImageEditor {\n constructor(fabricModuleOrOptions = {}, options = {}) {\n var _a;\n Object.defineProperty(this, \"fabricModule\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"isFabricLoaded\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"options\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"currentLayoutMode\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'expand'\n });\n Object.defineProperty(this, \"defaultMosaicConfig\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"currentMosaicConfig\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"canvas\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"canvasElement\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"containerElement\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"placeholderElement\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"elements\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {}\n });\n Object.defineProperty(this, \"elementOriginalDisabledMap\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Map()\n });\n Object.defineProperty(this, \"elementOriginalAriaDisabledMap\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Map()\n });\n Object.defineProperty(this, \"elementOriginalPointerEventsMap\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Map()\n });\n Object.defineProperty(this, \"originalImage\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"baseImageScale\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 1\n });\n Object.defineProperty(this, \"currentScale\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 1\n });\n Object.defineProperty(this, \"currentRotation\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\n });\n Object.defineProperty(this, \"isImageLoadedToCanvas\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"currentImageMimeType\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"maskCounter\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\n });\n Object.defineProperty(this, \"lastMask\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"lastSnapshot\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"historyManager\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"operationGuard\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"animQueue\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"transformController\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"viewportCache\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new ViewportCache()\n });\n Object.defineProperty(this, \"cropSession\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"mosaicSession\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"domBindings\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"isDisposed\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"shouldSuppressSaveState\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"lastEmittedIsBusy\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"activeStateRestoreOperation\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"nextSelectionChangeContext\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n const detected = detectFabric(fabricModuleOrOptions, options);\n this.fabricModule = (_a = detected.fabric) !== null && _a !== void 0 ? _a : {};\n this.isFabricLoaded = detected.isFabricLoaded;\n this.options = resolveOptions(detected.options);\n this.currentLayoutMode = this.options.layoutMode;\n this.defaultMosaicConfig = this.options.defaultMosaicConfig;\n this.currentMosaicConfig = cloneResolvedMosaicConfig(this.defaultMosaicConfig);\n const rawDefaultLayoutMode = detected.options\n .defaultLayoutMode;\n if (rawDefaultLayoutMode !== undefined && !isLayoutMode(rawDefaultLayoutMode)) {\n reportWarning(this.options, new TypeError(`[ImageEditor] Unsupported defaultLayoutMode ` +\n `${JSON.stringify(rawDefaultLayoutMode)}. ` +\n 'Expected \"fit\", \"cover\", or \"expand\".'), 'Invalid defaultLayoutMode fell back to \"expand\".');\n }\n this.operationGuard = new OperationGuard();\n this.animQueue = new AnimationQueue();\n this.historyManager = new HistoryManager(this.options.maxHistorySize);\n }\n init(idMap = {}) {\n if (!this.isFabricLoaded) {\n const globalFabric = globalThis.fabric;\n if (!globalFabric ||\n typeof globalFabric.Canvas !== 'function') {\n return;\n }\n this.fabricModule = globalFabric;\n this.isFabricLoaded = true;\n }\n if (this.isDisposed)\n return;\n const defaults = {\n canvas: 'canvas',\n canvasContainer: null,\n imagePlaceholder: 'imagePlaceholder',\n scalePercentageInput: 'scalePercentageInput',\n rotateLeftDegreesInput: 'rotateLeftDegreesInput',\n rotateRightDegreesInput: 'rotateRightDegreesInput',\n rotateLeftButton: 'rotateLeftButton',\n rotateRightButton: 'rotateRightButton',\n createMaskButton: 'createMaskButton',\n removeSelectedMaskButton: 'removeSelectedMaskButton',\n removeAllMasksButton: 'removeAllMasksButton',\n mergeMasksButton: 'mergeMasksButton',\n downloadImageButton: 'downloadImageButton',\n maskList: 'maskList',\n zoomInButton: 'zoomInButton',\n zoomOutButton: 'zoomOutButton',\n resetImageTransformButton: 'resetImageTransformButton',\n undoButton: 'undoButton',\n redoButton: 'redoButton',\n imageInput: 'imageInput',\n enterCropModeButton: 'enterCropModeButton',\n applyCropButton: 'applyCropButton',\n cancelCropButton: 'cancelCropButton',\n enterMosaicModeButton: 'enterMosaicModeButton',\n exitMosaicModeButton: 'exitMosaicModeButton',\n mosaicBrushSizeInput: 'mosaicBrushSizeInput',\n mosaicBlockSizeInput: 'mosaicBlockSizeInput',\n uploadArea: 'uploadArea',\n };\n this.elements = { ...defaults, ...idMap };\n this.domBindings = new DomBindings((key) => this.elements[key], () => this.isDisposed, () => { var _a, _b; return (_b = (_a = this.canvasElement) === null || _a === void 0 ? void 0 : _a.ownerDocument) !== null && _b !== void 0 ? _b : document; });\n this.initCanvas();\n this.transformController = new TransformController(this.buildTransformContext());\n this.bindDomEvents();\n this.updateInputs();\n this.updateMaskList();\n this.updateUi();\n if (this.options.initialImageBase64) {\n void this.loadImage(this.options.initialImageBase64).catch(() => {\n });\n }\n else {\n this.updatePlaceholderStatus();\n }\n }\n initCanvas() {\n var _a;\n const id = this.elements.canvas;\n const canvasElement = id ? document.getElementById(id) : null;\n if (!canvasElement)\n throw new Error(`[ImageEditor] Canvas element not found: \"${id}\"`);\n this.canvasElement = canvasElement;\n const containerId = this.elements.canvasContainer;\n if (containerId) {\n this.containerElement =\n (_a = document.getElementById(containerId)) !== null && _a !== void 0 ? _a : canvasElement.parentElement;\n }\n else {\n this.containerElement = canvasElement.parentElement;\n }\n const placeholderId = this.elements.imagePlaceholder;\n this.placeholderElement = placeholderId ? document.getElementById(placeholderId) : null;\n let initialWidth = this.options.canvasWidth;\n let initialHeight = this.options.canvasHeight;\n if (this.containerElement) {\n const containerWidth = Math.floor(this.containerElement.clientWidth);\n const containerHeight = Math.floor(this.containerElement.clientHeight);\n if (containerWidth > 0 && containerHeight > 0) {\n initialWidth = containerWidth;\n initialHeight = containerHeight;\n }\n }\n this.canvas = new this.fabricModule.Canvas(canvasElement, {\n width: initialWidth,\n height: initialHeight,\n backgroundColor: this.options.backgroundColor,\n selection: this.options.groupSelection,\n preserveObjectStacking: true,\n });\n this.canvas.on('selection:created', (e) => {\n this.handleSelectionChanged(e.selected);\n });\n this.canvas.on('selection:updated', (e) => {\n this.handleSelectionChanged(e.selected);\n });\n this.canvas.on('selection:cleared', () => this.handleSelectionChanged([]));\n const onObjectEvent = (e) => {\n if (e.target && isMaskObject(e.target))\n this.syncMaskLabel(e.target);\n };\n const onObjectModified = (e) => {\n if (!e.target || !isMaskObject(e.target))\n return;\n this.syncMaskLabel(e.target);\n this.saveState();\n };\n this.canvas.on('object:moving', onObjectEvent);\n this.canvas.on('object:scaling', onObjectEvent);\n this.canvas.on('object:rotating', onObjectEvent);\n this.canvas.on('object:modified', onObjectModified);\n }\n bindDomEvents() {\n this.bindElementIfExists('uploadArea', 'click', () => {\n var _a;\n const inputId = this.elements.imageInput;\n if (inputId)\n (_a = document.getElementById(inputId)) === null || _a === void 0 ? void 0 : _a.click();\n });\n this.bindElementIfExists('imageInput', 'change', (e) => {\n var _a;\n const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];\n if (file)\n void this.loadImageFile(file);\n });\n this.bindElementIfExists('zoomInButton', 'click', () => {\n void this.scaleImage(this.currentScale + this.options.scaleStep);\n });\n this.bindElementIfExists('zoomOutButton', 'click', () => {\n void this.scaleImage(this.currentScale - this.options.scaleStep);\n });\n this.bindElementIfExists('resetImageTransformButton', 'click', () => {\n void this.resetImageTransform();\n });\n this.bindElementIfExists('createMaskButton', 'click', () => {\n this.createMask();\n });\n this.bindElementIfExists('removeSelectedMaskButton', 'click', () => {\n this.removeSelectedMask();\n });\n this.bindElementIfExists('removeAllMasksButton', 'click', () => {\n this.removeAllMasks();\n });\n this.bindElementIfExists('mergeMasksButton', 'click', () => {\n void this.mergeMasks();\n });\n this.bindElementIfExists('downloadImageButton', 'click', () => {\n this.downloadImage();\n });\n this.bindElementIfExists('undoButton', 'click', () => {\n this.undo();\n });\n this.bindElementIfExists('redoButton', 'click', () => {\n this.redo();\n });\n this.bindElementIfExists('rotateLeftButton', 'click', () => {\n const inputId = this.elements.rotateLeftDegreesInput;\n const inputEl = inputId\n ? document.getElementById(inputId)\n : null;\n let step = this.options.rotationStep;\n if (inputEl) {\n const parsedStep = parseFloat(inputEl.value);\n if (!isNaN(parsedStep))\n step = parsedStep;\n }\n void this.rotateImage(this.currentRotation - step);\n });\n this.bindElementIfExists('rotateRightButton', 'click', () => {\n const inputId = this.elements.rotateRightDegreesInput;\n const inputEl = inputId\n ? document.getElementById(inputId)\n : null;\n let step = this.options.rotationStep;\n if (inputEl) {\n const parsedStep = parseFloat(inputEl.value);\n if (!isNaN(parsedStep))\n step = parsedStep;\n }\n void this.rotateImage(this.currentRotation + step);\n });\n this.bindElementIfExists('enterCropModeButton', 'click', () => {\n this.enterCropMode();\n });\n this.bindElementIfExists('applyCropButton', 'click', () => {\n void this.applyCrop().catch((error) => {\n reportError(this.options, error, 'Crop apply failed.');\n });\n });\n this.bindElementIfExists('cancelCropButton', 'click', () => {\n this.cancelCrop();\n });\n this.bindElementIfExists('enterMosaicModeButton', 'click', () => {\n this.enterMosaicMode();\n });\n this.bindElementIfExists('exitMosaicModeButton', 'click', () => {\n this.exitMosaicMode();\n });\n const bindMosaicSizeInput = (key, applyValue) => {\n const handler = (event) => {\n const parsed = parseFloat(event.target.value);\n applyValue(parsed);\n };\n this.bindElementIfExists(key, 'input', handler);\n this.bindElementIfExists(key, 'change', handler);\n };\n bindMosaicSizeInput('mosaicBrushSizeInput', (value) => {\n this.setMosaicBrushSize(value);\n });\n bindMosaicSizeInput('mosaicBlockSizeInput', (value) => {\n this.setMosaicBlockSize(value);\n });\n }\n bindElementIfExists(key, event, handler) {\n var _a;\n (_a = this.domBindings) === null || _a === void 0 ? void 0 : _a.bindIfExists(key, event, handler);\n }\n async loadImageFile(file) {\n const inputId = this.elements.imageInput;\n const inputEl = inputId\n ? document.getElementById(inputId)\n : null;\n const mime = inferImageMimeType(file);\n if (!mime) {\n reportWarning(this.options, null, `Unsupported image file type: ${file.type || file.name || 'unknown'}.`);\n resetFileInput(inputEl);\n return;\n }\n let dataUrl;\n try {\n dataUrl = await readFileAsDataUrl(file);\n }\n catch (error) {\n reportError(this.options, error, 'Failed to read selected image file.');\n resetFileInput(inputEl);\n return;\n }\n try {\n await this.loadImage(dataUrl);\n }\n catch {\n }\n finally {\n resetFileInput(inputEl);\n }\n }\n async loadImage(base64, options = {}) {\n return this.loadImageInternal(base64, options);\n }\n async loadImageInternal(base64, options = {}) {\n if (!this.isFabricLoaded || !this.canvas)\n return;\n if (this.isDisposed)\n return;\n if (typeof base64 !== 'string' || !base64.startsWith('data:image/'))\n return;\n if (!this.canRunIdleOperation('loadImage', options))\n return;\n const callbackContext = this.getOperationContext('loadImage', options);\n const previousImage = this.originalImage;\n const hadMasks = this.getMasks().length > 0;\n this.emitOptionCallback('onImageLoadStart', [callbackContext]);\n this.operationGuard.beginLoading();\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n this.hideAllMaskLabels();\n const loadImageContext = {\n fabric: this.fabricModule,\n canvas: this.canvas,\n options: this.getRuntimeOptions(),\n containerElement: this.containerElement,\n placeholderElement: this.placeholderElement,\n viewportCache: this.viewportCache,\n getOriginalImage: () => this.originalImage,\n setOriginalImage: (v) => {\n this.originalImage = v;\n },\n getIsImageLoadedToCanvas: () => this.isImageLoadedToCanvas,\n setIsImageLoadedToCanvas: (v) => {\n this.isImageLoadedToCanvas = v;\n },\n getLastSnapshot: () => this.lastSnapshot,\n setLastSnapshot: (v) => {\n this.lastSnapshot = v;\n },\n getMaskCounter: () => this.maskCounter,\n setMaskCounter: (v) => {\n this.maskCounter = v;\n },\n getCurrentScale: () => this.currentScale,\n setCurrentScale: (v) => {\n this.currentScale = v;\n },\n getCurrentRotation: () => this.currentRotation,\n setCurrentRotation: (v) => {\n this.currentRotation = v;\n },\n getBaseImageScale: () => this.baseImageScale,\n setBaseImageScale: (v) => {\n this.baseImageScale = v;\n },\n getCurrentImageMimeType: () => this.currentImageMimeType,\n setCurrentImageMimeType: (v) => {\n this.currentImageMimeType = v;\n },\n setPlaceholderVisible: (show) => {\n setPlaceholderVisibleImpl(this.placeholderElement, this.containerElement, this.options.showPlaceholder ? show : false);\n },\n };\n try {\n await loadImageImpl(loadImageContext, base64, options);\n }\n finally {\n this.operationGuard.endLoading();\n this.emitBusyChangeIfChanged(callbackContext);\n if (!this.isDisposed && this.canvas)\n this.updateUi();\n }\n this.lastMask = null;\n this.updateInputs();\n this.updateMaskList();\n this.updateUi();\n if (previousImage && previousImage !== this.originalImage) {\n this.emitOptionCallback('onImageCleared', [previousImage, callbackContext]);\n }\n const imageInfo = this.getImageInfo();\n if (imageInfo) {\n this.emitOptionCallback('onImageLoaded', [imageInfo, callbackContext]);\n }\n if (hadMasks) {\n this.emitMasksChanged(callbackContext);\n }\n this.emitImageChanged(callbackContext);\n }\n getInternalOperationToken(options) {\n var _a;\n return ((_a = options === null || options === void 0 ? void 0 : options[INTERNAL_OPERATION_TOKEN]) !== null && _a !== void 0 ? _a : null);\n }\n canRunDuringAnimationQueue(options) {\n return !!(options === null || options === void 0 ? void 0 : options[INTERNAL_ALLOW_DURING_ANIMATION_QUEUE]);\n }\n withInternalOperationOptions(token, options = {}) {\n return {\n ...options,\n ...(token ? { [INTERNAL_OPERATION_TOKEN]: token } : {}),\n };\n }\n withAnimationQueueBypass(options = {}) {\n return {\n ...options,\n [INTERNAL_ALLOW_DURING_ANIMATION_QUEUE]: true,\n };\n }\n assertIdleForOperation(operationName, options) {\n const token = this.getInternalOperationToken(options);\n this.operationGuard.assertIdleForOperation(operationName, token);\n if (this.cropSession &&\n !this.operationGuard.isOwnOperation(token) &&\n !CROP_SESSION_ALLOWED_OPERATIONS.has(operationName)) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" while crop mode is active.`);\n }\n if (this.mosaicSession &&\n !this.operationGuard.isOwnOperation(token) &&\n !MOSAIC_SESSION_ALLOWED_OPERATIONS.has(operationName)) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" while mosaic mode is active.`);\n }\n if (this.animQueue.isBusy() && !this.canRunDuringAnimationQueue(options)) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" while an animation is queued.`);\n }\n }\n canRunIdleOperation(operationName, options) {\n try {\n this.assertIdleForOperation(operationName, options);\n return true;\n }\n catch (error) {\n if (!this.isExpectedIdleGuardError(error, operationName)) {\n throw error;\n }\n return false;\n }\n }\n isExpectedIdleGuardError(error, operationName) {\n return (error instanceof Error &&\n error.message.startsWith(`[ImageEditor] Cannot run \"${operationName}\" `));\n }\n assertCanQueueAnimation(operationName, options) {\n this.operationGuard.assertCanQueueAnimation(operationName, this.getInternalOperationToken(options));\n }\n isImageLoaded() {\n var _a, _b;\n return !!(this.originalImage &&\n this.originalImage instanceof this.fabricModule.FabricImage &&\n ((_a = this.originalImage.width) !== null && _a !== void 0 ? _a : 0) > 0 &&\n ((_b = this.originalImage.height) !== null && _b !== void 0 ? _b : 0) > 0);\n }\n isBusy() {\n return (this.operationGuard.isBusy() ||\n this.animQueue.isBusy() ||\n this.cropSession !== null ||\n this.mosaicSession !== null);\n }\n setLayoutMode(mode) {\n if (!isLayoutMode(mode)) {\n reportWarning(this.options, new TypeError(`[ImageEditor] Unsupported layout mode ${JSON.stringify(mode)}. ` +\n 'Expected \"fit\", \"cover\", or \"expand\".'), 'Ignored invalid layout mode.');\n return;\n }\n this.currentLayoutMode = mode;\n }\n getRuntimeOptions() {\n if (this.currentLayoutMode === this.options.layoutMode)\n return this.options;\n return Object.freeze({\n ...this.options,\n layoutMode: this.currentLayoutMode,\n });\n }\n buildCallbackContext(operation, isInternalOperation = false) {\n return { operation, isInternalOperation };\n }\n getOperationContext(fallback, options) {\n const internal = this.getInternalOperationToken(options);\n const activeOperation = this.operationGuard.activeOperationName();\n if (internal && activeOperation) {\n return this.buildCallbackContext(isImageEditorOperation(activeOperation) ? activeOperation : fallback, true);\n }\n return this.buildCallbackContext(fallback, false);\n }\n emitOptionCallback(callbackName, args) {\n const callback = this.options[callbackName];\n if (typeof callback !== 'function')\n return;\n try {\n callback(...args);\n }\n catch (error) {\n console.error(`[ImageEditor] ${callbackName} callback threw`, error);\n }\n }\n getImageInfo() {\n if (!this.canvas || !this.originalImage)\n return null;\n const canvasWidth = this.canvas.getWidth();\n const canvasHeight = this.canvas.getHeight();\n let displayWidth;\n let displayHeight;\n try {\n this.originalImage.setCoords();\n const bounds = this.originalImage.getBoundingRect();\n displayWidth = Math.max(0, Number(bounds.width) || 0);\n displayHeight = Math.max(0, Number(bounds.height) || 0);\n }\n catch {\n displayWidth = Math.max(0, (Number(this.originalImage.width) || 0) *\n Math.abs(Number(this.originalImage.scaleX) || 1));\n displayHeight = Math.max(0, (Number(this.originalImage.height) || 0) *\n Math.abs(Number(this.originalImage.scaleY) || 1));\n }\n return {\n width: Math.max(0, Number(this.originalImage.width) || 0),\n height: Math.max(0, Number(this.originalImage.height) || 0),\n displayWidth,\n displayHeight,\n scale: this.currentScale,\n rotation: this.currentRotation,\n canvasWidth,\n canvasHeight,\n };\n }\n getMasks() {\n if (!this.canvas)\n return [];\n return this.canvas.getObjects().filter(isMaskObject).slice();\n }\n getMaskCollectionSignature() {\n return this.getMasks()\n .map((mask) => `${mask.maskId}:${mask.maskName}`)\n .join('|');\n }\n getEditorState() {\n const canvasWidth = this.canvas ? this.canvas.getWidth() : 0;\n const canvasHeight = this.canvas ? this.canvas.getHeight() : 0;\n const image = this.getImageInfo();\n return {\n hasImage: image !== null,\n image,\n maskCount: this.getMasks().length,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n isBusy: this.isBusy(),\n isCropMode: this.cropSession !== null,\n isMosaicMode: this.mosaicSession !== null,\n canUndo: this.historyManager.canUndo(),\n canRedo: this.historyManager.canRedo(),\n canvasWidth,\n canvasHeight,\n };\n }\n emitImageChanged(context) {\n this.emitOptionCallback('onImageChanged', [this.getEditorState(), context]);\n }\n emitMasksChanged(context) {\n this.emitOptionCallback('onMasksChanged', [this.getMasks(), context]);\n }\n emitBusyChangeIfChanged(context) {\n const isBusy = this.isBusy();\n if (this.lastEmittedIsBusy === isBusy)\n return;\n this.lastEmittedIsBusy = isBusy;\n this.emitOptionCallback('onBusyChange', [isBusy, context]);\n }\n buildSelection(selected) {\n var _a;\n const selectedMasks = selected.filter(isMaskObject);\n return {\n selectedMask: (_a = selectedMasks[0]) !== null && _a !== void 0 ? _a : null,\n selectedMasks,\n };\n }\n withSelectionChangeContext(context, callback) {\n const previous = this.nextSelectionChangeContext;\n this.nextSelectionChangeContext = context;\n try {\n return callback();\n }\n finally {\n this.nextSelectionChangeContext = previous;\n }\n }\n isSupportedImageMimeType(mimeType) {\n return mimeType === 'image/jpeg' || mimeType === 'image/png' || mimeType === 'image/webp';\n }\n inferCurrentImageMimeType() {\n const image = this.originalImage;\n if (!image)\n return null;\n let source = null;\n try {\n if (typeof image.getSrc === 'function')\n source = image.getSrc();\n else if (typeof image.src === 'string')\n source = image.src;\n }\n catch {\n source = null;\n }\n const mimeType = source ? detectSourceMimeType(source) : null;\n return this.isSupportedImageMimeType(mimeType) ? mimeType : null;\n }\n setCanvasSizePx(widthPx, heightPx) {\n if (!this.canvas)\n return;\n applyCanvasDimensions(this.canvas, widthPx, heightPx, this.containerElement);\n }\n alignObjectBoundingBoxToCanvasTopLeft(object) {\n var _a, _b;\n object.setCoords();\n const boundingRect = object.getBoundingRect();\n object.set({\n left: ((_a = object.left) !== null && _a !== void 0 ? _a : 0) - boundingRect.left,\n top: ((_b = object.top) !== null && _b !== void 0 ? _b : 0) - boundingRect.top,\n });\n object.setCoords();\n this.canvas.renderAll();\n }\n measureLayoutViewport(scrollbarSize) {\n return this.viewportCache.measure(this.containerElement, {\n width: this.options.canvasWidth,\n height: this.options.canvasHeight,\n }, scrollbarSize);\n }\n updateCanvasSizeToImageBounds() {\n var _a, _b;\n if (!this.originalImage)\n return;\n this.originalImage.setCoords();\n const boundingRect = this.originalImage.getBoundingRect();\n const scrollbarSize = measureScrollbarSize((_b = (_a = this.containerElement) === null || _a === void 0 ? void 0 : _a.ownerDocument) !== null && _b !== void 0 ? _b : null);\n const viewport = this.measureLayoutViewport(scrollbarSize);\n if (this.currentLayoutMode === 'fit' || this.currentLayoutMode === 'cover') {\n const canvasSize = computeScrollableCanvasSize(boundingRect.width, boundingRect.height, viewport, scrollbarSize);\n this.setCanvasSizePx(canvasSize.width, canvasSize.height);\n return;\n }\n if (boundingRect.width <= viewport.width && boundingRect.height <= viewport.height) {\n this.setCanvasSizePx(viewport.width, viewport.height);\n return;\n }\n this.setCanvasSizePx(Math.max(viewport.width, Math.ceil(boundingRect.width)), Math.max(viewport.height, Math.ceil(boundingRect.height)));\n }\n shouldNormalizeCanvasSizeAfterStateRestore() {\n var _a, _b;\n if (!this.canvas || !this.originalImage)\n return false;\n this.originalImage.setCoords();\n const boundingRect = this.originalImage.getBoundingRect();\n const viewport = this.measureLayoutViewport(measureScrollbarSize((_b = (_a = this.containerElement) === null || _a === void 0 ? void 0 : _a.ownerDocument) !== null && _b !== void 0 ? _b : null));\n const canvasW = Math.ceil(this.canvas.getWidth());\n const canvasH = Math.ceil(this.canvas.getHeight());\n const clipsImage = boundingRect.width > canvasW + LAYOUT_EPSILON ||\n boundingRect.height > canvasH + LAYOUT_EPSILON;\n if (this.currentLayoutMode === 'fit' || this.currentLayoutMode === 'cover') {\n const staleOverflowWidth = canvasW > viewport.width + LAYOUT_EPSILON &&\n boundingRect.width <= viewport.width + LAYOUT_EPSILON;\n const staleOverflowHeight = canvasH > viewport.height + LAYOUT_EPSILON &&\n boundingRect.height <= viewport.height + LAYOUT_EPSILON;\n return clipsImage || staleOverflowWidth || staleOverflowHeight;\n }\n if (this.currentLayoutMode === 'expand') {\n const expectedW = Math.max(viewport.width, Math.ceil(boundingRect.width));\n const expectedH = Math.max(viewport.height, Math.ceil(boundingRect.height));\n return (Math.abs(canvasW - expectedW) > LAYOUT_EPSILON ||\n Math.abs(canvasH - expectedH) > LAYOUT_EPSILON);\n }\n return clipsImage;\n }\n settleFitCoverScrollbarsAfterStateRestore() {\n if (!this.canvas ||\n !this.containerElement ||\n (this.currentLayoutMode !== 'fit' && this.currentLayoutMode !== 'cover')) {\n return;\n }\n const canvasW = Math.ceil(this.canvas.getWidth());\n const canvasH = Math.ceil(this.canvas.getHeight());\n if (canvasW <= 1 || canvasH <= 1)\n return;\n const clientW = Math.floor(this.containerElement.clientWidth || 0);\n const clientH = Math.floor(this.containerElement.clientHeight || 0);\n if (clientW <= 0 || clientH <= 0)\n return;\n const scrollW = Math.ceil(this.containerElement.scrollWidth || 0);\n const scrollH = Math.ceil(this.containerElement.scrollHeight || 0);\n const hasHorizontalScrollbar = scrollW > clientW + LAYOUT_EPSILON;\n const hasVerticalScrollbar = scrollH > clientH + LAYOUT_EPSILON;\n if (!hasHorizontalScrollbar && !hasVerticalScrollbar)\n return;\n const nudgeWidth = hasVerticalScrollbar && Math.abs(canvasW - clientW) <= SCROLLBAR_SETTLE_EPSILON;\n const nudgeHeight = hasHorizontalScrollbar && Math.abs(canvasH - clientH) <= SCROLLBAR_SETTLE_EPSILON;\n if (!nudgeWidth && !nudgeHeight)\n return;\n this.setCanvasSizePx(nudgeWidth ? canvasW - 1 : canvasW, nudgeHeight ? canvasH - 1 : canvasH);\n this.setCanvasSizePx(canvasW, canvasH);\n }\n captureImageDisplayGeometry() {\n if (!this.canvas || !this.originalImage)\n return null;\n this.originalImage.setCoords();\n const boundingRect = this.originalImage.getBoundingRect();\n return {\n canvasWidth: this.canvas.getWidth(),\n canvasHeight: this.canvas.getHeight(),\n imageDisplayWidth: Math.max(1, boundingRect.width),\n imageDisplayHeight: Math.max(1, boundingRect.height),\n };\n }\n restoreMergedImageDisplayGeometry(geometry) {\n if (!geometry || !this.canvas || !this.originalImage)\n return;\n this.setCanvasSizePx(geometry.canvasWidth, geometry.canvasHeight);\n const sourceW = Math.max(1, this.originalImage.width || geometry.imageDisplayWidth);\n const sourceH = Math.max(1, this.originalImage.height || geometry.imageDisplayHeight);\n const scale = Math.min(geometry.imageDisplayWidth / sourceW, geometry.imageDisplayHeight / sourceH);\n this.originalImage.set({\n left: 0,\n top: 0,\n angle: 0,\n scaleX: scale,\n scaleY: scale,\n originX: 'left',\n originY: 'top',\n selectable: false,\n evented: false,\n hasControls: false,\n hoverCursor: 'default',\n });\n this.originalImage.setCoords();\n this.canvas.sendObjectToBack(this.originalImage);\n this.currentScale = 1;\n this.currentRotation = 0;\n this.baseImageScale = scale;\n this.lastSnapshot = this.captureSnapshotInternal();\n this.canvas.renderAll();\n }\n buildTransformContext() {\n return {\n canvas: this.canvas,\n options: this.options,\n guard: this.operationGuard,\n getOriginalImage: () => this.originalImage,\n getCurrentScale: () => this.currentScale,\n setCurrentScale: (n) => {\n this.currentScale = n;\n },\n getCurrentRotation: () => this.currentRotation,\n setCurrentRotation: (n) => {\n this.currentRotation = n;\n },\n getBaseImageScale: () => this.baseImageScale,\n saveCanvasState: () => {\n this.saveStateInternal(this.withAnimationQueueBypass());\n },\n setSuppressSaveState: (suppress) => {\n this.shouldSuppressSaveState = suppress;\n },\n afterTransformSnap: () => {\n if (this.isDisposed || !this.canvas || !this.originalImage)\n return;\n this.updateCanvasSizeToImageBounds();\n this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage);\n this.canvas\n .getObjects()\n .filter(isMaskObject)\n .forEach((maskObject) => this.syncMaskLabel(maskObject));\n },\n };\n }\n scaleImage(factor) {\n if (this.isDisposed || !this.transformController)\n return Promise.resolve();\n if (!Number.isFinite(factor))\n return Promise.resolve();\n try {\n this.assertCanQueueAnimation('scaleImage');\n }\n catch (error) {\n return Promise.reject(error);\n }\n const controller = this.transformController;\n const context = this.buildCallbackContext('scaleImage', false);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.updateUi();\n try {\n await controller.scaleImage(factor);\n if (!this.isDisposed)\n this.emitImageChanged(context);\n }\n finally {\n if (!this.isDisposed) {\n this.updateInputs();\n }\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n rotateImage(degrees) {\n if (this.isDisposed || !this.transformController)\n return Promise.resolve();\n if (!Number.isFinite(degrees))\n return Promise.resolve();\n try {\n this.assertCanQueueAnimation('rotateImage');\n }\n catch (error) {\n return Promise.reject(error);\n }\n const controller = this.transformController;\n const context = this.buildCallbackContext('rotateImage', false);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.updateUi();\n try {\n await controller.rotateImage(degrees);\n if (!this.isDisposed)\n this.emitImageChanged(context);\n }\n finally {\n if (!this.isDisposed) {\n this.updateInputs();\n }\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n resetImageTransform() {\n if (this.isDisposed || !this.transformController)\n return Promise.resolve();\n try {\n this.assertCanQueueAnimation('resetImageTransform');\n }\n catch (error) {\n return Promise.reject(error);\n }\n const controller = this.transformController;\n const context = this.buildCallbackContext('resetImageTransform', false);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.updateUi();\n try {\n await controller.resetImageTransform();\n if (!this.isDisposed)\n this.emitImageChanged(context);\n }\n finally {\n if (!this.isDisposed) {\n this.updateInputs();\n }\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n refreshUiAfterQueuedAnimation() {\n if (this.isDisposed || !this.canvas)\n return;\n this.updateInputs();\n this.updateUi();\n }\n async loadFromState(jsonString) {\n return this.loadFromStateInternal(jsonString);\n }\n async loadFromStateInternal(jsonString, options) {\n var _a;\n if (!jsonString || !this.canvas)\n return;\n if (this.isDisposed)\n return;\n if (!this.canRunIdleOperation('loadFromState', options))\n return;\n const activeRestoreOperation = this.activeStateRestoreOperation;\n const context = this.buildCallbackContext(activeRestoreOperation !== null && activeRestoreOperation !== void 0 ? activeRestoreOperation : 'loadFromState', activeRestoreOperation === 'undo' || activeRestoreOperation === 'redo');\n const previousImage = this.originalImage;\n const previousMaskSignature = this.getMaskCollectionSignature();\n try {\n const restoredState = await loadFromStateImpl({\n canvas: this.canvas,\n jsonString,\n setCanvasSize: (widthPx, heightPx) => this.setCanvasSizePx(widthPx, heightPx),\n });\n if (this.isDisposed || !this.canvas)\n return;\n this.hideAllMaskLabels();\n this.originalImage = restoredState.originalImage;\n if (this.originalImage) {\n this.originalImage.set({\n originX: 'left',\n originY: 'top',\n selectable: false,\n evented: false,\n hasControls: false,\n hoverCursor: 'default',\n });\n this.canvas.sendObjectToBack(this.originalImage);\n }\n this.maskCounter = restoredState.maxMaskId;\n const editorState = restoredState.editorState;\n if (editorState) {\n this.currentScale = editorState.currentScale;\n this.currentRotation = editorState.currentRotation;\n this.baseImageScale = editorState.baseImageScale;\n }\n if (this.originalImage) {\n this.currentImageMimeType =\n editorState && 'currentImageMimeType' in editorState\n ? ((_a = editorState.currentImageMimeType) !== null && _a !== void 0 ? _a : null)\n : this.inferCurrentImageMimeType();\n }\n else {\n this.currentImageMimeType = null;\n }\n this.isImageLoadedToCanvas = !!this.originalImage;\n if (this.originalImage && this.shouldNormalizeCanvasSizeAfterStateRestore()) {\n this.updateCanvasSizeToImageBounds();\n this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage);\n }\n if (this.originalImage) {\n this.settleFitCoverScrollbarsAfterStateRestore();\n }\n const restoredMasks = restoredState.objects.filter(isMaskObject);\n this.lastMask = restoredMasks.reduce((lastMask, maskObject) => !lastMask || maskObject.maskId > lastMask.maskId ? maskObject : lastMask, null);\n restoredMasks.forEach((maskObject) => {\n applyMaskUnselectedStyle(maskObject);\n reattachMaskHoverHandlers(maskObject);\n });\n this.lastSnapshot = this.captureSnapshotInternal();\n this.canvas.renderAll();\n this.updateInputs();\n this.updateMaskList();\n this.updateUi();\n if (previousImage && previousImage !== this.originalImage) {\n this.emitOptionCallback('onImageCleared', [previousImage, context]);\n }\n if (previousMaskSignature !== this.getMaskCollectionSignature()) {\n this.emitMasksChanged(context);\n }\n this.emitImageChanged(context);\n const activeMaskId = editorState === null || editorState === void 0 ? void 0 : editorState.activeMaskId;\n if (typeof activeMaskId === 'number') {\n const activeMask = restoredMasks.find((maskObject) => maskObject.maskId === activeMaskId);\n if (activeMask) {\n this.withSelectionChangeContext(context, () => {\n this.canvas.setActiveObject(activeMask);\n this.handleSelectionChanged([activeMask]);\n });\n }\n }\n }\n catch (error) {\n reportError(this.options, error, 'Failed to restore canvas state.');\n throw error;\n }\n }\n saveState() {\n this.saveStateInternal();\n }\n saveStateInternal(options) {\n var _a, _b;\n if (!this.canvas || this.shouldSuppressSaveState)\n return;\n if (!this.canRunIdleOperation('saveState', options))\n return;\n const activeObj = this.canvas.getActiveObject();\n const activeMask = this.getActiveMaskForSnapshot();\n this.hideAllMaskLabels();\n try {\n const after = saveStateImpl({\n canvas: this.canvas,\n activeMaskId: (_a = activeMask === null || activeMask === void 0 ? void 0 : activeMask.maskId) !== null && _a !== void 0 ? _a : null,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n baseImageScale: this.baseImageScale,\n currentImageMimeType: this.currentImageMimeType,\n });\n const before = (_b = this.lastSnapshot) !== null && _b !== void 0 ? _b : after;\n if (after === before) {\n return;\n }\n const cmd = new Command(async () => {\n await this.loadFromStateInternal(after, this.withAnimationQueueBypass());\n }, async () => {\n await this.loadFromStateInternal(before, this.withAnimationQueueBypass());\n });\n this.historyManager.push(cmd);\n this.lastSnapshot = after;\n }\n catch (error) {\n reportWarning(this.options, error, 'Failed to capture canvas snapshot.');\n }\n finally {\n this.restoreActiveMaskAfterSnapshot(activeObj, activeMask);\n this.updateUi();\n }\n }\n restoreActiveMaskAfterSnapshot(activeObj, activeMask) {\n if (!this.canvas)\n return;\n const maskToRestore = activeObj && isMaskObject(activeObj) ? activeObj : activeMask;\n if (!maskToRestore || !this.canvas.getObjects().includes(maskToRestore))\n return;\n this.canvas.setActiveObject(maskToRestore);\n this.showLabelForMask(maskToRestore);\n this.updateMaskListSelection(maskToRestore);\n }\n undo() {\n if (this.isDisposed)\n return Promise.resolve();\n if (!this.canRunIdleOperation('undo'))\n return Promise.resolve();\n const context = this.buildCallbackContext('undo', true);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.activeStateRestoreOperation = 'undo';\n try {\n await this.historyManager.undo();\n }\n finally {\n this.activeStateRestoreOperation = null;\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n redo() {\n if (this.isDisposed)\n return Promise.resolve();\n if (!this.canRunIdleOperation('redo'))\n return Promise.resolve();\n const context = this.buildCallbackContext('redo', true);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.activeStateRestoreOperation = 'redo';\n try {\n await this.historyManager.redo();\n }\n finally {\n this.activeStateRestoreOperation = null;\n }\n });\n this.emitBusyChangeIfChanged(context);\n return job.finally(() => {\n this.refreshUiAfterQueuedAnimation();\n this.emitBusyChangeIfChanged(context);\n });\n }\n createMask(config = {}) {\n if (!this.canvas)\n return null;\n if (!this.canRunIdleOperation('createMask'))\n return null;\n const callbackContext = this.buildCallbackContext('createMask', false);\n const createMaskContext = this.buildCreateMaskContext();\n const mask = this.withSelectionChangeContext(callbackContext, () => createMaskImpl(createMaskContext, config));\n if (mask) {\n this.emitMasksChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n return mask;\n }\n removeSelectedMask() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('removeSelectedMask'))\n return;\n const before = this.getMasks().length;\n const callbackContext = this.buildCallbackContext('removeSelectedMask', false);\n const removeMaskContext = this.buildRemoveMaskContext();\n this.withSelectionChangeContext(callbackContext, () => removeSelectedMaskImpl(removeMaskContext));\n this.updateUi();\n if (this.getMasks().length !== before) {\n this.emitMasksChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n removeAllMasks(options = {}) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('removeAllMasks', options))\n return;\n const before = this.getMasks().length;\n const callbackContext = this.buildCallbackContext('removeAllMasks', false);\n const removeMaskContext = this.buildRemoveMaskContext();\n this.withSelectionChangeContext(callbackContext, () => removeAllMasksImpl(removeMaskContext, options));\n this.updateUi();\n if (this.getMasks().length !== before) {\n this.emitMasksChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n buildCreateMaskContext() {\n return {\n fabric: this.fabricModule,\n canvas: this.canvas,\n options: this.getRuntimeOptions(),\n getLastMask: () => this.lastMask,\n setLastMask: (maskObject) => {\n this.lastMask = maskObject;\n },\n getMaskCounter: () => this.maskCounter,\n setMaskCounter: (n) => {\n this.maskCounter = n;\n },\n updateMaskList: () => {\n this.updateMaskList();\n },\n saveCanvasState: () => {\n this.saveState();\n },\n expandCanvasIfNeeded: (widthPx, heightPx) => {\n this.setCanvasSizePx(widthPx, heightPx);\n },\n };\n }\n buildRemoveMaskContext() {\n return {\n canvas: this.canvas,\n removeLabelForMask: (mask) => {\n this.removeLabelForMask(mask);\n },\n updateMaskList: () => {\n this.updateMaskList();\n },\n saveCanvasState: () => {\n this.saveState();\n },\n setLastMask: (maskObject) => {\n this.lastMask = maskObject;\n },\n };\n }\n buildMaskLabelContext() {\n if (!this.canvas)\n return null;\n return { fabric: this.fabricModule, canvas: this.canvas, options: this.options };\n }\n removeLabelForMask(mask) {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n removeLabelForMask(context, mask);\n }\n createLabelForMask(mask) {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n createLabelForMask(context, mask);\n }\n hideAllMaskLabels() {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n hideAllMaskLabels(context);\n }\n syncMaskLabel(mask) {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n syncMaskLabel(context, mask);\n }\n showLabelForMask(mask) {\n const context = this.buildMaskLabelContext();\n if (!context)\n return;\n showLabelForMask(context, mask);\n }\n handleSelectionChanged(selected) {\n var _a, _b, _c;\n if (!this.canvas)\n return;\n const selectedMask = (_a = selected.find(isMaskObject)) !== null && _a !== void 0 ? _a : null;\n const masks = this.canvas.getObjects().filter(isMaskObject);\n masks.forEach((maskObject) => {\n if (maskObject !== selectedMask) {\n if (maskObject.labelObject) {\n this.removeLabelForMask(maskObject);\n }\n applyMaskUnselectedStyle(maskObject);\n }\n else {\n applyMaskSelectedStyle(maskObject);\n }\n });\n if (selectedMask)\n this.showLabelForMask(selectedMask);\n this.updateMaskListSelection(selectedMask);\n this.canvas.requestRenderAll();\n this.updateUi();\n const context = (_b = this.nextSelectionChangeContext) !== null && _b !== void 0 ? _b : this.buildCallbackContext((_c = this.activeStateRestoreOperation) !== null && _c !== void 0 ? _c : 'createMask', this.activeStateRestoreOperation === 'undo' ||\n this.activeStateRestoreOperation === 'redo');\n this.emitOptionCallback('onSelectionChange', [this.buildSelection(selected), context]);\n }\n buildMaskListContext() {\n return {\n canvas: this.canvas,\n getListElementId: () => this.elements.maskList,\n onMaskSelected: (mask) => this.handleSelectionChanged([mask]),\n };\n }\n updateMaskList() {\n renderMaskList(this.buildMaskListContext());\n }\n updateMaskListSelection(selectedMask) {\n updateMaskListSelection(this.buildMaskListContext(), selectedMask);\n }\n async mergeMasks() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('mergeMasks'))\n return;\n const hasMasks = this.canvas.getObjects().some(isMaskObject);\n if (!hasMasks)\n return;\n const callbackContext = this.buildCallbackContext('mergeMasks', false);\n const operationToken = this.operationGuard.beginBusyOperation('mergeMasks');\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n try {\n const mergeMasksContext = this.buildMergeMasksContext(operationToken);\n await mergeMasksImpl(mergeMasksContext);\n this.updateInputs();\n this.updateMaskList();\n this.emitMasksChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n }\n }\n downloadImage(fileName) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('downloadImage'))\n return;\n const callbackContext = this.buildCallbackContext('downloadImage', false);\n const operationToken = this.operationGuard.beginBusyOperation('downloadImage');\n this.emitBusyChangeIfChanged(callbackContext);\n const exportContext = this.buildExportServiceContext();\n try {\n downloadImageImpl(exportContext, fileName);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n }\n }\n async exportImageBase64(options) {\n if (!this.canvas)\n return '';\n if (!this.canRunIdleOperation('exportImageBase64', options))\n return '';\n const callbackContext = this.buildCallbackContext('exportImageBase64', false);\n const operationToken = this.operationGuard.beginBusyOperation('exportImageBase64');\n this.emitBusyChangeIfChanged(callbackContext);\n const exportContext = this.buildExportServiceContext();\n try {\n return await exportImageBase64Impl(exportContext, options);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n }\n }\n async exportImageFile(options) {\n this.assertIdleForOperation('exportImageFile', options);\n const callbackContext = this.buildCallbackContext('exportImageFile', false);\n const operationToken = this.operationGuard.beginBusyOperation('exportImageFile');\n this.emitBusyChangeIfChanged(callbackContext);\n const exportContext = this.buildExportServiceContext();\n try {\n return await exportImageFileImpl(exportContext, options);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n }\n }\n buildExportServiceContext() {\n return {\n fabric: this.fabricModule,\n canvas: this.canvas,\n options: this.options,\n isImageLoaded: () => this.isImageLoaded(),\n getOriginalImage: () => this.originalImage,\n };\n }\n buildMergeMasksContext(operationToken) {\n return {\n ...this.buildExportServiceContext(),\n historyManager: this.historyManager,\n containerElement: this.containerElement,\n loadImage: async (base64, providedOptions) => {\n const geometry = this.captureImageDisplayGeometry();\n await this.loadImageInternal(base64, this.withInternalOperationOptions(operationToken, providedOptions !== null && providedOptions !== void 0 ? providedOptions : {}));\n this.restoreMergedImageDisplayGeometry(geometry);\n },\n saveState: () => this.captureSnapshotInternal(),\n loadFromState: (snapshot) => this.loadFromStateInternal(snapshot, this.withInternalOperationOptions(operationToken, this.withAnimationQueueBypass())),\n removeAllMasksNoHistory: () => {\n const context = this.buildRemoveMaskContext();\n removeAllMasksImpl(context, { saveHistory: false });\n },\n };\n }\n captureSnapshotInternal() {\n var _a;\n if (!this.canvas) {\n throw new Error('[ImageEditor] Cannot capture canvas snapshot before init or after dispose.');\n }\n const activeMask = this.getActiveMaskForSnapshot();\n this.hideAllMaskLabels();\n return saveStateImpl({\n canvas: this.canvas,\n activeMaskId: (_a = activeMask === null || activeMask === void 0 ? void 0 : activeMask.maskId) !== null && _a !== void 0 ? _a : null,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n baseImageScale: this.baseImageScale,\n currentImageMimeType: this.currentImageMimeType,\n });\n }\n getActiveMaskForSnapshot() {\n var _a;\n if (!this.canvas)\n return null;\n const activeObject = this.canvas.getActiveObject();\n if (activeObject && isMaskObject(activeObject))\n return activeObject;\n const labeledMasks = this.canvas\n .getObjects()\n .filter((object) => isMaskObject(object) && !!object.labelObject);\n return labeledMasks.length === 1 ? ((_a = labeledMasks[0]) !== null && _a !== void 0 ? _a : null) : null;\n }\n enterMosaicMode() {\n if (!this.canvas || !this.originalImage)\n return;\n if (this.mosaicSession)\n return;\n if (!this.isImageLoaded())\n return;\n if (!this.canRunIdleOperation('enterMosaicMode'))\n return;\n enterMosaicModeImpl(this.buildMosaicControllerContext());\n this.updateInputs();\n this.updateUi();\n const callbackContext = this.buildCallbackContext('enterMosaicMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n exitMosaicMode() {\n if (!this.canvas || !this.mosaicSession)\n return;\n if (!this.canRunIdleOperation('exitMosaicMode'))\n return;\n exitMosaicModeImpl(this.buildMosaicControllerContext());\n this.updateInputs();\n this.updateUi();\n const callbackContext = this.buildCallbackContext('exitMosaicMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n isMosaicMode() {\n return this.mosaicSession !== null;\n }\n getMosaicConfig() {\n return cloneResolvedMosaicConfig(this.currentMosaicConfig);\n }\n setMosaicConfig(config) {\n this.applyMosaicConfigPatch(config, 'setMosaicConfig');\n }\n resetMosaicConfig() {\n if (this.isDisposed)\n return;\n const nextConfig = cloneResolvedMosaicConfig(this.defaultMosaicConfig);\n if (areResolvedMosaicConfigsEqual(this.currentMosaicConfig, nextConfig))\n return;\n this.currentMosaicConfig = nextConfig;\n if (this.mosaicSession && this.canvas) {\n updateMosaicPreview(this.buildMosaicControllerContext());\n }\n this.updateInputs();\n this.updateUi();\n this.emitImageChanged(this.buildCallbackContext('resetMosaicConfig', false));\n }\n setMosaicBrushSize(size) {\n this.applyMosaicConfigPatch({ brushSize: size }, 'setMosaicBrushSize');\n }\n setMosaicBlockSize(size) {\n this.applyMosaicConfigPatch({ blockSize: size }, 'setMosaicBlockSize');\n }\n applyMosaicConfigPatch(config, operation) {\n if (this.isDisposed)\n return;\n if (config === null || typeof config !== 'object' || Array.isArray(config)) {\n reportWarning(this.options, new TypeError('[ImageEditor] Invalid Mosaic config object.'), 'Ignored invalid Mosaic config.');\n return;\n }\n const invalidFields = getInvalidMosaicConfigFields(config);\n if (invalidFields.length > 0) {\n reportWarning(this.options, new TypeError(`[ImageEditor] Ignored invalid Mosaic config field(s): ` +\n `${invalidFields.join(', ')}.`), 'Ignored invalid Mosaic config fields.');\n }\n const nextConfig = mergeMosaicConfigPatch(this.currentMosaicConfig, config);\n if (areResolvedMosaicConfigsEqual(this.currentMosaicConfig, nextConfig))\n return;\n this.currentMosaicConfig = nextConfig;\n if (this.mosaicSession && this.canvas) {\n updateMosaicPreview(this.buildMosaicControllerContext());\n }\n this.updateInputs();\n this.updateUi();\n this.emitImageChanged(this.buildCallbackContext(operation, false));\n }\n buildMosaicControllerContext() {\n return {\n fabric: this.fabricModule,\n canvas: this.canvas,\n options: this.options,\n historyManager: this.historyManager,\n getMosaicConfig: () => cloneResolvedMosaicConfig(this.currentMosaicConfig),\n isImageLoaded: () => this.isImageLoaded(),\n getOriginalImage: () => this.originalImage,\n setOriginalImage: (image) => {\n this.originalImage = image;\n },\n getCurrentImageMimeType: () => this.currentImageMimeType,\n setCurrentImageMimeType: (mimeType) => {\n this.currentImageMimeType = mimeType;\n },\n getLastSnapshot: () => this.lastSnapshot,\n setLastSnapshot: (snapshot) => {\n this.lastSnapshot = snapshot;\n },\n captureSnapshot: () => this.captureSnapshotInternal(),\n loadFromState: (snapshot) => this.loadFromStateInternal(snapshot, this.withAnimationQueueBypass()),\n updateUi: () => {\n this.updateUi();\n },\n updateInputs: () => {\n this.updateInputs();\n },\n hideAllMaskLabels: () => {\n this.hideAllMaskLabels();\n },\n emitImageChanged: (context) => {\n this.emitImageChanged(context);\n },\n emitBusyChangeIfChanged: (context) => {\n this.emitBusyChangeIfChanged(context);\n },\n buildCallbackContext: (operation, isInternal) => this.buildCallbackContext(operation, isInternal),\n getMosaicSession: () => this.mosaicSession,\n setMosaicSession: (session) => {\n this.mosaicSession = session;\n },\n };\n }\n enterCropMode() {\n if (!this.canvas || !this.originalImage)\n return;\n if (this.cropSession)\n return;\n if (!this.isImageLoaded())\n return;\n if (!this.canRunIdleOperation('enterCropMode'))\n return;\n const cropControllerContext = this.buildCropControllerContext();\n enterCropModeImpl(cropControllerContext);\n this.updateUi();\n const callbackContext = this.buildCallbackContext('enterCropMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n cancelCrop() {\n if (!this.canvas || !this.cropSession)\n return;\n if (!this.canRunIdleOperation('cancelCrop'))\n return;\n const cropControllerContext = this.buildCropControllerContext();\n cancelCropImpl(cropControllerContext);\n this.cropSession = null;\n this.updateUi();\n this.canvas.requestRenderAll();\n const callbackContext = this.buildCallbackContext('cancelCrop', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n async applyCrop() {\n if (!this.canvas || !this.cropSession)\n return;\n if (!this.canRunIdleOperation('applyCrop'))\n return;\n const callbackContext = this.buildCallbackContext('applyCrop', false);\n const hadMasks = this.getMasks().length > 0;\n const operationToken = this.operationGuard.beginBusyOperation('applyCrop');\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n try {\n const cropControllerContext = this.buildCropControllerContext(operationToken);\n await applyCropImpl(cropControllerContext);\n this.updateInputs();\n this.updateMaskList();\n if (hadMasks || this.getMasks().length > 0) {\n this.emitMasksChanged(callbackContext);\n }\n this.emitImageChanged(callbackContext);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n }\n }\n buildCropControllerContext(operationToken) {\n return {\n fabric: this.fabricModule,\n canvas: this.canvas,\n options: this.options,\n historyManager: this.historyManager,\n isImageLoaded: () => this.isImageLoaded(),\n getOriginalImage: () => this.originalImage,\n getCurrentImageMimeType: () => this.currentImageMimeType,\n getCropSession: () => this.cropSession,\n setCropSession: (s) => {\n this.cropSession = s;\n },\n saveState: () => this.captureSnapshotInternal(),\n loadFromState: (snapshot) => this.loadFromStateInternal(snapshot, this.withInternalOperationOptions(operationToken, this.withAnimationQueueBypass())),\n loadImage: (base64, providedOptions) => this.loadImageInternal(base64, this.withInternalOperationOptions(operationToken, providedOptions !== null && providedOptions !== void 0 ? providedOptions : {})),\n getMaskCounter: () => this.maskCounter,\n setMaskCounter: (n) => {\n this.maskCounter = n;\n },\n updateMaskList: () => {\n this.updateMaskList();\n },\n };\n }\n updateInputs() {\n const scaleId = this.elements.scalePercentageInput;\n if (scaleId) {\n const scaleInputElement = document.getElementById(scaleId);\n if (scaleInputElement) {\n scaleInputElement.value = String(Math.round(this.currentScale * 100));\n }\n }\n const mosaicConfig = this.getMosaicConfig();\n const mosaicBrushSizeInputId = this.elements.mosaicBrushSizeInput;\n if (mosaicBrushSizeInputId) {\n const brushInput = document.getElementById(mosaicBrushSizeInputId);\n if (brushInput)\n brushInput.value = String(mosaicConfig.brushSize);\n }\n const mosaicBlockSizeInputId = this.elements.mosaicBlockSizeInput;\n if (mosaicBlockSizeInputId) {\n const blockInput = document.getElementById(mosaicBlockSizeInputId);\n if (blockInput)\n blockInput.value = String(mosaicConfig.blockSize);\n }\n }\n updateUi() {\n var _a;\n if (!this.canvas)\n return;\n const hasImage = !!this.originalImage;\n const masks = hasImage ? this.canvas.getObjects().filter(isMaskObject) : [];\n const hasMasks = masks.length > 0;\n const activeObject = this.canvas.getActiveObject();\n const hasSelectedMask = !!(activeObject && isMaskObject(activeObject));\n const isDefaultTransform = this.currentScale === 1 && this.currentRotation === 0;\n const canUndo = this.historyManager.canUndo();\n const canRedo = this.historyManager.canRedo();\n const isInCropMode = this.cropSession !== null;\n const isInMosaicMode = this.mosaicSession !== null;\n const isBusy = this.operationGuard.isBusy() || this.animQueue.isBusy();\n const isMosaicApplying = ((_a = this.mosaicSession) === null || _a === void 0 ? void 0 : _a.isApplying) === true;\n if (isInCropMode) {\n CROP_MODE_CONTROL_KEYS.forEach((key) => {\n this.setControlEnabled(key, !isBusy && CROP_MODE_ENABLED_KEYS.includes(key));\n });\n return;\n }\n if (isInMosaicMode) {\n MOSAIC_MODE_CONTROL_KEYS.forEach((key) => {\n this.setControlEnabled(key, !isBusy && !isMosaicApplying && MOSAIC_MODE_ENABLED_KEYS.includes(key));\n });\n this.setControlEnabled('imageInput', false);\n return;\n }\n this.setControlEnabled('scalePercentageInput', hasImage && !isBusy);\n this.setControlEnabled('rotateLeftDegreesInput', hasImage && !isBusy);\n this.setControlEnabled('rotateRightDegreesInput', hasImage && !isBusy);\n this.setControlEnabled('zoomInButton', hasImage && !isBusy && this.currentScale < this.options.maxScale);\n this.setControlEnabled('zoomOutButton', hasImage && !isBusy && this.currentScale > this.options.minScale);\n this.setControlEnabled('rotateLeftButton', hasImage && !isBusy);\n this.setControlEnabled('rotateRightButton', hasImage && !isBusy);\n this.setControlEnabled('createMaskButton', hasImage && !isBusy);\n this.setControlEnabled('removeSelectedMaskButton', hasSelectedMask && !isBusy);\n this.setControlEnabled('removeAllMasksButton', hasMasks && !isBusy);\n this.setControlEnabled('mergeMasksButton', hasImage && hasMasks && !isBusy);\n this.setControlEnabled('downloadImageButton', hasImage && !isBusy);\n this.setControlEnabled('resetImageTransformButton', hasImage && !isDefaultTransform && !isBusy);\n this.setControlEnabled('undoButton', hasImage && !isBusy && canUndo);\n this.setControlEnabled('redoButton', hasImage && !isBusy && canRedo);\n this.setControlEnabled('enterCropModeButton', hasImage && !isBusy);\n this.setControlEnabled('enterMosaicModeButton', hasImage && !isBusy);\n this.setControlEnabled('exitMosaicModeButton', false);\n this.setControlEnabled('mosaicBrushSizeInput', !this.isDisposed);\n this.setControlEnabled('mosaicBlockSizeInput', !this.isDisposed);\n this.setControlEnabled('imageInput', !isBusy);\n this.setControlEnabled('applyCropButton', false);\n this.setControlEnabled('cancelCropButton', false);\n }\n setControlEnabled(key, isEnabled) {\n var _a;\n const id = this.elements[key];\n if (!id)\n return;\n const controlElement = document.getElementById(id);\n if (!controlElement)\n return;\n this.recordElementOriginalState(key, controlElement);\n if ('disabled' in controlElement) {\n controlElement.disabled = !isEnabled;\n return;\n }\n if (!isEnabled) {\n controlElement.setAttribute('aria-disabled', 'true');\n controlElement.style.pointerEvents = 'none';\n }\n else {\n const originalAria = this.elementOriginalAriaDisabledMap.get(key);\n if (originalAria === null || originalAria === undefined) {\n controlElement.removeAttribute('aria-disabled');\n }\n else {\n controlElement.setAttribute('aria-disabled', originalAria);\n }\n controlElement.style.pointerEvents =\n (_a = this.elementOriginalPointerEventsMap.get(key)) !== null && _a !== void 0 ? _a : '';\n }\n }\n recordElementOriginalState(key, element) {\n if (!this.elementOriginalAriaDisabledMap.has(key)) {\n this.elementOriginalAriaDisabledMap.set(key, element.getAttribute('aria-disabled'));\n }\n if (!this.elementOriginalPointerEventsMap.has(key)) {\n this.elementOriginalPointerEventsMap.set(key, element.style.pointerEvents || '');\n }\n if ('disabled' in element && !this.elementOriginalDisabledMap.has(key)) {\n this.elementOriginalDisabledMap.set(key, !!element.disabled);\n }\n }\n restoreElementOriginalStates() {\n var _a, _b;\n for (const key of Object.keys(this.elements)) {\n const id = this.elements[key];\n if (!id)\n continue;\n const element = document.getElementById(id);\n if (!element)\n continue;\n if ('disabled' in element && this.elementOriginalDisabledMap.has(key)) {\n element.disabled =\n (_a = this.elementOriginalDisabledMap.get(key)) !== null && _a !== void 0 ? _a : false;\n }\n if (this.elementOriginalAriaDisabledMap.has(key)) {\n const originalAria = this.elementOriginalAriaDisabledMap.get(key);\n if (originalAria === null || originalAria === undefined) {\n element.removeAttribute('aria-disabled');\n }\n else {\n element.setAttribute('aria-disabled', originalAria);\n }\n }\n if (this.elementOriginalPointerEventsMap.has(key)) {\n element.style.pointerEvents = (_b = this.elementOriginalPointerEventsMap.get(key)) !== null && _b !== void 0 ? _b : '';\n }\n }\n this.elementOriginalDisabledMap.clear();\n this.elementOriginalAriaDisabledMap.clear();\n this.elementOriginalPointerEventsMap.clear();\n }\n updatePlaceholderStatus() {\n setPlaceholderVisibleImpl(this.placeholderElement, this.containerElement, this.options.showPlaceholder ? !this.originalImage : false);\n }\n dispose() {\n var _a;\n if (this.isDisposed)\n return;\n const context = this.buildCallbackContext('dispose', false);\n const previousImage = this.originalImage;\n this.isDisposed = true;\n this.operationGuard.markDisposed();\n this.animQueue.clear();\n (_a = this.domBindings) === null || _a === void 0 ? void 0 : _a.removeAll();\n this.restoreElementOriginalStates();\n if (this.cropSession && this.canvas) {\n try {\n const context = this.buildCropControllerContext();\n cancelCropImpl(context);\n }\n catch {\n }\n this.cropSession = null;\n }\n if (this.mosaicSession && this.canvas) {\n try {\n exitMosaicModeImpl(this.buildMosaicControllerContext());\n }\n catch {\n }\n this.mosaicSession = null;\n }\n if (this.canvas) {\n try {\n void Promise.resolve(this.canvas.dispose()).catch(() => {\n });\n }\n catch {\n }\n this.canvas = null;\n this.canvasElement = null;\n this.isImageLoadedToCanvas = false;\n }\n this.originalImage = null;\n this.currentImageMimeType = null;\n this.lastMask = null;\n this.maskCounter = 0;\n this.currentScale = 1;\n this.currentRotation = 0;\n this.baseImageScale = 1;\n this.lastSnapshot = null;\n this.transformController = null;\n this.viewportCache.clear();\n if (previousImage) {\n this.emitOptionCallback('onImageCleared', [previousImage, context]);\n }\n this.emitImageChanged(context);\n this.emitBusyChangeIfChanged(context);\n this.emitOptionCallback('onEditorDisposed', [context]);\n }\n}\n//# sourceMappingURL=image-editor.js.map"],"names":["AnimationQueue","constructor","Object","defineProperty","this","enumerable","configurable","writable","value","add","animationFn","Promise","resolve","reject","queue","push","run","running","drainQueue","clear","reason","pending","undefined","entry","isRunning","isBusy","length","waitForIdle","then","shift","error","reportWarning","options","message","warningCallback","onWarning","callbackError","console","warn","reportError","errorCallback","onError","FORMAT_ALIAS_TABLE","freeze","jpeg","jpg","png","webp","MIME_TABLE","tryNormalizeImageFormat","input","_a","key","String","toLowerCase","prototype","hasOwnProperty","call","mimeTypeFor","format","clampQuality","quality","fallback","numeric","Number","isFinite","Math","max","min","resolveExportFormat","downsampleQuality","providedOptions","fileType","formatAlias","normalizeImageFormat","mimeType","EMPTY_DEFAULT_MASK_CONFIG","DEFAULT_LAYOUT_MODE","DEFAULT_OPTIONS","canvasWidth","canvasHeight","backgroundColor","animationDuration","minScale","maxScale","scaleStep","rotationStep","defaultLayoutMode","layoutMode","downsampleOnLoad","downsampleMaxWidth","downsampleMaxHeight","preserveSourceFormat","downsampleMimeType","imageLoadTimeoutMs","maxHistorySize","exportMultiplier","maxExportPixels","exportAreaByDefault","mergeMaskByDefault","defaultMaskWidth","defaultMaskHeight","defaultMaskConfig","maskRotatable","maskLabelOnSelect","maskLabelOffset","maskName","groupSelection","showPlaceholder","initialImageBase64","defaultDownloadFileName","onImageLoadStart","onImageLoaded","onImageCleared","onImageChanged","onBusyChange","onEditorDisposed","onMasksChanged","onSelectionChange","DEFAULT_LABEL_TEXT_OPTIONS","fontSize","fill","padding","fontFamily","fontWeight","selectable","evented","originX","originY","DEFAULT_LABEL","getText","mask","DEFAULT_CROP","DEFAULT_MOSAIC_CONFIG","brushSize","blockSize","previewStroke","previewStrokeWidth","previewStrokeDashArray","previewFill","outputFileType","outputQuality","KNOWN_TOP_LEVEL_KEYS","Set","normalizeCallback","isLayoutMode","normalizeLayoutMode","isConfigObject","Array","isArray","copyDefaultMaskConfigValue","normalizeDefaultMaskConfig","normalized","optionValue","entries","styles","copiedStyles","styleValue","normalizePositiveInteger","floor","normalizePositiveFiniteNumber","normalizeNonNegativeFiniteNumber","normalizeFiniteNumber","normalizeQualityOption","normalizeMaxExportPixels","normalizeExportArea","normalizeOptionalQuality","hasOwn","object","isFiniteNumber","cloneResolvedMosaicConfig","config","mergeMosaicConfigPatch","current","patch","raw","next","normalizeMosaicPositiveNumber","normalizeMosaicBlockSize","normalizeMosaicNonNegativeNumber","every","normalizeMosaicDashArray","normalizeMosaicOutputFileType","normalizeMosaicOutputQuality","areResolvedMosaicConfigsEqual","left","right","leftDash","rightDash","dashEqual","index","resolveOptions","_b","_c","_d","resolved","keys","has","normalizeMaxHistorySize","userLabel","label","mergedTextOptions","textOptions","create","userCrop","crop","minWidth","minHeight","hideMasksDuringCrop","preserveMasksAfterCrop","allowRotationOfCropRect","exportFileType","exportQuality","defaultMosaicConfig","normalizeMosaicConfig","OperationGuard","isAnimating","isAnimationActive","isDisposed","isDisposedFlag","isLoading","isLoadingActive","activeOperationName","currentOperationName","currentOperationToken","beginAnimation","endAnimation","markDisposed","abort","animationAborters","registerAnimationAborter","delete","beginLoading","endLoading","beginBusyOperation","operationName","token","Symbol","endBusyOperation","isOwnOperation","runAnimation","animationTask","assertNotAnimating","operationLabel","Error","assertIdleForOperation","ownOperation","assertCanQueueAnimation","isMaskObject","maskId","SNAPSHOT_CUSTOM_KEYS","saveState","canvas","currentScale","currentRotation","baseImageScale","activeObject","getActiveObject","activeMaskId","type","isType","isActiveSelectionObject","discardActiveObject","jsonObj","toJSON","canvasObjects","jsonObjects","liveObject","jsonObject","maskUid","originalAlpha","originalStroke","originalStrokeWidth","hasControls","strokeUniform","lockRotation","transparentCorners","borderColor","cornerColor","cornerSize","isCropRect","maskLabel","isMosaicPreview","copySnapshotCustomPropsFromCanvas","getObjects","objects","filter","o","_editorState","currentImageMimeType","JSON","stringify","async","loadFromState","jsonString","snapshotInput","setCanvasSize","json","parse","width","height","loadFromJSON","canvasObjs","jsonObjs","_e","consumedCanvasIndexes","jObj","jType","jLeft","jTop","top","jUid","matchIndex","findIndex","abs","maskObject","opacity","forEach","canvasObj","restoreMaskPropsFromJson","editorState","maxMaskId","reduce","originalImage","find","isOriginalImageObject","Command","execute","undo","HistoryManager","maxSize","command","pushAndTrim","canUndo","currentIndex","canRedo","history","isProcessing","cmd","redo","slice","looksLikeFabricModule","Canvas","fixPrototype","self","ctor","setPrototypeOf","ImageDecodeError","originalError","super","ImageLoadTimeoutError","elapsedMs","DownsampleError","MergeMasksError","CropApplyError","ExportNotReadyError","operation","ExportError","DEFAULT_STROKE_FALLBACK","applyMaskUnselectedStyle","strokeWidth","set","stroke","attachMaskHoverHandlers","tagged","mouseover","baseAlpha","getMaskHoverStyle","requestRenderAll","mouseout","getMaskNormalStyle","on","imageEditorMaskHandlers","reattachMaskHoverHandlers","off","sw","detachMaskHoverHandlers","captureMaskStyleBackup","_f","_g","restoreMaskStyleBackup","backup","setCoords","applyCropHideMaskStyle","hasMeaningfulCanvasRegion","rect","bottom","safeCanvasWidth","safeCanvasHeight","overlapWidth","overlapHeight","getClampedCanvasRegion","safeLeft","safeTop","safeWidth","safeHeight","roundEnd","includePartialPixels","ceil","hasCanvasWidth","hasCanvasHeight","round","POSITIVE_INFINITY","hasFractionalCanvasEdge","numericValue","getPartialExportEdges","bounds","angle","normalizedAngle","getObjectBBox","boundingRect","getBoundingRect","CROP_RECT_DASH","CROPPED_EXPORT_QUALITY_FALLBACK","finiteNumberOrFallback","resolveLossyCropQuality","cropExportQuality","cropQuality","clampExportQuality","fallbackQuality","removeCropRect","context","session","targetHandlers","handlers","record","target","eventName","callback","cropRect","remove","restoreCropObjectState","prevEvented","teardownSession","maskBackups","restoreCropMaskBackups","selection","prevSelection","maskIntersectsRegion","region","bbox","cancelCrop","getCropSession","setCropSession","renderAll","applyCrop","beforeJson","preserveMasks","cropAngle","rectBounds","scaleX","scaleY","getCropRectContentBounds","getWidth","getHeight","cropRegion","preservedRecords","records","styleBackupByMask","Map","map","masks","styleBackup","get","capturePreservedMasks","cropFormat","requested","cropExportFileType","imageMimeToFormat","resolveCropExportFormat","getCurrentImageMimeType","exportOptions","multiplier","croppedBase64","toDataURL","loadImage","maxRestoredId","visible","bringObjectToFront","id","getMaskCounter","setMaskCounter","liveCounter","safeCounter","updateMaskList","reapplyPreservedMasks","afterJson","historyManager","rollbackError","computeDownsampleDimensions","srcWidth","srcHeight","maxWidth","maxHeight","isPositiveFinite","needsResize","ratio","detectSourceMimeType","dataUrl","match","exec","withTimeout","promise","ms","start","Date","now","timeoutId","setTimeout","clearTimeout","err","getSourceRadiusFromMatrix","matrix","canvasRadius","hypot","a","b","c","d","getMosaicImagePoint","fabric","image","canvasPoint","brushDiameterCanvasPx","brushDiameter","x","y","e","f","toMatrix2D","calcTransformMatrix","inverse","determinant","invertMatrix","localPoint","point","transformPoint","sourceX","sourceY","sourceRadius","isInsideCircle","centerX","centerY","radiusSquared","dx","dy","pixelOffset","applyCircularMosaicToImageData","imageData","data","radius","minX","maxX","minY","maxY","processed","blockY","blockX","blockMaxX","blockMaxY","sampleOffset","red","green","blue","alpha","offset","isFinitePoint","getPointerFromFabricEvent","event","fabricEvent","scenePoint","pointer","absolutePointer","getPointer","safeRender","ensurePreviewCircle","circle","previewCircle","getMosaicConfig","Circle","strokeDashArray","excludeFromExport","objectCaching","createPreviewCircle","includes","updateMosaicPreview","removePreviewCircle","ensurePreviewImage","sourceImage","rasterCache","previewImage","FabricImage","offscreenCanvas","copyBaseImageProperties","createPreviewImage","dirty","sourceIndex","indexOf","moveObjectTo","placePreviewImageAfterBase","removePreviewImage","hidePreview","getMosaicSession","movePreview","attachCanvasHandler","getImageSource","imageWithSource","src","getSrc","imageDimension","source","skewX","skewY","flipX","flipY","hoverCursor","getOrCreateRasterCache","ownerDocument","element","getElement","lowerCanvasEl","document","getCanvasDocument","decoded","imageElement","createElement","cleanup","removeEventListener","handleLoad","handleError","onload","onerror","naturalWidth","naturalHeight","startsWith","crossOrigin","addEventListener","once","decodeImageSource","renderingContext","getContext","drawImage","getImageData","applyMosaicImagePoint","imagePoint","previousPoint","lastImagePoint","points","end","distance","minRadius","spacing","steps","t","interpolateMosaicPoints","changed","hasUncommittedChanges","putImageData","applyMosaicPointToCache","expectedSession","getOriginalImage","isImageLoaded","commitMosaicChanges","callbackContext","commitRequested","output","mimeToFormat","toSupportedMimeType","resolveMosaicOutputFormat","nextDataUrl","nextImage","fromURL","createFabricImageFromDataUrl","oldImage","newImage","oldRemoved","newAdded","sendObjectToBack","setOriginalImage","setCurrentImageMimeType","replaceBaseImage","after","captureSnapshot","before","getLastSnapshot","setLastSnapshot","pushMosaicHistory","updateInputs","updateUi","emitImageChanged","drainMosaicQueue","isApplying","buildCallbackContext","emitBusyChangeIfChanged","pendingCanvasPoints","catch","enqueueMosaicPoint","splice","requestMosaicCommit","enterMosaicMode","hideAllMaskLabels","prevDefaultCursor","defaultCursor","prevObjectStates","isPointerDown","setMosaicSession","currentSession","installMosaicHandlers","exitMosaicMode","detachCanvasHandlers","restoreObjectStates","resolveMultiplier","num","fallbackValue","readCanvasDimension","getterName","propertyName","canvasLike","getter","withMaskExportState","mergeMask","mutator","backups","withMaskStyleBackup","applyExportBakeInStyle","getCanvasObjects","withMasksHidden","isObjectOnCanvas","getImageDimensions","loadImageElement","Image","getJpegBackgroundColor","trim","hex","digits","test","commaAlpha","isZeroCssAlpha","slashAlpha","isTransparentCssColor","createColorValidationContext","fillStyle","firstSentinel","firstResolved","secondSentinel","secondResolved","resolveCanvasFillStyle","endsWith","numericPercent","parseFloat","numericAlpha","warnNoImageLoaded","exportImageBase64","canvasWithSelection","captureActiveObject","labelBackups","labelObject","wasOnCanvas","captureMaskLabelBackups","exportArea","resolveExportOptions","partialEdges","computeExportRegion","sourceWidth","sourceHeight","outputWidth","outputHeight","pixelCount","maxPixels","RangeError","assertExportPixelBudget","renderFormat","renderQuality","fabricOptions","renderCanvasToDataUrl","sealedFormat","edges","hasPartialEdges","canvasContext","pixels","sealPixel","fallbackX","fallbackY","fallbackIndex","fallbackAlpha","nextAlpha","sealPartialTransparentEdges","fillRect","convertDataUrlToOpaqueJpeg","restoreMaskLabelBackups","setActiveObject","restoreActiveObject","requestRender","exportImageFile","fileName","base64","finalDataUrl","sourceDataUrl","reencodeDataUrlAs","bytes","globalThis","atob","binary","buffer","ArrayBuffer","Uint8Array","i","charCodeAt","bufferCtor","Buffer","from","dataUrlToBytes","File","downloadImage","resolvedFileName","link","download","href","body","appendChild","click","removeChild","ViewportCache","measure","container","scrollbarSize","containerWidth","clientWidth","containerHeight","clientHeight","lastVisible","overflow","style","computedOverflow","computedOverflowX","computedOverflowY","view","defaultView","window","getComputedStyle","computed","overflowX","overflowY","normalizeOverflowValue","all","getContainerOverflowValues","scrollbar","normalizeScrollbarSize","canAutoScrollX","some","isAutoScrollableOverflow","canAutoScrollY","scrollWidth","scrollHeight","hasHorizontalScrollbar","OVERFLOW_EPSILON","measureContainerViewport","peek","measureScrollbarSize","doc","probe","position","visibility","pointerEvents","offsetWidth","offsetHeight","computeScrollableCanvasSize","contentWidth","contentHeight","viewport","viewportW","viewportH","hasHorizontal","hasVertical","effectiveW","effectiveH","nextHorizontal","nextVertical","applyCanvasDimensions","containerElement","integerWidth","integerHeight","setDimensions","imageBase64","loadOptions","bundle","placeholderHidden","placeholderElement","hidden","containerScrollTop","scrollTop","containerScrollLeft","scrollLeft","isImageLoadedToCanvas","getIsImageLoadedToCanvas","lastSnapshot","canvasJson","serializeCanvas","maskCounter","getCurrentScale","getCurrentRotation","getBaseImageScale","setPlaceholderVisible","decode","clearSource","hasNaturalImageDimensions","rejectImage","resolveImage","startImageDecode","loadSource","originalDataUrl","originalMimeType","toSupportedImageMimeType","downsampleDimensions","sourceMime","resampledImage","selectDownsampleMimeType","documentForCanvas","resampleImage","actualMimeType","maybeDownsample","fabricImage","layout","imageWidth","imageHeight","viewportCache","strategy","optionsCanvasWidth","optionsCanvasHeight","containerSize","fitScale","imageScale","imageLeft","imageTop","computeFitLayout","coverScale","scaledW","scaledH","nextHasHorizontal","nextHasVertical","canvasSize","computeCoverLayout","computeExpandLayout","computeLayout","scale","setBaseImageScale","setCurrentScale","setCurrentRotation","setIsImageLoadedToCanvas","preserveScroll","replayRollback","errorMessage","animateProps","props","guard","propCount","completed","settled","aborters","unregisterAborter","settle","abortAndSettle","duration","animationResult","animate","onChange","onComplete","handles","values","flatMap","handle","collectAnimationAborters","fail","TransformController","scaleImage","factor","imageObject","clamped","targetAbs","topLeft","computeTopLeftPoint","setPositionByOrigin","afterTransformSnap","saveCanvasState","rotateImage","degrees","centre","getCenterPoint","animationFailed","restoreOrigin","newTopLeft","resetImageTransform","setSuppressSaveState","first","getCoords","resolveNumeric","val","axis","pct","dim","coercePoint","pt","isStyleObject","warnInvalidMask","isResolvableNumericInput","validateFiniteField","fieldName","validatePositiveField","validateNonNegativeField","resolvePolygonPoints","resolvedPoints","area","polygonArea","createMask","_h","_j","_k","_l","_m","_o","_p","_q","_r","fabricModule","mergedConfig","safeDefaultConfig","defaultStyles","onCreate","fabricGenerator","configStyles","safeDefaultStyles","mergeMaskConfig","shapeType","shape","fields","rx","ry","validateNumericInputs","resolvedConfig","color","gap","previousMask","getLastMask","previousRight","getScaledWidth","polygonPoints","requiredWidth","requiredHeight","nextWidth","nextHeight","expandCanvasIfNeeded","generated","candidate","isFabricObjectLike","originProps","Ellipse","polygon","Polygon","deltaX","deltaY","Rect","nextId","setLastMask","removeAllMasks","removeLabelForMask","saveHistory","createLabelForMask","labelTextObject","indexForGetText","labelText","FabricText","syncMaskLabel","coords","tl","center","vx","vy","dist","sqrt","getMaskListDocument","DomBindings","resolveElementId","resolveDocument","bindIfExists","eventType","handler","getElementById","wrapped","registry","elementKey","removeAll","size","show","setAttribute","SUPPORTED_IMAGE_EXTENSIONS","gif","bmp","SUPPORTED_IMAGE_MIME_TYPES","resetFileInput","LAYOUT_EPSILON","INTERNAL_OPERATION_TOKEN","INTERNAL_ALLOW_DURING_ANIMATION_QUEUE","CROP_MODE_CONTROL_KEYS","CROP_MODE_ENABLED_KEYS","CROP_SESSION_ALLOWED_OPERATIONS","MOSAIC_MODE_CONTROL_KEYS","MOSAIC_MODE_ENABLED_KEYS","MOSAIC_SESSION_ALLOWED_OPERATIONS","IMAGE_EDITOR_OPERATIONS","ImageEditor","fabricModuleOrOptions","detected","fabricOrOptions","maybeOptions","globalScope","isFabricLoaded","globalFabric","readGlobalFabric","detectFabric","currentLayoutMode","currentMosaicConfig","rawDefaultLayoutMode","TypeError","operationGuard","animQueue","init","idMap","elements","canvasContainer","imagePlaceholder","scalePercentageInput","rotateLeftDegreesInput","rotateRightDegreesInput","rotateLeftButton","rotateRightButton","createMaskButton","removeSelectedMaskButton","removeAllMasksButton","mergeMasksButton","downloadImageButton","maskList","zoomInButton","zoomOutButton","resetImageTransformButton","undoButton","redoButton","imageInput","enterCropModeButton","applyCropButton","cancelCropButton","enterMosaicModeButton","exitMosaicModeButton","mosaicBrushSizeInput","mosaicBlockSizeInput","uploadArea","domBindings","canvasElement","initCanvas","transformController","buildTransformContext","bindDomEvents","updatePlaceholderStatus","containerId","parentElement","placeholderId","initialWidth","initialHeight","preserveObjectStacking","handleSelectionChanged","selected","onObjectEvent","bindElementIfExists","inputId","file","files","loadImageFile","removeSelectedMask","mergeMasks","inputEl","step","parsedStep","isNaN","enterCropMode","bindMosaicSizeInput","applyValue","parsed","setMosaicBrushSize","setMosaicBlockSize","mime","name","ext","inferImageMimeType","reader","FileReader","fileReaderResult","result","onabort","readAsDataURL","readFileAsDataUrl","loadImageInternal","canRunIdleOperation","getOperationContext","previousImage","hadMasks","getMasks","emitOptionCallback","loadImageContext","getRuntimeOptions","v","setPlaceholderVisibleImpl","loadImageImpl","lastMask","imageInfo","getImageInfo","emitMasksChanged","getInternalOperationToken","canRunDuringAnimationQueue","withInternalOperationOptions","withAnimationQueueBypass","cropSession","mosaicSession","isExpectedIdleGuardError","setLayoutMode","mode","isInternalOperation","internal","activeOperation","callbackName","args","displayWidth","displayHeight","rotation","getMaskCollectionSignature","join","getEditorState","hasImage","maskCount","isCropMode","isMosaicMode","lastEmittedIsBusy","buildSelection","selectedMasks","selectedMask","withSelectionChangeContext","previous","nextSelectionChangeContext","isSupportedImageMimeType","inferCurrentImageMimeType","setCanvasSizePx","widthPx","heightPx","alignObjectBoundingBoxToCanvasTopLeft","measureLayoutViewport","updateCanvasSizeToImageBounds","shouldNormalizeCanvasSizeAfterStateRestore","canvasW","canvasH","clipsImage","staleOverflowWidth","staleOverflowHeight","expectedW","expectedH","settleFitCoverScrollbarsAfterStateRestore","clientW","clientH","scrollW","scrollH","hasVerticalScrollbar","nudgeWidth","nudgeHeight","captureImageDisplayGeometry","imageDisplayWidth","imageDisplayHeight","restoreMergedImageDisplayGeometry","geometry","sourceW","sourceH","captureSnapshotInternal","n","saveStateInternal","suppress","shouldSuppressSaveState","controller","job","finally","refreshUiAfterQueuedAnimation","loadFromStateInternal","activeRestoreOperation","activeStateRestoreOperation","previousMaskSignature","restoredState","loadFromStateImpl","restoredMasks","activeMask","activeObj","getActiveMaskForSnapshot","saveStateImpl","restoreActiveMaskAfterSnapshot","maskToRestore","showLabelForMask","updateMaskListSelection","createMaskContext","buildCreateMaskContext","createMaskImpl","removeMaskContext","buildRemoveMaskContext","active","removeSelectedMaskImpl","removeAllMasksImpl","buildMaskLabelContext","objs","l","buildMaskListContext","getListElementId","onMaskSelected","listId","listEl","innerHTML","listItemElement","className","textContent","dataset","onclick","renderMaskList","selectedId","querySelectorAll","item","isSelected","classList","toggle","operationToken","mergeMasksContext","buildMergeMasksContext","beforeSnapshot","preScrollTop","preScrollLeft","merged","removeAllMasksNoHistory","afterSnapshot","scrollError","mergeMasksImpl","exportContext","buildExportServiceContext","downloadImageImpl","exportImageBase64Impl","exportImageFileImpl","snapshot","labeledMasks","enterMosaicModeImpl","buildMosaicControllerContext","exitMosaicModeImpl","setMosaicConfig","applyMosaicConfigPatch","resetMosaicConfig","nextConfig","invalidFields","invalid","getInvalidMosaicConfigFields","isInternal","imageBounds","boundsLeft","boundsTop","maxCropWidth","maxCropHeight","rectLeft","rectTop","configuredMinWidth","configuredMinHeight","minCropWidth","minCropHeight","allowRotation","lockScalingFlip","setControlVisible","hideMasks","handleCropRectModified","cropWidth","cropHeight","nextScaleX","nextScaleY","scaledWidth","scaledHeight","maxLeft","maxTop","nextLeft","nextTop","enterCropModeImpl","buildCropControllerContext","cancelCropImpl","cropControllerContext","applyCropImpl","s","scaleId","scaleInputElement","mosaicConfig","mosaicBrushSizeInputId","brushInput","mosaicBlockSizeInputId","blockInput","hasMasks","hasSelectedMask","isDefaultTransform","isInCropMode","isInMosaicMode","isMosaicApplying","setControlEnabled","isEnabled","controlElement","recordElementOriginalState","disabled","originalAria","elementOriginalAriaDisabledMap","removeAttribute","elementOriginalPointerEventsMap","getAttribute","elementOriginalDisabledMap","restoreElementOriginalStates","dispose"],"mappings":"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"}
|