@bensitu/image-editor 2.2.0 → 2.3.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 +152 -96
- package/dist/cjs/index.cjs +534 -139
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/core/default-options.js +8 -6
- package/dist/esm/core/default-options.js.map +1 -1
- package/dist/esm/core/public-types.js.map +1 -1
- package/dist/esm/core/state-serializer.js +8 -0
- package/dist/esm/core/state-serializer.js.map +1 -1
- package/dist/esm/crop/crop-controller.js +218 -10
- package/dist/esm/crop/crop-controller.js.map +1 -1
- package/dist/esm/export/export-format.js.map +1 -1
- package/dist/esm/export/export-service.js +57 -56
- package/dist/esm/export/export-service.js.map +1 -1
- package/dist/esm/image/image-loader.js +2 -2
- package/dist/esm/image/image-loader.js.map +1 -1
- package/dist/esm/image/transform-controller.js +42 -0
- package/dist/esm/image/transform-controller.js.map +1 -1
- package/dist/esm/image-editor.js +139 -14
- package/dist/esm/image-editor.js.map +1 -1
- package/dist/esm/utils/file.js +10 -0
- package/dist/esm/utils/file.js.map +1 -1
- package/dist/types/core/default-options.d.ts.map +1 -1
- package/dist/types/core/public-types.d.ts +68 -50
- package/dist/types/core/public-types.d.ts.map +1 -1
- package/dist/types/core/state-serializer.d.ts +5 -1
- package/dist/types/core/state-serializer.d.ts.map +1 -1
- package/dist/types/crop/crop-controller.d.ts +12 -7
- package/dist/types/crop/crop-controller.d.ts.map +1 -1
- package/dist/types/export/export-format.d.ts +7 -10
- package/dist/types/export/export-format.d.ts.map +1 -1
- package/dist/types/export/export-service.d.ts +27 -32
- package/dist/types/export/export-service.d.ts.map +1 -1
- package/dist/types/export/overlay-merge-service.d.ts +3 -3
- package/dist/types/export/overlay-merge-service.d.ts.map +1 -1
- package/dist/types/image/image-loader.d.ts +5 -5
- package/dist/types/image/image-loader.d.ts.map +1 -1
- package/dist/types/image/transform-controller.d.ts +14 -7
- package/dist/types/image/transform-controller.d.ts.map +1 -1
- package/dist/types/image-editor.d.ts +22 -12
- 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/utils/file.d.ts +13 -0
- package/dist/types/utils/file.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/export/export-format.js","../esm/core/default-options.js","../esm/core/operation-guard.js","../esm/core/public-types.js","../esm/core/editor-object-kind.js","../esm/core/state-serializer.js","../esm/history/history-manager.js","../esm/fabric/fabric-adapter.js","../esm/annotation/annotation-lock.js","../esm/annotation/annotation-style.js","../esm/annotation/annotation-manager.js","../esm/core/layer-order.js","../esm/utils/canvas-region.js","../esm/utils/number.js","../esm/utils/pointer.js","../esm/annotation/text-controller.js","../esm/annotation/draw-controller.js","../esm/core/errors.js","../esm/mask/mask-style.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/utils/image-element-loader.js","../esm/export/overlay-merge-service.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/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 mergeMasksByDefault: true,\n mergeAnnotationsByDefault: 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 textAnnotationName: 'text',\n drawAnnotationName: 'draw',\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 onAnnotationsChanged: 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});\nexport const DEFAULT_TEXT_ANNOTATION_CONFIG = Object.freeze({\n text: 'Text',\n left: undefined,\n top: undefined,\n width: 200,\n fontSize: 32,\n fontFamily: 'sans-serif',\n fontWeight: 'normal',\n fill: '#ff0000',\n backgroundColor: 'rgba(255,255,255,0)',\n textAlign: 'left',\n angle: 0,\n selectable: true,\n evented: true,\n editable: true,\n enterEditing: true,\n annotationHidden: false,\n annotationLocked: false,\n styles: Object.freeze({}),\n});\nexport const DEFAULT_DRAW_CONFIG = Object.freeze({\n brushSize: 8,\n color: '#ff0000',\n opacity: 1,\n lineCap: 'round',\n lineJoin: 'round',\n selectable: true,\n evented: true,\n annotationHidden: false,\n annotationLocked: false,\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 'mergeMasksByDefault',\n 'mergeAnnotationsByDefault',\n 'defaultMaskWidth',\n 'defaultMaskHeight',\n 'defaultMaskConfig',\n 'maskRotatable',\n 'maskLabelOnSelect',\n 'maskLabelOffset',\n 'maskName',\n 'textAnnotationName',\n 'drawAnnotationName',\n 'groupSelection',\n 'showPlaceholder',\n 'initialImageBase64',\n 'defaultDownloadFileName',\n 'onImageLoadStart',\n 'onImageLoaded',\n 'onImageCleared',\n 'onImageChanged',\n 'onBusyChange',\n 'onEditorDisposed',\n 'onMasksChanged',\n 'onAnnotationsChanged',\n 'onSelectionChange',\n 'onError',\n 'onWarning',\n 'label',\n 'crop',\n 'defaultMosaicConfig',\n 'defaultTextConfig',\n 'defaultDrawConfig',\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 cloneResolvedTextAnnotationConfig(config) {\n return {\n ...config,\n styles: { ...config.styles },\n };\n}\nexport function cloneResolvedDrawConfig(config) {\n return { ...config };\n}\nfunction normalizeTextAlign(value, fallback) {\n return value === 'left' || value === 'center' || value === 'right' || value === 'justify'\n ? value\n : fallback;\n}\nfunction normalizePositiveNumber(value, fallback) {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;\n}\nfunction normalizeBoolean(value, fallback) {\n return typeof value === 'boolean' ? value : fallback;\n}\nfunction normalizeString(value, fallback) {\n return typeof value === 'string' ? value : fallback;\n}\nfunction normalizeTextLeftTop(value) {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\nfunction normalizeTextboxStyles(value) {\n if (!isConfigObject(value))\n return {};\n return { ...value };\n}\nexport function mergeTextAnnotationConfigPatch(current, patch, fallback = current) {\n const raw = isConfigObject(patch) ? patch : {};\n const next = cloneResolvedTextAnnotationConfig(current);\n if (hasOwn(raw, 'text'))\n next.text = normalizeString(raw.text, fallback.text);\n if (hasOwn(raw, 'left'))\n next.left = normalizeTextLeftTop(raw.left);\n if (hasOwn(raw, 'top'))\n next.top = normalizeTextLeftTop(raw.top);\n if (hasOwn(raw, 'width'))\n next.width = normalizePositiveNumber(raw.width, fallback.width);\n if (hasOwn(raw, 'fontSize')) {\n next.fontSize = normalizePositiveNumber(raw.fontSize, fallback.fontSize);\n }\n if (hasOwn(raw, 'fontFamily')) {\n next.fontFamily = normalizeString(raw.fontFamily, fallback.fontFamily);\n }\n if (hasOwn(raw, 'fontWeight')) {\n next.fontWeight =\n typeof raw.fontWeight === 'string' || typeof raw.fontWeight === 'number'\n ? raw.fontWeight\n : fallback.fontWeight;\n }\n if (hasOwn(raw, 'fill'))\n next.fill = normalizeString(raw.fill, fallback.fill);\n if (hasOwn(raw, 'backgroundColor')) {\n next.backgroundColor = normalizeString(raw.backgroundColor, fallback.backgroundColor);\n }\n if (hasOwn(raw, 'textAlign'))\n next.textAlign = normalizeTextAlign(raw.textAlign, fallback.textAlign);\n if (hasOwn(raw, 'angle'))\n next.angle = normalizeFiniteNumber(raw.angle, fallback.angle);\n if (hasOwn(raw, 'selectable'))\n next.selectable = normalizeBoolean(raw.selectable, fallback.selectable);\n if (hasOwn(raw, 'evented'))\n next.evented = normalizeBoolean(raw.evented, fallback.evented);\n if (hasOwn(raw, 'editable'))\n next.editable = normalizeBoolean(raw.editable, fallback.editable);\n if (hasOwn(raw, 'enterEditing')) {\n next.enterEditing = normalizeBoolean(raw.enterEditing, fallback.enterEditing);\n }\n if (hasOwn(raw, 'annotationHidden')) {\n next.annotationHidden = normalizeBoolean(raw.annotationHidden, fallback.annotationHidden);\n }\n if (hasOwn(raw, 'annotationLocked')) {\n next.annotationLocked = normalizeBoolean(raw.annotationLocked, fallback.annotationLocked);\n }\n if (hasOwn(raw, 'styles')) {\n next.styles = {\n ...next.styles,\n ...normalizeTextboxStyles(raw.styles),\n };\n }\n return next;\n}\nexport function normalizeTextAnnotationConfig(input, fallback) {\n if (!isConfigObject(input))\n return cloneResolvedTextAnnotationConfig(fallback);\n return mergeTextAnnotationConfigPatch(fallback, input);\n}\nfunction normalizeLineCap(value, fallback) {\n return value === 'butt' || value === 'round' || value === 'square' ? value : fallback;\n}\nfunction normalizeLineJoin(value, fallback) {\n return value === 'bevel' || value === 'round' || value === 'miter' ? value : fallback;\n}\nfunction normalizeOpacity(value, fallback) {\n if (typeof value !== 'number' || !Number.isFinite(value))\n return fallback;\n return Math.max(0, Math.min(1, value));\n}\nexport function mergeDrawConfigPatch(current, patch, fallback = current) {\n const raw = isConfigObject(patch) ? patch : {};\n const next = cloneResolvedDrawConfig(current);\n if (hasOwn(raw, 'brushSize')) {\n next.brushSize = normalizePositiveNumber(raw.brushSize, fallback.brushSize);\n }\n if (hasOwn(raw, 'color'))\n next.color = normalizeString(raw.color, fallback.color);\n if (hasOwn(raw, 'opacity'))\n next.opacity = normalizeOpacity(raw.opacity, fallback.opacity);\n if (hasOwn(raw, 'lineCap'))\n next.lineCap = normalizeLineCap(raw.lineCap, fallback.lineCap);\n if (hasOwn(raw, 'lineJoin'))\n next.lineJoin = normalizeLineJoin(raw.lineJoin, fallback.lineJoin);\n if (hasOwn(raw, 'selectable'))\n next.selectable = normalizeBoolean(raw.selectable, fallback.selectable);\n if (hasOwn(raw, 'evented'))\n next.evented = normalizeBoolean(raw.evented, fallback.evented);\n if (hasOwn(raw, 'annotationHidden')) {\n next.annotationHidden = normalizeBoolean(raw.annotationHidden, fallback.annotationHidden);\n }\n if (hasOwn(raw, 'annotationLocked')) {\n next.annotationLocked = normalizeBoolean(raw.annotationLocked, fallback.annotationLocked);\n }\n return next;\n}\nexport function normalizeDrawConfig(input, fallback) {\n if (!isConfigObject(input))\n return cloneResolvedDrawConfig(fallback);\n return mergeDrawConfigPatch(fallback, input);\n}\nexport function areResolvedTextAnnotationConfigsEqual(left, right) {\n return JSON.stringify(left) === JSON.stringify(right);\n}\nexport function areResolvedDrawConfigsEqual(left, right) {\n return (left.brushSize === right.brushSize &&\n left.color === right.color &&\n left.opacity === right.opacity &&\n left.lineCap === right.lineCap &&\n left.lineJoin === right.lineJoin &&\n left.selectable === right.selectable &&\n left.evented === right.evented &&\n left.annotationHidden === right.annotationHidden &&\n left.annotationLocked === right.annotationLocked);\n}\nexport function getInvalidTextAnnotationConfigFields(input) {\n const raw = isConfigObject(input) ? input : {};\n const invalid = [];\n if (hasOwn(raw, 'text') && typeof raw.text !== 'string')\n invalid.push('text');\n if (hasOwn(raw, 'width') && !isFiniteNumber(raw.width))\n invalid.push('width');\n if (hasOwn(raw, 'fontSize') && !isFiniteNumber(raw.fontSize))\n invalid.push('fontSize');\n if (hasOwn(raw, 'fontFamily') && typeof raw.fontFamily !== 'string')\n invalid.push('fontFamily');\n if (hasOwn(raw, 'fill') && typeof raw.fill !== 'string') {\n invalid.push('fill');\n }\n return invalid;\n}\nexport function getInvalidDrawConfigFields(input) {\n const raw = isConfigObject(input) ? input : {};\n const invalid = [];\n if (hasOwn(raw, 'brushSize') && !isFiniteNumber(raw.brushSize))\n invalid.push('brushSize');\n if (hasOwn(raw, 'color') && typeof raw.color !== 'string')\n invalid.push('color');\n if (hasOwn(raw, 'opacity') && !isFiniteNumber(raw.opacity))\n invalid.push('opacity');\n return invalid;\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' ||\n key === 'crop' ||\n key === 'defaultMosaicConfig' ||\n key === 'defaultTextConfig' ||\n key === 'defaultDrawConfig') {\n continue;\n }\n if (key === 'onImageLoadStart' ||\n key === 'onImageLoaded' ||\n key === 'onImageCleared' ||\n key === 'onImageChanged' ||\n key === 'onBusyChange' ||\n key === 'onEditorDisposed' ||\n key === 'onMasksChanged' ||\n key === 'onAnnotationsChanged' ||\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.onAnnotationsChanged = normalizeCallback(raw.onAnnotationsChanged);\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 const defaultTextConfig = normalizeTextAnnotationConfig(raw.defaultTextConfig, DEFAULT_TEXT_ANNOTATION_CONFIG);\n Object.freeze(defaultTextConfig.styles);\n Object.freeze(defaultTextConfig);\n const defaultDrawConfig = normalizeDrawConfig(raw.defaultDrawConfig, DEFAULT_DRAW_CONFIG);\n Object.freeze(defaultDrawConfig);\n return Object.freeze({\n ...resolved,\n label,\n crop,\n defaultMosaicConfig,\n defaultTextConfig,\n defaultDrawConfig,\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 isBaseImageObject(object) {\n return (!!object &&\n typeof object === 'object' &&\n object.editorObjectKind === 'baseImage');\n}\nexport function isMaskObject(object) {\n const candidate = object;\n return (!!candidate &&\n candidate.editorObjectKind === 'mask' &&\n typeof candidate.maskId === 'number' &&\n typeof candidate.maskUid === 'string' &&\n typeof candidate.maskName === 'string');\n}\nexport function isAnnotationObject(object) {\n const candidate = object;\n return (!!candidate &&\n candidate.editorObjectKind === 'annotation' &&\n typeof candidate.annotationId === 'number' &&\n typeof candidate.annotationType === 'string' &&\n typeof candidate.annotationName === 'string');\n}\nexport function isTextAnnotationObject(object) {\n return isAnnotationObject(object) && object.annotationType === 'text';\n}\nexport function isDrawAnnotationObject(object) {\n return isAnnotationObject(object) && object.annotationType === 'draw';\n}\nexport function isSessionObject(object) {\n const candidate = object;\n return (!!candidate &&\n candidate.editorObjectKind === 'session' &&\n typeof candidate.sessionObjectType === 'string');\n}\nexport function isEditableOverlayObject(object) {\n return isMaskObject(object) || isAnnotationObject(object);\n}\n//# sourceMappingURL=public-types.js.map","export function markBaseImageObject(image) {\n const baseImage = image;\n baseImage.editorObjectKind = 'baseImage';\n return baseImage;\n}\nexport function markMaskObject(object, meta) {\n const mask = object;\n mask.editorObjectKind = 'mask';\n mask.maskId = meta.maskId;\n mask.maskUid = meta.maskUid;\n mask.maskName = meta.maskName;\n mask.originalAlpha = meta.originalAlpha;\n if ('originalStroke' in meta)\n mask.originalStroke = meta.originalStroke;\n if (typeof meta.originalStrokeWidth === 'number') {\n mask.originalStrokeWidth = meta.originalStrokeWidth;\n }\n return mask;\n}\nexport function markAnnotationObject(object, meta) {\n var _a, _b;\n const annotation = object;\n annotation.editorObjectKind = 'annotation';\n annotation.annotationId = meta.annotationId;\n annotation.annotationType = meta.annotationType;\n annotation.annotationName = meta.annotationName;\n annotation.annotationHidden = (_a = meta.annotationHidden) !== null && _a !== void 0 ? _a : false;\n annotation.annotationLocked = (_b = meta.annotationLocked) !== null && _b !== void 0 ? _b : false;\n return annotation;\n}\nexport function markSessionObject(object, sessionObjectType) {\n const sessionObject = object;\n sessionObject.editorObjectKind = 'session';\n sessionObject.sessionObjectType = sessionObjectType;\n return sessionObject;\n}\n//# sourceMappingURL=editor-object-kind.js.map","import { isAnnotationObject, isBaseImageObject, isMaskObject } from './public-types.js';\nimport { markAnnotationObject, markBaseImageObject, markMaskObject } from './editor-object-kind.js';\nexport const SNAPSHOT_CUSTOM_KEYS = [\n 'editorObjectKind',\n 'sessionObjectType',\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 'annotationId',\n 'annotationType',\n 'annotationName',\n 'annotationHidden',\n 'annotationLocked',\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.editorObjectKind === 'string') {\n jsonObject.editorObjectKind = liveObject.editorObjectKind;\n }\n if (typeof liveObject.sessionObjectType === 'string') {\n jsonObject.sessionObjectType = liveObject.sessionObjectType;\n }\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 if (typeof liveObject.annotationId === 'number') {\n jsonObject.annotationId = liveObject.annotationId;\n }\n if (typeof liveObject.annotationType === 'string') {\n jsonObject.annotationType = liveObject.annotationType;\n }\n if (typeof liveObject.annotationName === 'string') {\n jsonObject.annotationName = liveObject.annotationName;\n }\n if (typeof liveObject.annotationHidden === 'boolean') {\n jsonObject.annotationHidden = liveObject.annotationHidden;\n }\n if (typeof liveObject.annotationLocked === 'boolean') {\n jsonObject.annotationLocked = liveObject.annotationLocked;\n }\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 const activeAnnotationId = activeObject && isAnnotationObject(activeObject)\n ? activeObject.annotationId\n : typeof input.activeAnnotationId === 'number'\n ? input.activeAnnotationId\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.editorObjectKind !== 'session' &&\n o.isCropRect !== true &&\n o.maskLabel !== true &&\n 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 activeObjectKind: activeMaskId !== null ? 'mask' : activeAnnotationId !== null ? 'annotation' : null,\n };\n if (activeMaskId !== null)\n jsonObj._editorState.activeMaskId = activeMaskId;\n if (activeAnnotationId !== null) {\n jsonObj._editorState.activeAnnotationId = activeAnnotationId;\n }\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 restoreEditorObjectPropsFromJson(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 &&\n json._editorState &&\n typeof json._editorState.activeAnnotationId === 'number') {\n editorState.activeAnnotationId = json._editorState.activeAnnotationId;\n }\n if (editorState && json._editorState && 'activeObjectKind' in json._editorState) {\n const kind = json._editorState.activeObjectKind;\n editorState.activeObjectKind =\n kind === 'mask' || kind === 'annotation' || kind === null ? kind : null;\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 maxAnnotationId = objects\n .filter(isAnnotationObject)\n .reduce((max, annotationObject) => Math.max(max, annotationObject.annotationId), 0);\n const masks = objects.filter(isMaskObject);\n const annotations = objects.filter(isAnnotationObject);\n const originalImage = (_b = objects.find(isBaseImageObject)) !== null && _b !== void 0 ? _b : null;\n return {\n editorState,\n maxMaskId,\n maxAnnotationId,\n originalImage,\n objects,\n masks,\n annotations,\n jsonString,\n };\n}\nfunction restoreEditorObjectPropsFromJson(canvasObjs, jsonObjs) {\n var _a, _b, _c, _d;\n jsonObjs.forEach((jObj, index) => {\n const canvasObj = canvasObjs[index];\n if (!canvasObj)\n return;\n if (jObj.editorObjectKind === 'baseImage') {\n markBaseImageObject(canvasObj);\n return;\n }\n if (jObj.editorObjectKind === 'annotation' &&\n typeof jObj.annotationId === 'number' &&\n typeof jObj.annotationType === 'string' &&\n typeof jObj.annotationName === 'string') {\n markAnnotationObject(canvasObj, {\n annotationId: jObj.annotationId,\n annotationType: jObj.annotationType === 'draw' ? 'draw' : 'text',\n annotationName: jObj.annotationName,\n annotationHidden: typeof jObj.annotationHidden === 'boolean' ? jObj.annotationHidden : false,\n annotationLocked: typeof jObj.annotationLocked === 'boolean' ? jObj.annotationLocked : false,\n });\n return;\n }\n if (jObj.editorObjectKind === 'session' && typeof jObj.sessionObjectType === 'string') {\n canvasObj.editorObjectKind = 'session';\n canvasObj.sessionObjectType = jObj.sessionObjectType;\n }\n });\n const consumedCanvasIndexes = new Set();\n for (const jObj of jsonObjs) {\n if (jObj.editorObjectKind !== 'mask' || 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 const originalStroke = 'originalStroke' in jObj\n ? jObj.originalStroke\n : undefined;\n markMaskObject(maskObject, {\n maskId: jObj.maskId,\n maskUid: typeof jObj.maskUid === 'string' ? jObj.maskUid : `mask-${jObj.maskId}`,\n maskName: typeof jObj.maskName === 'string' ? jObj.maskName : '',\n originalAlpha: typeof jObj.originalAlpha === 'number'\n ? jObj.originalAlpha\n : ((_d = maskObject.opacity) !== null && _d !== void 0 ? _d : 0.5),\n originalStroke,\n originalStrokeWidth: typeof jObj.originalStrokeWidth === 'number' ? jObj.originalStrokeWidth : undefined,\n });\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 async execute(command) {\n await 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","export function isAnnotationLocked(annotation) {\n return annotation.annotationLocked === true;\n}\nexport function isAnnotationUnlocked(annotation) {\n return !isAnnotationLocked(annotation);\n}\n//# sourceMappingURL=annotation-lock.js.map","import { isTextAnnotationObject, } from '../core/public-types.js';\nimport { isAnnotationLocked } from './annotation-lock.js';\nfunction setObjectProps(object, props) {\n try {\n object.set(props);\n }\n catch {\n Object.assign(object, props);\n }\n}\nfunction syncTextEditability(annotation, editable) {\n const textObject = annotation;\n textObject.editable = editable;\n}\nexport function syncAnnotationRuntimeState(annotation) {\n var _a;\n const hidden = annotation.annotationHidden === true;\n const locked = isAnnotationLocked(annotation);\n setObjectProps(annotation, {\n visible: !hidden,\n selectable: locked ? false : true,\n evented: locked ? false : true,\n hasControls: !locked,\n lockMovementX: locked,\n lockMovementY: locked,\n lockScalingX: locked,\n lockScalingY: locked,\n lockRotation: locked,\n });\n if (!locked) {\n setObjectProps(annotation, {\n selectable: true,\n evented: true,\n hasControls: true,\n lockMovementX: false,\n lockMovementY: false,\n lockScalingX: false,\n lockScalingY: false,\n lockRotation: false,\n });\n }\n if (isTextAnnotationObject(annotation)) {\n syncTextEditability(annotation, !locked);\n }\n (_a = annotation.setCoords) === null || _a === void 0 ? void 0 : _a.call(annotation);\n}\nexport function syncAnnotationRuntimeStates(annotations) {\n annotations.forEach(syncAnnotationRuntimeState);\n}\n//# sourceMappingURL=annotation-style.js.map","import { isAnnotationObject, isDrawAnnotationObject, isTextAnnotationObject, } from '../core/public-types.js';\nimport { syncAnnotationRuntimeState } from './annotation-style.js';\nimport { isAnnotationLocked, isAnnotationUnlocked } from './annotation-lock.js';\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 getActiveSelectionObjects(canvas) {\n const active = canvas.getActiveObject();\n if (!active)\n return [];\n if (!isActiveSelectionObject(active))\n return [active];\n const getObjects = active.getObjects;\n return typeof getObjects === 'function' ? getObjects.call(active) : [];\n}\nexport function getAnnotations(canvas) {\n return canvas.getObjects().filter(isAnnotationObject).slice();\n}\nexport function getSelectedAnnotations(canvas) {\n return getActiveSelectionObjects(canvas).filter(isAnnotationObject);\n}\nfunction snapshotAnnotation(annotation) {\n return JSON.stringify({\n text: annotation.text,\n fontSize: annotation.fontSize,\n fontFamily: annotation.fontFamily,\n fontWeight: annotation.fontWeight,\n fill: annotation.fill,\n backgroundColor: annotation.backgroundColor,\n textAlign: annotation.textAlign,\n width: annotation.width,\n stroke: annotation.stroke,\n strokeWidth: annotation.strokeWidth,\n opacity: annotation.opacity,\n visible: annotation.visible,\n selectable: annotation.selectable,\n evented: annotation.evented,\n annotationHidden: annotation.annotationHidden,\n annotationLocked: annotation.annotationLocked,\n });\n}\nfunction setAnnotationProps(annotation, props) {\n try {\n annotation.set(props);\n }\n catch {\n Object.assign(annotation, props);\n }\n}\nfunction updateTextAnnotation(annotation, config) {\n const props = {};\n const raw = config;\n if (typeof raw.text === 'string')\n props.text = raw.text;\n if (typeof raw.fontSize === 'number' && Number.isFinite(raw.fontSize) && raw.fontSize > 0) {\n props.fontSize = raw.fontSize;\n }\n if (typeof raw.fontFamily === 'string')\n props.fontFamily = raw.fontFamily;\n if (typeof raw.fontWeight === 'string' || typeof raw.fontWeight === 'number') {\n props.fontWeight = raw.fontWeight;\n }\n if (typeof raw.fill === 'string')\n props.fill = raw.fill;\n if (typeof raw.backgroundColor === 'string')\n props.backgroundColor = raw.backgroundColor;\n if (raw.textAlign === 'left' ||\n raw.textAlign === 'center' ||\n raw.textAlign === 'right' ||\n raw.textAlign === 'justify') {\n props.textAlign = raw.textAlign;\n }\n if (typeof raw.width === 'number' && Number.isFinite(raw.width) && raw.width > 0) {\n props.width = raw.width;\n }\n if (Object.keys(props).length > 0)\n setAnnotationProps(annotation, props);\n}\nfunction updateDrawAnnotation(annotation, config) {\n const props = {};\n const raw = config;\n if (typeof raw.stroke === 'string')\n props.stroke = raw.stroke;\n if (typeof raw.strokeWidth === 'number' &&\n Number.isFinite(raw.strokeWidth) &&\n raw.strokeWidth > 0) {\n props.strokeWidth = raw.strokeWidth;\n }\n if (typeof raw.opacity === 'number' && Number.isFinite(raw.opacity)) {\n props.opacity = Math.max(0, Math.min(1, raw.opacity));\n }\n if (Object.keys(props).length > 0)\n setAnnotationProps(annotation, props);\n}\nexport function updateAnnotationObject(annotation, config) {\n const before = snapshotAnnotation(annotation);\n const raw = config;\n if (typeof raw.annotationHidden === 'boolean') {\n annotation.annotationHidden = raw.annotationHidden;\n }\n if (typeof raw.annotationLocked === 'boolean') {\n annotation.annotationLocked = raw.annotationLocked;\n }\n const lockedAfter = isAnnotationLocked(annotation);\n if (!lockedAfter) {\n if (typeof raw.selectable === 'boolean')\n annotation.selectable = raw.selectable;\n if (typeof raw.evented === 'boolean')\n annotation.evented = raw.evented;\n if (isTextAnnotationObject(annotation))\n updateTextAnnotation(annotation, config);\n if (isDrawAnnotationObject(annotation))\n updateDrawAnnotation(annotation, config);\n }\n syncAnnotationRuntimeState(annotation);\n return snapshotAnnotation(annotation) !== before;\n}\nexport function updateAnnotation(context, annotationId, config) {\n const target = getAnnotations(context.canvas).find((annotation) => annotation.annotationId === annotationId);\n if (!target)\n return false;\n const changed = updateAnnotationObject(target, config);\n if (!changed)\n return false;\n context.canvas.requestRenderAll();\n context.saveCanvasState();\n context.updateUi();\n return true;\n}\nexport function updateSelectedAnnotation(context, config) {\n const selectedAnnotations = getSelectedAnnotations(context.canvas);\n if (selectedAnnotations.length === 0)\n return false;\n const changed = selectedAnnotations\n .map((annotation) => updateAnnotationObject(annotation, config))\n .some(Boolean);\n if (!changed)\n return false;\n context.canvas.requestRenderAll();\n context.saveCanvasState();\n context.updateUi();\n return true;\n}\nexport function removeAnnotationObjects(context, objects, options = {}) {\n const force = options.force === true;\n const removable = objects.filter((annotation) => force || isAnnotationUnlocked(annotation));\n if (removable.length === 0)\n return 0;\n for (const annotation of removable) {\n context.canvas.remove(annotation);\n }\n context.canvas.discardActiveObject();\n context.canvas.renderAll();\n if (options.saveHistory !== false)\n context.saveCanvasState();\n context.updateUi();\n return removable.length;\n}\nexport function removeSelectedAnnotation(context) {\n return removeAnnotationObjects(context, getSelectedAnnotations(context.canvas));\n}\nexport function removeAllAnnotations(context, options = {}) {\n return removeAnnotationObjects(context, getAnnotations(context.canvas), options);\n}\nfunction getAnnotationListDocument(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 renderAnnotationList(context) {\n const listId = context.getListElementId();\n if (!listId)\n return;\n const ownerDocument = getAnnotationListDocument(context);\n const listEl = ownerDocument.getElementById(listId);\n if (!listEl || !context.canvas)\n return;\n listEl.innerHTML = '';\n const canvas = context.canvas;\n getAnnotations(canvas).forEach((annotation) => {\n const item = ownerDocument.createElement('li');\n item.className = 'list-group-item annotation-item';\n item.textContent = annotation.annotationName;\n item.dataset.annotationId = String(annotation.annotationId);\n item.onclick = () => {\n const id = Number(item.dataset.annotationId);\n if (!Number.isFinite(id))\n return;\n const target = getAnnotations(canvas).find((candidate) => candidate.annotationId === id);\n if (!target)\n return;\n canvas.setActiveObject(target);\n context.onAnnotationSelected(target);\n };\n listEl.appendChild(item);\n });\n}\nexport function updateAnnotationListSelection(context, selectedAnnotation) {\n const listId = context.getListElementId();\n if (!listId)\n return;\n const listEl = getAnnotationListDocument(context).getElementById(listId);\n if (!listEl)\n return;\n const selectedId = selectedAnnotation ? String(selectedAnnotation.annotationId) : null;\n listEl.querySelectorAll('.annotation-item').forEach((item) => {\n item.classList.toggle('active', selectedId !== null && item.dataset.annotationId === selectedId);\n });\n}\n//# sourceMappingURL=annotation-manager.js.map","import { isBaseImageObject, isEditableOverlayObject, isSessionObject, } from './public-types.js';\nfunction isLegacySessionObject(object) {\n const candidate = object;\n return (candidate.isCropRect === true ||\n candidate.maskLabel === true ||\n candidate.isMosaicPreview === true);\n}\nfunction moveObjectTo(canvas, object, index) {\n const canvasWithLayerApi = canvas;\n if (typeof canvasWithLayerApi.moveObjectTo === 'function') {\n canvasWithLayerApi.moveObjectTo(object, index);\n return;\n }\n try {\n canvas.remove(object);\n canvas.insertAt(index, object);\n }\n catch {\n canvas.add(object);\n }\n}\nfunction ensureOnCanvas(canvas, object) {\n if (!canvas.getObjects().includes(object)) {\n canvas.add(object);\n }\n}\nfunction withoutObject(canvas, object) {\n return canvas.getObjects().filter((candidate) => candidate !== object);\n}\nfunction findFirstSessionIndex(objects) {\n return objects.findIndex((object) => isSessionObject(object) || isLegacySessionObject(object));\n}\nfunction getOrderedGroups(canvas) {\n const baseImages = [];\n const overlays = [];\n const sessions = [];\n const others = [];\n for (const object of canvas.getObjects()) {\n if (isBaseImageObject(object)) {\n baseImages.push(object);\n }\n else if (isEditableOverlayObject(object)) {\n overlays.push(object);\n }\n else if (isSessionObject(object) || isLegacySessionObject(object)) {\n sessions.push(object);\n }\n else {\n others.push(object);\n }\n }\n return { baseImages, overlays, sessions, others };\n}\nexport function normalizeLayerOrder(canvas) {\n const groups = getOrderedGroups(canvas);\n const ordered = [\n ...groups.baseImages,\n ...groups.others,\n ...groups.overlays,\n ...groups.sessions,\n ];\n ordered.forEach((object, index) => {\n moveObjectTo(canvas, object, index);\n });\n}\nexport function placeBaseImageObject(canvas, image) {\n ensureOnCanvas(canvas, image);\n const targetIndex = withoutObject(canvas, image).filter(isBaseImageObject).length;\n moveObjectTo(canvas, image, targetIndex);\n}\nexport function placeMaskObject(canvas, mask) {\n ensureOnCanvas(canvas, mask);\n const objects = withoutObject(canvas, mask);\n const firstSessionIndex = findFirstSessionIndex(objects);\n moveObjectTo(canvas, mask, firstSessionIndex === -1 ? objects.length : firstSessionIndex);\n}\nexport function placeAnnotationObject(canvas, annotation) {\n ensureOnCanvas(canvas, annotation);\n const objects = withoutObject(canvas, annotation);\n const firstSessionIndex = findFirstSessionIndex(objects);\n moveObjectTo(canvas, annotation, firstSessionIndex === -1 ? objects.length : firstSessionIndex);\n}\nexport function placeSessionObject(canvas, sessionObject) {\n ensureOnCanvas(canvas, sessionObject);\n moveObjectTo(canvas, sessionObject, withoutObject(canvas, sessionObject).length);\n}\nexport function getEditableOverlayRange(canvas) {\n const objects = canvas.getObjects();\n const overlayIndexes = objects\n .map((object, index) => ({ object, index }))\n .filter(({ object }) => isEditableOverlayObject(object));\n if (overlayIndexes.length === 0)\n return { start: -1, end: -1, overlays: [] };\n return {\n start: overlayIndexes[0].index,\n end: overlayIndexes[overlayIndexes.length - 1].index,\n overlays: overlayIndexes.map(({ object }) => object),\n };\n}\n//# sourceMappingURL=layer-order.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","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","export function 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}\nexport function getPointerFromFabricEvent(canvas, event) {\n const fabricEvent = event && typeof event === 'object'\n ? event\n : null;\n if (!fabricEvent)\n return null;\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}\n//# sourceMappingURL=pointer.js.map","import { markAnnotationObject } from '../core/editor-object-kind.js';\nimport { placeAnnotationObject } from '../core/layer-order.js';\nimport { isEditableOverlayObject, isTextAnnotationObject, } from '../core/public-types.js';\nimport { mergeTextAnnotationConfigPatch } from '../core/default-options.js';\nimport { getObjectBBox } from '../utils/canvas-region.js';\nimport { resolveNumeric } from '../utils/number.js';\nimport { getPointerFromFabricEvent } from '../utils/pointer.js';\nimport { markSessionObject } from '../core/editor-object-kind.js';\nimport { syncAnnotationRuntimeState } from './annotation-style.js';\nimport { isAnnotationUnlocked } from './annotation-lock.js';\nfunction resolveDefaultTextPosition(context) {\n const image = context.getOriginalImage();\n if (image) {\n const bounds = getObjectBBox(image);\n return { left: Math.round(bounds.left + 10), top: Math.round(bounds.top + 10) };\n }\n return { left: 10, top: 10 };\n}\nfunction resolveTextCreationConfig(context, config) {\n var _a, _b;\n const base = mergeTextAnnotationConfigPatch(context.getTextConfig(), config);\n const fallback = resolveDefaultTextPosition(context);\n const leftInput = (_a = config.left) !== null && _a !== void 0 ? _a : base.left;\n const topInput = (_b = config.top) !== null && _b !== void 0 ? _b : base.top;\n return {\n ...base,\n left: resolveNumeric(leftInput, 'x', fallback.left, context.canvas, context.options),\n top: resolveNumeric(topInput, 'y', fallback.top, context.canvas, context.options),\n };\n}\nfunction nextAnnotationMeta(context, config) {\n const annotationId = context.getAnnotationCounter() + 1;\n context.setAnnotationCounter(annotationId);\n return {\n annotationId,\n annotationName: `${context.options.textAnnotationName}${annotationId}`,\n annotationHidden: config.annotationHidden,\n annotationLocked: config.annotationLocked,\n };\n}\nexport function attachTextEditingHandlers(context, annotation) {\n const textObject = annotation;\n if (textObject.imageEditorTextEditingHandlers) {\n try {\n textObject.off('editing:entered', textObject.imageEditorTextEditingHandlers.entered);\n textObject.off('editing:exited', textObject.imageEditorTextEditingHandlers.exited);\n }\n catch {\n }\n }\n const entered = () => {\n var _a;\n textObject.imageEditorTextEditingInitialText = String((_a = textObject.text) !== null && _a !== void 0 ? _a : '');\n textObject.imageEditorTextEditingCancel = false;\n };\n const exited = () => {\n var _a;\n const initial = textObject.imageEditorTextEditingInitialText;\n const finalText = String((_a = textObject.text) !== null && _a !== void 0 ? _a : '');\n const cancel = textObject.imageEditorTextEditingCancel === true;\n if (cancel && initial !== undefined) {\n textObject.set({ text: initial });\n }\n delete textObject.imageEditorTextEditingInitialText;\n delete textObject.imageEditorTextEditingCancel;\n if (!cancel && initial !== undefined && initial !== finalText) {\n context.saveCanvasState();\n const callbackContext = context.buildCallbackContext('createTextAnnotation');\n context.emitAnnotationsChanged(callbackContext);\n context.emitImageChanged(callbackContext);\n }\n };\n textObject.on('editing:entered', entered);\n textObject.on('editing:exited', exited);\n textObject.imageEditorTextEditingHandlers = { entered, exited };\n}\nfunction selectAllText(annotation) {\n var _a;\n const textObject = annotation;\n const textLength = String((_a = textObject.text) !== null && _a !== void 0 ? _a : '').length;\n if (textLength <= 0)\n return;\n if (typeof textObject.selectAll === 'function') {\n textObject.selectAll();\n return;\n }\n if (typeof textObject.setSelectionStart === 'function' &&\n typeof textObject.setSelectionEnd === 'function') {\n textObject.setSelectionStart(0);\n textObject.setSelectionEnd(textLength);\n return;\n }\n textObject.selectionStart = 0;\n textObject.selectionEnd = textLength;\n}\nexport function createTextAnnotation(context, config = {}) {\n var _a, _b;\n if (!context.isImageLoaded())\n return null;\n const resolved = resolveTextCreationConfig(context, config);\n const textbox = new context.fabric.Textbox(resolved.text, {\n left: resolved.left,\n top: resolved.top,\n width: resolved.width,\n fontSize: resolved.fontSize,\n fontFamily: resolved.fontFamily,\n fontWeight: resolved.fontWeight,\n fill: resolved.fill,\n backgroundColor: resolved.backgroundColor,\n textAlign: resolved.textAlign,\n angle: resolved.angle,\n selectable: resolved.selectable,\n evented: resolved.evented,\n editable: resolved.editable,\n originX: 'left',\n originY: 'top',\n ...resolved.styles,\n });\n const meta = nextAnnotationMeta(context, resolved);\n const annotation = markAnnotationObject(textbox, {\n annotationId: meta.annotationId,\n annotationType: 'text',\n annotationName: meta.annotationName,\n annotationHidden: meta.annotationHidden,\n annotationLocked: meta.annotationLocked,\n });\n syncAnnotationRuntimeState(annotation);\n attachTextEditingHandlers(context, annotation);\n placeAnnotationObject(context.canvas, annotation);\n if (resolved.selectable !== false && isAnnotationUnlocked(annotation)) {\n context.canvas.setActiveObject(annotation);\n }\n context.canvas.renderAll();\n context.updateAnnotationList();\n context.saveCanvasState();\n const callbackContext = context.buildCallbackContext('createTextAnnotation');\n context.emitAnnotationsChanged(callbackContext);\n context.emitImageChanged(callbackContext);\n if (resolved.enterEditing && isAnnotationUnlocked(annotation)) {\n (_b = (_a = annotation).enterEditing) === null || _b === void 0 ? void 0 : _b.call(_a);\n selectAllText(annotation);\n }\n return annotation;\n}\nfunction handleTextModePointer(context, event) {\n var _a, _b;\n const fabricEvent = event;\n const target = fabricEvent.target;\n if (target) {\n if (isTextAnnotationObject(target) && isAnnotationUnlocked(target)) {\n context.canvas.setActiveObject(target);\n (_b = (_a = target).enterEditing) === null || _b === void 0 ? void 0 : _b.call(_a);\n }\n else if (isEditableOverlayObject(target)) {\n context.canvas.setActiveObject(target);\n }\n return;\n }\n const pointer = getPointerFromFabricEvent(context.canvas, event);\n if (!pointer)\n return;\n createTextAnnotation(context, {\n left: pointer.x,\n top: pointer.y,\n });\n}\nexport function enterTextMode(context) {\n if (context.getTextSession())\n return;\n if (!context.isImageLoaded())\n return;\n const { canvas } = context;\n const previousCanvasSelection = !!canvas.selection;\n const previousDefaultCursor = canvas.defaultCursor;\n canvas.selection = true;\n canvas.defaultCursor = 'text';\n const callback = (event) => handleTextModePointer(context, event);\n canvas.on('mouse:down', callback);\n const session = {\n mode: 'text',\n previousCanvasSelection,\n previousDefaultCursor,\n handlers: [{ eventName: 'mouse:down', callback }],\n dispose: () => {\n try {\n canvas.off('mouse:down', callback);\n }\n catch {\n }\n canvas.selection = previousCanvasSelection;\n canvas.defaultCursor = previousDefaultCursor !== null && previousDefaultCursor !== void 0 ? previousDefaultCursor : 'default';\n },\n };\n const preview = new context.fabric.Rect({\n left: -1,\n top: -1,\n width: 1,\n height: 1,\n selectable: false,\n evented: false,\n visible: false,\n excludeFromExport: true,\n });\n markSessionObject(preview, 'textPreview');\n context.setTextSession(session);\n context.updateUi();\n}\nexport function exitTextMode(context) {\n const session = context.getTextSession();\n if (!session)\n return;\n session.dispose();\n context.setTextSession(null);\n context.canvas.requestRenderAll();\n context.updateUi();\n}\nexport function finalizeActiveTextEditing(context, options) {\n var _a;\n const active = context.canvas.getActiveObject();\n if (!active || !isTextAnnotationObject(active))\n return;\n const textObject = active;\n if (textObject.isEditing !== true)\n return;\n textObject.imageEditorTextEditingCancel = !options.commit;\n (_a = textObject.exitEditing) === null || _a === void 0 ? void 0 : _a.call(textObject);\n context.canvas.requestRenderAll();\n}\nexport function attachTextEditingHandlersToAnnotations(context, annotations) {\n annotations.filter(isTextAnnotationObject).forEach((annotation) => {\n attachTextEditingHandlers(context, annotation);\n });\n}\n//# sourceMappingURL=text-controller.js.map","import { markAnnotationObject } from '../core/editor-object-kind.js';\nimport { placeAnnotationObject } from '../core/layer-order.js';\nimport { syncAnnotationRuntimeState } from './annotation-style.js';\nfunction colorWithOpacity(color, opacity) {\n const alpha = Math.max(0, Math.min(1, opacity));\n if (alpha >= 1)\n return color;\n if (/^#([0-9a-f]{6})$/i.test(color)) {\n const hex = color.slice(1);\n const r = Number.parseInt(hex.slice(0, 2), 16);\n const g = Number.parseInt(hex.slice(2, 4), 16);\n const b = Number.parseInt(hex.slice(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n }\n return color;\n}\nfunction configureBrush(context) {\n const config = context.getDrawConfig();\n const canvasWithBrush = context.canvas;\n canvasWithBrush.freeDrawingBrush = new context.fabric.PencilBrush(context.canvas);\n canvasWithBrush.freeDrawingBrush.width = config.brushSize;\n canvasWithBrush.freeDrawingBrush.color = colorWithOpacity(config.color, config.opacity);\n canvasWithBrush.freeDrawingBrush.strokeLineCap = config.lineCap;\n canvasWithBrush.freeDrawingBrush.strokeLineJoin = config.lineJoin;\n}\nfunction markPathAsDrawAnnotation(context, path) {\n const config = context.getDrawConfig();\n const annotationId = context.getAnnotationCounter() + 1;\n context.setAnnotationCounter(annotationId);\n path.set({\n selectable: config.selectable,\n evented: config.evented,\n opacity: config.opacity,\n stroke: config.color,\n strokeWidth: config.brushSize,\n });\n const annotation = markAnnotationObject(path, {\n annotationId,\n annotationType: 'draw',\n annotationName: `${context.options.drawAnnotationName}${annotationId}`,\n annotationHidden: config.annotationHidden,\n annotationLocked: config.annotationLocked,\n });\n syncAnnotationRuntimeState(annotation);\n return annotation;\n}\nfunction handlePathCreated(context, event) {\n const path = event.path;\n if (!path)\n return;\n const annotation = markPathAsDrawAnnotation(context, path);\n placeAnnotationObject(context.canvas, annotation);\n context.canvas.setActiveObject(annotation);\n context.canvas.renderAll();\n context.updateAnnotationList();\n context.saveCanvasState();\n const callbackContext = context.buildCallbackContext('enterDrawMode');\n context.emitAnnotationsChanged(callbackContext);\n context.emitImageChanged(callbackContext);\n}\nexport function enterDrawMode(context) {\n if (context.getDrawSession())\n return;\n if (!context.isImageLoaded())\n return;\n const { canvas } = context;\n const canvasWithDrawing = canvas;\n const previousDrawingMode = !!canvasWithDrawing.isDrawingMode;\n const previousBrush = canvasWithDrawing.freeDrawingBrush;\n const previousCanvasSelection = !!canvas.selection;\n const previousDefaultCursor = canvas.defaultCursor;\n canvas.selection = false;\n canvas.defaultCursor = 'crosshair';\n canvasWithDrawing.isDrawingMode = true;\n configureBrush(context);\n const callback = (event) => handlePathCreated(context, event);\n canvas.on('path:created', callback);\n const session = {\n mode: 'draw',\n previousDrawingMode,\n previousBrush,\n previousCanvasSelection,\n previousDefaultCursor,\n handlers: [{ eventName: 'path:created', callback }],\n dispose: () => {\n try {\n canvas.off('path:created', callback);\n }\n catch {\n }\n canvasWithDrawing.isDrawingMode = previousDrawingMode;\n canvasWithDrawing.freeDrawingBrush = previousBrush;\n canvas.selection = previousCanvasSelection;\n canvas.defaultCursor = previousDefaultCursor !== null && previousDefaultCursor !== void 0 ? previousDefaultCursor : 'default';\n },\n };\n context.setDrawSession(session);\n context.updateUi();\n}\nexport function exitDrawMode(context) {\n const session = context.getDrawSession();\n if (!session)\n return;\n session.dispose();\n context.setDrawSession(null);\n context.canvas.requestRenderAll();\n context.updateUi();\n}\nexport function updateDrawBrush(context) {\n if (!context.getDrawSession())\n return;\n configureBrush(context);\n}\n//# sourceMappingURL=draw-controller.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 MergeAnnotationsError extends Error {\n constructor(message = 'Failed to merge annotations into the image.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'MergeAnnotationsError'\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, MergeAnnotationsError);\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","import { CropApplyError } from '../core/errors.js';\nimport { markSessionObject } from '../core/editor-object-kind.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 markSessionObject(cropRect, '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 { markBaseImageObject, markSessionObject } from '../core/editor-object-kind.js';\nimport { mimeTypeFor, tryNormalizeImageFormat } from '../export/export-format.js';\nimport { Command } from '../history/history-manager.js';\nimport { detectSourceMimeType } from '../image/image-resampler.js';\nimport { getPointerFromFabricEvent } from '../utils/pointer.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 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 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: config.previewStrokeDashArray\n ? [...config.previewStrokeDashArray]\n : undefined,\n selectable: false,\n evented: false,\n excludeFromExport: true,\n objectCaching: false,\n visible: false,\n });\n markSessionObject(circle, 'mosaicPreviewCircle');\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 markSessionObject(image, 'mosaicPreviewImage');\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 releaseMosaicRasterCache(session) {\n const cache = session.rasterCache;\n if (!cache)\n return;\n try {\n cache.offscreenCanvas.width = 0;\n cache.offscreenCanvas.height = 0;\n }\n catch {\n }\n session.rasterCache = 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(markBaseImageObject(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 releaseMosaicRasterCache(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 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: config.previewStrokeDashArray\n ? [...config.previewStrokeDashArray]\n : 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","export function startImageElementLoad(dataUrl, options) {\n const imageElement = new Image();\n if (options.crossOrigin !== undefined) {\n imageElement.crossOrigin = options.crossOrigin;\n }\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 try {\n imageElement.src = '';\n }\n catch {\n }\n }\n };\n const handleLoad = () => {\n var _a, _b;\n const validationError = (_b = (_a = options.validate) === null || _a === void 0 ? void 0 : _a.call(options, imageElement)) !== null && _b !== void 0 ? _b : null;\n if (validationError) {\n cleanup(true);\n rejectImage(validationError);\n return;\n }\n cleanup(false);\n resolveImage(imageElement);\n };\n const handleError = (event) => {\n cleanup(true);\n rejectImage(options.createError(event));\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}\n//# sourceMappingURL=image-element-loader.js.map","import { MergeAnnotationsError, MergeMasksError } from '../core/errors.js';\nimport { normalizeLayerOrder } from '../core/layer-order.js';\nimport { Command } from '../history/history-manager.js';\nfunction createMergeError(operation, error) {\n if (operation === 'mergeAnnotations') {\n if (error instanceof MergeAnnotationsError)\n return error;\n const message = error instanceof Error\n ? `mergeAnnotations failed: ${error.message}`\n : 'mergeAnnotations failed';\n return new MergeAnnotationsError(message, error);\n }\n if (error instanceof MergeMasksError)\n return error;\n const message = error instanceof Error ? `mergeMasks failed: ${error.message}` : 'mergeMasks failed';\n return new MergeMasksError(message, error);\n}\nfunction detachObjects(canvas, objects) {\n for (const object of objects) {\n if (!canvas.getObjects().includes(object))\n continue;\n canvas.remove(object);\n }\n canvas.discardActiveObject();\n canvas.renderAll();\n}\nexport async function flattenOverlayGroupToBaseImage(context, options) {\n if (!context.isImageLoaded())\n return;\n if (options.getTargets().length === 0)\n return;\n const beforeSnapshot = context.captureSnapshot();\n const preservedObjects = options.getPreservedObjects();\n const preScrollTop = context.containerElement ? context.containerElement.scrollTop : null;\n const preScrollLeft = context.containerElement ? context.containerElement.scrollLeft : null;\n try {\n detachObjects(context.canvas, preservedObjects);\n const exportedDataUrl = await context.exportImageBase64(options.exportOptions);\n if (!exportedDataUrl) {\n throw createMergeError(options.operation, `${options.operation}: exportImageBase64 returned an empty data URL.`);\n }\n options.removeTargetsNoHistory();\n await context.loadImage(exportedDataUrl, { preserveScroll: true });\n await options.restorePreservedObjects(preservedObjects);\n normalizeLayerOrder(context.canvas);\n context.canvas.renderAll();\n context.updateInputs();\n context.updateUi();\n if (context.containerElement) {\n try {\n if (preScrollTop !== null)\n context.containerElement.scrollTop = preScrollTop;\n if (preScrollLeft !== null)\n context.containerElement.scrollLeft = preScrollLeft;\n }\n catch (scrollError) {\n console.warn(`[ImageEditor] ${options.operation}: scroll restore failed`, scrollError);\n }\n }\n const afterSnapshot = context.captureSnapshot();\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] ${options.operation}: rollback failed`, rollbackError);\n }\n throw createMergeError(options.operation, error);\n }\n}\n//# sourceMappingURL=overlay-merge-service.js.map","import { isAnnotationObject, isMaskObject, isSessionObject } from '../core/public-types.js';\nimport { reportError } from '../core/callback-reporter.js';\nimport { ExportError, ExportNotReadyError } from '../core/errors.js';\nimport { withMaskStyleBackup } from '../mask/mask-style.js';\nimport { getClampedCanvasRegion, getObjectBBox, getPartialExportEdges, hasMeaningfulCanvasRegion, } from '../utils/canvas-region.js';\nimport { startImageElementLoad } from '../utils/image-element-loader.js';\nimport { resolveExportFormat } from './export-format.js';\nimport { flattenOverlayGroupToBaseImage, } from './overlay-merge-service.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 mergeMasks: typeof providedOptions.mergeMasks === 'boolean'\n ? providedOptions.mergeMasks\n : context.options.mergeMasksByDefault,\n mergeAnnotations: typeof providedOptions.mergeAnnotations === 'boolean'\n ? providedOptions.mergeAnnotations\n : context.options.mergeAnnotationsByDefault,\n multiplier: resolveMultiplier(providedOptions.multiplier, context.options.exportMultiplier),\n format: resolveExportFormat(providedOptions, context.options.downsampleQuality),\n };\n}\nfunction resolveDownloadOptions(context, options) {\n var _a;\n const providedOptions = typeof options === 'string'\n ? { fileName: options }\n : (options !== null && options !== void 0 ? options : {});\n return {\n fileName: (_a = providedOptions.fileName) !== null && _a !== void 0 ? _a : context.options.defaultDownloadFileName,\n exportOptions: {\n exportArea: context.options.exportAreaByDefault,\n mergeMasks: providedOptions.mergeMasks,\n mergeAnnotations: providedOptions.mergeAnnotations,\n multiplier: context.options.exportMultiplier,\n },\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, mergeMasks, callback) {\n if (!mergeMasks) {\n return withObjectsHidden(context.canvas, isMaskObject, callback);\n }\n return withMaskStyleBackup({ canvas: context.canvas, options: context.options }, applyExportBakeInStyle, callback);\n}\nasync function withObjectsHidden(canvas, predicate, callback) {\n const backups = getCanvasObjects(canvas)\n .filter(predicate)\n .map((object) => ({\n object,\n visible: object.visible,\n }));\n for (const backup of backups) {\n try {\n if (typeof backup.object.set === 'function') {\n backup.object.set({ visible: false });\n }\n else {\n backup.object.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.object.set === 'function') {\n backup.object.set({ visible: backup.visible });\n }\n else {\n backup.object.visible = backup.visible;\n }\n }\n catch {\n }\n }\n requestRender(canvas);\n }\n}\nasync function withSessionObjectsHidden(context, callback) {\n return withObjectsHidden(context.canvas, (object) => isSessionObject(object) ||\n object.isCropRect === true ||\n object.maskLabel === true ||\n object.isMosaicPreview === true, callback);\n}\nasync function withAnnotationsExportState(context, mergeAnnotations, callback) {\n if (!mergeAnnotations) {\n return withObjectsHidden(context.canvas, isAnnotationObject, callback);\n }\n return withObjectsHidden(context.canvas, (object) => isAnnotationObject(object) && object.annotationHidden === true, callback);\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 startImageElementLoad(dataUrl, {\n crossOrigin: 'anonymous',\n createError: () => new Error('Failed to decode export data URL'),\n }).promise;\n}\nasync function sealPartialTransparentEdges(dataUrl, edges, target, ownerDocument) {\n if (!hasPartialEdges(edges))\n return dataUrl;\n const imageElement = await loadImageElement(dataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = ownerDocument.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, ownerDocument) {\n return resolveCanvasFillStyle(backgroundColor, ownerDocument);\n}\nfunction resolveCanvasFillStyle(backgroundColor, ownerDocument, 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(ownerDocument);\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(ownerDocument) {\n try {\n return ownerDocument.createElement('canvas').getContext('2d');\n }\n catch {\n return null;\n }\n}\nfunction getCanvasDocument(canvas) {\n var _a, _b, _c, _d;\n const canvasLike = canvas;\n const ownerDocument = (_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;\n if (ownerDocument)\n return ownerDocument;\n if (typeof document !== 'undefined')\n return document;\n throw new Error('Document is unavailable for export canvas creation.');\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, ownerDocument) {\n const imageElement = await loadImageElement(dataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = ownerDocument.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, ownerDocument);\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, canvas) {\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 ownerDocument = getCanvasDocument(canvas);\n const offscreenCanvas = ownerDocument.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, ownerDocument);\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 withSessionObjectsHidden(context, async () => withMaskExportState(context, resolved.mergeMasks, async () => withAnnotationsExportState(context, resolved.mergeAnnotations, 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 if (hasPartialEdges(partialEdges)) {\n dataUrl = await sealPartialTransparentEdges(dataUrl, partialEdges, sealedFormat, getCanvasDocument(context.canvas));\n }\n if (resolved.format.format === 'jpeg') {\n dataUrl = await convertDataUrlToOpaqueJpeg(dataUrl, context.options.backgroundColor, resolved.format.quality, getCanvasDocument(context.canvas));\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 mergeMasks: providedOptions.mergeMasks,\n mergeAnnotations: providedOptions.mergeAnnotations,\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, context.canvas);\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, options) {\n if (!context.isImageLoaded()) {\n warnNoImageLoaded('downloadImage');\n return;\n }\n const resolved = resolveDownloadOptions(context, options);\n void exportImageBase64(context, resolved.exportOptions)\n .then((dataUrl) => {\n if (!dataUrl)\n return;\n const ownerDocument = getCanvasDocument(context.canvas);\n const link = ownerDocument.createElement('a');\n link.download = resolved.fileName;\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 await flattenOverlayGroupToBaseImage(context, {\n operation: 'mergeMasks',\n exportOptions: {\n exportArea: 'image',\n mergeMasks: true,\n mergeAnnotations: false,\n multiplier: context.options.exportMultiplier,\n fileType: 'png',\n },\n getTargets: () => context.canvas.getObjects().filter(isMaskObject),\n getPreservedObjects: () => context.getAnnotations(),\n removeTargetsNoHistory: () => {\n context.removeAllMasksNoHistory();\n },\n restorePreservedObjects: (objects) => context.restoreAnnotations(objects),\n });\n}\nexport async function mergeAnnotations(context) {\n await flattenOverlayGroupToBaseImage(context, {\n operation: 'mergeAnnotations',\n exportOptions: {\n exportArea: 'image',\n mergeMasks: false,\n mergeAnnotations: true,\n multiplier: context.options.exportMultiplier,\n fileType: 'png',\n },\n getTargets: () => context.canvas.getObjects().filter(isAnnotationObject),\n getPreservedObjects: () => context.getMasks(),\n removeTargetsNoHistory: () => {\n context.removeAllAnnotationsNoHistory();\n },\n restorePreservedObjects: (objects) => context.restoreMasks(objects),\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 { markBaseImageObject } from '../core/editor-object-kind.js';\nimport { ImageDecodeError } from '../core/errors.js';\nimport { saveState, SNAPSHOT_CUSTOM_KEYS } from '../core/state-serializer.js';\nimport { startImageElementLoad } from '../utils/image-element-loader.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 annotationCounter: context.getAnnotationCounter(),\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 const baseImage = markBaseImageObject(fabricImage);\n baseImage.set({\n originX: 'left',\n originY: 'top',\n selectable: false,\n evented: false,\n });\n const layout = computeLayout(context, baseImage);\n applyCanvasDimensions(context.canvas, layout.canvasWidth, layout.canvasHeight, context.containerElement);\n baseImage.set({ left: layout.imageLeft, top: layout.imageTop });\n baseImage.scale(layout.imageScale);\n context.canvas.add(baseImage);\n context.canvas.sendObjectToBack(baseImage);\n context.setOriginalImage(baseImage);\n context.setBaseImageScale(layout.baseImageScale);\n context.setCurrentScale(1);\n context.setCurrentRotation(0);\n context.setMaskCounter(0);\n context.setAnnotationCounter(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 return startImageElementLoad(dataUrl, {\n validate: (imageElement) => hasNaturalImageDimensions(imageElement)\n ? null\n : new ImageDecodeError('Failed to decode image data URL: image has no natural dimensions.', null),\n createError: (event) => new ImageDecodeError('Failed to decode image data URL.', event),\n });\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.setAnnotationCounter(bundle.annotationCounter);\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","import { isMaskObject } from '../core/public-types.js';\nimport { markMaskObject } from '../core/editor-object-kind.js';\nimport { placeMaskObject } from '../core/layer-order.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 const nextId = context.getMaskCounter() + 1;\n context.setMaskCounter(nextId);\n markMaskObject(maskObject, {\n maskId: nextId,\n maskUid: createMaskUid(nextId),\n maskName: `${options.maskName}${nextId}`,\n originalAlpha: resolvedConfig.alpha,\n originalStroke: maskObject.stroke,\n originalStrokeWidth: maskObject.strokeWidth,\n });\n attachMaskHoverHandlers(maskObject);\n context.setLastMask(maskObject);\n placeMaskObject(canvas, 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}\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}\nfunction getSelectedMaskObjects(canvas) {\n const active = canvas.getActiveObject();\n if (!active)\n return [];\n if (!isActiveSelectionObject(active))\n return isMaskObject(active) ? [active] : [];\n const getObjects = active.getObjects;\n const objects = typeof getObjects === 'function' ? getObjects.call(active) : [];\n return objects.filter(isMaskObject);\n}\nexport function removeSelectedMask(context) {\n const selectedMasks = getSelectedMaskObjects(context.canvas);\n if (selectedMasks.length === 0)\n return;\n for (const mask of selectedMasks) {\n context.removeLabelForMask(mask);\n detachMaskHoverHandlers(mask);\n context.canvas.remove(mask);\n }\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';\nimport { markSessionObject } from '../core/editor-object-kind.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 markSessionObject(labelTextObject, 'maskLabel');\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, areResolvedDrawConfigsEqual, areResolvedTextAnnotationConfigsEqual, cloneResolvedMosaicConfig, cloneResolvedDrawConfig, cloneResolvedTextAnnotationConfig, getInvalidDrawConfigFields, getInvalidMosaicConfigFields, getInvalidTextAnnotationConfigFields, isLayoutMode, mergeDrawConfigPatch, mergeMosaicConfigPatch, mergeTextAnnotationConfigPatch, 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 { isAnnotationObject, isDrawAnnotationObject, isEditableOverlayObject, isMaskObject, isTextAnnotationObject, } from './core/public-types.js';\nimport { getAnnotations as getAnnotationsImpl, removeAllAnnotations as removeAllAnnotationsImpl, removeAnnotationObjects, removeSelectedAnnotation as removeSelectedAnnotationImpl, renderAnnotationList, updateAnnotation as updateAnnotationImpl, updateAnnotationListSelection, updateSelectedAnnotation as updateSelectedAnnotationImpl, } from './annotation/annotation-manager.js';\nimport { attachTextEditingHandlersToAnnotations, createTextAnnotation as createTextAnnotationImpl, enterTextMode as enterTextModeImpl, exitTextMode as exitTextModeImpl, finalizeActiveTextEditing, } from './annotation/text-controller.js';\nimport { enterDrawMode as enterDrawModeImpl, exitDrawMode as exitDrawModeImpl, updateDrawBrush, } from './annotation/draw-controller.js';\nimport { isAnnotationLocked, isAnnotationUnlocked } from './annotation/annotation-lock.js';\nimport { syncAnnotationRuntimeStates } from './annotation/annotation-style.js';\nimport { normalizeLayerOrder, getEditableOverlayRange } from './core/layer-order.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, mergeAnnotations as mergeAnnotationsImpl, 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 'mergeAnnotationsButton',\n 'enterTextModeButton',\n 'exitTextModeButton',\n 'textColorInput',\n 'textFontSizeInput',\n 'enterDrawModeButton',\n 'exitDrawModeButton',\n 'drawColorInput',\n 'drawBrushSizeInput',\n 'removeSelectedAnnotationButton',\n 'removeAllAnnotationsButton',\n 'deleteSelectedObjectButton',\n 'bringSelectedObjectForwardButton',\n 'sendSelectedObjectBackwardButton',\n 'bringSelectedObjectToFrontButton',\n 'sendSelectedObjectToBackButton',\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 TEXT_MODE_ENABLED_KEYS = [\n 'exitTextModeButton',\n 'textColorInput',\n 'textFontSizeInput',\n];\nconst DRAW_MODE_ENABLED_KEYS = [\n 'exitDrawModeButton',\n 'drawColorInput',\n 'drawBrushSizeInput',\n];\nconst MOSAIC_MODE_CONTROL_KEYS = [\n 'scalePercentageInput',\n 'rotateLeftDegreesInput',\n 'rotateRightDegreesInput',\n 'rotateLeftButton',\n 'rotateRightButton',\n 'createMaskButton',\n 'removeSelectedMaskButton',\n 'removeAllMasksButton',\n 'mergeMasksButton',\n 'mergeAnnotationsButton',\n 'enterTextModeButton',\n 'exitTextModeButton',\n 'textColorInput',\n 'textFontSizeInput',\n 'enterDrawModeButton',\n 'exitDrawModeButton',\n 'drawColorInput',\n 'drawBrushSizeInput',\n 'removeSelectedAnnotationButton',\n 'removeAllAnnotationsButton',\n 'deleteSelectedObjectButton',\n 'bringSelectedObjectForwardButton',\n 'sendSelectedObjectBackwardButton',\n 'bringSelectedObjectToFrontButton',\n 'sendSelectedObjectToBackButton',\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 'createTextAnnotation',\n 'enterTextMode',\n 'exitTextMode',\n 'setTextConfig',\n 'resetTextConfig',\n 'setTextColor',\n 'setTextFontSize',\n 'enterDrawMode',\n 'exitDrawMode',\n 'setDrawConfig',\n 'resetDrawConfig',\n 'setDrawColor',\n 'setDrawBrushSize',\n 'updateSelectedAnnotation',\n 'updateAnnotation',\n 'removeSelectedAnnotation',\n 'removeAllAnnotations',\n 'deleteSelectedObject',\n 'mergeAnnotations',\n 'bringSelectedObjectForward',\n 'sendSelectedObjectBackward',\n 'bringSelectedObjectToFront',\n 'sendSelectedObjectToBack',\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]);\nconst TOOL_MODE_ALLOWED_OPERATIONS = {\n crop: CROP_SESSION_ALLOWED_OPERATIONS,\n mosaic: MOSAIC_SESSION_ALLOWED_OPERATIONS,\n text: new Set([\n 'exitTextMode',\n 'createTextAnnotation',\n 'setTextConfig',\n 'resetTextConfig',\n 'setTextColor',\n 'setTextFontSize',\n 'saveState',\n ]),\n draw: new Set([\n 'exitDrawMode',\n 'setDrawConfig',\n 'resetDrawConfig',\n 'setDrawColor',\n 'setDrawBrushSize',\n 'saveState',\n ]),\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, \"defaultTextConfig\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"currentTextConfig\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"defaultDrawConfig\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"currentDrawConfig\", {\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, \"annotationCounter\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\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, \"textSession\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"drawSession\", {\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, \"keyboardDocument\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"keyboardHandler\", {\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 this.defaultTextConfig = this.options.defaultTextConfig;\n this.currentTextConfig = cloneResolvedTextAnnotationConfig(this.defaultTextConfig);\n this.defaultDrawConfig = this.options.defaultDrawConfig;\n this.currentDrawConfig = cloneResolvedDrawConfig(this.defaultDrawConfig);\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 annotationList: 'annotationList',\n enterTextModeButton: 'enterTextModeButton',\n exitTextModeButton: 'exitTextModeButton',\n textColorInput: 'textColorInput',\n textFontSizeInput: 'textFontSizeInput',\n enterDrawModeButton: 'enterDrawModeButton',\n exitDrawModeButton: 'exitDrawModeButton',\n drawColorInput: 'drawColorInput',\n drawBrushSizeInput: 'drawBrushSizeInput',\n removeSelectedAnnotationButton: 'removeSelectedAnnotationButton',\n removeAllAnnotationsButton: 'removeAllAnnotationsButton',\n deleteSelectedObjectButton: 'deleteSelectedObjectButton',\n mergeAnnotationsButton: 'mergeAnnotationsButton',\n bringSelectedObjectForwardButton: 'bringSelectedObjectForwardButton',\n sendSelectedObjectBackwardButton: 'sendSelectedObjectBackwardButton',\n bringSelectedObjectToFrontButton: 'bringSelectedObjectToFrontButton',\n sendSelectedObjectToBackButton: 'sendSelectedObjectToBackButton',\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.initCanvas();\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.transformController = new TransformController(this.buildTransformContext());\n this.bindDomEvents();\n this.updateInputs();\n this.updateMaskList();\n this.updateAnnotationList();\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)\n this.handleObjectMovingScalingRotating(e.target);\n };\n const onObjectModified = (e) => {\n if (e.target)\n this.handleObjectModified(e.target);\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 getLiveCanvasOrThrow(operationName) {\n if (this.isDisposed || !this.canvas) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" after dispose.`);\n }\n return this.canvas;\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('mergeAnnotationsButton', 'click', () => {\n void this.mergeAnnotations();\n });\n this.bindElementIfExists('enterTextModeButton', 'click', () => {\n this.enterTextMode();\n });\n this.bindElementIfExists('exitTextModeButton', 'click', () => {\n this.exitTextMode();\n });\n this.bindElementIfExists('enterDrawModeButton', 'click', () => {\n this.enterDrawMode();\n });\n this.bindElementIfExists('exitDrawModeButton', 'click', () => {\n this.exitDrawMode();\n });\n this.bindElementIfExists('removeSelectedAnnotationButton', 'click', () => {\n this.removeSelectedAnnotation();\n });\n this.bindElementIfExists('removeAllAnnotationsButton', 'click', () => {\n this.removeAllAnnotations();\n });\n this.bindElementIfExists('deleteSelectedObjectButton', 'click', () => {\n this.deleteSelectedObject();\n });\n this.bindElementIfExists('bringSelectedObjectForwardButton', 'click', () => {\n this.bringSelectedObjectForward();\n });\n this.bindElementIfExists('sendSelectedObjectBackwardButton', 'click', () => {\n this.sendSelectedObjectBackward();\n });\n this.bindElementIfExists('bringSelectedObjectToFrontButton', 'click', () => {\n this.bringSelectedObjectToFront();\n });\n this.bindElementIfExists('sendSelectedObjectToBackButton', 'click', () => {\n this.sendSelectedObjectToBack();\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 const bindStringInput = (key, applyValue) => {\n const handler = (event) => {\n applyValue(event.target.value);\n };\n this.bindElementIfExists(key, 'input', handler);\n this.bindElementIfExists(key, 'change', handler);\n };\n const bindNumberInput = (key, applyValue) => {\n const handler = (event) => {\n applyValue(parseFloat(event.target.value));\n };\n this.bindElementIfExists(key, 'input', handler);\n this.bindElementIfExists(key, 'change', handler);\n };\n bindStringInput('textColorInput', (value) => this.applyTextColorInput(value));\n bindNumberInput('textFontSizeInput', (value) => this.applyTextFontSizeInput(value));\n bindStringInput('drawColorInput', (value) => this.applyDrawColorInput(value));\n bindNumberInput('drawBrushSizeInput', (value) => this.applyDrawBrushSizeInput(value));\n this.bindKeyboardEvents();\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 bindKeyboardEvents() {\n var _a, _b;\n const ownerDocument = (_b = (_a = this.canvasElement) === null || _a === void 0 ? void 0 : _a.ownerDocument) !== null && _b !== void 0 ? _b : document;\n if (this.keyboardHandler && this.keyboardDocument) {\n this.keyboardDocument.removeEventListener('keydown', this.keyboardHandler);\n }\n this.keyboardDocument = ownerDocument;\n this.keyboardHandler = (event) => this.handleKeyboardEvent(event);\n ownerDocument.addEventListener('keydown', this.keyboardHandler);\n }\n isNativeTextInputActive() {\n var _a;\n const activeElement = (_a = this.keyboardDocument) === null || _a === void 0 ? void 0 : _a.activeElement;\n if (!activeElement)\n return false;\n const tagName = activeElement.tagName.toLowerCase();\n return (tagName === 'input' ||\n tagName === 'textarea' ||\n tagName === 'select' ||\n activeElement.isContentEditable === true);\n }\n isFabricTextEditingActive() {\n var _a;\n const activeObject = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n return !!(activeObject &&\n isTextAnnotationObject(activeObject) &&\n activeObject.isEditing === true);\n }\n handleKeyboardEvent(event) {\n if (this.isDisposed)\n return;\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (this.isNativeTextInputActive() || this.isFabricTextEditingActive())\n return;\n this.deleteSelectedObject();\n return;\n }\n if (event.key !== 'Escape')\n return;\n if (this.isFabricTextEditingActive() && this.canvas) {\n finalizeActiveTextEditing(this.buildTextControllerContext(), { commit: false });\n event.preventDefault();\n return;\n }\n if (this.textSession) {\n this.exitTextMode();\n }\n else if (this.drawSession) {\n this.exitDrawMode();\n }\n else if (this.mosaicSession) {\n this.exitMosaicMode();\n }\n else if (this.cropSession) {\n this.cancelCrop();\n }\n }\n finalizeActiveTextEditingIfNeeded() {\n if (!this.canvas || !this.isFabricTextEditingActive())\n return;\n finalizeActiveTextEditing(this.buildTextControllerContext(), { commit: true });\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 this.finalizeActiveTextEditingIfNeeded();\n const callbackContext = this.getOperationContext('loadImage', options);\n const previousImage = this.originalImage;\n const hadMasks = this.getMasks().length > 0;\n const hadAnnotations = this.getAnnotations().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 getAnnotationCounter: () => this.annotationCounter,\n setAnnotationCounter: (v) => {\n this.annotationCounter = 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.updateAnnotationList();\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 if (hadAnnotations) {\n this.emitAnnotationsChanged(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 const activeToolMode = this.getActiveToolMode();\n if (activeToolMode &&\n !this.operationGuard.isOwnOperation(token) &&\n !TOOL_MODE_ALLOWED_OPERATIONS[activeToolMode].has(operationName)) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" while ${activeToolMode} 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() || this.animQueue.isBusy() || this.isToolModeActive();\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 getAnnotations() {\n if (!this.canvas)\n return [];\n return getAnnotationsImpl(this.canvas);\n }\n getMaskCollectionSignature() {\n return this.getMasks()\n .map((mask) => `${mask.maskId}:${mask.maskName}`)\n .join('|');\n }\n getAnnotationCollectionSignature() {\n return this.getAnnotations()\n .map((annotation) => `${annotation.annotationId}:${annotation.annotationName}`)\n .join('|');\n }\n getActiveToolMode() {\n if (this.cropSession)\n return 'crop';\n if (this.mosaicSession)\n return 'mosaic';\n if (this.textSession)\n return 'text';\n if (this.drawSession)\n return 'draw';\n return null;\n }\n isToolModeActive() {\n return this.getActiveToolMode() !== null;\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 annotationCount: this.getAnnotations().length,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n isBusy: this.isBusy(),\n activeToolMode: this.getActiveToolMode(),\n isCropMode: this.cropSession !== null,\n isMosaicMode: this.mosaicSession !== null,\n isTextMode: this.textSession !== null,\n isDrawMode: this.drawSession !== 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 emitAnnotationsChanged(context) {\n this.emitOptionCallback('onAnnotationsChanged', [this.getAnnotations(), 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, _b;\n const selectedMasks = selected.filter(isMaskObject);\n const selectedAnnotations = selected.filter(isAnnotationObject);\n const selectedObjectKind = selectedMasks.length === 1 && selectedAnnotations.length === 0\n ? 'mask'\n : selectedAnnotations.length === 1 && selectedMasks.length === 0\n ? 'annotation'\n : null;\n return {\n selectedMask: (_a = selectedMasks[0]) !== null && _a !== void 0 ? _a : null,\n selectedMasks,\n selectedAnnotation: (_b = selectedAnnotations[0]) !== null && _b !== void 0 ? _b : null,\n selectedAnnotations,\n selectedObjectKind,\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, _c;\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 (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.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 getScrollbarStableViewportCanvasSize(viewport) {\n return {\n width: Math.max(1, viewport.width - 1),\n height: Math.max(1, viewport.height - 1),\n };\n }\n updateCanvasSizeToImageBounds(options = {}) {\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 const shouldStabilizeContainedViewport = options.stabilizeContainedViewport !== false;\n const imageFitsViewport = boundingRect.width <= viewport.width + LAYOUT_EPSILON &&\n boundingRect.height <= viewport.height + LAYOUT_EPSILON;\n if (this.currentLayoutMode === 'fit' || this.currentLayoutMode === 'cover') {\n if (imageFitsViewport) {\n const canvasSize = shouldStabilizeContainedViewport\n ? this.getScrollbarStableViewportCanvasSize(viewport)\n : viewport;\n this.setCanvasSizePx(canvasSize.width, canvasSize.height);\n return;\n }\n const canvasSize = computeScrollableCanvasSize(boundingRect.width, boundingRect.height, viewport, scrollbarSize);\n this.setCanvasSizePx(canvasSize.width, canvasSize.height);\n return;\n }\n if (imageFitsViewport) {\n const canvasSize = shouldStabilizeContainedViewport\n ? this.getScrollbarStableViewportCanvasSize(viewport)\n : viewport;\n this.setCanvasSizePx(canvasSize.width, canvasSize.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.getLiveCanvasOrThrow('buildTransformContext'),\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 const previousAnnotationSignature = this.getAnnotationCollectionSignature();\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 this.annotationCounter = restoredState.maxAnnotationId;\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({ stabilizeContainedViewport: false });\n this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage);\n }\n if (this.originalImage) {\n this.settleFitCoverScrollbarsAfterStateRestore();\n }\n const restoredMasks = restoredState.masks;\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 syncAnnotationRuntimeStates(restoredState.annotations);\n attachTextEditingHandlersToAnnotations(this.buildTextControllerContext(), restoredState.annotations);\n this.lastSnapshot = this.captureSnapshotInternal();\n this.canvas.renderAll();\n this.updateInputs();\n this.updateMaskList();\n this.updateAnnotationList();\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 if (previousAnnotationSignature !== this.getAnnotationCollectionSignature()) {\n this.emitAnnotationsChanged(context);\n }\n this.emitImageChanged(context);\n const canvas = this.getLiveCanvasOrThrow('loadFromState');\n const activeMaskId = editorState === null || editorState === void 0 ? void 0 : editorState.activeMaskId;\n const activeAnnotationId = editorState === null || editorState === void 0 ? void 0 : editorState.activeAnnotationId;\n if ((editorState === null || editorState === void 0 ? void 0 : editorState.activeObjectKind) === 'mask' && typeof activeMaskId === 'number') {\n const activeMask = restoredMasks.find((maskObject) => maskObject.maskId === activeMaskId);\n if (activeMask) {\n this.withSelectionChangeContext(context, () => {\n canvas.setActiveObject(activeMask);\n this.handleSelectionChanged([activeMask]);\n });\n }\n }\n else if ((editorState === null || editorState === void 0 ? void 0 : editorState.activeObjectKind) === 'annotation' &&\n typeof activeAnnotationId === 'number') {\n const activeAnnotation = restoredState.annotations.find((annotation) => annotation.annotationId === activeAnnotationId);\n if (activeAnnotation) {\n this.withSelectionChangeContext(context, () => {\n canvas.setActiveObject(activeAnnotation);\n this.handleSelectionChanged([activeAnnotation]);\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, _c;\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 const activeAnnotation = this.getActiveAnnotationForSnapshot();\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 activeAnnotationId: (_b = activeAnnotation === null || activeAnnotation === void 0 ? void 0 : activeAnnotation.annotationId) !== null && _b !== void 0 ? _b : null,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n baseImageScale: this.baseImageScale,\n currentImageMimeType: this.currentImageMimeType,\n });\n const before = (_c = this.lastSnapshot) !== null && _c !== void 0 ? _c : 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.restoreActiveObjectAfterSnapshot(activeObj, activeMask, activeAnnotation);\n this.updateUi();\n }\n }\n restoreActiveObjectAfterSnapshot(activeObj, activeMask, activeAnnotation) {\n if (!this.canvas)\n return;\n const maskToRestore = activeObj && isMaskObject(activeObj) ? activeObj : activeMask;\n const annotationToRestore = activeObj && isAnnotationObject(activeObj) ? activeObj : activeAnnotation;\n if (maskToRestore && this.canvas.getObjects().includes(maskToRestore)) {\n this.canvas.setActiveObject(maskToRestore);\n this.showLabelForMask(maskToRestore);\n this.updateMaskListSelection(maskToRestore);\n return;\n }\n if (annotationToRestore && this.canvas.getObjects().includes(annotationToRestore)) {\n this.canvas.setActiveObject(annotationToRestore);\n this.updateAnnotationListSelection(annotationToRestore);\n }\n }\n undo() {\n if (this.isDisposed)\n return Promise.resolve();\n if (!this.canRunIdleOperation('undo'))\n return Promise.resolve();\n this.finalizeActiveTextEditingIfNeeded();\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 this.finalizeActiveTextEditingIfNeeded();\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.getLiveCanvasOrThrow('createMask'),\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.getLiveCanvasOrThrow('removeMask'),\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 handleObjectMovingScalingRotating(target) {\n if (isMaskObject(target)) {\n this.syncMaskLabel(target);\n }\n }\n handleObjectModified(target) {\n if (isMaskObject(target)) {\n this.syncMaskLabel(target);\n const context = this.buildCallbackContext('saveState', false);\n this.saveState();\n this.emitMasksChanged(context);\n this.emitImageChanged(context);\n return;\n }\n if (isAnnotationObject(target)) {\n if (isAnnotationLocked(target))\n return;\n const context = this.buildCallbackContext('updateAnnotation', false);\n this.saveState();\n this.emitAnnotationsChanged(context);\n this.emitImageChanged(context);\n }\n }\n handleSelectionChanged(selected) {\n var _a, _b, _c, _d;\n if (!this.canvas)\n return;\n const selectedMask = (_a = selected.find(isMaskObject)) !== null && _a !== void 0 ? _a : null;\n const selectedAnnotation = (_b = selected.find(isAnnotationObject)) !== null && _b !== void 0 ? _b : 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.updateAnnotationListSelection(selectedAnnotation);\n this.canvas.requestRenderAll();\n this.updateUi();\n const context = (_c = this.nextSelectionChangeContext) !== null && _c !== void 0 ? _c : this.buildCallbackContext((_d = this.activeStateRestoreOperation) !== null && _d !== void 0 ? _d : '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 enterTextMode() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('enterTextMode'))\n return;\n if (this.isToolModeActive())\n return;\n enterTextModeImpl(this.buildTextControllerContext());\n const callbackContext = this.buildCallbackContext('enterTextMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n exitTextMode() {\n if (!this.canvas || !this.textSession)\n return;\n if (!this.canRunIdleOperation('exitTextMode'))\n return;\n exitTextModeImpl(this.buildTextControllerContext());\n const callbackContext = this.buildCallbackContext('exitTextMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n isTextMode() {\n return this.textSession !== null;\n }\n createTextAnnotation(config = {}) {\n if (!this.canvas)\n return null;\n if (!this.canRunIdleOperation('createTextAnnotation'))\n return null;\n return createTextAnnotationImpl(this.buildTextControllerContext(), config);\n }\n enterDrawMode() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('enterDrawMode'))\n return;\n if (this.isToolModeActive())\n return;\n enterDrawModeImpl(this.buildDrawControllerContext());\n const callbackContext = this.buildCallbackContext('enterDrawMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n exitDrawMode() {\n if (!this.canvas || !this.drawSession)\n return;\n if (!this.canRunIdleOperation('exitDrawMode'))\n return;\n exitDrawModeImpl(this.buildDrawControllerContext());\n const callbackContext = this.buildCallbackContext('exitDrawMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n isDrawMode() {\n return this.drawSession !== null;\n }\n getTextConfig() {\n return cloneResolvedTextAnnotationConfig(this.currentTextConfig);\n }\n setTextConfig(config) {\n this.applyTextConfigPatch(config, 'setTextConfig');\n }\n resetTextConfig() {\n this.applyTextConfigPatch(this.defaultTextConfig, 'resetTextConfig');\n }\n setTextColor(color) {\n this.applyTextConfigPatch({ fill: color }, 'setTextColor');\n }\n setTextFontSize(size) {\n this.applyTextConfigPatch({ fontSize: size }, 'setTextFontSize');\n }\n getDrawConfig() {\n return cloneResolvedDrawConfig(this.currentDrawConfig);\n }\n setDrawConfig(config) {\n this.applyDrawConfigPatch(config, 'setDrawConfig');\n }\n resetDrawConfig() {\n this.applyDrawConfigPatch(this.defaultDrawConfig, 'resetDrawConfig');\n }\n setDrawColor(color) {\n this.applyDrawConfigPatch({ color }, 'setDrawColor');\n }\n setDrawBrushSize(size) {\n this.applyDrawConfigPatch({ brushSize: size }, 'setDrawBrushSize');\n }\n removeSelectedAnnotation() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('removeSelectedAnnotation'))\n return;\n const before = this.getAnnotations().length;\n const callbackContext = this.buildCallbackContext('removeSelectedAnnotation', false);\n this.withSelectionChangeContext(callbackContext, () => {\n removeSelectedAnnotationImpl(this.buildAnnotationManagerContext());\n });\n this.updateAnnotationList();\n this.updateUi();\n if (this.getAnnotations().length !== before) {\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n removeAllAnnotations(options = {}) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('removeAllAnnotations', options))\n return;\n const before = this.getAnnotations().length;\n const callbackContext = this.buildCallbackContext('removeAllAnnotations', false);\n this.withSelectionChangeContext(callbackContext, () => {\n removeAllAnnotationsImpl(this.buildAnnotationManagerContext(), options);\n });\n this.updateAnnotationList();\n this.updateUi();\n if (this.getAnnotations().length !== before) {\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n updateAnnotation(annotationId, config) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('updateAnnotation'))\n return;\n const callbackContext = this.buildCallbackContext('updateAnnotation', false);\n const changed = updateAnnotationImpl(this.buildAnnotationManagerContext(), annotationId, config);\n if (changed) {\n this.updateAnnotationList();\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n updateSelectedAnnotation(config) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('updateSelectedAnnotation'))\n return;\n const callbackContext = this.buildCallbackContext('updateSelectedAnnotation', false);\n const changed = updateSelectedAnnotationImpl(this.buildAnnotationManagerContext(), config);\n if (changed) {\n this.updateAnnotationList();\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n deleteSelectedObject() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('deleteSelectedObject'))\n return;\n this.finalizeActiveTextEditingIfNeeded();\n const selectedObjects = this.getSelectedCanvasObjects();\n const selectedMasks = selectedObjects.filter(isMaskObject);\n const selectedAnnotations = selectedObjects.filter((object) => isAnnotationObject(object) && isAnnotationUnlocked(object));\n if (selectedMasks.length === 0 && selectedAnnotations.length === 0)\n return;\n const canvas = this.getLiveCanvasOrThrow('deleteSelectedObject');\n const callbackContext = this.buildCallbackContext('deleteSelectedObject', false);\n this.withSelectionChangeContext(callbackContext, () => {\n for (const mask of selectedMasks) {\n this.removeLabelForMask(mask);\n canvas.remove(mask);\n }\n removeAnnotationObjects(this.buildAnnotationManagerContext(), selectedAnnotations, {\n saveHistory: false,\n force: true,\n });\n canvas.discardActiveObject();\n canvas.renderAll();\n this.saveState();\n });\n this.updateMaskList();\n this.updateAnnotationList();\n this.updateUi();\n if (selectedMasks.length > 0)\n this.emitMasksChanged(callbackContext);\n if (selectedAnnotations.length > 0)\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n bringSelectedObjectForward() {\n this.moveSelectedEditableObject('bringSelectedObjectForward');\n }\n sendSelectedObjectBackward() {\n this.moveSelectedEditableObject('sendSelectedObjectBackward');\n }\n bringSelectedObjectToFront() {\n this.moveSelectedEditableObject('bringSelectedObjectToFront');\n }\n sendSelectedObjectToBack() {\n this.moveSelectedEditableObject('sendSelectedObjectToBack');\n }\n buildAnnotationManagerContext() {\n return {\n canvas: this.getLiveCanvasOrThrow('annotationManager'),\n saveCanvasState: () => this.saveState(),\n updateUi: () => this.updateUi(),\n };\n }\n buildAnnotationListContext() {\n return {\n canvas: this.canvas,\n getListElementId: () => this.elements.annotationList,\n onAnnotationSelected: (annotation) => this.handleSelectionChanged([annotation]),\n };\n }\n updateAnnotationList() {\n renderAnnotationList(this.buildAnnotationListContext());\n }\n updateAnnotationListSelection(selectedAnnotation) {\n updateAnnotationListSelection(this.buildAnnotationListContext(), selectedAnnotation);\n }\n buildTextControllerContext() {\n return {\n fabric: this.fabricModule,\n canvas: this.getLiveCanvasOrThrow('textController'),\n options: this.options,\n getOriginalImage: () => this.originalImage,\n getTextConfig: () => this.currentTextConfig,\n isImageLoaded: () => this.isImageLoaded(),\n getAnnotationCounter: () => this.annotationCounter,\n setAnnotationCounter: (value) => {\n this.annotationCounter = value;\n },\n getTextSession: () => this.textSession,\n setTextSession: (session) => {\n this.textSession = session;\n },\n saveCanvasState: () => this.saveState(),\n updateAnnotationList: () => this.updateAnnotationList(),\n updateUi: () => this.updateUi(),\n emitAnnotationsChanged: (context) => this.emitAnnotationsChanged(context),\n emitImageChanged: (context) => this.emitImageChanged(context),\n buildCallbackContext: (operation) => this.buildCallbackContext(operation, false),\n };\n }\n buildDrawControllerContext() {\n return {\n fabric: this.fabricModule,\n canvas: this.getLiveCanvasOrThrow('drawController'),\n options: this.options,\n getDrawConfig: () => this.currentDrawConfig,\n isImageLoaded: () => this.isImageLoaded(),\n getAnnotationCounter: () => this.annotationCounter,\n setAnnotationCounter: (value) => {\n this.annotationCounter = value;\n },\n getDrawSession: () => this.drawSession,\n setDrawSession: (session) => {\n this.drawSession = session;\n },\n saveCanvasState: () => this.saveState(),\n updateAnnotationList: () => this.updateAnnotationList(),\n updateUi: () => this.updateUi(),\n emitAnnotationsChanged: (context) => this.emitAnnotationsChanged(context),\n emitImageChanged: (context) => this.emitImageChanged(context),\n buildCallbackContext: (operation) => this.buildCallbackContext(operation, false),\n };\n }\n applyTextConfigPatch(config, operation) {\n if (!this.canRunIdleOperation(operation))\n return;\n const invalidFields = getInvalidTextAnnotationConfigFields(config);\n if (invalidFields.length > 0) {\n reportWarning(this.options, null, `${operation} ignored invalid Text config fields: ${invalidFields.join(', ')}.`);\n }\n const next = mergeTextAnnotationConfigPatch(this.currentTextConfig, config, this.defaultTextConfig);\n if (areResolvedTextAnnotationConfigsEqual(this.currentTextConfig, next))\n return;\n this.currentTextConfig = next;\n this.updateInputs();\n this.updateUi();\n this.emitImageChanged(this.buildCallbackContext(operation, false));\n }\n applyDrawConfigPatch(config, operation) {\n if (!this.canRunIdleOperation(operation))\n return;\n const invalidFields = getInvalidDrawConfigFields(config);\n if (invalidFields.length > 0) {\n reportWarning(this.options, null, `${operation} ignored invalid Draw config fields: ${invalidFields.join(', ')}.`);\n }\n const next = mergeDrawConfigPatch(this.currentDrawConfig, config, this.defaultDrawConfig);\n if (areResolvedDrawConfigsEqual(this.currentDrawConfig, next))\n return;\n this.currentDrawConfig = next;\n updateDrawBrush(this.buildDrawControllerContext());\n this.updateInputs();\n this.updateUi();\n this.emitImageChanged(this.buildCallbackContext(operation, false));\n }\n applyTextColorInput(color) {\n var _a;\n if (this.isTextMode()) {\n this.setTextColor(color);\n return;\n }\n const selected = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n if (selected && isTextAnnotationObject(selected)) {\n this.updateSelectedAnnotation({ fill: color });\n return;\n }\n this.setTextColor(color);\n }\n applyTextFontSizeInput(size) {\n var _a;\n if (this.isTextMode()) {\n this.setTextFontSize(size);\n return;\n }\n const selected = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n if (selected && isTextAnnotationObject(selected)) {\n this.updateSelectedAnnotation({ fontSize: size });\n return;\n }\n this.setTextFontSize(size);\n }\n applyDrawColorInput(color) {\n var _a;\n if (this.isDrawMode()) {\n this.setDrawColor(color);\n return;\n }\n const selected = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n if (selected && isDrawAnnotationObject(selected)) {\n this.updateSelectedAnnotation({ stroke: color });\n return;\n }\n this.setDrawColor(color);\n }\n applyDrawBrushSizeInput(size) {\n var _a;\n if (this.isDrawMode()) {\n this.setDrawBrushSize(size);\n return;\n }\n const selected = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n if (selected && isDrawAnnotationObject(selected)) {\n this.updateSelectedAnnotation({ strokeWidth: size });\n return;\n }\n this.setDrawBrushSize(size);\n }\n getSelectedCanvasObjects() {\n var _a, _b, _c;\n if (!this.canvas)\n return [];\n const activeObject = this.canvas.getActiveObject();\n if (!activeObject)\n return [];\n const type = typeof activeObject.type === 'string' ? activeObject.type.toLowerCase() : '';\n const isActiveSelection = type === 'activeselection' ||\n ((_c = (_b = (_a = activeObject).isType) === null || _b === void 0 ? void 0 : _b.call(_a, 'ActiveSelection')) !== null && _c !== void 0 ? _c : false);\n if (!isActiveSelection)\n return [activeObject];\n const getObjects = activeObject\n .getObjects;\n return typeof getObjects === 'function' ? getObjects.call(activeObject) : [];\n }\n moveSelectedEditableObject(operation) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation(operation))\n return;\n const selected = this.getSelectedCanvasObjects().filter(isEditableOverlayObject);\n if (selected.length !== 1) {\n if (selected.length > 1) {\n reportWarning(this.options, null, `${operation} skipped: ActiveSelection layer moves are not supported.`);\n }\n return;\n }\n const object = selected[0];\n const range = getEditableOverlayRange(this.canvas);\n const overlays = range.overlays;\n const currentOverlayIndex = overlays.indexOf(object);\n if (currentOverlayIndex < 0)\n return;\n let nextOverlayIndex = currentOverlayIndex;\n if (operation === 'bringSelectedObjectForward') {\n nextOverlayIndex = Math.min(overlays.length - 1, currentOverlayIndex + 1);\n }\n else if (operation === 'sendSelectedObjectBackward') {\n nextOverlayIndex = Math.max(0, currentOverlayIndex - 1);\n }\n else if (operation === 'bringSelectedObjectToFront') {\n nextOverlayIndex = overlays.length - 1;\n }\n else if (operation === 'sendSelectedObjectToBack') {\n nextOverlayIndex = 0;\n }\n if (nextOverlayIndex === currentOverlayIndex)\n return;\n const reordered = overlays.slice();\n reordered.splice(currentOverlayIndex, 1);\n reordered.splice(nextOverlayIndex, 0, object);\n reordered.forEach((overlay, index) => {\n var _a, _b;\n (_b = (_a = this.canvas).moveObjectTo) === null || _b === void 0 ? void 0 : _b.call(_a, overlay, range.start + index);\n });\n normalizeLayerOrder(this.canvas);\n this.canvas.setActiveObject(object);\n this.canvas.renderAll();\n this.saveState();\n this.updateMaskList();\n this.updateAnnotationList();\n this.updateUi();\n const context = this.buildCallbackContext(operation, false);\n if (isMaskObject(object))\n this.emitMasksChanged(context);\n if (isAnnotationObject(object))\n this.emitAnnotationsChanged(context);\n this.emitImageChanged(context);\n }\n async mergeMasks() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('mergeMasks'))\n return;\n this.finalizeActiveTextEditingIfNeeded();\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.updateAnnotationList();\n this.emitMasksChanged(callbackContext);\n if (this.getAnnotations().length > 0) {\n this.emitAnnotationsChanged(callbackContext);\n }\n this.emitImageChanged(callbackContext);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n }\n }\n downloadImage(options) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('downloadImage'))\n return;\n this.finalizeActiveTextEditingIfNeeded();\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, options);\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 this.finalizeActiveTextEditingIfNeeded();\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 this.finalizeActiveTextEditingIfNeeded();\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.getLiveCanvasOrThrow('export'),\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 captureSnapshot: () => this.captureSnapshotInternal(),\n loadFromState: (snapshot) => this.loadFromStateInternal(snapshot, this.withInternalOperationOptions(operationToken, this.withAnimationQueueBypass())),\n exportImageBase64: (options) => exportImageBase64Impl(this.buildExportServiceContext(), options),\n updateUi: () => this.updateUi(),\n updateInputs: () => this.updateInputs(),\n removeAllMasksNoHistory: () => {\n const context = this.buildRemoveMaskContext();\n removeAllMasksImpl(context, { saveHistory: false });\n },\n getAnnotations: () => this.getAnnotations(),\n restoreAnnotations: (objects) => {\n const canvas = this.getLiveCanvasOrThrow('restoreAnnotations');\n objects.forEach((annotation) => {\n canvas.add(annotation);\n });\n syncAnnotationRuntimeStates(objects);\n attachTextEditingHandlersToAnnotations(this.buildTextControllerContext(), objects);\n this.annotationCounter = Math.max(this.annotationCounter, ...objects.map((annotation) => annotation.annotationId), 0);\n this.updateAnnotationList();\n },\n };\n }\n buildMergeAnnotationsContext(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 captureSnapshot: () => this.captureSnapshotInternal(),\n loadFromState: (snapshot) => this.loadFromStateInternal(snapshot, this.withInternalOperationOptions(operationToken, this.withAnimationQueueBypass())),\n exportImageBase64: (options) => exportImageBase64Impl(this.buildExportServiceContext(), options),\n updateUi: () => this.updateUi(),\n updateInputs: () => this.updateInputs(),\n removeAllAnnotationsNoHistory: () => {\n removeAllAnnotationsImpl(this.buildAnnotationManagerContext(), {\n saveHistory: false,\n force: true,\n });\n },\n getMasks: () => this.getMasks(),\n restoreMasks: (objects) => {\n const canvas = this.getLiveCanvasOrThrow('restoreMasks');\n objects.forEach((mask) => {\n canvas.add(mask);\n reattachMaskHoverHandlers(mask);\n });\n this.lastMask = objects.reduce((lastMask, mask) => !lastMask || mask.maskId > lastMask.maskId ? mask : lastMask, null);\n this.maskCounter = Math.max(this.maskCounter, ...objects.map((mask) => mask.maskId), 0);\n this.updateMaskList();\n },\n };\n }\n captureSnapshotInternal() {\n var _a, _b;\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 const activeAnnotation = this.getActiveAnnotationForSnapshot();\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 activeAnnotationId: (_b = activeAnnotation === null || activeAnnotation === void 0 ? void 0 : activeAnnotation.annotationId) !== null && _b !== void 0 ? _b : 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 getActiveAnnotationForSnapshot() {\n if (!this.canvas)\n return null;\n const activeObject = this.canvas.getActiveObject();\n return activeObject && isAnnotationObject(activeObject) ? activeObject : 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.getLiveCanvasOrThrow('mosaicController'),\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.getLiveCanvasOrThrow('cropController'),\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 syncInputValue(inputElement, value) {\n if (!inputElement)\n return;\n const ownerDocument = inputElement.ownerDocument;\n if (ownerDocument.activeElement === inputElement && !inputElement.readOnly)\n return;\n if (inputElement.value !== value)\n inputElement.value = value;\n }\n updateInputs() {\n const scaleId = this.elements.scalePercentageInput;\n if (scaleId) {\n const scaleInputElement = document.getElementById(scaleId);\n this.syncInputValue(scaleInputElement, String(Math.round(this.currentScale * 100)));\n }\n const mosaicConfig = this.getMosaicConfig();\n const mosaicBrushSizeInputId = this.elements.mosaicBrushSizeInput;\n if (mosaicBrushSizeInputId) {\n const brushInput = document.getElementById(mosaicBrushSizeInputId);\n this.syncInputValue(brushInput, String(mosaicConfig.brushSize));\n }\n const mosaicBlockSizeInputId = this.elements.mosaicBlockSizeInput;\n if (mosaicBlockSizeInputId) {\n const blockInput = document.getElementById(mosaicBlockSizeInputId);\n this.syncInputValue(blockInput, String(mosaicConfig.blockSize));\n }\n const textConfig = this.getTextConfig();\n const textColorInputId = this.elements.textColorInput;\n if (textColorInputId) {\n const textColorInput = document.getElementById(textColorInputId);\n this.syncInputValue(textColorInput, textConfig.fill);\n }\n const textFontSizeInputId = this.elements.textFontSizeInput;\n if (textFontSizeInputId) {\n const fontInput = document.getElementById(textFontSizeInputId);\n this.syncInputValue(fontInput, String(textConfig.fontSize));\n }\n const drawConfig = this.getDrawConfig();\n const drawColorInputId = this.elements.drawColorInput;\n if (drawColorInputId) {\n const drawColorInput = document.getElementById(drawColorInputId);\n this.syncInputValue(drawColorInput, drawConfig.color);\n }\n const drawBrushSizeInputId = this.elements.drawBrushSizeInput;\n if (drawBrushSizeInputId) {\n const brushInput = document.getElementById(drawBrushSizeInputId);\n this.syncInputValue(brushInput, String(drawConfig.brushSize));\n }\n }\n async mergeAnnotations() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('mergeAnnotations'))\n return;\n this.finalizeActiveTextEditingIfNeeded();\n const hasAnnotations = this.canvas.getObjects().some(isAnnotationObject);\n if (!hasAnnotations)\n return;\n const callbackContext = this.buildCallbackContext('mergeAnnotations', false);\n const operationToken = this.operationGuard.beginBusyOperation('mergeAnnotations');\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n try {\n await mergeAnnotationsImpl(this.buildMergeAnnotationsContext(operationToken));\n this.updateInputs();\n this.updateMaskList();\n this.updateAnnotationList();\n this.emitAnnotationsChanged(callbackContext);\n if (this.getMasks().length > 0)\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 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 annotations = hasImage ? this.canvas.getObjects().filter(isAnnotationObject) : [];\n const hasMasks = masks.length > 0;\n const hasAnnotations = annotations.length > 0;\n const activeObject = this.canvas.getActiveObject();\n const hasSelectedMask = !!(activeObject && isMaskObject(activeObject));\n const hasSelectedAnnotation = !!(activeObject && isAnnotationObject(activeObject));\n const hasSelectedEditableObject = !!activeObject && isEditableOverlayObject(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 isInTextMode = this.textSession !== null;\n const isInDrawMode = this.drawSession !== 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 (isInTextMode) {\n CROP_MODE_CONTROL_KEYS.forEach((key) => {\n this.setControlEnabled(key, !isBusy && TEXT_MODE_ENABLED_KEYS.includes(key));\n });\n return;\n }\n if (isInDrawMode) {\n CROP_MODE_CONTROL_KEYS.forEach((key) => {\n this.setControlEnabled(key, !isBusy && DRAW_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('removeSelectedAnnotationButton', hasSelectedAnnotation && !isBusy);\n this.setControlEnabled('removeAllAnnotationsButton', hasAnnotations && !isBusy);\n this.setControlEnabled('deleteSelectedObjectButton', hasSelectedEditableObject && !isBusy);\n this.setControlEnabled('mergeAnnotationsButton', hasImage && hasAnnotations && !isBusy);\n this.setControlEnabled('bringSelectedObjectForwardButton', hasSelectedEditableObject && !isBusy);\n this.setControlEnabled('sendSelectedObjectBackwardButton', hasSelectedEditableObject && !isBusy);\n this.setControlEnabled('bringSelectedObjectToFrontButton', hasSelectedEditableObject && !isBusy);\n this.setControlEnabled('sendSelectedObjectToBackButton', hasSelectedEditableObject && !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('enterTextModeButton', hasImage && !isBusy);\n this.setControlEnabled('enterDrawModeButton', hasImage && !isBusy);\n this.setControlEnabled('exitMosaicModeButton', false);\n this.setControlEnabled('exitTextModeButton', false);\n this.setControlEnabled('exitDrawModeButton', false);\n this.setControlEnabled('mosaicBrushSizeInput', !this.isDisposed);\n this.setControlEnabled('mosaicBlockSizeInput', !this.isDisposed);\n this.setControlEnabled('textColorInput', !this.isDisposed);\n this.setControlEnabled('textFontSizeInput', !this.isDisposed);\n this.setControlEnabled('drawColorInput', !this.isDisposed);\n this.setControlEnabled('drawBrushSizeInput', !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 const formControl = controlElement;\n const nextDisabled = !isEnabled;\n if (formControl.disabled !== nextDisabled)\n formControl.disabled = nextDisabled;\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 if (this.keyboardHandler && this.keyboardDocument) {\n try {\n this.keyboardDocument.removeEventListener('keydown', this.keyboardHandler);\n }\n catch {\n }\n }\n this.keyboardHandler = null;\n this.keyboardDocument = null;\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.textSession && this.canvas) {\n try {\n exitTextModeImpl(this.buildTextControllerContext());\n }\n catch {\n }\n this.textSession = null;\n }\n if (this.drawSession && this.canvas) {\n try {\n exitDrawModeImpl(this.buildDrawControllerContext());\n }\n catch {\n }\n this.drawSession = 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.annotationCounter = 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","mergeMasksByDefault","mergeAnnotationsByDefault","defaultMaskWidth","defaultMaskHeight","defaultMaskConfig","maskRotatable","maskLabelOnSelect","maskLabelOffset","maskName","textAnnotationName","drawAnnotationName","groupSelection","showPlaceholder","initialImageBase64","defaultDownloadFileName","onImageLoadStart","onImageLoaded","onImageCleared","onImageChanged","onBusyChange","onEditorDisposed","onMasksChanged","onAnnotationsChanged","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","DEFAULT_TEXT_ANNOTATION_CONFIG","text","left","top","width","textAlign","angle","editable","enterEditing","annotationHidden","annotationLocked","styles","DEFAULT_DRAW_CONFIG","color","opacity","lineCap","lineJoin","KNOWN_TOP_LEVEL_KEYS","Set","normalizeCallback","isLayoutMode","normalizeLayoutMode","isConfigObject","Array","isArray","copyDefaultMaskConfigValue","normalizeDefaultMaskConfig","normalized","optionValue","entries","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","right","leftDash","rightDash","dashEqual","index","cloneResolvedTextAnnotationConfig","cloneResolvedDrawConfig","normalizePositiveNumber","normalizeBoolean","normalizeString","normalizeTextLeftTop","mergeTextAnnotationConfigPatch","normalizeTextAlign","mergeDrawConfigPatch","normalizeOpacity","normalizeLineCap","normalizeLineJoin","resolveOptions","_b","_c","_d","resolved","keys","has","normalizeMaxHistorySize","userLabel","label","mergedTextOptions","textOptions","create","userCrop","crop","minWidth","minHeight","hideMasksDuringCrop","preserveMasksAfterCrop","allowRotationOfCropRect","exportFileType","exportQuality","defaultMosaicConfig","normalizeMosaicConfig","defaultTextConfig","normalizeTextAnnotationConfig","defaultDrawConfig","normalizeDrawConfig","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","isBaseImageObject","editorObjectKind","isMaskObject","candidate","maskId","maskUid","isAnnotationObject","annotationId","annotationType","annotationName","isTextAnnotationObject","isDrawAnnotationObject","isSessionObject","sessionObjectType","isEditableOverlayObject","markBaseImageObject","image","baseImage","markMaskObject","meta","originalAlpha","originalStroke","originalStrokeWidth","markAnnotationObject","annotation","markSessionObject","sessionObject","SNAPSHOT_CUSTOM_KEYS","saveState","canvas","currentScale","currentRotation","baseImageScale","activeObject","getActiveObject","activeMaskId","activeAnnotationId","type","isType","isActiveSelectionObject","discardActiveObject","jsonObj","toJSON","canvasObjects","jsonObjects","liveObject","jsonObject","hasControls","strokeUniform","lockRotation","transparentCorners","borderColor","cornerColor","cornerSize","isCropRect","maskLabel","isMosaicPreview","copySnapshotCustomPropsFromCanvas","getObjects","objects","filter","o","_editorState","currentImageMimeType","activeObjectKind","JSON","stringify","async","loadFromState","jsonString","snapshotInput","setCanvasSize","json","parse","height","loadFromJSON","canvasObjs","jsonObjs","forEach","jObj","canvasObj","consumedCanvasIndexes","jType","jLeft","jTop","jUid","matchIndex","findIndex","abs","maskObject","restoreEditorObjectPropsFromJson","editorState","kind","maxMaskId","reduce","maxAnnotationId","annotationObject","masks","annotations","originalImage","find","Command","execute","undo","HistoryManager","maxSize","command","pushAndTrim","canUndo","currentIndex","canRedo","history","isProcessing","cmd","redo","slice","looksLikeFabricModule","Canvas","isAnnotationLocked","isAnnotationUnlocked","setObjectProps","props","set","assign","syncAnnotationRuntimeState","hidden","locked","visible","lockMovementX","lockMovementY","lockScalingX","lockScalingY","syncTextEditability","setCoords","syncAnnotationRuntimeStates","getAnnotations","getSelectedAnnotations","active","getActiveSelectionObjects","snapshotAnnotation","stroke","strokeWidth","setAnnotationProps","updateAnnotationObject","before","updateTextAnnotation","updateDrawAnnotation","removeAnnotationObjects","context","force","removable","remove","renderAll","saveHistory","saveCanvasState","updateUi","removeAllAnnotations","getAnnotationListDocument","_e","canvasLike","getElement","ownerDocument","lowerCanvasEl","document","isLegacySessionObject","moveObjectTo","canvasWithLayerApi","insertAt","ensureOnCanvas","includes","withoutObject","findFirstSessionIndex","normalizeLayerOrder","groups","baseImages","overlays","sessions","others","getOrderedGroups","placeAnnotationObject","firstSessionIndex","hasMeaningfulCanvasRegion","rect","bottom","safeCanvasWidth","safeCanvasHeight","overlapWidth","overlapHeight","getClampedCanvasRegion","safeLeft","safeTop","safeWidth","safeHeight","roundEnd","includePartialPixels","ceil","hasCanvasWidth","hasCanvasHeight","round","POSITIVE_INFINITY","hasFractionalCanvasEdge","numericValue","getPartialExportEdges","bounds","normalizedAngle","getObjectBBox","boundingRect","getBoundingRect","resolveNumeric","val","axis","endsWith","pct","parseFloat","dim","getWidth","getHeight","coercePoint","pt","x","y","isFinitePoint","point","getPointerFromFabricEvent","event","fabricEvent","scenePoint","pointer","absolutePointer","e","getPointer","resolveTextCreationConfig","base","getTextConfig","getOriginalImage","resolveDefaultTextPosition","leftInput","topInput","attachTextEditingHandlers","textObject","imageEditorTextEditingHandlers","off","entered","exited","imageEditorTextEditingInitialText","imageEditorTextEditingCancel","initial","finalText","cancel","callbackContext","buildCallbackContext","emitAnnotationsChanged","emitImageChanged","on","createTextAnnotation","isImageLoaded","textbox","fabric","Textbox","getAnnotationCounter","setAnnotationCounter","nextAnnotationMeta","setActiveObject","updateAnnotationList","textLength","selectAll","setSelectionStart","setSelectionEnd","selectionStart","selectionEnd","selectAllText","enterTextMode","getTextSession","previousCanvasSelection","selection","previousDefaultCursor","defaultCursor","callback","target","handleTextModePointer","session","mode","handlers","eventName","dispose","Rect","excludeFromExport","setTextSession","exitTextMode","requestRenderAll","finalizeActiveTextEditing","isEditing","commit","exitEditing","attachTextEditingHandlersToAnnotations","configureBrush","getDrawConfig","canvasWithBrush","freeDrawingBrush","PencilBrush","alpha","test","hex","parseInt","colorWithOpacity","strokeLineCap","strokeLineJoin","handlePathCreated","path","markPathAsDrawAnnotation","exitDrawMode","getDrawSession","setDrawSession","fixPrototype","self","ctor","setPrototypeOf","ImageDecodeError","originalError","super","ImageLoadTimeoutError","elapsedMs","DownsampleError","MergeMasksError","MergeAnnotationsError","CropApplyError","ExportNotReadyError","operation","ExportError","DEFAULT_STROKE_FALLBACK","applyMaskUnselectedStyle","attachMaskHoverHandlers","tagged","mouseover","baseAlpha","getMaskHoverStyle","mouseout","getMaskNormalStyle","imageEditorMaskHandlers","reattachMaskHoverHandlers","sw","detachMaskHoverHandlers","captureMaskStyleBackup","_f","_g","restoreMaskStyleBackup","backup","applyCropHideMaskStyle","CROP_RECT_DASH","CROPPED_EXPORT_QUALITY_FALLBACK","finiteNumberOrFallback","resolveLossyCropQuality","cropExportQuality","cropQuality","clampExportQuality","fallbackQuality","removeCropRect","targetHandlers","record","cropRect","restoreCropObjectState","prevEvented","teardownSession","maskBackups","restoreCropMaskBackups","prevSelection","maskIntersectsRegion","region","bbox","cancelCrop","getCropSession","setCropSession","applyCrop","beforeJson","preserveMasks","cropAngle","rectBounds","scaleX","scaleY","getCropRectContentBounds","cropRegion","preservedRecords","records","styleBackupByMask","Map","map","styleBackup","get","capturePreservedMasks","cropFormat","requested","cropExportFileType","imageMimeToFormat","resolveCropExportFormat","getCurrentImageMimeType","exportOptions","multiplier","croppedBase64","toDataURL","loadImage","maxRestoredId","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","canvasPoint","brushDiameterCanvasPx","brushDiameter","f","toMatrix2D","calcTransformMatrix","inverse","determinant","invertMatrix","localPoint","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","offset","safeRender","ensurePreviewCircle","circle","previewCircle","getMosaicConfig","Circle","strokeDashArray","objectCaching","createPreviewCircle","updateMosaicPreview","removePreviewCircle","ensurePreviewImage","sourceImage","rasterCache","previewImage","FabricImage","offscreenCanvas","copyBaseImageProperties","createPreviewImage","dirty","sourceIndex","indexOf","placePreviewImageAfterBase","removePreviewImage","hidePreview","getMosaicSession","movePreview","attachCanvasHandler","getImageSource","imageWithSource","src","getSrc","imageDimension","source","skewX","skewY","flipX","flipY","hoverCursor","getOrCreateRasterCache","element","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","commitMosaicChanges","commitRequested","output","mimeToFormat","toSupportedMimeType","resolveMosaicOutputFormat","nextDataUrl","nextImage","fromURL","createFabricImageFromDataUrl","oldImage","newImage","oldRemoved","newAdded","sendObjectToBack","setOriginalImage","setCurrentImageMimeType","replaceBaseImage","after","captureSnapshot","getLastSnapshot","setLastSnapshot","pushMosaicHistory","updateInputs","drainMosaicQueue","isApplying","emitBusyChangeIfChanged","pendingCanvasPoints","catch","enqueueMosaicPoint","splice","requestMosaicCommit","enterMosaicMode","hideAllMaskLabels","prevDefaultCursor","prevObjectStates","isPointerDown","setMosaicSession","currentSession","installMosaicHandlers","exitMosaicMode","detachCanvasHandlers","cache","releaseMosaicRasterCache","restoreObjectStates","startImageElementLoad","Image","clearSource","validationError","validate","rejectImage","resolveImage","createError","createMergeError","flattenOverlayGroupToBaseImage","getTargets","beforeSnapshot","preservedObjects","getPreservedObjects","preScrollTop","containerElement","scrollTop","preScrollLeft","scrollLeft","detachObjects","exportedDataUrl","exportImageBase64","removeTargetsNoHistory","preserveScroll","restorePreservedObjects","scrollError","afterSnapshot","resolveMultiplier","num","fallbackValue","readCanvasDimension","getterName","propertyName","getter","withMaskExportState","mergeMasks","mutator","backups","withMaskStyleBackup","applyExportBakeInStyle","withObjectsHidden","predicate","getCanvasObjects","requestRender","isObjectOnCanvas","hasPartialEdges","edges","getImageDimensions","loadImageElement","getJpegBackgroundColor","trim","digits","commaAlpha","isZeroCssAlpha","slashAlpha","isTransparentCssColor","createColorValidationContext","fillStyle","firstSentinel","firstResolved","secondSentinel","secondResolved","resolveCanvasFillStyle","numericPercent","numericAlpha","warnNoImageLoaded","canvasWithSelection","captureActiveObject","labelBackups","labelObject","wasOnCanvas","captureMaskLabelBackups","exportArea","mergeAnnotations","resolveExportOptions","partialEdges","computeExportRegion","sourceWidth","sourceHeight","outputWidth","outputHeight","pixelCount","maxPixels","RangeError","assertExportPixelBudget","renderFormat","renderQuality","withSessionObjectsHidden","withAnnotationsExportState","fabricOptions","renderCanvasToDataUrl","sealedFormat","canvasContext","pixels","sealPixel","fallbackX","fallbackY","fallbackIndex","fallbackAlpha","nextAlpha","sealPartialTransparentEdges","fillRect","convertDataUrlToOpaqueJpeg","restoreMaskLabelBackups","restoreActiveObject","exportImageFile","fileName","base64","finalDataUrl","sourceDataUrl","reencodeDataUrlAs","bytes","globalThis","atob","binary","buffer","ArrayBuffer","Uint8Array","i","charCodeAt","bufferCtor","Buffer","from","dataUrlToBytes","File","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","body","probe","position","visibility","pointerEvents","appendChild","offsetWidth","offsetHeight","computeScrollableCanvasSize","contentWidth","contentHeight","viewport","viewportW","viewportH","hasHorizontal","hasVertical","effectiveW","effectiveH","nextHorizontal","nextVertical","applyCanvasDimensions","integerWidth","integerHeight","setDimensions","imageBase64","loadOptions","bundle","placeholderHidden","placeholderElement","containerScrollTop","containerScrollLeft","isImageLoadedToCanvas","getIsImageLoadedToCanvas","lastSnapshot","canvasJson","serializeCanvas","maskCounter","annotationCounter","getCurrentScale","getCurrentRotation","getBaseImageScale","setPlaceholderVisible","decode","hasNaturalImageDimensions","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","replayRollback","errorMessage","animateProps","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","rotateImage","degrees","centre","getCenterPoint","animationFailed","restoreOrigin","newTopLeft","resetImageTransform","setSuppressSaveState","first","getCoords","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","gap","previousMask","getLastMask","previousRight","getScaledWidth","polygonPoints","requiredWidth","requiredHeight","nextWidth","nextHeight","expandCanvasIfNeeded","generated","isFabricObjectLike","originProps","Ellipse","polygon","Polygon","deltaX","deltaY","nextId","setLastMask","placeMaskObject","removeSelectedMask","selectedMasks","getSelectedMaskObjects","removeLabelForMask","removeAllMasks","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","TEXT_MODE_ENABLED_KEYS","DRAW_MODE_ENABLED_KEYS","MOSAIC_MODE_CONTROL_KEYS","MOSAIC_MODE_ENABLED_KEYS","MOSAIC_SESSION_ALLOWED_OPERATIONS","IMAGE_EDITOR_OPERATIONS","TOOL_MODE_ALLOWED_OPERATIONS","mosaic","draw","ImageEditor","fabricModuleOrOptions","detected","fabricOrOptions","maybeOptions","globalScope","isFabricLoaded","globalFabric","readGlobalFabric","detectFabric","currentLayoutMode","currentMosaicConfig","currentTextConfig","currentDrawConfig","rawDefaultLayoutMode","TypeError","operationGuard","animQueue","init","idMap","elements","canvasContainer","imagePlaceholder","scalePercentageInput","rotateLeftDegreesInput","rotateRightDegreesInput","rotateLeftButton","rotateRightButton","createMaskButton","removeSelectedMaskButton","removeAllMasksButton","mergeMasksButton","annotationList","enterTextModeButton","exitTextModeButton","textColorInput","textFontSizeInput","enterDrawModeButton","exitDrawModeButton","drawColorInput","drawBrushSizeInput","removeSelectedAnnotationButton","removeAllAnnotationsButton","deleteSelectedObjectButton","mergeAnnotationsButton","bringSelectedObjectForwardButton","sendSelectedObjectBackwardButton","bringSelectedObjectToFrontButton","sendSelectedObjectToBackButton","downloadImageButton","maskList","zoomInButton","zoomOutButton","resetImageTransformButton","undoButton","redoButton","imageInput","enterCropModeButton","applyCropButton","cancelCropButton","enterMosaicModeButton","exitMosaicModeButton","mosaicBrushSizeInput","mosaicBlockSizeInput","uploadArea","initCanvas","domBindings","canvasElement","transformController","buildTransformContext","bindDomEvents","updatePlaceholderStatus","containerId","parentElement","placeholderId","initialWidth","initialHeight","preserveObjectStacking","handleSelectionChanged","selected","onObjectEvent","handleObjectMovingScalingRotating","handleObjectModified","getLiveCanvasOrThrow","bindElementIfExists","inputId","click","file","files","loadImageFile","enterDrawMode","removeSelectedAnnotation","deleteSelectedObject","bringSelectedObjectForward","sendSelectedObjectBackward","bringSelectedObjectToFront","sendSelectedObjectToBack","downloadImage","inputEl","step","parsedStep","isNaN","enterCropMode","bindMosaicSizeInput","applyValue","parsed","setMosaicBrushSize","setMosaicBlockSize","bindStringInput","bindNumberInput","applyTextColorInput","applyTextFontSizeInput","applyDrawColorInput","applyDrawBrushSizeInput","bindKeyboardEvents","keyboardHandler","keyboardDocument","handleKeyboardEvent","isNativeTextInputActive","activeElement","tagName","isContentEditable","isFabricTextEditingActive","buildTextControllerContext","preventDefault","textSession","drawSession","mosaicSession","cropSession","finalizeActiveTextEditingIfNeeded","mime","name","ext","inferImageMimeType","reader","FileReader","fileReaderResult","result","onabort","readAsDataURL","readFileAsDataUrl","loadImageInternal","canRunIdleOperation","getOperationContext","previousImage","hadMasks","getMasks","hadAnnotations","emitOptionCallback","loadImageContext","getRuntimeOptions","v","setPlaceholderVisibleImpl","loadImageImpl","lastMask","imageInfo","getImageInfo","emitMasksChanged","getInternalOperationToken","canRunDuringAnimationQueue","withInternalOperationOptions","withAnimationQueueBypass","activeToolMode","getActiveToolMode","isExpectedIdleGuardError","isToolModeActive","setLayoutMode","isInternalOperation","internal","activeOperation","callbackName","args","displayWidth","displayHeight","rotation","getAnnotationsImpl","getMaskCollectionSignature","join","getAnnotationCollectionSignature","getEditorState","hasImage","maskCount","annotationCount","isCropMode","isMosaicMode","isTextMode","isDrawMode","lastEmittedIsBusy","buildSelection","selectedAnnotations","selectedObjectKind","selectedMask","selectedAnnotation","withSelectionChangeContext","previous","nextSelectionChangeContext","isSupportedImageMimeType","inferCurrentImageMimeType","setCanvasSizePx","widthPx","heightPx","alignObjectBoundingBoxToCanvasTopLeft","measureLayoutViewport","getScrollbarStableViewportCanvasSize","updateCanvasSizeToImageBounds","shouldStabilizeContainedViewport","stabilizeContainedViewport","imageFitsViewport","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","previousAnnotationSignature","restoredState","loadFromStateImpl","restoredMasks","activeMask","activeAnnotation","activeObj","getActiveMaskForSnapshot","getActiveAnnotationForSnapshot","saveStateImpl","restoreActiveObjectAfterSnapshot","maskToRestore","annotationToRestore","showLabelForMask","updateMaskListSelection","updateAnnotationListSelection","createMaskContext","buildCreateMaskContext","createMaskImpl","removeMaskContext","buildRemoveMaskContext","removeSelectedMaskImpl","removeAllMasksImpl","buildMaskLabelContext","objs","l","buildMaskListContext","getListElementId","onMaskSelected","listId","listEl","innerHTML","listItemElement","className","textContent","dataset","onclick","renderMaskList","selectedId","querySelectorAll","item","isSelected","classList","toggle","enterTextModeImpl","exitTextModeImpl","createTextAnnotationImpl","canvasWithDrawing","previousDrawingMode","isDrawingMode","previousBrush","enterDrawModeImpl","buildDrawControllerContext","exitDrawModeImpl","setTextConfig","applyTextConfigPatch","resetTextConfig","setTextColor","setTextFontSize","setDrawConfig","applyDrawConfigPatch","resetDrawConfig","setDrawColor","setDrawBrushSize","buildAnnotationManagerContext","removeAllAnnotationsImpl","updateAnnotation","updateAnnotationImpl","updateSelectedAnnotation","Boolean","updateSelectedAnnotationImpl","selectedObjects","getSelectedCanvasObjects","moveSelectedEditableObject","buildAnnotationListContext","onAnnotationSelected","renderAnnotationList","invalidFields","invalid","getInvalidTextAnnotationConfigFields","getInvalidDrawConfigFields","range","overlayIndexes","getEditableOverlayRange","currentOverlayIndex","nextOverlayIndex","reordered","overlay","operationToken","mergeMasksContext","buildMergeMasksContext","removeAllMasksNoHistory","restoreAnnotations","mergeMasksImpl","exportContext","buildExportServiceContext","resolveDownloadOptions","link","download","href","removeChild","downloadImageImpl","exportImageBase64Impl","exportImageFileImpl","snapshot","buildMergeAnnotationsContext","removeAllAnnotationsNoHistory","restoreMasks","labeledMasks","enterMosaicModeImpl","buildMosaicControllerContext","exitMosaicModeImpl","setMosaicConfig","applyMosaicConfigPatch","resetMosaicConfig","nextConfig","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","syncInputValue","inputElement","readOnly","scaleId","scaleInputElement","mosaicConfig","mosaicBrushSizeInputId","brushInput","mosaicBlockSizeInputId","blockInput","textConfig","textColorInputId","textFontSizeInputId","fontInput","drawConfig","drawColorInputId","drawBrushSizeInputId","mergeAnnotationsImpl","hasMasks","hasAnnotations","hasSelectedMask","hasSelectedAnnotation","hasSelectedEditableObject","isDefaultTransform","isInCropMode","isInMosaicMode","isInTextMode","isInDrawMode","isMosaicApplying","setControlEnabled","isEnabled","controlElement","recordElementOriginalState","formControl","nextDisabled","disabled","originalAria","elementOriginalAriaDisabledMap","removeAttribute","elementOriginalPointerEventsMap","getAttribute","elementOriginalDisabledMap","restoreElementOriginalStates"],"mappings":"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AASvtC,MACzB,EChEG,SAAS2iC,GAAsBb,EAAoBhL,EAAkB6W,GACpE7L,IACAA,EAAmBhqB,QAAU61B,EAC7B7L,EAAmB8L,aAAa,cAAeD,EAAO,QAAU,SAEhE7W,IACAA,EAAiBhf,OAAS61B,EAC1B7W,EAAiB8W,aAAa,cAAeD,EAAO,OAAS,SAErE,CCTO,MAAME,GAA6B,CACtCzsC,IAAK,YACLD,IAAK,aACLD,KAAM,aACNG,KAAM,aACNysC,IAAK,YACLC,IAAK,aAEIC,GAA6B,IAAItlC,IAAIlK,OAAO+nC,OAAOsH,KAmCzD,SAASI,GAAezsC,GAC3B,GAAKA,EAEL,IACIA,EAAM1C,MAAQ,EAClB,CACA,MACA,CACJ,CCvBA,MAAMovC,GAAiB,GACjBC,GAA2B7+B,OAAO,gCAClC8+B,GAAwC9+B,OAAO,wCAC/C++B,GAAyB,CAC3B,uBACA,yBACA,0BACA,mBACA,oBACA,mBACA,2BACA,uBACA,mBACA,yBACA,sBACA,qBACA,iBACA,oBACA,sBACA,qBACA,iBACA,qBACA,iCACA,6BACA,6BACA,mCACA,mCACA,mCACA,iCACA,sBACA,eACA,gBACA,4BACA,aACA,aACA,aACA,sBACA,kBACA,mBACA,wBACA,uBACA,uBACA,wBAEEC,GAAyB,CAAC,kBAAmB,oBAC7CC,GAAkC,IAAI7lC,IAAI,CAAC,YAAa,eACxD8lC,GAAyB,CAC3B,qBACA,iBACA,qBAEEC,GAAyB,CAC3B,qBACA,iBACA,sBAEEC,GAA2B,CAC7B,uBACA,yBACA,0BACA,mBACA,oBACA,mBACA,2BACA,uBACA,mBACA,yBACA,sBACA,qBACA,iBACA,oBACA,sBACA,qBACA,iBACA,qBACA,iCACA,6BACA,6BACA,mCACA,mCACA,mCACA,iCACA,sBACA,eACA,gBACA,4BACA,aACA,aACA,aACA,sBACA,kBACA,mBACA,wBACA,uBACA,uBACA,wBAEEC,GAA2B,CAC7B,uBACA,uBACA,wBAEEC,GAAoC,IAAIlmC,IAAI,CAC9C,iBACA,cACA,kBACA,oBACA,qBACA,qBACA,cAGEmmC,GAA0B,IAAInmC,IA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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/editor-object-kind.js","../esm/core/state-serializer.js","../esm/history/history-manager.js","../esm/fabric/fabric-adapter.js","../esm/annotation/annotation-lock.js","../esm/annotation/annotation-style.js","../esm/annotation/annotation-manager.js","../esm/core/layer-order.js","../esm/utils/canvas-region.js","../esm/utils/number.js","../esm/utils/pointer.js","../esm/annotation/text-controller.js","../esm/annotation/draw-controller.js","../esm/core/errors.js","../esm/mask/mask-style.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/utils/image-element-loader.js","../esm/export/overlay-merge-service.js","../esm/export/export-service.js","../esm/utils/file.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/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/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 mergeMasksByDefault: true,\n mergeAnnotationsByDefault: 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 textAnnotationName: 'text',\n drawAnnotationName: 'draw',\n groupSelection: false,\n showPlaceholder: true,\n initialImageBase64: null,\n defaultDownloadFileName: 'edited_image',\n onImageLoadStart: null,\n onImageLoaded: null,\n onImageCleared: null,\n onImageChanged: null,\n onBusyChange: null,\n onEditorDisposed: null,\n onMasksChanged: null,\n onAnnotationsChanged: 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 aspectRatio: 'free',\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});\nexport const DEFAULT_TEXT_ANNOTATION_CONFIG = Object.freeze({\n text: 'Text',\n left: undefined,\n top: undefined,\n width: 200,\n fontSize: 32,\n fontFamily: 'sans-serif',\n fontWeight: 'normal',\n fill: '#ff0000',\n backgroundColor: 'rgba(255,255,255,0)',\n textAlign: 'left',\n angle: 0,\n selectable: true,\n evented: true,\n editable: true,\n enterEditing: true,\n annotationHidden: false,\n annotationLocked: false,\n styles: Object.freeze({}),\n});\nexport const DEFAULT_DRAW_CONFIG = Object.freeze({\n brushSize: 8,\n color: '#ff0000',\n opacity: 1,\n lineCap: 'round',\n lineJoin: 'round',\n selectable: true,\n evented: true,\n annotationHidden: false,\n annotationLocked: false,\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 'mergeMasksByDefault',\n 'mergeAnnotationsByDefault',\n 'defaultMaskWidth',\n 'defaultMaskHeight',\n 'defaultMaskConfig',\n 'maskRotatable',\n 'maskLabelOnSelect',\n 'maskLabelOffset',\n 'maskName',\n 'textAnnotationName',\n 'drawAnnotationName',\n 'groupSelection',\n 'showPlaceholder',\n 'initialImageBase64',\n 'defaultDownloadFileName',\n 'onImageLoadStart',\n 'onImageLoaded',\n 'onImageCleared',\n 'onImageChanged',\n 'onBusyChange',\n 'onEditorDisposed',\n 'onMasksChanged',\n 'onAnnotationsChanged',\n 'onSelectionChange',\n 'onError',\n 'onWarning',\n 'label',\n 'crop',\n 'defaultMosaicConfig',\n 'defaultTextConfig',\n 'defaultDrawConfig',\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 cloneResolvedTextAnnotationConfig(config) {\n return {\n ...config,\n styles: { ...config.styles },\n };\n}\nexport function cloneResolvedDrawConfig(config) {\n return { ...config };\n}\nfunction normalizeTextAlign(value, fallback) {\n return value === 'left' || value === 'center' || value === 'right' || value === 'justify'\n ? value\n : fallback;\n}\nfunction normalizePositiveNumber(value, fallback) {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;\n}\nfunction normalizeBoolean(value, fallback) {\n return typeof value === 'boolean' ? value : fallback;\n}\nfunction normalizeString(value, fallback) {\n return typeof value === 'string' ? value : fallback;\n}\nfunction normalizeTextLeftTop(value) {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\nfunction normalizeTextboxStyles(value) {\n if (!isConfigObject(value))\n return {};\n return { ...value };\n}\nexport function mergeTextAnnotationConfigPatch(current, patch, fallback = current) {\n const raw = isConfigObject(patch) ? patch : {};\n const next = cloneResolvedTextAnnotationConfig(current);\n if (hasOwn(raw, 'text'))\n next.text = normalizeString(raw.text, fallback.text);\n if (hasOwn(raw, 'left'))\n next.left = normalizeTextLeftTop(raw.left);\n if (hasOwn(raw, 'top'))\n next.top = normalizeTextLeftTop(raw.top);\n if (hasOwn(raw, 'width'))\n next.width = normalizePositiveNumber(raw.width, fallback.width);\n if (hasOwn(raw, 'fontSize')) {\n next.fontSize = normalizePositiveNumber(raw.fontSize, fallback.fontSize);\n }\n if (hasOwn(raw, 'fontFamily')) {\n next.fontFamily = normalizeString(raw.fontFamily, fallback.fontFamily);\n }\n if (hasOwn(raw, 'fontWeight')) {\n next.fontWeight =\n typeof raw.fontWeight === 'string' || typeof raw.fontWeight === 'number'\n ? raw.fontWeight\n : fallback.fontWeight;\n }\n if (hasOwn(raw, 'fill'))\n next.fill = normalizeString(raw.fill, fallback.fill);\n if (hasOwn(raw, 'backgroundColor')) {\n next.backgroundColor = normalizeString(raw.backgroundColor, fallback.backgroundColor);\n }\n if (hasOwn(raw, 'textAlign'))\n next.textAlign = normalizeTextAlign(raw.textAlign, fallback.textAlign);\n if (hasOwn(raw, 'angle'))\n next.angle = normalizeFiniteNumber(raw.angle, fallback.angle);\n if (hasOwn(raw, 'selectable'))\n next.selectable = normalizeBoolean(raw.selectable, fallback.selectable);\n if (hasOwn(raw, 'evented'))\n next.evented = normalizeBoolean(raw.evented, fallback.evented);\n if (hasOwn(raw, 'editable'))\n next.editable = normalizeBoolean(raw.editable, fallback.editable);\n if (hasOwn(raw, 'enterEditing')) {\n next.enterEditing = normalizeBoolean(raw.enterEditing, fallback.enterEditing);\n }\n if (hasOwn(raw, 'annotationHidden')) {\n next.annotationHidden = normalizeBoolean(raw.annotationHidden, fallback.annotationHidden);\n }\n if (hasOwn(raw, 'annotationLocked')) {\n next.annotationLocked = normalizeBoolean(raw.annotationLocked, fallback.annotationLocked);\n }\n if (hasOwn(raw, 'styles')) {\n next.styles = {\n ...next.styles,\n ...normalizeTextboxStyles(raw.styles),\n };\n }\n return next;\n}\nexport function normalizeTextAnnotationConfig(input, fallback) {\n if (!isConfigObject(input))\n return cloneResolvedTextAnnotationConfig(fallback);\n return mergeTextAnnotationConfigPatch(fallback, input);\n}\nfunction normalizeLineCap(value, fallback) {\n return value === 'butt' || value === 'round' || value === 'square' ? value : fallback;\n}\nfunction normalizeLineJoin(value, fallback) {\n return value === 'bevel' || value === 'round' || value === 'miter' ? value : fallback;\n}\nfunction normalizeOpacity(value, fallback) {\n if (typeof value !== 'number' || !Number.isFinite(value))\n return fallback;\n return Math.max(0, Math.min(1, value));\n}\nexport function mergeDrawConfigPatch(current, patch, fallback = current) {\n const raw = isConfigObject(patch) ? patch : {};\n const next = cloneResolvedDrawConfig(current);\n if (hasOwn(raw, 'brushSize')) {\n next.brushSize = normalizePositiveNumber(raw.brushSize, fallback.brushSize);\n }\n if (hasOwn(raw, 'color'))\n next.color = normalizeString(raw.color, fallback.color);\n if (hasOwn(raw, 'opacity'))\n next.opacity = normalizeOpacity(raw.opacity, fallback.opacity);\n if (hasOwn(raw, 'lineCap'))\n next.lineCap = normalizeLineCap(raw.lineCap, fallback.lineCap);\n if (hasOwn(raw, 'lineJoin'))\n next.lineJoin = normalizeLineJoin(raw.lineJoin, fallback.lineJoin);\n if (hasOwn(raw, 'selectable'))\n next.selectable = normalizeBoolean(raw.selectable, fallback.selectable);\n if (hasOwn(raw, 'evented'))\n next.evented = normalizeBoolean(raw.evented, fallback.evented);\n if (hasOwn(raw, 'annotationHidden')) {\n next.annotationHidden = normalizeBoolean(raw.annotationHidden, fallback.annotationHidden);\n }\n if (hasOwn(raw, 'annotationLocked')) {\n next.annotationLocked = normalizeBoolean(raw.annotationLocked, fallback.annotationLocked);\n }\n return next;\n}\nexport function normalizeDrawConfig(input, fallback) {\n if (!isConfigObject(input))\n return cloneResolvedDrawConfig(fallback);\n return mergeDrawConfigPatch(fallback, input);\n}\nexport function areResolvedTextAnnotationConfigsEqual(left, right) {\n return JSON.stringify(left) === JSON.stringify(right);\n}\nexport function areResolvedDrawConfigsEqual(left, right) {\n return (left.brushSize === right.brushSize &&\n left.color === right.color &&\n left.opacity === right.opacity &&\n left.lineCap === right.lineCap &&\n left.lineJoin === right.lineJoin &&\n left.selectable === right.selectable &&\n left.evented === right.evented &&\n left.annotationHidden === right.annotationHidden &&\n left.annotationLocked === right.annotationLocked);\n}\nexport function getInvalidTextAnnotationConfigFields(input) {\n const raw = isConfigObject(input) ? input : {};\n const invalid = [];\n if (hasOwn(raw, 'text') && typeof raw.text !== 'string')\n invalid.push('text');\n if (hasOwn(raw, 'width') && !isFiniteNumber(raw.width))\n invalid.push('width');\n if (hasOwn(raw, 'fontSize') && !isFiniteNumber(raw.fontSize))\n invalid.push('fontSize');\n if (hasOwn(raw, 'fontFamily') && typeof raw.fontFamily !== 'string')\n invalid.push('fontFamily');\n if (hasOwn(raw, 'fill') && typeof raw.fill !== 'string') {\n invalid.push('fill');\n }\n return invalid;\n}\nexport function getInvalidDrawConfigFields(input) {\n const raw = isConfigObject(input) ? input : {};\n const invalid = [];\n if (hasOwn(raw, 'brushSize') && !isFiniteNumber(raw.brushSize))\n invalid.push('brushSize');\n if (hasOwn(raw, 'color') && typeof raw.color !== 'string')\n invalid.push('color');\n if (hasOwn(raw, 'opacity') && !isFiniteNumber(raw.opacity))\n invalid.push('opacity');\n return invalid;\n}\nexport function resolveOptions(input) {\n var _a, _b, _c, _d, _e;\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' ||\n key === 'crop' ||\n key === 'defaultMosaicConfig' ||\n key === 'defaultTextConfig' ||\n key === 'defaultDrawConfig') {\n continue;\n }\n if (key === 'onImageLoadStart' ||\n key === 'onImageLoaded' ||\n key === 'onImageCleared' ||\n key === 'onImageChanged' ||\n key === 'onBusyChange' ||\n key === 'onEditorDisposed' ||\n key === 'onMasksChanged' ||\n key === 'onAnnotationsChanged' ||\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.onAnnotationsChanged = normalizeCallback(raw.onAnnotationsChanged);\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 aspectRatio: (_a = userCrop.aspectRatio) !== null && _a !== void 0 ? _a : DEFAULT_CROP.aspectRatio,\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: (_b = userCrop.hideMasksDuringCrop) !== null && _b !== void 0 ? _b : DEFAULT_CROP.hideMasksDuringCrop,\n preserveMasksAfterCrop: (_c = userCrop.preserveMasksAfterCrop) !== null && _c !== void 0 ? _c : DEFAULT_CROP.preserveMasksAfterCrop,\n allowRotationOfCropRect: (_d = userCrop.allowRotationOfCropRect) !== null && _d !== void 0 ? _d : DEFAULT_CROP.allowRotationOfCropRect,\n exportFileType: (_e = userCrop.exportFileType) !== null && _e !== void 0 ? _e : 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 const defaultTextConfig = normalizeTextAnnotationConfig(raw.defaultTextConfig, DEFAULT_TEXT_ANNOTATION_CONFIG);\n Object.freeze(defaultTextConfig.styles);\n Object.freeze(defaultTextConfig);\n const defaultDrawConfig = normalizeDrawConfig(raw.defaultDrawConfig, DEFAULT_DRAW_CONFIG);\n Object.freeze(defaultDrawConfig);\n return Object.freeze({\n ...resolved,\n label,\n crop,\n defaultMosaicConfig,\n defaultTextConfig,\n defaultDrawConfig,\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 isBaseImageObject(object) {\n return (!!object &&\n typeof object === 'object' &&\n object.editorObjectKind === 'baseImage');\n}\nexport function isMaskObject(object) {\n const candidate = object;\n return (!!candidate &&\n candidate.editorObjectKind === 'mask' &&\n typeof candidate.maskId === 'number' &&\n typeof candidate.maskUid === 'string' &&\n typeof candidate.maskName === 'string');\n}\nexport function isAnnotationObject(object) {\n const candidate = object;\n return (!!candidate &&\n candidate.editorObjectKind === 'annotation' &&\n typeof candidate.annotationId === 'number' &&\n typeof candidate.annotationType === 'string' &&\n typeof candidate.annotationName === 'string');\n}\nexport function isTextAnnotationObject(object) {\n return isAnnotationObject(object) && object.annotationType === 'text';\n}\nexport function isDrawAnnotationObject(object) {\n return isAnnotationObject(object) && object.annotationType === 'draw';\n}\nexport function isSessionObject(object) {\n const candidate = object;\n return (!!candidate &&\n candidate.editorObjectKind === 'session' &&\n typeof candidate.sessionObjectType === 'string');\n}\nexport function isEditableOverlayObject(object) {\n return isMaskObject(object) || isAnnotationObject(object);\n}\n//# sourceMappingURL=public-types.js.map","export function markBaseImageObject(image) {\n const baseImage = image;\n baseImage.editorObjectKind = 'baseImage';\n return baseImage;\n}\nexport function markMaskObject(object, meta) {\n const mask = object;\n mask.editorObjectKind = 'mask';\n mask.maskId = meta.maskId;\n mask.maskUid = meta.maskUid;\n mask.maskName = meta.maskName;\n mask.originalAlpha = meta.originalAlpha;\n if ('originalStroke' in meta)\n mask.originalStroke = meta.originalStroke;\n if (typeof meta.originalStrokeWidth === 'number') {\n mask.originalStrokeWidth = meta.originalStrokeWidth;\n }\n return mask;\n}\nexport function markAnnotationObject(object, meta) {\n var _a, _b;\n const annotation = object;\n annotation.editorObjectKind = 'annotation';\n annotation.annotationId = meta.annotationId;\n annotation.annotationType = meta.annotationType;\n annotation.annotationName = meta.annotationName;\n annotation.annotationHidden = (_a = meta.annotationHidden) !== null && _a !== void 0 ? _a : false;\n annotation.annotationLocked = (_b = meta.annotationLocked) !== null && _b !== void 0 ? _b : false;\n return annotation;\n}\nexport function markSessionObject(object, sessionObjectType) {\n const sessionObject = object;\n sessionObject.editorObjectKind = 'session';\n sessionObject.sessionObjectType = sessionObjectType;\n return sessionObject;\n}\n//# sourceMappingURL=editor-object-kind.js.map","import { isAnnotationObject, isBaseImageObject, isMaskObject } from './public-types.js';\nimport { markAnnotationObject, markBaseImageObject, markMaskObject } from './editor-object-kind.js';\nexport const SNAPSHOT_CUSTOM_KEYS = [\n 'editorObjectKind',\n 'sessionObjectType',\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 'flipX',\n 'flipY',\n 'isMosaicPreview',\n 'annotationId',\n 'annotationType',\n 'annotationName',\n 'annotationHidden',\n 'annotationLocked',\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.editorObjectKind === 'string') {\n jsonObject.editorObjectKind = liveObject.editorObjectKind;\n }\n if (typeof liveObject.sessionObjectType === 'string') {\n jsonObject.sessionObjectType = liveObject.sessionObjectType;\n }\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 (typeof liveObject.flipX === 'boolean') {\n jsonObject.flipX = liveObject.flipX;\n }\n if (typeof liveObject.flipY === 'boolean') {\n jsonObject.flipY = liveObject.flipY;\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 if (typeof liveObject.annotationId === 'number') {\n jsonObject.annotationId = liveObject.annotationId;\n }\n if (typeof liveObject.annotationType === 'string') {\n jsonObject.annotationType = liveObject.annotationType;\n }\n if (typeof liveObject.annotationName === 'string') {\n jsonObject.annotationName = liveObject.annotationName;\n }\n if (typeof liveObject.annotationHidden === 'boolean') {\n jsonObject.annotationHidden = liveObject.annotationHidden;\n }\n if (typeof liveObject.annotationLocked === 'boolean') {\n jsonObject.annotationLocked = liveObject.annotationLocked;\n }\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 const activeAnnotationId = activeObject && isAnnotationObject(activeObject)\n ? activeObject.annotationId\n : typeof input.activeAnnotationId === 'number'\n ? input.activeAnnotationId\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.editorObjectKind !== 'session' &&\n o.isCropRect !== true &&\n o.maskLabel !== true &&\n 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 activeObjectKind: activeMaskId !== null ? 'mask' : activeAnnotationId !== null ? 'annotation' : null,\n };\n if (activeMaskId !== null)\n jsonObj._editorState.activeMaskId = activeMaskId;\n if (activeAnnotationId !== null) {\n jsonObj._editorState.activeAnnotationId = activeAnnotationId;\n }\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 restoreEditorObjectPropsFromJson(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 &&\n json._editorState &&\n typeof json._editorState.activeAnnotationId === 'number') {\n editorState.activeAnnotationId = json._editorState.activeAnnotationId;\n }\n if (editorState && json._editorState && 'activeObjectKind' in json._editorState) {\n const kind = json._editorState.activeObjectKind;\n editorState.activeObjectKind =\n kind === 'mask' || kind === 'annotation' || kind === null ? kind : null;\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 maxAnnotationId = objects\n .filter(isAnnotationObject)\n .reduce((max, annotationObject) => Math.max(max, annotationObject.annotationId), 0);\n const masks = objects.filter(isMaskObject);\n const annotations = objects.filter(isAnnotationObject);\n const originalImage = (_b = objects.find(isBaseImageObject)) !== null && _b !== void 0 ? _b : null;\n return {\n editorState,\n maxMaskId,\n maxAnnotationId,\n originalImage,\n objects,\n masks,\n annotations,\n jsonString,\n };\n}\nfunction restoreEditorObjectPropsFromJson(canvasObjs, jsonObjs) {\n var _a, _b, _c, _d;\n jsonObjs.forEach((jObj, index) => {\n const canvasObj = canvasObjs[index];\n if (!canvasObj)\n return;\n if (jObj.editorObjectKind === 'baseImage') {\n markBaseImageObject(canvasObj);\n return;\n }\n if (jObj.editorObjectKind === 'annotation' &&\n typeof jObj.annotationId === 'number' &&\n typeof jObj.annotationType === 'string' &&\n typeof jObj.annotationName === 'string') {\n markAnnotationObject(canvasObj, {\n annotationId: jObj.annotationId,\n annotationType: jObj.annotationType === 'draw' ? 'draw' : 'text',\n annotationName: jObj.annotationName,\n annotationHidden: typeof jObj.annotationHidden === 'boolean' ? jObj.annotationHidden : false,\n annotationLocked: typeof jObj.annotationLocked === 'boolean' ? jObj.annotationLocked : false,\n });\n return;\n }\n if (jObj.editorObjectKind === 'session' && typeof jObj.sessionObjectType === 'string') {\n canvasObj.editorObjectKind = 'session';\n canvasObj.sessionObjectType = jObj.sessionObjectType;\n }\n });\n const consumedCanvasIndexes = new Set();\n for (const jObj of jsonObjs) {\n if (jObj.editorObjectKind !== 'mask' || 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 const originalStroke = 'originalStroke' in jObj\n ? jObj.originalStroke\n : undefined;\n markMaskObject(maskObject, {\n maskId: jObj.maskId,\n maskUid: typeof jObj.maskUid === 'string' ? jObj.maskUid : `mask-${jObj.maskId}`,\n maskName: typeof jObj.maskName === 'string' ? jObj.maskName : '',\n originalAlpha: typeof jObj.originalAlpha === 'number'\n ? jObj.originalAlpha\n : ((_d = maskObject.opacity) !== null && _d !== void 0 ? _d : 0.5),\n originalStroke,\n originalStrokeWidth: typeof jObj.originalStrokeWidth === 'number' ? jObj.originalStrokeWidth : undefined,\n });\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 async execute(command) {\n await 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","export function isAnnotationLocked(annotation) {\n return annotation.annotationLocked === true;\n}\nexport function isAnnotationUnlocked(annotation) {\n return !isAnnotationLocked(annotation);\n}\n//# sourceMappingURL=annotation-lock.js.map","import { isTextAnnotationObject, } from '../core/public-types.js';\nimport { isAnnotationLocked } from './annotation-lock.js';\nfunction setObjectProps(object, props) {\n try {\n object.set(props);\n }\n catch {\n Object.assign(object, props);\n }\n}\nfunction syncTextEditability(annotation, editable) {\n const textObject = annotation;\n textObject.editable = editable;\n}\nexport function syncAnnotationRuntimeState(annotation) {\n var _a;\n const hidden = annotation.annotationHidden === true;\n const locked = isAnnotationLocked(annotation);\n setObjectProps(annotation, {\n visible: !hidden,\n selectable: locked ? false : true,\n evented: locked ? false : true,\n hasControls: !locked,\n lockMovementX: locked,\n lockMovementY: locked,\n lockScalingX: locked,\n lockScalingY: locked,\n lockRotation: locked,\n });\n if (!locked) {\n setObjectProps(annotation, {\n selectable: true,\n evented: true,\n hasControls: true,\n lockMovementX: false,\n lockMovementY: false,\n lockScalingX: false,\n lockScalingY: false,\n lockRotation: false,\n });\n }\n if (isTextAnnotationObject(annotation)) {\n syncTextEditability(annotation, !locked);\n }\n (_a = annotation.setCoords) === null || _a === void 0 ? void 0 : _a.call(annotation);\n}\nexport function syncAnnotationRuntimeStates(annotations) {\n annotations.forEach(syncAnnotationRuntimeState);\n}\n//# sourceMappingURL=annotation-style.js.map","import { isAnnotationObject, isDrawAnnotationObject, isTextAnnotationObject, } from '../core/public-types.js';\nimport { syncAnnotationRuntimeState } from './annotation-style.js';\nimport { isAnnotationLocked, isAnnotationUnlocked } from './annotation-lock.js';\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 getActiveSelectionObjects(canvas) {\n const active = canvas.getActiveObject();\n if (!active)\n return [];\n if (!isActiveSelectionObject(active))\n return [active];\n const getObjects = active.getObjects;\n return typeof getObjects === 'function' ? getObjects.call(active) : [];\n}\nexport function getAnnotations(canvas) {\n return canvas.getObjects().filter(isAnnotationObject).slice();\n}\nexport function getSelectedAnnotations(canvas) {\n return getActiveSelectionObjects(canvas).filter(isAnnotationObject);\n}\nfunction snapshotAnnotation(annotation) {\n return JSON.stringify({\n text: annotation.text,\n fontSize: annotation.fontSize,\n fontFamily: annotation.fontFamily,\n fontWeight: annotation.fontWeight,\n fill: annotation.fill,\n backgroundColor: annotation.backgroundColor,\n textAlign: annotation.textAlign,\n width: annotation.width,\n stroke: annotation.stroke,\n strokeWidth: annotation.strokeWidth,\n opacity: annotation.opacity,\n visible: annotation.visible,\n selectable: annotation.selectable,\n evented: annotation.evented,\n annotationHidden: annotation.annotationHidden,\n annotationLocked: annotation.annotationLocked,\n });\n}\nfunction setAnnotationProps(annotation, props) {\n try {\n annotation.set(props);\n }\n catch {\n Object.assign(annotation, props);\n }\n}\nfunction updateTextAnnotation(annotation, config) {\n const props = {};\n const raw = config;\n if (typeof raw.text === 'string')\n props.text = raw.text;\n if (typeof raw.fontSize === 'number' && Number.isFinite(raw.fontSize) && raw.fontSize > 0) {\n props.fontSize = raw.fontSize;\n }\n if (typeof raw.fontFamily === 'string')\n props.fontFamily = raw.fontFamily;\n if (typeof raw.fontWeight === 'string' || typeof raw.fontWeight === 'number') {\n props.fontWeight = raw.fontWeight;\n }\n if (typeof raw.fill === 'string')\n props.fill = raw.fill;\n if (typeof raw.backgroundColor === 'string')\n props.backgroundColor = raw.backgroundColor;\n if (raw.textAlign === 'left' ||\n raw.textAlign === 'center' ||\n raw.textAlign === 'right' ||\n raw.textAlign === 'justify') {\n props.textAlign = raw.textAlign;\n }\n if (typeof raw.width === 'number' && Number.isFinite(raw.width) && raw.width > 0) {\n props.width = raw.width;\n }\n if (Object.keys(props).length > 0)\n setAnnotationProps(annotation, props);\n}\nfunction updateDrawAnnotation(annotation, config) {\n const props = {};\n const raw = config;\n if (typeof raw.stroke === 'string')\n props.stroke = raw.stroke;\n if (typeof raw.strokeWidth === 'number' &&\n Number.isFinite(raw.strokeWidth) &&\n raw.strokeWidth > 0) {\n props.strokeWidth = raw.strokeWidth;\n }\n if (typeof raw.opacity === 'number' && Number.isFinite(raw.opacity)) {\n props.opacity = Math.max(0, Math.min(1, raw.opacity));\n }\n if (Object.keys(props).length > 0)\n setAnnotationProps(annotation, props);\n}\nexport function updateAnnotationObject(annotation, config) {\n const before = snapshotAnnotation(annotation);\n const raw = config;\n if (typeof raw.annotationHidden === 'boolean') {\n annotation.annotationHidden = raw.annotationHidden;\n }\n if (typeof raw.annotationLocked === 'boolean') {\n annotation.annotationLocked = raw.annotationLocked;\n }\n const lockedAfter = isAnnotationLocked(annotation);\n if (!lockedAfter) {\n if (typeof raw.selectable === 'boolean')\n annotation.selectable = raw.selectable;\n if (typeof raw.evented === 'boolean')\n annotation.evented = raw.evented;\n if (isTextAnnotationObject(annotation))\n updateTextAnnotation(annotation, config);\n if (isDrawAnnotationObject(annotation))\n updateDrawAnnotation(annotation, config);\n }\n syncAnnotationRuntimeState(annotation);\n return snapshotAnnotation(annotation) !== before;\n}\nexport function updateAnnotation(context, annotationId, config) {\n const target = getAnnotations(context.canvas).find((annotation) => annotation.annotationId === annotationId);\n if (!target)\n return false;\n const changed = updateAnnotationObject(target, config);\n if (!changed)\n return false;\n context.canvas.requestRenderAll();\n context.saveCanvasState();\n context.updateUi();\n return true;\n}\nexport function updateSelectedAnnotation(context, config) {\n const selectedAnnotations = getSelectedAnnotations(context.canvas);\n if (selectedAnnotations.length === 0)\n return false;\n const changed = selectedAnnotations\n .map((annotation) => updateAnnotationObject(annotation, config))\n .some(Boolean);\n if (!changed)\n return false;\n context.canvas.requestRenderAll();\n context.saveCanvasState();\n context.updateUi();\n return true;\n}\nexport function removeAnnotationObjects(context, objects, options = {}) {\n const force = options.force === true;\n const removable = objects.filter((annotation) => force || isAnnotationUnlocked(annotation));\n if (removable.length === 0)\n return 0;\n for (const annotation of removable) {\n context.canvas.remove(annotation);\n }\n context.canvas.discardActiveObject();\n context.canvas.renderAll();\n if (options.saveHistory !== false)\n context.saveCanvasState();\n context.updateUi();\n return removable.length;\n}\nexport function removeSelectedAnnotation(context) {\n return removeAnnotationObjects(context, getSelectedAnnotations(context.canvas));\n}\nexport function removeAllAnnotations(context, options = {}) {\n return removeAnnotationObjects(context, getAnnotations(context.canvas), options);\n}\nfunction getAnnotationListDocument(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 renderAnnotationList(context) {\n const listId = context.getListElementId();\n if (!listId)\n return;\n const ownerDocument = getAnnotationListDocument(context);\n const listEl = ownerDocument.getElementById(listId);\n if (!listEl || !context.canvas)\n return;\n listEl.innerHTML = '';\n const canvas = context.canvas;\n getAnnotations(canvas).forEach((annotation) => {\n const item = ownerDocument.createElement('li');\n item.className = 'list-group-item annotation-item';\n item.textContent = annotation.annotationName;\n item.dataset.annotationId = String(annotation.annotationId);\n item.onclick = () => {\n const id = Number(item.dataset.annotationId);\n if (!Number.isFinite(id))\n return;\n const target = getAnnotations(canvas).find((candidate) => candidate.annotationId === id);\n if (!target)\n return;\n canvas.setActiveObject(target);\n context.onAnnotationSelected(target);\n };\n listEl.appendChild(item);\n });\n}\nexport function updateAnnotationListSelection(context, selectedAnnotation) {\n const listId = context.getListElementId();\n if (!listId)\n return;\n const listEl = getAnnotationListDocument(context).getElementById(listId);\n if (!listEl)\n return;\n const selectedId = selectedAnnotation ? String(selectedAnnotation.annotationId) : null;\n listEl.querySelectorAll('.annotation-item').forEach((item) => {\n item.classList.toggle('active', selectedId !== null && item.dataset.annotationId === selectedId);\n });\n}\n//# sourceMappingURL=annotation-manager.js.map","import { isBaseImageObject, isEditableOverlayObject, isSessionObject, } from './public-types.js';\nfunction isLegacySessionObject(object) {\n const candidate = object;\n return (candidate.isCropRect === true ||\n candidate.maskLabel === true ||\n candidate.isMosaicPreview === true);\n}\nfunction moveObjectTo(canvas, object, index) {\n const canvasWithLayerApi = canvas;\n if (typeof canvasWithLayerApi.moveObjectTo === 'function') {\n canvasWithLayerApi.moveObjectTo(object, index);\n return;\n }\n try {\n canvas.remove(object);\n canvas.insertAt(index, object);\n }\n catch {\n canvas.add(object);\n }\n}\nfunction ensureOnCanvas(canvas, object) {\n if (!canvas.getObjects().includes(object)) {\n canvas.add(object);\n }\n}\nfunction withoutObject(canvas, object) {\n return canvas.getObjects().filter((candidate) => candidate !== object);\n}\nfunction findFirstSessionIndex(objects) {\n return objects.findIndex((object) => isSessionObject(object) || isLegacySessionObject(object));\n}\nfunction getOrderedGroups(canvas) {\n const baseImages = [];\n const overlays = [];\n const sessions = [];\n const others = [];\n for (const object of canvas.getObjects()) {\n if (isBaseImageObject(object)) {\n baseImages.push(object);\n }\n else if (isEditableOverlayObject(object)) {\n overlays.push(object);\n }\n else if (isSessionObject(object) || isLegacySessionObject(object)) {\n sessions.push(object);\n }\n else {\n others.push(object);\n }\n }\n return { baseImages, overlays, sessions, others };\n}\nexport function normalizeLayerOrder(canvas) {\n const groups = getOrderedGroups(canvas);\n const ordered = [\n ...groups.baseImages,\n ...groups.others,\n ...groups.overlays,\n ...groups.sessions,\n ];\n ordered.forEach((object, index) => {\n moveObjectTo(canvas, object, index);\n });\n}\nexport function placeBaseImageObject(canvas, image) {\n ensureOnCanvas(canvas, image);\n const targetIndex = withoutObject(canvas, image).filter(isBaseImageObject).length;\n moveObjectTo(canvas, image, targetIndex);\n}\nexport function placeMaskObject(canvas, mask) {\n ensureOnCanvas(canvas, mask);\n const objects = withoutObject(canvas, mask);\n const firstSessionIndex = findFirstSessionIndex(objects);\n moveObjectTo(canvas, mask, firstSessionIndex === -1 ? objects.length : firstSessionIndex);\n}\nexport function placeAnnotationObject(canvas, annotation) {\n ensureOnCanvas(canvas, annotation);\n const objects = withoutObject(canvas, annotation);\n const firstSessionIndex = findFirstSessionIndex(objects);\n moveObjectTo(canvas, annotation, firstSessionIndex === -1 ? objects.length : firstSessionIndex);\n}\nexport function placeSessionObject(canvas, sessionObject) {\n ensureOnCanvas(canvas, sessionObject);\n moveObjectTo(canvas, sessionObject, withoutObject(canvas, sessionObject).length);\n}\nexport function getEditableOverlayRange(canvas) {\n const objects = canvas.getObjects();\n const overlayIndexes = objects\n .map((object, index) => ({ object, index }))\n .filter(({ object }) => isEditableOverlayObject(object));\n if (overlayIndexes.length === 0)\n return { start: -1, end: -1, overlays: [] };\n return {\n start: overlayIndexes[0].index,\n end: overlayIndexes[overlayIndexes.length - 1].index,\n overlays: overlayIndexes.map(({ object }) => object),\n };\n}\n//# sourceMappingURL=layer-order.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","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","export function 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}\nexport function getPointerFromFabricEvent(canvas, event) {\n const fabricEvent = event && typeof event === 'object'\n ? event\n : null;\n if (!fabricEvent)\n return null;\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}\n//# sourceMappingURL=pointer.js.map","import { markAnnotationObject } from '../core/editor-object-kind.js';\nimport { placeAnnotationObject } from '../core/layer-order.js';\nimport { isEditableOverlayObject, isTextAnnotationObject, } from '../core/public-types.js';\nimport { mergeTextAnnotationConfigPatch } from '../core/default-options.js';\nimport { getObjectBBox } from '../utils/canvas-region.js';\nimport { resolveNumeric } from '../utils/number.js';\nimport { getPointerFromFabricEvent } from '../utils/pointer.js';\nimport { markSessionObject } from '../core/editor-object-kind.js';\nimport { syncAnnotationRuntimeState } from './annotation-style.js';\nimport { isAnnotationUnlocked } from './annotation-lock.js';\nfunction resolveDefaultTextPosition(context) {\n const image = context.getOriginalImage();\n if (image) {\n const bounds = getObjectBBox(image);\n return { left: Math.round(bounds.left + 10), top: Math.round(bounds.top + 10) };\n }\n return { left: 10, top: 10 };\n}\nfunction resolveTextCreationConfig(context, config) {\n var _a, _b;\n const base = mergeTextAnnotationConfigPatch(context.getTextConfig(), config);\n const fallback = resolveDefaultTextPosition(context);\n const leftInput = (_a = config.left) !== null && _a !== void 0 ? _a : base.left;\n const topInput = (_b = config.top) !== null && _b !== void 0 ? _b : base.top;\n return {\n ...base,\n left: resolveNumeric(leftInput, 'x', fallback.left, context.canvas, context.options),\n top: resolveNumeric(topInput, 'y', fallback.top, context.canvas, context.options),\n };\n}\nfunction nextAnnotationMeta(context, config) {\n const annotationId = context.getAnnotationCounter() + 1;\n context.setAnnotationCounter(annotationId);\n return {\n annotationId,\n annotationName: `${context.options.textAnnotationName}${annotationId}`,\n annotationHidden: config.annotationHidden,\n annotationLocked: config.annotationLocked,\n };\n}\nexport function attachTextEditingHandlers(context, annotation) {\n const textObject = annotation;\n if (textObject.imageEditorTextEditingHandlers) {\n try {\n textObject.off('editing:entered', textObject.imageEditorTextEditingHandlers.entered);\n textObject.off('editing:exited', textObject.imageEditorTextEditingHandlers.exited);\n }\n catch {\n }\n }\n const entered = () => {\n var _a;\n textObject.imageEditorTextEditingInitialText = String((_a = textObject.text) !== null && _a !== void 0 ? _a : '');\n textObject.imageEditorTextEditingCancel = false;\n };\n const exited = () => {\n var _a;\n const initial = textObject.imageEditorTextEditingInitialText;\n const finalText = String((_a = textObject.text) !== null && _a !== void 0 ? _a : '');\n const cancel = textObject.imageEditorTextEditingCancel === true;\n if (cancel && initial !== undefined) {\n textObject.set({ text: initial });\n }\n delete textObject.imageEditorTextEditingInitialText;\n delete textObject.imageEditorTextEditingCancel;\n if (!cancel && initial !== undefined && initial !== finalText) {\n context.saveCanvasState();\n const callbackContext = context.buildCallbackContext('createTextAnnotation');\n context.emitAnnotationsChanged(callbackContext);\n context.emitImageChanged(callbackContext);\n }\n };\n textObject.on('editing:entered', entered);\n textObject.on('editing:exited', exited);\n textObject.imageEditorTextEditingHandlers = { entered, exited };\n}\nfunction selectAllText(annotation) {\n var _a;\n const textObject = annotation;\n const textLength = String((_a = textObject.text) !== null && _a !== void 0 ? _a : '').length;\n if (textLength <= 0)\n return;\n if (typeof textObject.selectAll === 'function') {\n textObject.selectAll();\n return;\n }\n if (typeof textObject.setSelectionStart === 'function' &&\n typeof textObject.setSelectionEnd === 'function') {\n textObject.setSelectionStart(0);\n textObject.setSelectionEnd(textLength);\n return;\n }\n textObject.selectionStart = 0;\n textObject.selectionEnd = textLength;\n}\nexport function createTextAnnotation(context, config = {}) {\n var _a, _b;\n if (!context.isImageLoaded())\n return null;\n const resolved = resolveTextCreationConfig(context, config);\n const textbox = new context.fabric.Textbox(resolved.text, {\n left: resolved.left,\n top: resolved.top,\n width: resolved.width,\n fontSize: resolved.fontSize,\n fontFamily: resolved.fontFamily,\n fontWeight: resolved.fontWeight,\n fill: resolved.fill,\n backgroundColor: resolved.backgroundColor,\n textAlign: resolved.textAlign,\n angle: resolved.angle,\n selectable: resolved.selectable,\n evented: resolved.evented,\n editable: resolved.editable,\n originX: 'left',\n originY: 'top',\n ...resolved.styles,\n });\n const meta = nextAnnotationMeta(context, resolved);\n const annotation = markAnnotationObject(textbox, {\n annotationId: meta.annotationId,\n annotationType: 'text',\n annotationName: meta.annotationName,\n annotationHidden: meta.annotationHidden,\n annotationLocked: meta.annotationLocked,\n });\n syncAnnotationRuntimeState(annotation);\n attachTextEditingHandlers(context, annotation);\n placeAnnotationObject(context.canvas, annotation);\n if (resolved.selectable !== false && isAnnotationUnlocked(annotation)) {\n context.canvas.setActiveObject(annotation);\n }\n context.canvas.renderAll();\n context.updateAnnotationList();\n context.saveCanvasState();\n const callbackContext = context.buildCallbackContext('createTextAnnotation');\n context.emitAnnotationsChanged(callbackContext);\n context.emitImageChanged(callbackContext);\n if (resolved.enterEditing && isAnnotationUnlocked(annotation)) {\n (_b = (_a = annotation).enterEditing) === null || _b === void 0 ? void 0 : _b.call(_a);\n selectAllText(annotation);\n }\n return annotation;\n}\nfunction handleTextModePointer(context, event) {\n var _a, _b;\n const fabricEvent = event;\n const target = fabricEvent.target;\n if (target) {\n if (isTextAnnotationObject(target) && isAnnotationUnlocked(target)) {\n context.canvas.setActiveObject(target);\n (_b = (_a = target).enterEditing) === null || _b === void 0 ? void 0 : _b.call(_a);\n }\n else if (isEditableOverlayObject(target)) {\n context.canvas.setActiveObject(target);\n }\n return;\n }\n const pointer = getPointerFromFabricEvent(context.canvas, event);\n if (!pointer)\n return;\n createTextAnnotation(context, {\n left: pointer.x,\n top: pointer.y,\n });\n}\nexport function enterTextMode(context) {\n if (context.getTextSession())\n return;\n if (!context.isImageLoaded())\n return;\n const { canvas } = context;\n const previousCanvasSelection = !!canvas.selection;\n const previousDefaultCursor = canvas.defaultCursor;\n canvas.selection = true;\n canvas.defaultCursor = 'text';\n const callback = (event) => handleTextModePointer(context, event);\n canvas.on('mouse:down', callback);\n const session = {\n mode: 'text',\n previousCanvasSelection,\n previousDefaultCursor,\n handlers: [{ eventName: 'mouse:down', callback }],\n dispose: () => {\n try {\n canvas.off('mouse:down', callback);\n }\n catch {\n }\n canvas.selection = previousCanvasSelection;\n canvas.defaultCursor = previousDefaultCursor !== null && previousDefaultCursor !== void 0 ? previousDefaultCursor : 'default';\n },\n };\n const preview = new context.fabric.Rect({\n left: -1,\n top: -1,\n width: 1,\n height: 1,\n selectable: false,\n evented: false,\n visible: false,\n excludeFromExport: true,\n });\n markSessionObject(preview, 'textPreview');\n context.setTextSession(session);\n context.updateUi();\n}\nexport function exitTextMode(context) {\n const session = context.getTextSession();\n if (!session)\n return;\n session.dispose();\n context.setTextSession(null);\n context.canvas.requestRenderAll();\n context.updateUi();\n}\nexport function finalizeActiveTextEditing(context, options) {\n var _a;\n const active = context.canvas.getActiveObject();\n if (!active || !isTextAnnotationObject(active))\n return;\n const textObject = active;\n if (textObject.isEditing !== true)\n return;\n textObject.imageEditorTextEditingCancel = !options.commit;\n (_a = textObject.exitEditing) === null || _a === void 0 ? void 0 : _a.call(textObject);\n context.canvas.requestRenderAll();\n}\nexport function attachTextEditingHandlersToAnnotations(context, annotations) {\n annotations.filter(isTextAnnotationObject).forEach((annotation) => {\n attachTextEditingHandlers(context, annotation);\n });\n}\n//# sourceMappingURL=text-controller.js.map","import { markAnnotationObject } from '../core/editor-object-kind.js';\nimport { placeAnnotationObject } from '../core/layer-order.js';\nimport { syncAnnotationRuntimeState } from './annotation-style.js';\nfunction colorWithOpacity(color, opacity) {\n const alpha = Math.max(0, Math.min(1, opacity));\n if (alpha >= 1)\n return color;\n if (/^#([0-9a-f]{6})$/i.test(color)) {\n const hex = color.slice(1);\n const r = Number.parseInt(hex.slice(0, 2), 16);\n const g = Number.parseInt(hex.slice(2, 4), 16);\n const b = Number.parseInt(hex.slice(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n }\n return color;\n}\nfunction configureBrush(context) {\n const config = context.getDrawConfig();\n const canvasWithBrush = context.canvas;\n canvasWithBrush.freeDrawingBrush = new context.fabric.PencilBrush(context.canvas);\n canvasWithBrush.freeDrawingBrush.width = config.brushSize;\n canvasWithBrush.freeDrawingBrush.color = colorWithOpacity(config.color, config.opacity);\n canvasWithBrush.freeDrawingBrush.strokeLineCap = config.lineCap;\n canvasWithBrush.freeDrawingBrush.strokeLineJoin = config.lineJoin;\n}\nfunction markPathAsDrawAnnotation(context, path) {\n const config = context.getDrawConfig();\n const annotationId = context.getAnnotationCounter() + 1;\n context.setAnnotationCounter(annotationId);\n path.set({\n selectable: config.selectable,\n evented: config.evented,\n opacity: config.opacity,\n stroke: config.color,\n strokeWidth: config.brushSize,\n });\n const annotation = markAnnotationObject(path, {\n annotationId,\n annotationType: 'draw',\n annotationName: `${context.options.drawAnnotationName}${annotationId}`,\n annotationHidden: config.annotationHidden,\n annotationLocked: config.annotationLocked,\n });\n syncAnnotationRuntimeState(annotation);\n return annotation;\n}\nfunction handlePathCreated(context, event) {\n const path = event.path;\n if (!path)\n return;\n const annotation = markPathAsDrawAnnotation(context, path);\n placeAnnotationObject(context.canvas, annotation);\n context.canvas.setActiveObject(annotation);\n context.canvas.renderAll();\n context.updateAnnotationList();\n context.saveCanvasState();\n const callbackContext = context.buildCallbackContext('enterDrawMode');\n context.emitAnnotationsChanged(callbackContext);\n context.emitImageChanged(callbackContext);\n}\nexport function enterDrawMode(context) {\n if (context.getDrawSession())\n return;\n if (!context.isImageLoaded())\n return;\n const { canvas } = context;\n const canvasWithDrawing = canvas;\n const previousDrawingMode = !!canvasWithDrawing.isDrawingMode;\n const previousBrush = canvasWithDrawing.freeDrawingBrush;\n const previousCanvasSelection = !!canvas.selection;\n const previousDefaultCursor = canvas.defaultCursor;\n canvas.selection = false;\n canvas.defaultCursor = 'crosshair';\n canvasWithDrawing.isDrawingMode = true;\n configureBrush(context);\n const callback = (event) => handlePathCreated(context, event);\n canvas.on('path:created', callback);\n const session = {\n mode: 'draw',\n previousDrawingMode,\n previousBrush,\n previousCanvasSelection,\n previousDefaultCursor,\n handlers: [{ eventName: 'path:created', callback }],\n dispose: () => {\n try {\n canvas.off('path:created', callback);\n }\n catch {\n }\n canvasWithDrawing.isDrawingMode = previousDrawingMode;\n canvasWithDrawing.freeDrawingBrush = previousBrush;\n canvas.selection = previousCanvasSelection;\n canvas.defaultCursor = previousDefaultCursor !== null && previousDefaultCursor !== void 0 ? previousDefaultCursor : 'default';\n },\n };\n context.setDrawSession(session);\n context.updateUi();\n}\nexport function exitDrawMode(context) {\n const session = context.getDrawSession();\n if (!session)\n return;\n session.dispose();\n context.setDrawSession(null);\n context.canvas.requestRenderAll();\n context.updateUi();\n}\nexport function updateDrawBrush(context) {\n if (!context.getDrawSession())\n return;\n configureBrush(context);\n}\n//# sourceMappingURL=draw-controller.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 MergeAnnotationsError extends Error {\n constructor(message = 'Failed to merge annotations into the image.', originalError = null) {\n super(message);\n Object.defineProperty(this, \"name\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 'MergeAnnotationsError'\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, MergeAnnotationsError);\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","import { CropApplyError } from '../core/errors.js';\nimport { markSessionObject } from '../core/editor-object-kind.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}\nconst CROP_ASPECT_RATIO_PRESETS = Object.freeze({\n free: null,\n '1:1': 1,\n '3:4': 3 / 4,\n '4:3': 4 / 3,\n '3:2': 3 / 2,\n '2:3': 2 / 3,\n '9:16': 9 / 16,\n '16:9': 16 / 9,\n});\nexport function normalizeCropAspectRatio(input) {\n var _a;\n if (input === null || input === undefined)\n return null;\n if (typeof input === 'number') {\n return Number.isFinite(input) && input > 0 ? input : null;\n }\n if (typeof input === 'string') {\n const trimmed = input.trim();\n if (Object.prototype.hasOwnProperty.call(CROP_ASPECT_RATIO_PRESETS, trimmed)) {\n return (_a = CROP_ASPECT_RATIO_PRESETS[trimmed]) !== null && _a !== void 0 ? _a : null;\n }\n const parts = trimmed.split(':');\n if (parts.length !== 2)\n return null;\n const width = Number(parts[0]);\n const height = Number(parts[1]);\n return Number.isFinite(width) && width > 0 && Number.isFinite(height) && height > 0\n ? width / height\n : null;\n }\n if (typeof input === 'object') {\n const width = Number(input.width);\n const height = Number(input.height);\n return Number.isFinite(width) && width > 0 && Number.isFinite(height) && height > 0\n ? width / height\n : null;\n }\n return null;\n}\nfunction fitAspectRatioInside(maxWidth, maxHeight, aspectRatio) {\n const safeMaxWidth = Math.max(1, maxWidth);\n const safeMaxHeight = Math.max(1, maxHeight);\n let width = safeMaxWidth;\n let height = width / aspectRatio;\n if (height > safeMaxHeight) {\n height = safeMaxHeight;\n width = height * aspectRatio;\n }\n return {\n width: Math.max(1, width),\n height: Math.max(1, height),\n };\n}\nfunction minimumAspectRatioSizeThatFits(minWidth, minHeight, maxWidth, maxHeight, aspectRatio) {\n let width = Math.max(1, minWidth);\n let height = width / aspectRatio;\n if (height < minHeight) {\n height = Math.max(1, minHeight);\n width = height * aspectRatio;\n }\n return width <= maxWidth && height <= maxHeight ? { width, height } : null;\n}\nfunction chooseAspectRatioResizeBasis(canvas, cropRect, scaleX, scaleY) {\n var _a, _b, _c;\n const corner = String((_c = (_a = cropRect.__corner) !== null && _a !== void 0 ? _a : (_b = canvas._currentTransform) === null || _b === void 0 ? void 0 : _b.corner) !== null && _c !== void 0 ? _c : '').toLowerCase();\n if (corner === 'mt' || corner === 'mb')\n return 'height';\n if (corner === 'ml' || corner === 'mr')\n return 'width';\n return Math.abs(scaleY - 1) > Math.abs(scaleX - 1) ? 'height' : 'width';\n}\nfunction constrainAspectRatioSize(requestedWidth, requestedHeight, basis, aspectRatio, minWidth, minHeight, maxWidth, maxHeight) {\n var _a;\n const maxSize = fitAspectRatioInside(maxWidth, maxHeight, aspectRatio);\n const minSize = (_a = minimumAspectRatioSizeThatFits(minWidth, minHeight, maxSize.width, maxSize.height, aspectRatio)) !== null && _a !== void 0 ? _a : maxSize;\n let width = basis === 'height' ? requestedHeight * aspectRatio : requestedWidth;\n let height = basis === 'height' ? requestedHeight : requestedWidth / aspectRatio;\n if (width > maxSize.width || height > maxSize.height) {\n ({ width, height } = maxSize);\n }\n if (width < minSize.width || height < minSize.height) {\n ({ width, height } = minSize);\n }\n return { width, height };\n}\nfunction resolvePaddedCropArea(boundsLeft, boundsTop, maxCropWidth, maxCropHeight, padding) {\n const insetX = padding * 2 < maxCropWidth ? padding : 0;\n const insetY = padding * 2 < maxCropHeight ? padding : 0;\n return {\n left: boundsLeft + insetX,\n top: boundsTop + insetY,\n width: Math.max(1, maxCropWidth - insetX * 2),\n height: Math.max(1, maxCropHeight - insetY * 2),\n };\n}\nfunction resolveCropBounds(context) {\n const originalImage = context.getOriginalImage();\n if (!originalImage)\n return null;\n originalImage.setCoords();\n const { options } = context;\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 configuredMinWidth = Math.max(1, Number(options.crop.minWidth) || 1);\n const configuredMinHeight = Math.max(1, Number(options.crop.minHeight) || 1);\n return {\n boundsLeft,\n boundsTop,\n maxCropWidth,\n maxCropHeight,\n minCropWidth: Math.min(configuredMinWidth, maxCropWidth),\n minCropHeight: Math.min(configuredMinHeight, maxCropHeight),\n padding,\n imageBounds,\n };\n}\nfunction clampCropRectIntoBounds(cropRect, bounds) {\n const width = Math.min(bounds.maxCropWidth, Math.max(bounds.minCropWidth, (Number(cropRect.width) || 1) * (Number(cropRect.scaleX) || 1)));\n const height = Math.min(bounds.maxCropHeight, Math.max(bounds.minCropHeight, (Number(cropRect.height) || 1) * (Number(cropRect.scaleY) || 1)));\n const left = Math.min(bounds.boundsLeft + bounds.maxCropWidth - width, Math.max(bounds.boundsLeft, Number(cropRect.left) || bounds.boundsLeft));\n const top = Math.min(bounds.boundsTop + bounds.maxCropHeight - height, Math.max(bounds.boundsTop, Number(cropRect.top) || bounds.boundsTop));\n cropRect.set({ left, top, width, height, scaleX: 1, scaleY: 1 });\n}\nfunction resizeCropRectToAspectRatio(context, cropRect, aspectRatio) {\n const bounds = resolveCropBounds(context);\n if (!bounds)\n return;\n if (aspectRatio === null) {\n clampCropRectIntoBounds(cropRect, bounds);\n cropRect.setCoords();\n return;\n }\n const available = resolvePaddedCropArea(bounds.boundsLeft, bounds.boundsTop, bounds.maxCropWidth, bounds.maxCropHeight, bounds.padding);\n const fitted = fitAspectRatioInside(available.width, available.height, aspectRatio);\n cropRect.set({\n left: available.left + (available.width - fitted.width) / 2,\n top: available.top + (available.height - fitted.height) / 2,\n width: fitted.width,\n height: fitted.height,\n scaleX: 1,\n scaleY: 1,\n });\n cropRect.setCoords();\n}\nfunction updateCropRectControlVisibility(cropRect, aspectRatio, allowRotationOfCropRect) {\n const lockedRatio = aspectRatio !== null;\n cropRect.setControlsVisibility({\n tl: true,\n tr: true,\n br: true,\n bl: true,\n mt: !lockedRatio,\n mb: !lockedRatio,\n ml: !lockedRatio,\n mr: !lockedRatio,\n mtr: allowRotationOfCropRect,\n });\n cropRect.setCoords();\n}\nexport function enterCropMode(context, cropModeOptions = {}) {\n var _a;\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 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 aspectRatio = normalizeCropAspectRatio((_a = cropModeOptions.aspectRatio) !== null && _a !== void 0 ? _a : options.crop.aspectRatio);\n let rectLeft;\n let rectTop;\n let rectWidth;\n let rectHeight;\n if (aspectRatio === null) {\n rectLeft = Math.min(boundsLeft + maxCropWidth - 1, Math.max(boundsLeft, Math.floor(imageBounds.left + padding)));\n rectTop = Math.min(boundsTop + maxCropHeight - 1, Math.max(boundsTop, Math.floor(imageBounds.top + padding)));\n rectWidth = minCropWidth;\n rectHeight = minCropHeight;\n }\n else {\n const available = resolvePaddedCropArea(boundsLeft, boundsTop, maxCropWidth, maxCropHeight, padding);\n const fitted = fitAspectRatioInside(available.width, available.height, aspectRatio);\n rectWidth = fitted.width;\n rectHeight = fitted.height;\n rectLeft = available.left + (available.width - rectWidth) / 2;\n rectTop = available.top + (available.height - rectHeight) / 2;\n }\n const cropRect = new context.fabric.Rect({\n left: rectLeft,\n top: rectTop,\n width: rectWidth,\n height: rectHeight,\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 updateCropRectControlVisibility(cropRect, aspectRatio, allowRotation);\n canvas.add(cropRect);\n markSessionObject(cropRect, '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 let nextScaleX;\n let nextScaleY;\n const activeSession = context.getCropSession();\n const activeAspectRatio = activeSession ? activeSession.aspectRatio : aspectRatio;\n if (activeAspectRatio === null) {\n nextScaleX = Math.min(maxCropWidth / cropWidth, Math.max(minCropWidth / cropWidth, Number(cropRect.scaleX) || 1));\n nextScaleY = Math.min(maxCropHeight / cropHeight, Math.max(minCropHeight / cropHeight, Number(cropRect.scaleY) || 1));\n }\n else {\n const rawScaleX = Math.max(0.0001, Number(cropRect.scaleX) || 1);\n const rawScaleY = Math.max(0.0001, Number(cropRect.scaleY) || 1);\n const basis = chooseAspectRatioResizeBasis(canvas, cropRect, rawScaleX, rawScaleY);\n const constrained = constrainAspectRatioSize(cropWidth * rawScaleX, cropHeight * rawScaleY, basis, activeAspectRatio, minCropWidth, minCropHeight, maxCropWidth, maxCropHeight);\n nextScaleX = constrained.width / cropWidth;\n nextScaleY = constrained.height / cropHeight;\n }\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 aspectRatio,\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 setCropAspectRatio(context, aspectRatioInput) {\n const session = context.getCropSession();\n if (!(session === null || session === void 0 ? void 0 : session.cropRect))\n return;\n const aspectRatio = normalizeCropAspectRatio(aspectRatioInput);\n session.aspectRatio = aspectRatio;\n resizeCropRectToAspectRatio(context, session.cropRect, aspectRatio);\n updateCropRectControlVisibility(session.cropRect, aspectRatio, !!context.options.crop.allowRotationOfCropRect);\n context.canvas.setActiveObject(session.cropRect);\n context.canvas.requestRenderAll();\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 { markBaseImageObject, markSessionObject } from '../core/editor-object-kind.js';\nimport { mimeTypeFor, tryNormalizeImageFormat } from '../export/export-format.js';\nimport { Command } from '../history/history-manager.js';\nimport { detectSourceMimeType } from '../image/image-resampler.js';\nimport { getPointerFromFabricEvent } from '../utils/pointer.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 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 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: config.previewStrokeDashArray\n ? [...config.previewStrokeDashArray]\n : undefined,\n selectable: false,\n evented: false,\n excludeFromExport: true,\n objectCaching: false,\n visible: false,\n });\n markSessionObject(circle, 'mosaicPreviewCircle');\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 markSessionObject(image, 'mosaicPreviewImage');\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 releaseMosaicRasterCache(session) {\n const cache = session.rasterCache;\n if (!cache)\n return;\n try {\n cache.offscreenCanvas.width = 0;\n cache.offscreenCanvas.height = 0;\n }\n catch {\n }\n session.rasterCache = 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(markBaseImageObject(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 releaseMosaicRasterCache(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 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: config.previewStrokeDashArray\n ? [...config.previewStrokeDashArray]\n : 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","export function startImageElementLoad(dataUrl, options) {\n const imageElement = new Image();\n if (options.crossOrigin !== undefined) {\n imageElement.crossOrigin = options.crossOrigin;\n }\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 try {\n imageElement.src = '';\n }\n catch {\n }\n }\n };\n const handleLoad = () => {\n var _a, _b;\n const validationError = (_b = (_a = options.validate) === null || _a === void 0 ? void 0 : _a.call(options, imageElement)) !== null && _b !== void 0 ? _b : null;\n if (validationError) {\n cleanup(true);\n rejectImage(validationError);\n return;\n }\n cleanup(false);\n resolveImage(imageElement);\n };\n const handleError = (event) => {\n cleanup(true);\n rejectImage(options.createError(event));\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}\n//# sourceMappingURL=image-element-loader.js.map","import { MergeAnnotationsError, MergeMasksError } from '../core/errors.js';\nimport { normalizeLayerOrder } from '../core/layer-order.js';\nimport { Command } from '../history/history-manager.js';\nfunction createMergeError(operation, error) {\n if (operation === 'mergeAnnotations') {\n if (error instanceof MergeAnnotationsError)\n return error;\n const message = error instanceof Error\n ? `mergeAnnotations failed: ${error.message}`\n : 'mergeAnnotations failed';\n return new MergeAnnotationsError(message, error);\n }\n if (error instanceof MergeMasksError)\n return error;\n const message = error instanceof Error ? `mergeMasks failed: ${error.message}` : 'mergeMasks failed';\n return new MergeMasksError(message, error);\n}\nfunction detachObjects(canvas, objects) {\n for (const object of objects) {\n if (!canvas.getObjects().includes(object))\n continue;\n canvas.remove(object);\n }\n canvas.discardActiveObject();\n canvas.renderAll();\n}\nexport async function flattenOverlayGroupToBaseImage(context, options) {\n if (!context.isImageLoaded())\n return;\n if (options.getTargets().length === 0)\n return;\n const beforeSnapshot = context.captureSnapshot();\n const preservedObjects = options.getPreservedObjects();\n const preScrollTop = context.containerElement ? context.containerElement.scrollTop : null;\n const preScrollLeft = context.containerElement ? context.containerElement.scrollLeft : null;\n try {\n detachObjects(context.canvas, preservedObjects);\n const exportedDataUrl = await context.exportImageBase64(options.exportOptions);\n if (!exportedDataUrl) {\n throw createMergeError(options.operation, `${options.operation}: exportImageBase64 returned an empty data URL.`);\n }\n options.removeTargetsNoHistory();\n await context.loadImage(exportedDataUrl, { preserveScroll: true });\n await options.restorePreservedObjects(preservedObjects);\n normalizeLayerOrder(context.canvas);\n context.canvas.renderAll();\n context.updateInputs();\n context.updateUi();\n if (context.containerElement) {\n try {\n if (preScrollTop !== null)\n context.containerElement.scrollTop = preScrollTop;\n if (preScrollLeft !== null)\n context.containerElement.scrollLeft = preScrollLeft;\n }\n catch (scrollError) {\n console.warn(`[ImageEditor] ${options.operation}: scroll restore failed`, scrollError);\n }\n }\n const afterSnapshot = context.captureSnapshot();\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] ${options.operation}: rollback failed`, rollbackError);\n }\n throw createMergeError(options.operation, error);\n }\n}\n//# sourceMappingURL=overlay-merge-service.js.map","import { isAnnotationObject, isMaskObject, isSessionObject } from '../core/public-types.js';\nimport { reportError } from '../core/callback-reporter.js';\nimport { ExportError, ExportNotReadyError } from '../core/errors.js';\nimport { withMaskStyleBackup } from '../mask/mask-style.js';\nimport { getClampedCanvasRegion, getObjectBBox, getPartialExportEdges, hasMeaningfulCanvasRegion, } from '../utils/canvas-region.js';\nimport { startImageElementLoad } from '../utils/image-element-loader.js';\nimport { resolveExportFormat } from './export-format.js';\nimport { flattenOverlayGroupToBaseImage, } from './overlay-merge-service.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 mergeMasks: typeof providedOptions.mergeMasks === 'boolean'\n ? providedOptions.mergeMasks\n : context.options.mergeMasksByDefault,\n mergeAnnotations: typeof providedOptions.mergeAnnotations === 'boolean'\n ? providedOptions.mergeAnnotations\n : context.options.mergeAnnotationsByDefault,\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, mergeMasks, callback) {\n if (!mergeMasks) {\n return withObjectsHidden(context.canvas, isMaskObject, callback);\n }\n return withMaskStyleBackup({ canvas: context.canvas, options: context.options }, applyExportBakeInStyle, callback);\n}\nasync function withObjectsHidden(canvas, predicate, callback) {\n const backups = getCanvasObjects(canvas)\n .filter(predicate)\n .map((object) => ({\n object,\n visible: object.visible,\n }));\n for (const backup of backups) {\n try {\n if (typeof backup.object.set === 'function') {\n backup.object.set({ visible: false });\n }\n else {\n backup.object.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.object.set === 'function') {\n backup.object.set({ visible: backup.visible });\n }\n else {\n backup.object.visible = backup.visible;\n }\n }\n catch {\n }\n }\n requestRender(canvas);\n }\n}\nasync function withSessionObjectsHidden(context, callback) {\n return withObjectsHidden(context.canvas, (object) => isSessionObject(object) ||\n object.isCropRect === true ||\n object.maskLabel === true ||\n object.isMosaicPreview === true, callback);\n}\nasync function withAnnotationsExportState(context, mergeAnnotations, callback) {\n if (!mergeAnnotations) {\n return withObjectsHidden(context.canvas, isAnnotationObject, callback);\n }\n return withObjectsHidden(context.canvas, (object) => isAnnotationObject(object) && object.annotationHidden === true, callback);\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 startImageElementLoad(dataUrl, {\n crossOrigin: 'anonymous',\n createError: () => new Error('Failed to decode export data URL'),\n }).promise;\n}\nasync function sealPartialTransparentEdges(dataUrl, edges, target, ownerDocument) {\n if (!hasPartialEdges(edges))\n return dataUrl;\n const imageElement = await loadImageElement(dataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = ownerDocument.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, ownerDocument) {\n return resolveCanvasFillStyle(backgroundColor, ownerDocument);\n}\nfunction resolveCanvasFillStyle(backgroundColor, ownerDocument, 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(ownerDocument);\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(ownerDocument) {\n try {\n return ownerDocument.createElement('canvas').getContext('2d');\n }\n catch {\n return null;\n }\n}\nfunction getCanvasDocument(canvas) {\n var _a, _b, _c, _d;\n const canvasLike = canvas;\n const ownerDocument = (_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;\n if (ownerDocument)\n return ownerDocument;\n if (typeof document !== 'undefined')\n return document;\n throw new Error('Document is unavailable for export canvas creation.');\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, ownerDocument) {\n const imageElement = await loadImageElement(dataUrl);\n const { width, height } = getImageDimensions(imageElement);\n const offscreenCanvas = ownerDocument.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, ownerDocument);\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, canvas) {\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 ownerDocument = getCanvasDocument(canvas);\n const offscreenCanvas = ownerDocument.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, ownerDocument);\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}\nfunction extensionForFormat(format) {\n return format === 'jpeg' ? 'jpg' : format;\n}\nfunction resolveFileName(baseName, format) {\n const fallback = 'edited_image';\n const trimmed = String(baseName || fallback).trim() || fallback;\n const ext = extensionForFormat(format.format);\n if (/\\.(jpe?g|png|webp)$/i.test(trimmed)) {\n return trimmed.replace(/\\.(jpe?g|png|webp)$/i, `.${ext}`);\n }\n return `${trimmed}.${ext}`;\n}\nasync function renderExportDataUrl(context, resolved) {\n const activeObject = captureActiveObject(context.canvas);\n const labelBackups = captureMaskLabelBackups(context.canvas);\n try {\n context.canvas.discardActiveObject();\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 withSessionObjectsHidden(context, async () => withMaskExportState(context, resolved.mergeMasks, async () => withAnnotationsExportState(context, resolved.mergeAnnotations, 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 if (hasPartialEdges(partialEdges)) {\n dataUrl = await sealPartialTransparentEdges(dataUrl, partialEdges, sealedFormat, getCanvasDocument(context.canvas));\n }\n if (resolved.format.format === 'jpeg') {\n dataUrl = await convertDataUrlToOpaqueJpeg(dataUrl, context.options.backgroundColor, resolved.format.quality, getCanvasDocument(context.canvas));\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 exportImageBase64(context, options) {\n if (!context.isImageLoaded()) {\n warnNoImageLoaded('exportImageBase64');\n return '';\n }\n const resolved = resolveExportOptions(context, options);\n return renderExportDataUrl(context, resolved);\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 resolved = resolveExportOptions(context, providedOptions);\n const rawDataUrl = await renderExportDataUrl(context, resolved);\n const finalDataUrl = await reencodeDataUrlAs(rawDataUrl, resolved.format, context.options.backgroundColor, context.canvas);\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 const fileName = resolveFileName((_a = providedOptions.fileName) !== null && _a !== void 0 ? _a : context.options.defaultDownloadFileName, resolved.format);\n return new File([bytes], fileName, { type: resolved.format.mimeType });\n}\nexport async function downloadImage(context, options) {\n if (!context.isImageLoaded()) {\n warnNoImageLoaded('downloadImage');\n return;\n }\n if (options !== undefined && options !== null && typeof options !== 'object') {\n throw new TypeError('[ImageEditor] downloadImage(options) expects an ImageExportOptions object.');\n }\n try {\n const file = await exportImageFile(context, options);\n triggerFileDownload(context, file);\n }\n catch (error) {\n reportError(context.options, error, 'downloadImage failed.');\n console.error('[ImageEditor] downloadImage failed', error);\n throw error;\n }\n}\nfunction triggerFileDownload(context, file) {\n const ownerDocument = getCanvasDocument(context.canvas);\n const objectUrl = URL.createObjectURL(file);\n const link = ownerDocument.createElement('a');\n link.download = file.name;\n link.href = objectUrl;\n const body = ownerDocument.body;\n body.appendChild(link);\n try {\n link.click();\n }\n finally {\n body.removeChild(link);\n if (typeof globalThis.setTimeout === 'function') {\n globalThis.setTimeout(() => URL.revokeObjectURL(objectUrl), 0);\n }\n else {\n URL.revokeObjectURL(objectUrl);\n }\n }\n}\nexport async function mergeMasks(context) {\n await flattenOverlayGroupToBaseImage(context, {\n operation: 'mergeMasks',\n exportOptions: {\n exportArea: 'image',\n mergeMasks: true,\n mergeAnnotations: false,\n multiplier: context.options.exportMultiplier,\n fileType: 'png',\n },\n getTargets: () => context.canvas.getObjects().filter(isMaskObject),\n getPreservedObjects: () => context.getAnnotations(),\n removeTargetsNoHistory: () => {\n context.removeAllMasksNoHistory();\n },\n restorePreservedObjects: (objects) => context.restoreAnnotations(objects),\n });\n}\nexport async function mergeAnnotations(context) {\n await flattenOverlayGroupToBaseImage(context, {\n operation: 'mergeAnnotations',\n exportOptions: {\n exportArea: 'image',\n mergeMasks: false,\n mergeAnnotations: true,\n multiplier: context.options.exportMultiplier,\n fileType: 'png',\n },\n getTargets: () => context.canvas.getObjects().filter(isAnnotationObject),\n getPreservedObjects: () => context.getMasks(),\n removeTargetsNoHistory: () => {\n context.removeAllAnnotationsNoHistory();\n },\n restorePreservedObjects: (objects) => context.restoreMasks(objects),\n });\n}\n//# sourceMappingURL=export-service.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 isSupportedImageDataUrl(value) {\n if (typeof value !== 'string')\n return false;\n if (!value.startsWith('data:image/'))\n return false;\n const match = /^data:(image\\/[^;,]+)(?:[;,])/.exec(value);\n if (!match)\n return false;\n return SUPPORTED_IMAGE_MIME_TYPES.has(match[1].toLowerCase());\n}\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 { 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 { markBaseImageObject } from '../core/editor-object-kind.js';\nimport { ImageDecodeError } from '../core/errors.js';\nimport { saveState, SNAPSHOT_CUSTOM_KEYS } from '../core/state-serializer.js';\nimport { isSupportedImageDataUrl } from '../utils/file.js';\nimport { startImageElementLoad } from '../utils/image-element-loader.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 (!isSupportedImageDataUrl(imageBase64))\n return;\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 annotationCounter: context.getAnnotationCounter(),\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 const baseImage = markBaseImageObject(fabricImage);\n baseImage.set({\n originX: 'left',\n originY: 'top',\n selectable: false,\n evented: false,\n });\n const layout = computeLayout(context, baseImage);\n applyCanvasDimensions(context.canvas, layout.canvasWidth, layout.canvasHeight, context.containerElement);\n baseImage.set({ left: layout.imageLeft, top: layout.imageTop });\n baseImage.scale(layout.imageScale);\n context.canvas.add(baseImage);\n context.canvas.sendObjectToBack(baseImage);\n context.setOriginalImage(baseImage);\n context.setBaseImageScale(layout.baseImageScale);\n context.setCurrentScale(1);\n context.setCurrentRotation(0);\n context.setMaskCounter(0);\n context.setAnnotationCounter(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 return startImageElementLoad(dataUrl, {\n validate: (imageElement) => hasNaturalImageDimensions(imageElement)\n ? null\n : new ImageDecodeError('Failed to decode image data URL: image has no natural dimensions.', null),\n createError: (event) => new ImageDecodeError('Failed to decode image data URL.', event),\n });\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.setAnnotationCounter(bundle.annotationCounter);\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 flipHorizontal() {\n await this.flipImage('flipX');\n }\n async flipVertical() {\n await this.flipImage('flipY');\n }\n async flipImage(property) {\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 try {\n const centre = imageObject.getCenterPoint();\n imageObject.set({ originX: 'center', originY: 'center' });\n imageObject.setPositionByOrigin(centre, 'center', 'center');\n imageObject.set({ [property]: !imageObject[property] });\n imageObject.setCoords();\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] ${property === 'flipX' ? 'flipHorizontal' : 'flipVertical'} failed`, error);\n return;\n }\n if (this.context.guard.isDisposed())\n return;\n if (this.context.afterTransformSnap)\n this.context.afterTransformSnap();\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 const imageObject = this.context.getOriginalImage();\n if (imageObject && !this.context.guard.isDisposed()) {\n imageObject.set({ flipX: false, flipY: false });\n imageObject.setCoords();\n if (this.context.afterTransformSnap)\n this.context.afterTransformSnap();\n }\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","import { isMaskObject } from '../core/public-types.js';\nimport { markMaskObject } from '../core/editor-object-kind.js';\nimport { placeMaskObject } from '../core/layer-order.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 const nextId = context.getMaskCounter() + 1;\n context.setMaskCounter(nextId);\n markMaskObject(maskObject, {\n maskId: nextId,\n maskUid: createMaskUid(nextId),\n maskName: `${options.maskName}${nextId}`,\n originalAlpha: resolvedConfig.alpha,\n originalStroke: maskObject.stroke,\n originalStrokeWidth: maskObject.strokeWidth,\n });\n attachMaskHoverHandlers(maskObject);\n context.setLastMask(maskObject);\n placeMaskObject(canvas, 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}\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}\nfunction getSelectedMaskObjects(canvas) {\n const active = canvas.getActiveObject();\n if (!active)\n return [];\n if (!isActiveSelectionObject(active))\n return isMaskObject(active) ? [active] : [];\n const getObjects = active.getObjects;\n const objects = typeof getObjects === 'function' ? getObjects.call(active) : [];\n return objects.filter(isMaskObject);\n}\nexport function removeSelectedMask(context) {\n const selectedMasks = getSelectedMaskObjects(context.canvas);\n if (selectedMasks.length === 0)\n return;\n for (const mask of selectedMasks) {\n context.removeLabelForMask(mask);\n detachMaskHoverHandlers(mask);\n context.canvas.remove(mask);\n }\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';\nimport { markSessionObject } from '../core/editor-object-kind.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 markSessionObject(labelTextObject, 'maskLabel');\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","import { AnimationQueue } from './animation/animation-queue.js';\nimport { reportError, reportWarning } from './core/callback-reporter.js';\nimport { areResolvedMosaicConfigsEqual, areResolvedDrawConfigsEqual, areResolvedTextAnnotationConfigsEqual, cloneResolvedMosaicConfig, cloneResolvedDrawConfig, cloneResolvedTextAnnotationConfig, getInvalidDrawConfigFields, getInvalidMosaicConfigFields, getInvalidTextAnnotationConfigFields, isLayoutMode, mergeDrawConfigPatch, mergeMosaicConfigPatch, mergeTextAnnotationConfigPatch, 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 { isAnnotationObject, isDrawAnnotationObject, isEditableOverlayObject, isMaskObject, isTextAnnotationObject, } from './core/public-types.js';\nimport { getAnnotations as getAnnotationsImpl, removeAllAnnotations as removeAllAnnotationsImpl, removeAnnotationObjects, removeSelectedAnnotation as removeSelectedAnnotationImpl, renderAnnotationList, updateAnnotation as updateAnnotationImpl, updateAnnotationListSelection, updateSelectedAnnotation as updateSelectedAnnotationImpl, } from './annotation/annotation-manager.js';\nimport { attachTextEditingHandlersToAnnotations, createTextAnnotation as createTextAnnotationImpl, enterTextMode as enterTextModeImpl, exitTextMode as exitTextModeImpl, finalizeActiveTextEditing, } from './annotation/text-controller.js';\nimport { enterDrawMode as enterDrawModeImpl, exitDrawMode as exitDrawModeImpl, updateDrawBrush, } from './annotation/draw-controller.js';\nimport { isAnnotationLocked, isAnnotationUnlocked } from './annotation/annotation-lock.js';\nimport { syncAnnotationRuntimeStates } from './annotation/annotation-style.js';\nimport { normalizeLayerOrder, getEditableOverlayRange } from './core/layer-order.js';\nimport { applyCrop as applyCropImpl, cancelCrop as cancelCropImpl, enterCropMode as enterCropModeImpl, setCropAspectRatio as setCropAspectRatioImpl, } 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, mergeAnnotations as mergeAnnotationsImpl, 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, isSupportedImageDataUrl, 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 'flipHorizontalButton',\n 'flipVerticalButton',\n 'createMaskButton',\n 'removeSelectedMaskButton',\n 'removeAllMasksButton',\n 'mergeMasksButton',\n 'mergeAnnotationsButton',\n 'enterTextModeButton',\n 'exitTextModeButton',\n 'textColorInput',\n 'textFontSizeInput',\n 'enterDrawModeButton',\n 'exitDrawModeButton',\n 'drawColorInput',\n 'drawBrushSizeInput',\n 'removeSelectedAnnotationButton',\n 'removeAllAnnotationsButton',\n 'deleteSelectedObjectButton',\n 'bringSelectedObjectForwardButton',\n 'sendSelectedObjectBackwardButton',\n 'bringSelectedObjectToFrontButton',\n 'sendSelectedObjectToBackButton',\n 'downloadImageButton',\n 'zoomInButton',\n 'zoomOutButton',\n 'resetImageTransformButton',\n 'undoButton',\n 'redoButton',\n 'imageInput',\n 'enterCropModeButton',\n 'cropAspectRatioSelect',\n 'applyCropButton',\n 'cancelCropButton',\n 'enterMosaicModeButton',\n 'exitMosaicModeButton',\n 'mosaicBrushSizeInput',\n 'mosaicBlockSizeInput',\n];\nconst CROP_MODE_ENABLED_KEYS = [\n 'cropAspectRatioSelect',\n 'applyCropButton',\n 'cancelCropButton',\n];\nconst CROP_SESSION_ALLOWED_OPERATIONS = new Set(['setCropAspectRatio', 'applyCrop', 'cancelCrop']);\nconst TEXT_MODE_ENABLED_KEYS = [\n 'exitTextModeButton',\n 'textColorInput',\n 'textFontSizeInput',\n];\nconst DRAW_MODE_ENABLED_KEYS = [\n 'exitDrawModeButton',\n 'drawColorInput',\n 'drawBrushSizeInput',\n];\nconst MOSAIC_MODE_CONTROL_KEYS = [\n 'scalePercentageInput',\n 'rotateLeftDegreesInput',\n 'rotateRightDegreesInput',\n 'rotateLeftButton',\n 'rotateRightButton',\n 'flipHorizontalButton',\n 'flipVerticalButton',\n 'createMaskButton',\n 'removeSelectedMaskButton',\n 'removeAllMasksButton',\n 'mergeMasksButton',\n 'mergeAnnotationsButton',\n 'enterTextModeButton',\n 'exitTextModeButton',\n 'textColorInput',\n 'textFontSizeInput',\n 'enterDrawModeButton',\n 'exitDrawModeButton',\n 'drawColorInput',\n 'drawBrushSizeInput',\n 'removeSelectedAnnotationButton',\n 'removeAllAnnotationsButton',\n 'deleteSelectedObjectButton',\n 'bringSelectedObjectForwardButton',\n 'sendSelectedObjectBackwardButton',\n 'bringSelectedObjectToFrontButton',\n 'sendSelectedObjectToBackButton',\n 'downloadImageButton',\n 'zoomInButton',\n 'zoomOutButton',\n 'resetImageTransformButton',\n 'undoButton',\n 'redoButton',\n 'imageInput',\n 'enterCropModeButton',\n 'cropAspectRatioSelect',\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 'flipHorizontal',\n 'flipVertical',\n 'resetImageTransform',\n 'createMask',\n 'removeSelectedMask',\n 'removeAllMasks',\n 'mergeMasks',\n 'createTextAnnotation',\n 'enterTextMode',\n 'exitTextMode',\n 'setTextConfig',\n 'resetTextConfig',\n 'setTextColor',\n 'setTextFontSize',\n 'enterDrawMode',\n 'exitDrawMode',\n 'setDrawConfig',\n 'resetDrawConfig',\n 'setDrawColor',\n 'setDrawBrushSize',\n 'updateSelectedAnnotation',\n 'updateAnnotation',\n 'removeSelectedAnnotation',\n 'removeAllAnnotations',\n 'deleteSelectedObject',\n 'mergeAnnotations',\n 'bringSelectedObjectForward',\n 'sendSelectedObjectBackward',\n 'bringSelectedObjectToFront',\n 'sendSelectedObjectToBack',\n 'enterCropMode',\n 'setCropAspectRatio',\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]);\nconst TOOL_MODE_ALLOWED_OPERATIONS = {\n crop: CROP_SESSION_ALLOWED_OPERATIONS,\n mosaic: MOSAIC_SESSION_ALLOWED_OPERATIONS,\n text: new Set([\n 'exitTextMode',\n 'createTextAnnotation',\n 'setTextConfig',\n 'resetTextConfig',\n 'setTextColor',\n 'setTextFontSize',\n 'saveState',\n ]),\n draw: new Set([\n 'exitDrawMode',\n 'setDrawConfig',\n 'resetDrawConfig',\n 'setDrawColor',\n 'setDrawBrushSize',\n 'saveState',\n ]),\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, \"defaultTextConfig\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"currentTextConfig\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"defaultDrawConfig\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"currentDrawConfig\", {\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, \"annotationCounter\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 0\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, \"textSession\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"drawSession\", {\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, \"keyboardDocument\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: null\n });\n Object.defineProperty(this, \"keyboardHandler\", {\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 this.defaultTextConfig = this.options.defaultTextConfig;\n this.currentTextConfig = cloneResolvedTextAnnotationConfig(this.defaultTextConfig);\n this.defaultDrawConfig = this.options.defaultDrawConfig;\n this.currentDrawConfig = cloneResolvedDrawConfig(this.defaultDrawConfig);\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 flipHorizontalButton: 'flipHorizontalButton',\n flipVerticalButton: 'flipVerticalButton',\n createMaskButton: 'createMaskButton',\n removeSelectedMaskButton: 'removeSelectedMaskButton',\n removeAllMasksButton: 'removeAllMasksButton',\n mergeMasksButton: 'mergeMasksButton',\n annotationList: 'annotationList',\n enterTextModeButton: 'enterTextModeButton',\n exitTextModeButton: 'exitTextModeButton',\n textColorInput: 'textColorInput',\n textFontSizeInput: 'textFontSizeInput',\n enterDrawModeButton: 'enterDrawModeButton',\n exitDrawModeButton: 'exitDrawModeButton',\n drawColorInput: 'drawColorInput',\n drawBrushSizeInput: 'drawBrushSizeInput',\n removeSelectedAnnotationButton: 'removeSelectedAnnotationButton',\n removeAllAnnotationsButton: 'removeAllAnnotationsButton',\n deleteSelectedObjectButton: 'deleteSelectedObjectButton',\n mergeAnnotationsButton: 'mergeAnnotationsButton',\n bringSelectedObjectForwardButton: 'bringSelectedObjectForwardButton',\n sendSelectedObjectBackwardButton: 'sendSelectedObjectBackwardButton',\n bringSelectedObjectToFrontButton: 'bringSelectedObjectToFrontButton',\n sendSelectedObjectToBackButton: 'sendSelectedObjectToBackButton',\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 cropAspectRatioSelect: 'cropAspectRatioSelect',\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.initCanvas();\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.transformController = new TransformController(this.buildTransformContext());\n this.bindDomEvents();\n this.updateInputs();\n this.updateMaskList();\n this.updateAnnotationList();\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)\n this.handleObjectMovingScalingRotating(e.target);\n };\n const onObjectModified = (e) => {\n if (e.target)\n this.handleObjectModified(e.target);\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 getLiveCanvasOrThrow(operationName) {\n if (this.isDisposed || !this.canvas) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" after dispose.`);\n }\n return this.canvas;\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('flipHorizontalButton', 'click', () => {\n void this.flipHorizontal();\n });\n this.bindElementIfExists('flipVerticalButton', 'click', () => {\n void this.flipVertical();\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('mergeAnnotationsButton', 'click', () => {\n void this.mergeAnnotations();\n });\n this.bindElementIfExists('enterTextModeButton', 'click', () => {\n this.enterTextMode();\n });\n this.bindElementIfExists('exitTextModeButton', 'click', () => {\n this.exitTextMode();\n });\n this.bindElementIfExists('enterDrawModeButton', 'click', () => {\n this.enterDrawMode();\n });\n this.bindElementIfExists('exitDrawModeButton', 'click', () => {\n this.exitDrawMode();\n });\n this.bindElementIfExists('removeSelectedAnnotationButton', 'click', () => {\n this.removeSelectedAnnotation();\n });\n this.bindElementIfExists('removeAllAnnotationsButton', 'click', () => {\n this.removeAllAnnotations();\n });\n this.bindElementIfExists('deleteSelectedObjectButton', 'click', () => {\n this.deleteSelectedObject();\n });\n this.bindElementIfExists('bringSelectedObjectForwardButton', 'click', () => {\n this.bringSelectedObjectForward();\n });\n this.bindElementIfExists('sendSelectedObjectBackwardButton', 'click', () => {\n this.sendSelectedObjectBackward();\n });\n this.bindElementIfExists('bringSelectedObjectToFrontButton', 'click', () => {\n this.bringSelectedObjectToFront();\n });\n this.bindElementIfExists('sendSelectedObjectToBackButton', 'click', () => {\n this.sendSelectedObjectToBack();\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({ aspectRatio: this.getSelectedCropAspectRatio() });\n });\n this.bindElementIfExists('cropAspectRatioSelect', 'change', () => {\n if (this.cropSession)\n this.setCropAspectRatio(this.getSelectedCropAspectRatio());\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 const bindStringInput = (key, applyValue) => {\n const handler = (event) => {\n applyValue(event.target.value);\n };\n this.bindElementIfExists(key, 'input', handler);\n this.bindElementIfExists(key, 'change', handler);\n };\n const bindNumberInput = (key, applyValue) => {\n const handler = (event) => {\n applyValue(parseFloat(event.target.value));\n };\n this.bindElementIfExists(key, 'input', handler);\n this.bindElementIfExists(key, 'change', handler);\n };\n bindStringInput('textColorInput', (value) => this.applyTextColorInput(value));\n bindNumberInput('textFontSizeInput', (value) => this.applyTextFontSizeInput(value));\n bindStringInput('drawColorInput', (value) => this.applyDrawColorInput(value));\n bindNumberInput('drawBrushSizeInput', (value) => this.applyDrawBrushSizeInput(value));\n this.bindKeyboardEvents();\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 bindKeyboardEvents() {\n var _a, _b;\n const ownerDocument = (_b = (_a = this.canvasElement) === null || _a === void 0 ? void 0 : _a.ownerDocument) !== null && _b !== void 0 ? _b : document;\n if (this.keyboardHandler && this.keyboardDocument) {\n this.keyboardDocument.removeEventListener('keydown', this.keyboardHandler);\n }\n this.keyboardDocument = ownerDocument;\n this.keyboardHandler = (event) => this.handleKeyboardEvent(event);\n ownerDocument.addEventListener('keydown', this.keyboardHandler);\n }\n isNativeTextInputActive() {\n var _a;\n const activeElement = (_a = this.keyboardDocument) === null || _a === void 0 ? void 0 : _a.activeElement;\n if (!activeElement)\n return false;\n const tagName = activeElement.tagName.toLowerCase();\n return (tagName === 'input' ||\n tagName === 'textarea' ||\n tagName === 'select' ||\n activeElement.isContentEditable === true);\n }\n isFabricTextEditingActive() {\n var _a;\n const activeObject = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n return !!(activeObject &&\n isTextAnnotationObject(activeObject) &&\n activeObject.isEditing === true);\n }\n handleKeyboardEvent(event) {\n if (this.isDisposed)\n return;\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (this.isNativeTextInputActive() || this.isFabricTextEditingActive())\n return;\n this.deleteSelectedObject();\n return;\n }\n if (event.key !== 'Escape')\n return;\n if (this.isFabricTextEditingActive() && this.canvas) {\n finalizeActiveTextEditing(this.buildTextControllerContext(), { commit: false });\n event.preventDefault();\n return;\n }\n if (this.textSession) {\n this.exitTextMode();\n }\n else if (this.drawSession) {\n this.exitDrawMode();\n }\n else if (this.mosaicSession) {\n this.exitMosaicMode();\n }\n else if (this.cropSession) {\n this.cancelCrop();\n }\n }\n finalizeActiveTextEditingIfNeeded() {\n if (!this.canvas || !this.isFabricTextEditingActive())\n return;\n finalizeActiveTextEditing(this.buildTextControllerContext(), { commit: true });\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 (!isSupportedImageDataUrl(base64))\n return;\n if (!this.canRunIdleOperation('loadImage', options))\n return;\n this.finalizeActiveTextEditingIfNeeded();\n const callbackContext = this.getOperationContext('loadImage', options);\n const previousImage = this.originalImage;\n const hadMasks = this.getMasks().length > 0;\n const hadAnnotations = this.getAnnotations().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 getAnnotationCounter: () => this.annotationCounter,\n setAnnotationCounter: (v) => {\n this.annotationCounter = 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.updateAnnotationList();\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 if (hadAnnotations) {\n this.emitAnnotationsChanged(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 const activeToolMode = this.getActiveToolMode();\n if (activeToolMode &&\n !this.operationGuard.isOwnOperation(token) &&\n !TOOL_MODE_ALLOWED_OPERATIONS[activeToolMode].has(operationName)) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" while ${activeToolMode} 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 getSelectedCropAspectRatio() {\n const inputId = this.elements.cropAspectRatioSelect;\n const inputEl = inputId\n ? document.getElementById(inputId)\n : null;\n const value = inputEl && 'value' in inputEl ? String(inputEl.value).trim() : '';\n return (value || 'free');\n }\n isExpectedIdleGuardError(error, operationName) {\n return (error instanceof Error &&\n error.message.startsWith(`[ImageEditor] Cannot run \"${operationName}\" `));\n }\n assertCanQueueAnimation(operationName, options) {\n const token = this.getInternalOperationToken(options);\n this.operationGuard.assertCanQueueAnimation(operationName, token);\n const activeToolMode = this.getActiveToolMode();\n if (activeToolMode &&\n !this.operationGuard.isOwnOperation(token) &&\n !TOOL_MODE_ALLOWED_OPERATIONS[activeToolMode].has(operationName)) {\n throw new Error(`[ImageEditor] Cannot run \"${operationName}\" while ${activeToolMode} mode is active.`);\n }\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.isToolModeActive();\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 getAnnotations() {\n if (!this.canvas)\n return [];\n return getAnnotationsImpl(this.canvas);\n }\n getMaskCollectionSignature() {\n return this.getMasks()\n .map((mask) => `${mask.maskId}:${mask.maskName}`)\n .join('|');\n }\n getAnnotationCollectionSignature() {\n return this.getAnnotations()\n .map((annotation) => `${annotation.annotationId}:${annotation.annotationName}`)\n .join('|');\n }\n getActiveToolMode() {\n if (this.cropSession)\n return 'crop';\n if (this.mosaicSession)\n return 'mosaic';\n if (this.textSession)\n return 'text';\n if (this.drawSession)\n return 'draw';\n return null;\n }\n isToolModeActive() {\n return this.getActiveToolMode() !== null;\n }\n getEditorState() {\n var _a, _b;\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 annotationCount: this.getAnnotations().length,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n isFlippedHorizontally: !!((_a = this.originalImage) === null || _a === void 0 ? void 0 : _a.flipX),\n isFlippedVertically: !!((_b = this.originalImage) === null || _b === void 0 ? void 0 : _b.flipY),\n isBusy: this.isBusy(),\n activeToolMode: this.getActiveToolMode(),\n isCropMode: this.cropSession !== null,\n isMosaicMode: this.mosaicSession !== null,\n isTextMode: this.textSession !== null,\n isDrawMode: this.drawSession !== 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 emitAnnotationsChanged(context) {\n this.emitOptionCallback('onAnnotationsChanged', [this.getAnnotations(), 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, _b;\n const selectedMasks = selected.filter(isMaskObject);\n const selectedAnnotations = selected.filter(isAnnotationObject);\n const selectedObjectKind = selectedMasks.length === 1 && selectedAnnotations.length === 0\n ? 'mask'\n : selectedAnnotations.length === 1 && selectedMasks.length === 0\n ? 'annotation'\n : null;\n return {\n selectedMask: (_a = selectedMasks[0]) !== null && _a !== void 0 ? _a : null,\n selectedMasks,\n selectedAnnotation: (_b = selectedAnnotations[0]) !== null && _b !== void 0 ? _b : null,\n selectedAnnotations,\n selectedObjectKind,\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, _c;\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 (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.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 getScrollbarStableViewportCanvasSize(viewport) {\n return {\n width: Math.max(1, viewport.width - 1),\n height: Math.max(1, viewport.height - 1),\n };\n }\n updateCanvasSizeToImageBounds(options = {}) {\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 const shouldStabilizeContainedViewport = options.stabilizeContainedViewport !== false;\n const imageFitsViewport = boundingRect.width <= viewport.width + LAYOUT_EPSILON &&\n boundingRect.height <= viewport.height + LAYOUT_EPSILON;\n if (this.currentLayoutMode === 'fit' || this.currentLayoutMode === 'cover') {\n if (imageFitsViewport) {\n const canvasSize = shouldStabilizeContainedViewport\n ? this.getScrollbarStableViewportCanvasSize(viewport)\n : viewport;\n this.setCanvasSizePx(canvasSize.width, canvasSize.height);\n return;\n }\n const canvasSize = computeScrollableCanvasSize(boundingRect.width, boundingRect.height, viewport, scrollbarSize);\n this.setCanvasSizePx(canvasSize.width, canvasSize.height);\n return;\n }\n if (imageFitsViewport) {\n const canvasSize = shouldStabilizeContainedViewport\n ? this.getScrollbarStableViewportCanvasSize(viewport)\n : viewport;\n this.setCanvasSizePx(canvasSize.width, canvasSize.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.getLiveCanvasOrThrow('buildTransformContext'),\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 flipHorizontal() {\n if (this.isDisposed || !this.transformController)\n return Promise.resolve();\n try {\n this.assertCanQueueAnimation('flipHorizontal');\n }\n catch (error) {\n return Promise.reject(error);\n }\n const controller = this.transformController;\n const context = this.buildCallbackContext('flipHorizontal', false);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.updateUi();\n try {\n await controller.flipHorizontal();\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 flipVertical() {\n if (this.isDisposed || !this.transformController)\n return Promise.resolve();\n try {\n this.assertCanQueueAnimation('flipVertical');\n }\n catch (error) {\n return Promise.reject(error);\n }\n const controller = this.transformController;\n const context = this.buildCallbackContext('flipVertical', false);\n const job = this.animQueue.add(async () => {\n if (this.isDisposed)\n return;\n this.updateUi();\n try {\n await controller.flipVertical();\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 const previousAnnotationSignature = this.getAnnotationCollectionSignature();\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 this.annotationCounter = restoredState.maxAnnotationId;\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({ stabilizeContainedViewport: false });\n this.alignObjectBoundingBoxToCanvasTopLeft(this.originalImage);\n }\n if (this.originalImage) {\n this.settleFitCoverScrollbarsAfterStateRestore();\n }\n const restoredMasks = restoredState.masks;\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 syncAnnotationRuntimeStates(restoredState.annotations);\n attachTextEditingHandlersToAnnotations(this.buildTextControllerContext(), restoredState.annotations);\n this.lastSnapshot = this.captureSnapshotInternal();\n this.canvas.renderAll();\n this.updateInputs();\n this.updateMaskList();\n this.updateAnnotationList();\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 if (previousAnnotationSignature !== this.getAnnotationCollectionSignature()) {\n this.emitAnnotationsChanged(context);\n }\n this.emitImageChanged(context);\n const canvas = this.getLiveCanvasOrThrow('loadFromState');\n const activeMaskId = editorState === null || editorState === void 0 ? void 0 : editorState.activeMaskId;\n const activeAnnotationId = editorState === null || editorState === void 0 ? void 0 : editorState.activeAnnotationId;\n if ((editorState === null || editorState === void 0 ? void 0 : editorState.activeObjectKind) === 'mask' && typeof activeMaskId === 'number') {\n const activeMask = restoredMasks.find((maskObject) => maskObject.maskId === activeMaskId);\n if (activeMask) {\n this.withSelectionChangeContext(context, () => {\n canvas.setActiveObject(activeMask);\n this.handleSelectionChanged([activeMask]);\n });\n }\n }\n else if ((editorState === null || editorState === void 0 ? void 0 : editorState.activeObjectKind) === 'annotation' &&\n typeof activeAnnotationId === 'number') {\n const activeAnnotation = restoredState.annotations.find((annotation) => annotation.annotationId === activeAnnotationId);\n if (activeAnnotation) {\n this.withSelectionChangeContext(context, () => {\n canvas.setActiveObject(activeAnnotation);\n this.handleSelectionChanged([activeAnnotation]);\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, _c;\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 const activeAnnotation = this.getActiveAnnotationForSnapshot();\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 activeAnnotationId: (_b = activeAnnotation === null || activeAnnotation === void 0 ? void 0 : activeAnnotation.annotationId) !== null && _b !== void 0 ? _b : null,\n currentScale: this.currentScale,\n currentRotation: this.currentRotation,\n baseImageScale: this.baseImageScale,\n currentImageMimeType: this.currentImageMimeType,\n });\n const before = (_c = this.lastSnapshot) !== null && _c !== void 0 ? _c : 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.restoreActiveObjectAfterSnapshot(activeObj, activeMask, activeAnnotation);\n this.updateUi();\n }\n }\n restoreActiveObjectAfterSnapshot(activeObj, activeMask, activeAnnotation) {\n if (!this.canvas)\n return;\n const maskToRestore = activeObj && isMaskObject(activeObj) ? activeObj : activeMask;\n const annotationToRestore = activeObj && isAnnotationObject(activeObj) ? activeObj : activeAnnotation;\n if (maskToRestore && this.canvas.getObjects().includes(maskToRestore)) {\n this.canvas.setActiveObject(maskToRestore);\n this.showLabelForMask(maskToRestore);\n this.updateMaskListSelection(maskToRestore);\n return;\n }\n if (annotationToRestore && this.canvas.getObjects().includes(annotationToRestore)) {\n this.canvas.setActiveObject(annotationToRestore);\n this.updateAnnotationListSelection(annotationToRestore);\n }\n }\n undo() {\n if (this.isDisposed)\n return Promise.resolve();\n if (!this.canRunIdleOperation('undo'))\n return Promise.resolve();\n this.finalizeActiveTextEditingIfNeeded();\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 this.finalizeActiveTextEditingIfNeeded();\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.getLiveCanvasOrThrow('createMask'),\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.getLiveCanvasOrThrow('removeMask'),\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 handleObjectMovingScalingRotating(target) {\n if (isMaskObject(target)) {\n this.syncMaskLabel(target);\n }\n }\n handleObjectModified(target) {\n if (isMaskObject(target)) {\n this.syncMaskLabel(target);\n const context = this.buildCallbackContext('saveState', false);\n this.saveState();\n this.emitMasksChanged(context);\n this.emitImageChanged(context);\n return;\n }\n if (isAnnotationObject(target)) {\n if (isAnnotationLocked(target))\n return;\n const context = this.buildCallbackContext('updateAnnotation', false);\n this.saveState();\n this.emitAnnotationsChanged(context);\n this.emitImageChanged(context);\n }\n }\n handleSelectionChanged(selected) {\n var _a, _b, _c, _d;\n if (!this.canvas)\n return;\n const selectedMask = (_a = selected.find(isMaskObject)) !== null && _a !== void 0 ? _a : null;\n const selectedAnnotation = (_b = selected.find(isAnnotationObject)) !== null && _b !== void 0 ? _b : 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.updateAnnotationListSelection(selectedAnnotation);\n this.canvas.requestRenderAll();\n this.updateUi();\n const context = (_c = this.nextSelectionChangeContext) !== null && _c !== void 0 ? _c : this.buildCallbackContext((_d = this.activeStateRestoreOperation) !== null && _d !== void 0 ? _d : '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 enterTextMode() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('enterTextMode'))\n return;\n if (this.isToolModeActive())\n return;\n enterTextModeImpl(this.buildTextControllerContext());\n const callbackContext = this.buildCallbackContext('enterTextMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n exitTextMode() {\n if (!this.canvas || !this.textSession)\n return;\n if (!this.canRunIdleOperation('exitTextMode'))\n return;\n exitTextModeImpl(this.buildTextControllerContext());\n const callbackContext = this.buildCallbackContext('exitTextMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n isTextMode() {\n return this.textSession !== null;\n }\n createTextAnnotation(config = {}) {\n if (!this.canvas)\n return null;\n if (!this.canRunIdleOperation('createTextAnnotation'))\n return null;\n return createTextAnnotationImpl(this.buildTextControllerContext(), config);\n }\n enterDrawMode() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('enterDrawMode'))\n return;\n if (this.isToolModeActive())\n return;\n enterDrawModeImpl(this.buildDrawControllerContext());\n const callbackContext = this.buildCallbackContext('enterDrawMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n exitDrawMode() {\n if (!this.canvas || !this.drawSession)\n return;\n if (!this.canRunIdleOperation('exitDrawMode'))\n return;\n exitDrawModeImpl(this.buildDrawControllerContext());\n const callbackContext = this.buildCallbackContext('exitDrawMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n isDrawMode() {\n return this.drawSession !== null;\n }\n getTextConfig() {\n return cloneResolvedTextAnnotationConfig(this.currentTextConfig);\n }\n setTextConfig(config) {\n this.applyTextConfigPatch(config, 'setTextConfig');\n }\n resetTextConfig() {\n this.applyTextConfigPatch(this.defaultTextConfig, 'resetTextConfig');\n }\n setTextColor(color) {\n this.applyTextConfigPatch({ fill: color }, 'setTextColor');\n }\n setTextFontSize(size) {\n this.applyTextConfigPatch({ fontSize: size }, 'setTextFontSize');\n }\n getDrawConfig() {\n return cloneResolvedDrawConfig(this.currentDrawConfig);\n }\n setDrawConfig(config) {\n this.applyDrawConfigPatch(config, 'setDrawConfig');\n }\n resetDrawConfig() {\n this.applyDrawConfigPatch(this.defaultDrawConfig, 'resetDrawConfig');\n }\n setDrawColor(color) {\n this.applyDrawConfigPatch({ color }, 'setDrawColor');\n }\n setDrawBrushSize(size) {\n this.applyDrawConfigPatch({ brushSize: size }, 'setDrawBrushSize');\n }\n removeSelectedAnnotation() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('removeSelectedAnnotation'))\n return;\n const before = this.getAnnotations().length;\n const callbackContext = this.buildCallbackContext('removeSelectedAnnotation', false);\n this.withSelectionChangeContext(callbackContext, () => {\n removeSelectedAnnotationImpl(this.buildAnnotationManagerContext());\n });\n this.updateAnnotationList();\n this.updateUi();\n if (this.getAnnotations().length !== before) {\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n removeAllAnnotations(options = {}) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('removeAllAnnotations', options))\n return;\n const before = this.getAnnotations().length;\n const callbackContext = this.buildCallbackContext('removeAllAnnotations', false);\n this.withSelectionChangeContext(callbackContext, () => {\n removeAllAnnotationsImpl(this.buildAnnotationManagerContext(), options);\n });\n this.updateAnnotationList();\n this.updateUi();\n if (this.getAnnotations().length !== before) {\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n updateAnnotation(annotationId, config) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('updateAnnotation'))\n return;\n const callbackContext = this.buildCallbackContext('updateAnnotation', false);\n const changed = updateAnnotationImpl(this.buildAnnotationManagerContext(), annotationId, config);\n if (changed) {\n this.updateAnnotationList();\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n updateSelectedAnnotation(config) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('updateSelectedAnnotation'))\n return;\n const callbackContext = this.buildCallbackContext('updateSelectedAnnotation', false);\n const changed = updateSelectedAnnotationImpl(this.buildAnnotationManagerContext(), config);\n if (changed) {\n this.updateAnnotationList();\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n }\n deleteSelectedObject() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('deleteSelectedObject'))\n return;\n this.finalizeActiveTextEditingIfNeeded();\n const selectedObjects = this.getSelectedCanvasObjects();\n const selectedMasks = selectedObjects.filter(isMaskObject);\n const selectedAnnotations = selectedObjects.filter((object) => isAnnotationObject(object) && isAnnotationUnlocked(object));\n if (selectedMasks.length === 0 && selectedAnnotations.length === 0)\n return;\n const canvas = this.getLiveCanvasOrThrow('deleteSelectedObject');\n const callbackContext = this.buildCallbackContext('deleteSelectedObject', false);\n this.withSelectionChangeContext(callbackContext, () => {\n for (const mask of selectedMasks) {\n this.removeLabelForMask(mask);\n canvas.remove(mask);\n }\n removeAnnotationObjects(this.buildAnnotationManagerContext(), selectedAnnotations, {\n saveHistory: false,\n force: true,\n });\n canvas.discardActiveObject();\n canvas.renderAll();\n this.saveState();\n });\n this.updateMaskList();\n this.updateAnnotationList();\n this.updateUi();\n if (selectedMasks.length > 0)\n this.emitMasksChanged(callbackContext);\n if (selectedAnnotations.length > 0)\n this.emitAnnotationsChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n bringSelectedObjectForward() {\n this.moveSelectedEditableObject('bringSelectedObjectForward');\n }\n sendSelectedObjectBackward() {\n this.moveSelectedEditableObject('sendSelectedObjectBackward');\n }\n bringSelectedObjectToFront() {\n this.moveSelectedEditableObject('bringSelectedObjectToFront');\n }\n sendSelectedObjectToBack() {\n this.moveSelectedEditableObject('sendSelectedObjectToBack');\n }\n buildAnnotationManagerContext() {\n return {\n canvas: this.getLiveCanvasOrThrow('annotationManager'),\n saveCanvasState: () => this.saveState(),\n updateUi: () => this.updateUi(),\n };\n }\n buildAnnotationListContext() {\n return {\n canvas: this.canvas,\n getListElementId: () => this.elements.annotationList,\n onAnnotationSelected: (annotation) => this.handleSelectionChanged([annotation]),\n };\n }\n updateAnnotationList() {\n renderAnnotationList(this.buildAnnotationListContext());\n }\n updateAnnotationListSelection(selectedAnnotation) {\n updateAnnotationListSelection(this.buildAnnotationListContext(), selectedAnnotation);\n }\n buildTextControllerContext() {\n return {\n fabric: this.fabricModule,\n canvas: this.getLiveCanvasOrThrow('textController'),\n options: this.options,\n getOriginalImage: () => this.originalImage,\n getTextConfig: () => this.currentTextConfig,\n isImageLoaded: () => this.isImageLoaded(),\n getAnnotationCounter: () => this.annotationCounter,\n setAnnotationCounter: (value) => {\n this.annotationCounter = value;\n },\n getTextSession: () => this.textSession,\n setTextSession: (session) => {\n this.textSession = session;\n },\n saveCanvasState: () => this.saveState(),\n updateAnnotationList: () => this.updateAnnotationList(),\n updateUi: () => this.updateUi(),\n emitAnnotationsChanged: (context) => this.emitAnnotationsChanged(context),\n emitImageChanged: (context) => this.emitImageChanged(context),\n buildCallbackContext: (operation) => this.buildCallbackContext(operation, false),\n };\n }\n buildDrawControllerContext() {\n return {\n fabric: this.fabricModule,\n canvas: this.getLiveCanvasOrThrow('drawController'),\n options: this.options,\n getDrawConfig: () => this.currentDrawConfig,\n isImageLoaded: () => this.isImageLoaded(),\n getAnnotationCounter: () => this.annotationCounter,\n setAnnotationCounter: (value) => {\n this.annotationCounter = value;\n },\n getDrawSession: () => this.drawSession,\n setDrawSession: (session) => {\n this.drawSession = session;\n },\n saveCanvasState: () => this.saveState(),\n updateAnnotationList: () => this.updateAnnotationList(),\n updateUi: () => this.updateUi(),\n emitAnnotationsChanged: (context) => this.emitAnnotationsChanged(context),\n emitImageChanged: (context) => this.emitImageChanged(context),\n buildCallbackContext: (operation) => this.buildCallbackContext(operation, false),\n };\n }\n applyTextConfigPatch(config, operation) {\n if (!this.canRunIdleOperation(operation))\n return;\n const invalidFields = getInvalidTextAnnotationConfigFields(config);\n if (invalidFields.length > 0) {\n reportWarning(this.options, null, `${operation} ignored invalid Text config fields: ${invalidFields.join(', ')}.`);\n }\n const next = mergeTextAnnotationConfigPatch(this.currentTextConfig, config, this.defaultTextConfig);\n if (areResolvedTextAnnotationConfigsEqual(this.currentTextConfig, next))\n return;\n this.currentTextConfig = next;\n this.updateInputs();\n this.updateUi();\n this.emitImageChanged(this.buildCallbackContext(operation, false));\n }\n applyDrawConfigPatch(config, operation) {\n if (!this.canRunIdleOperation(operation))\n return;\n const invalidFields = getInvalidDrawConfigFields(config);\n if (invalidFields.length > 0) {\n reportWarning(this.options, null, `${operation} ignored invalid Draw config fields: ${invalidFields.join(', ')}.`);\n }\n const next = mergeDrawConfigPatch(this.currentDrawConfig, config, this.defaultDrawConfig);\n if (areResolvedDrawConfigsEqual(this.currentDrawConfig, next))\n return;\n this.currentDrawConfig = next;\n updateDrawBrush(this.buildDrawControllerContext());\n this.updateInputs();\n this.updateUi();\n this.emitImageChanged(this.buildCallbackContext(operation, false));\n }\n applyTextColorInput(color) {\n var _a;\n if (this.isTextMode()) {\n this.setTextColor(color);\n return;\n }\n const selected = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n if (selected && isTextAnnotationObject(selected)) {\n this.updateSelectedAnnotation({ fill: color });\n return;\n }\n this.setTextColor(color);\n }\n applyTextFontSizeInput(size) {\n var _a;\n if (this.isTextMode()) {\n this.setTextFontSize(size);\n return;\n }\n const selected = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n if (selected && isTextAnnotationObject(selected)) {\n this.updateSelectedAnnotation({ fontSize: size });\n return;\n }\n this.setTextFontSize(size);\n }\n applyDrawColorInput(color) {\n var _a;\n if (this.isDrawMode()) {\n this.setDrawColor(color);\n return;\n }\n const selected = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n if (selected && isDrawAnnotationObject(selected)) {\n this.updateSelectedAnnotation({ stroke: color });\n return;\n }\n this.setDrawColor(color);\n }\n applyDrawBrushSizeInput(size) {\n var _a;\n if (this.isDrawMode()) {\n this.setDrawBrushSize(size);\n return;\n }\n const selected = (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.getActiveObject();\n if (selected && isDrawAnnotationObject(selected)) {\n this.updateSelectedAnnotation({ strokeWidth: size });\n return;\n }\n this.setDrawBrushSize(size);\n }\n getSelectedCanvasObjects() {\n var _a, _b, _c;\n if (!this.canvas)\n return [];\n const activeObject = this.canvas.getActiveObject();\n if (!activeObject)\n return [];\n const type = typeof activeObject.type === 'string' ? activeObject.type.toLowerCase() : '';\n const isActiveSelection = type === 'activeselection' ||\n ((_c = (_b = (_a = activeObject).isType) === null || _b === void 0 ? void 0 : _b.call(_a, 'ActiveSelection')) !== null && _c !== void 0 ? _c : false);\n if (!isActiveSelection)\n return [activeObject];\n const getObjects = activeObject\n .getObjects;\n return typeof getObjects === 'function' ? getObjects.call(activeObject) : [];\n }\n moveSelectedEditableObject(operation) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation(operation))\n return;\n const selected = this.getSelectedCanvasObjects().filter(isEditableOverlayObject);\n if (selected.length !== 1) {\n if (selected.length > 1) {\n reportWarning(this.options, null, `${operation} skipped: ActiveSelection layer moves are not supported.`);\n }\n return;\n }\n const object = selected[0];\n const range = getEditableOverlayRange(this.canvas);\n const overlays = range.overlays;\n const currentOverlayIndex = overlays.indexOf(object);\n if (currentOverlayIndex < 0)\n return;\n let nextOverlayIndex = currentOverlayIndex;\n if (operation === 'bringSelectedObjectForward') {\n nextOverlayIndex = Math.min(overlays.length - 1, currentOverlayIndex + 1);\n }\n else if (operation === 'sendSelectedObjectBackward') {\n nextOverlayIndex = Math.max(0, currentOverlayIndex - 1);\n }\n else if (operation === 'bringSelectedObjectToFront') {\n nextOverlayIndex = overlays.length - 1;\n }\n else if (operation === 'sendSelectedObjectToBack') {\n nextOverlayIndex = 0;\n }\n if (nextOverlayIndex === currentOverlayIndex)\n return;\n const reordered = overlays.slice();\n reordered.splice(currentOverlayIndex, 1);\n reordered.splice(nextOverlayIndex, 0, object);\n reordered.forEach((overlay, index) => {\n var _a, _b;\n (_b = (_a = this.canvas).moveObjectTo) === null || _b === void 0 ? void 0 : _b.call(_a, overlay, range.start + index);\n });\n normalizeLayerOrder(this.canvas);\n this.canvas.setActiveObject(object);\n this.canvas.renderAll();\n this.saveState();\n this.updateMaskList();\n this.updateAnnotationList();\n this.updateUi();\n const context = this.buildCallbackContext(operation, false);\n if (isMaskObject(object))\n this.emitMasksChanged(context);\n if (isAnnotationObject(object))\n this.emitAnnotationsChanged(context);\n this.emitImageChanged(context);\n }\n async mergeMasks() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('mergeMasks'))\n return;\n this.finalizeActiveTextEditingIfNeeded();\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.updateAnnotationList();\n this.emitMasksChanged(callbackContext);\n if (this.getAnnotations().length > 0) {\n this.emitAnnotationsChanged(callbackContext);\n }\n this.emitImageChanged(callbackContext);\n }\n finally {\n this.operationGuard.endBusyOperation(operationToken);\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n }\n }\n async downloadImage(options) {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('downloadImage'))\n return;\n this.finalizeActiveTextEditingIfNeeded();\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 await downloadImageImpl(exportContext, options);\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 this.finalizeActiveTextEditingIfNeeded();\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 this.finalizeActiveTextEditingIfNeeded();\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.getLiveCanvasOrThrow('export'),\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 captureSnapshot: () => this.captureSnapshotInternal(),\n loadFromState: (snapshot) => this.loadFromStateInternal(snapshot, this.withInternalOperationOptions(operationToken, this.withAnimationQueueBypass())),\n exportImageBase64: (options) => exportImageBase64Impl(this.buildExportServiceContext(), options),\n updateUi: () => this.updateUi(),\n updateInputs: () => this.updateInputs(),\n removeAllMasksNoHistory: () => {\n const context = this.buildRemoveMaskContext();\n removeAllMasksImpl(context, { saveHistory: false });\n },\n getAnnotations: () => this.getAnnotations(),\n restoreAnnotations: (objects) => {\n const canvas = this.getLiveCanvasOrThrow('restoreAnnotations');\n objects.forEach((annotation) => {\n canvas.add(annotation);\n });\n syncAnnotationRuntimeStates(objects);\n attachTextEditingHandlersToAnnotations(this.buildTextControllerContext(), objects);\n this.annotationCounter = Math.max(this.annotationCounter, ...objects.map((annotation) => annotation.annotationId), 0);\n this.updateAnnotationList();\n },\n };\n }\n buildMergeAnnotationsContext(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 captureSnapshot: () => this.captureSnapshotInternal(),\n loadFromState: (snapshot) => this.loadFromStateInternal(snapshot, this.withInternalOperationOptions(operationToken, this.withAnimationQueueBypass())),\n exportImageBase64: (options) => exportImageBase64Impl(this.buildExportServiceContext(), options),\n updateUi: () => this.updateUi(),\n updateInputs: () => this.updateInputs(),\n removeAllAnnotationsNoHistory: () => {\n removeAllAnnotationsImpl(this.buildAnnotationManagerContext(), {\n saveHistory: false,\n force: true,\n });\n },\n getMasks: () => this.getMasks(),\n restoreMasks: (objects) => {\n const canvas = this.getLiveCanvasOrThrow('restoreMasks');\n objects.forEach((mask) => {\n canvas.add(mask);\n reattachMaskHoverHandlers(mask);\n });\n this.lastMask = objects.reduce((lastMask, mask) => !lastMask || mask.maskId > lastMask.maskId ? mask : lastMask, null);\n this.maskCounter = Math.max(this.maskCounter, ...objects.map((mask) => mask.maskId), 0);\n this.updateMaskList();\n },\n };\n }\n captureSnapshotInternal() {\n var _a, _b;\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 const activeAnnotation = this.getActiveAnnotationForSnapshot();\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 activeAnnotationId: (_b = activeAnnotation === null || activeAnnotation === void 0 ? void 0 : activeAnnotation.annotationId) !== null && _b !== void 0 ? _b : 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 getActiveAnnotationForSnapshot() {\n if (!this.canvas)\n return null;\n const activeObject = this.canvas.getActiveObject();\n return activeObject && isAnnotationObject(activeObject) ? activeObject : 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.getLiveCanvasOrThrow('mosaicController'),\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(options = {}) {\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, options);\n this.updateUi();\n const callbackContext = this.buildCallbackContext('enterCropMode', false);\n this.emitBusyChangeIfChanged(callbackContext);\n this.emitImageChanged(callbackContext);\n }\n setCropAspectRatio(aspectRatio) {\n if (!this.canvas || !this.cropSession)\n return;\n if (!this.canRunIdleOperation('setCropAspectRatio'))\n return;\n const cropControllerContext = this.buildCropControllerContext();\n setCropAspectRatioImpl(cropControllerContext, aspectRatio);\n this.updateUi();\n const callbackContext = this.buildCallbackContext('setCropAspectRatio', false);\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.getLiveCanvasOrThrow('cropController'),\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 syncInputValue(inputElement, value) {\n if (!inputElement)\n return;\n const ownerDocument = inputElement.ownerDocument;\n if (ownerDocument.activeElement === inputElement && !inputElement.readOnly)\n return;\n if (inputElement.value !== value)\n inputElement.value = value;\n }\n updateInputs() {\n const scaleId = this.elements.scalePercentageInput;\n if (scaleId) {\n const scaleInputElement = document.getElementById(scaleId);\n this.syncInputValue(scaleInputElement, String(Math.round(this.currentScale * 100)));\n }\n const mosaicConfig = this.getMosaicConfig();\n const mosaicBrushSizeInputId = this.elements.mosaicBrushSizeInput;\n if (mosaicBrushSizeInputId) {\n const brushInput = document.getElementById(mosaicBrushSizeInputId);\n this.syncInputValue(brushInput, String(mosaicConfig.brushSize));\n }\n const mosaicBlockSizeInputId = this.elements.mosaicBlockSizeInput;\n if (mosaicBlockSizeInputId) {\n const blockInput = document.getElementById(mosaicBlockSizeInputId);\n this.syncInputValue(blockInput, String(mosaicConfig.blockSize));\n }\n const textConfig = this.getTextConfig();\n const textColorInputId = this.elements.textColorInput;\n if (textColorInputId) {\n const textColorInput = document.getElementById(textColorInputId);\n this.syncInputValue(textColorInput, textConfig.fill);\n }\n const textFontSizeInputId = this.elements.textFontSizeInput;\n if (textFontSizeInputId) {\n const fontInput = document.getElementById(textFontSizeInputId);\n this.syncInputValue(fontInput, String(textConfig.fontSize));\n }\n const drawConfig = this.getDrawConfig();\n const drawColorInputId = this.elements.drawColorInput;\n if (drawColorInputId) {\n const drawColorInput = document.getElementById(drawColorInputId);\n this.syncInputValue(drawColorInput, drawConfig.color);\n }\n const drawBrushSizeInputId = this.elements.drawBrushSizeInput;\n if (drawBrushSizeInputId) {\n const brushInput = document.getElementById(drawBrushSizeInputId);\n this.syncInputValue(brushInput, String(drawConfig.brushSize));\n }\n }\n async mergeAnnotations() {\n if (!this.canvas)\n return;\n if (!this.canRunIdleOperation('mergeAnnotations'))\n return;\n this.finalizeActiveTextEditingIfNeeded();\n const hasAnnotations = this.canvas.getObjects().some(isAnnotationObject);\n if (!hasAnnotations)\n return;\n const callbackContext = this.buildCallbackContext('mergeAnnotations', false);\n const operationToken = this.operationGuard.beginBusyOperation('mergeAnnotations');\n this.emitBusyChangeIfChanged(callbackContext);\n this.updateUi();\n try {\n await mergeAnnotationsImpl(this.buildMergeAnnotationsContext(operationToken));\n this.updateInputs();\n this.updateMaskList();\n this.updateAnnotationList();\n this.emitAnnotationsChanged(callbackContext);\n if (this.getMasks().length > 0)\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 updateUi() {\n var _a, _b, _c;\n if (!this.canvas)\n return;\n const hasImage = !!this.originalImage;\n const masks = hasImage ? this.canvas.getObjects().filter(isMaskObject) : [];\n const annotations = hasImage ? this.canvas.getObjects().filter(isAnnotationObject) : [];\n const hasMasks = masks.length > 0;\n const hasAnnotations = annotations.length > 0;\n const activeObject = this.canvas.getActiveObject();\n const hasSelectedMask = !!(activeObject && isMaskObject(activeObject));\n const hasSelectedAnnotation = !!(activeObject && isAnnotationObject(activeObject));\n const hasSelectedEditableObject = !!activeObject && isEditableOverlayObject(activeObject);\n const isDefaultTransform = this.currentScale === 1 &&\n this.currentRotation === 0 &&\n !((_a = this.originalImage) === null || _a === void 0 ? void 0 : _a.flipX) &&\n !((_b = this.originalImage) === null || _b === void 0 ? void 0 : _b.flipY);\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 isInTextMode = this.textSession !== null;\n const isInDrawMode = this.drawSession !== null;\n const isBusy = this.operationGuard.isBusy() || this.animQueue.isBusy();\n const isMosaicApplying = ((_c = this.mosaicSession) === null || _c === void 0 ? void 0 : _c.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 (isInTextMode) {\n CROP_MODE_CONTROL_KEYS.forEach((key) => {\n this.setControlEnabled(key, !isBusy && TEXT_MODE_ENABLED_KEYS.includes(key));\n });\n return;\n }\n if (isInDrawMode) {\n CROP_MODE_CONTROL_KEYS.forEach((key) => {\n this.setControlEnabled(key, !isBusy && DRAW_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('flipHorizontalButton', hasImage && !isBusy);\n this.setControlEnabled('flipVerticalButton', 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('removeSelectedAnnotationButton', hasSelectedAnnotation && !isBusy);\n this.setControlEnabled('removeAllAnnotationsButton', hasAnnotations && !isBusy);\n this.setControlEnabled('deleteSelectedObjectButton', hasSelectedEditableObject && !isBusy);\n this.setControlEnabled('mergeAnnotationsButton', hasImage && hasAnnotations && !isBusy);\n this.setControlEnabled('bringSelectedObjectForwardButton', hasSelectedEditableObject && !isBusy);\n this.setControlEnabled('sendSelectedObjectBackwardButton', hasSelectedEditableObject && !isBusy);\n this.setControlEnabled('bringSelectedObjectToFrontButton', hasSelectedEditableObject && !isBusy);\n this.setControlEnabled('sendSelectedObjectToBackButton', hasSelectedEditableObject && !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('cropAspectRatioSelect', hasImage && !isBusy);\n this.setControlEnabled('enterMosaicModeButton', hasImage && !isBusy);\n this.setControlEnabled('enterTextModeButton', hasImage && !isBusy);\n this.setControlEnabled('enterDrawModeButton', hasImage && !isBusy);\n this.setControlEnabled('exitMosaicModeButton', false);\n this.setControlEnabled('exitTextModeButton', false);\n this.setControlEnabled('exitDrawModeButton', false);\n this.setControlEnabled('mosaicBrushSizeInput', !this.isDisposed);\n this.setControlEnabled('mosaicBlockSizeInput', !this.isDisposed);\n this.setControlEnabled('textColorInput', !this.isDisposed);\n this.setControlEnabled('textFontSizeInput', !this.isDisposed);\n this.setControlEnabled('drawColorInput', !this.isDisposed);\n this.setControlEnabled('drawBrushSizeInput', !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 const formControl = controlElement;\n const nextDisabled = !isEnabled;\n if (formControl.disabled !== nextDisabled)\n formControl.disabled = nextDisabled;\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 if (this.keyboardHandler && this.keyboardDocument) {\n try {\n this.keyboardDocument.removeEventListener('keydown', this.keyboardHandler);\n }\n catch {\n }\n }\n this.keyboardHandler = null;\n this.keyboardDocument = null;\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.textSession && this.canvas) {\n try {\n exitTextModeImpl(this.buildTextControllerContext());\n }\n catch {\n }\n this.textSession = null;\n }\n if (this.drawSession && this.canvas) {\n try {\n exitDrawModeImpl(this.buildDrawControllerContext());\n }\n catch {\n }\n this.drawSession = 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.annotationCounter = 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","mergeMasksByDefault","mergeAnnotationsByDefault","defaultMaskWidth","defaultMaskHeight","defaultMaskConfig","maskRotatable","maskLabelOnSelect","maskLabelOffset","maskName","textAnnotationName","drawAnnotationName","groupSelection","showPlaceholder","initialImageBase64","defaultDownloadFileName","onImageLoadStart","onImageLoaded","onImageCleared","onImageChanged","onBusyChange","onEditorDisposed","onMasksChanged","onAnnotationsChanged","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","DEFAULT_TEXT_ANNOTATION_CONFIG","text","left","top","width","textAlign","angle","editable","enterEditing","annotationHidden","annotationLocked","styles","DEFAULT_DRAW_CONFIG","color","opacity","lineCap","lineJoin","KNOWN_TOP_LEVEL_KEYS","Set","normalizeCallback","isLayoutMode","normalizeLayoutMode","isConfigObject","Array","isArray","copyDefaultMaskConfigValue","normalizeDefaultMaskConfig","normalized","optionValue","entries","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","right","leftDash","rightDash","dashEqual","index","cloneResolvedTextAnnotationConfig","cloneResolvedDrawConfig","normalizePositiveNumber","normalizeBoolean","normalizeString","normalizeTextLeftTop","mergeTextAnnotationConfigPatch","normalizeTextAlign","mergeDrawConfigPatch","normalizeOpacity","normalizeLineCap","normalizeLineJoin","resolveOptions","_b","_c","_d","_e","resolved","keys","has","normalizeMaxHistorySize","userLabel","label","mergedTextOptions","textOptions","create","userCrop","crop","aspectRatio","minWidth","minHeight","hideMasksDuringCrop","preserveMasksAfterCrop","allowRotationOfCropRect","exportFileType","exportQuality","defaultMosaicConfig","normalizeMosaicConfig","defaultTextConfig","normalizeTextAnnotationConfig","defaultDrawConfig","normalizeDrawConfig","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","isBaseImageObject","editorObjectKind","isMaskObject","candidate","maskId","maskUid","isAnnotationObject","annotationId","annotationType","annotationName","isTextAnnotationObject","isDrawAnnotationObject","isSessionObject","sessionObjectType","isEditableOverlayObject","markBaseImageObject","image","baseImage","markMaskObject","meta","originalAlpha","originalStroke","originalStrokeWidth","markAnnotationObject","annotation","markSessionObject","sessionObject","SNAPSHOT_CUSTOM_KEYS","saveState","canvas","currentScale","currentRotation","baseImageScale","activeObject","getActiveObject","activeMaskId","activeAnnotationId","type","isType","isActiveSelectionObject","discardActiveObject","jsonObj","toJSON","canvasObjects","jsonObjects","liveObject","jsonObject","hasControls","strokeUniform","lockRotation","transparentCorners","borderColor","cornerColor","cornerSize","flipX","flipY","isCropRect","maskLabel","isMosaicPreview","copySnapshotCustomPropsFromCanvas","getObjects","objects","filter","o","_editorState","currentImageMimeType","activeObjectKind","JSON","stringify","async","loadFromState","jsonString","snapshotInput","setCanvasSize","json","parse","height","loadFromJSON","canvasObjs","jsonObjs","forEach","jObj","canvasObj","consumedCanvasIndexes","jType","jLeft","jTop","jUid","matchIndex","findIndex","abs","maskObject","restoreEditorObjectPropsFromJson","editorState","kind","maxMaskId","reduce","maxAnnotationId","annotationObject","masks","annotations","originalImage","find","Command","execute","undo","HistoryManager","maxSize","command","pushAndTrim","canUndo","currentIndex","canRedo","history","isProcessing","cmd","redo","slice","looksLikeFabricModule","Canvas","isAnnotationLocked","isAnnotationUnlocked","setObjectProps","props","set","assign","syncAnnotationRuntimeState","hidden","locked","visible","lockMovementX","lockMovementY","lockScalingX","lockScalingY","syncTextEditability","setCoords","syncAnnotationRuntimeStates","getAnnotations","getSelectedAnnotations","active","getActiveSelectionObjects","snapshotAnnotation","stroke","strokeWidth","setAnnotationProps","updateAnnotationObject","before","updateTextAnnotation","updateDrawAnnotation","removeAnnotationObjects","context","force","removable","remove","renderAll","saveHistory","saveCanvasState","updateUi","removeAllAnnotations","getAnnotationListDocument","canvasLike","getElement","ownerDocument","lowerCanvasEl","document","isLegacySessionObject","moveObjectTo","canvasWithLayerApi","insertAt","ensureOnCanvas","includes","withoutObject","findFirstSessionIndex","normalizeLayerOrder","groups","baseImages","overlays","sessions","others","getOrderedGroups","placeAnnotationObject","firstSessionIndex","hasMeaningfulCanvasRegion","rect","bottom","safeCanvasWidth","safeCanvasHeight","overlapWidth","overlapHeight","getClampedCanvasRegion","safeLeft","safeTop","safeWidth","safeHeight","roundEnd","includePartialPixels","ceil","hasCanvasWidth","hasCanvasHeight","round","POSITIVE_INFINITY","hasFractionalCanvasEdge","numericValue","getPartialExportEdges","bounds","normalizedAngle","getObjectBBox","boundingRect","getBoundingRect","resolveNumeric","val","axis","endsWith","pct","parseFloat","dim","getWidth","getHeight","coercePoint","pt","x","y","isFinitePoint","point","getPointerFromFabricEvent","event","fabricEvent","scenePoint","pointer","absolutePointer","e","getPointer","resolveTextCreationConfig","base","getTextConfig","getOriginalImage","resolveDefaultTextPosition","leftInput","topInput","attachTextEditingHandlers","textObject","imageEditorTextEditingHandlers","off","entered","exited","imageEditorTextEditingInitialText","imageEditorTextEditingCancel","initial","finalText","cancel","callbackContext","buildCallbackContext","emitAnnotationsChanged","emitImageChanged","on","createTextAnnotation","isImageLoaded","textbox","fabric","Textbox","getAnnotationCounter","setAnnotationCounter","nextAnnotationMeta","setActiveObject","updateAnnotationList","textLength","selectAll","setSelectionStart","setSelectionEnd","selectionStart","selectionEnd","selectAllText","enterTextMode","getTextSession","previousCanvasSelection","selection","previousDefaultCursor","defaultCursor","callback","target","handleTextModePointer","session","mode","handlers","eventName","dispose","Rect","excludeFromExport","setTextSession","exitTextMode","requestRenderAll","finalizeActiveTextEditing","isEditing","commit","exitEditing","attachTextEditingHandlersToAnnotations","configureBrush","getDrawConfig","canvasWithBrush","freeDrawingBrush","PencilBrush","alpha","test","hex","parseInt","colorWithOpacity","strokeLineCap","strokeLineJoin","handlePathCreated","path","markPathAsDrawAnnotation","exitDrawMode","getDrawSession","setDrawSession","fixPrototype","self","ctor","setPrototypeOf","ImageDecodeError","originalError","super","ImageLoadTimeoutError","elapsedMs","DownsampleError","MergeMasksError","MergeAnnotationsError","CropApplyError","ExportNotReadyError","operation","ExportError","DEFAULT_STROKE_FALLBACK","applyMaskUnselectedStyle","attachMaskHoverHandlers","tagged","mouseover","baseAlpha","getMaskHoverStyle","mouseout","getMaskNormalStyle","imageEditorMaskHandlers","reattachMaskHoverHandlers","sw","detachMaskHoverHandlers","captureMaskStyleBackup","_f","_g","restoreMaskStyleBackup","backup","applyCropHideMaskStyle","CROP_RECT_DASH","CROPPED_EXPORT_QUALITY_FALLBACK","finiteNumberOrFallback","resolveLossyCropQuality","cropExportQuality","cropQuality","clampExportQuality","fallbackQuality","removeCropRect","targetHandlers","record","cropRect","restoreCropObjectState","prevEvented","teardownSession","maskBackups","restoreCropMaskBackups","prevSelection","maskIntersectsRegion","region","bbox","CROP_ASPECT_RATIO_PRESETS","free","normalizeCropAspectRatio","trimmed","trim","parts","split","fitAspectRatioInside","maxWidth","maxHeight","safeMaxWidth","safeMaxHeight","constrainAspectRatioSize","requestedWidth","requestedHeight","basis","minSize","minimumAspectRatioSizeThatFits","resolvePaddedCropArea","boundsLeft","boundsTop","maxCropWidth","maxCropHeight","insetX","insetY","resizeCropRectToAspectRatio","imageBounds","configuredMinWidth","configuredMinHeight","minCropWidth","minCropHeight","resolveCropBounds","scaleX","scaleY","clampCropRectIntoBounds","available","fitted","updateCropRectControlVisibility","lockedRatio","setControlsVisibility","tl","tr","br","bl","mt","mb","ml","mr","mtr","enterCropMode","cropModeOptions","getCropSession","beforeJson","allowRotation","rectLeft","rectTop","rectWidth","rectHeight","strokeDashArray","objectCaching","lockScalingFlip","bringObjectToFront","hideMasks","handleCropRectModified","cropWidth","cropHeight","nextScaleX","nextScaleY","activeSession","activeAspectRatio","rawScaleX","rawScaleY","corner","__corner","_currentTransform","chooseAspectRatioResizeBasis","constrained","scaledWidth","scaledHeight","maxLeft","maxTop","nextLeft","nextTop","setCropSession","cancelCrop","applyCrop","preserveMasks","cropAngle","rectBounds","getCropRectContentBounds","cropRegion","preservedRecords","records","styleBackupByMask","Map","map","styleBackup","get","capturePreservedMasks","cropFormat","requested","cropExportFileType","imageMimeToFormat","resolveCropExportFormat","getCurrentImageMimeType","exportOptions","multiplier","croppedBase64","toDataURL","loadImage","maxRestoredId","id","getMaskCounter","setMaskCounter","liveCounter","safeCounter","updateMaskList","reapplyPreservedMasks","afterJson","historyManager","rollbackError","computeDownsampleDimensions","srcWidth","srcHeight","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","canvasPoint","brushDiameterCanvasPx","brushDiameter","f","toMatrix2D","calcTransformMatrix","inverse","determinant","invertMatrix","localPoint","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","offset","safeRender","ensurePreviewCircle","circle","previewCircle","getMosaicConfig","Circle","createPreviewCircle","updateMosaicPreview","removePreviewCircle","ensurePreviewImage","sourceImage","rasterCache","previewImage","FabricImage","offscreenCanvas","copyBaseImageProperties","createPreviewImage","dirty","sourceIndex","indexOf","placePreviewImageAfterBase","removePreviewImage","hidePreview","getMosaicSession","movePreview","attachCanvasHandler","getImageSource","imageWithSource","src","getSrc","imageDimension","source","skewX","skewY","hoverCursor","getOrCreateRasterCache","element","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","commitMosaicChanges","commitRequested","output","mimeToFormat","toSupportedMimeType","resolveMosaicOutputFormat","nextDataUrl","nextImage","fromURL","createFabricImageFromDataUrl","oldImage","newImage","oldRemoved","newAdded","sendObjectToBack","setOriginalImage","setCurrentImageMimeType","replaceBaseImage","after","captureSnapshot","getLastSnapshot","setLastSnapshot","pushMosaicHistory","updateInputs","drainMosaicQueue","isApplying","emitBusyChangeIfChanged","pendingCanvasPoints","catch","enqueueMosaicPoint","splice","requestMosaicCommit","enterMosaicMode","hideAllMaskLabels","prevDefaultCursor","prevObjectStates","isPointerDown","setMosaicSession","currentSession","installMosaicHandlers","exitMosaicMode","detachCanvasHandlers","cache","releaseMosaicRasterCache","restoreObjectStates","startImageElementLoad","Image","clearSource","validationError","validate","rejectImage","resolveImage","createError","createMergeError","flattenOverlayGroupToBaseImage","getTargets","beforeSnapshot","preservedObjects","getPreservedObjects","preScrollTop","containerElement","scrollTop","preScrollLeft","scrollLeft","detachObjects","exportedDataUrl","exportImageBase64","removeTargetsNoHistory","preserveScroll","restorePreservedObjects","scrollError","afterSnapshot","resolveMultiplier","num","fallbackValue","resolveExportOptions","exportArea","mergeMasks","mergeAnnotations","readCanvasDimension","getterName","propertyName","getter","withMaskExportState","mutator","backups","withMaskStyleBackup","applyExportBakeInStyle","withObjectsHidden","predicate","getCanvasObjects","requestRender","isObjectOnCanvas","hasPartialEdges","edges","getImageDimensions","loadImageElement","getJpegBackgroundColor","digits","commaAlpha","isZeroCssAlpha","slashAlpha","isTransparentCssColor","createColorValidationContext","fillStyle","firstSentinel","firstResolved","secondSentinel","secondResolved","resolveCanvasFillStyle","numericPercent","numericAlpha","warnNoImageLoaded","renderExportDataUrl","canvasWithSelection","captureActiveObject","labelBackups","labelObject","wasOnCanvas","captureMaskLabelBackups","partialEdges","computeExportRegion","sourceWidth","sourceHeight","outputWidth","outputHeight","pixelCount","maxPixels","RangeError","assertExportPixelBudget","renderFormat","renderQuality","withSessionObjectsHidden","withAnnotationsExportState","fabricOptions","renderCanvasToDataUrl","sealedFormat","canvasContext","pixels","sealPixel","fallbackX","fallbackY","fallbackIndex","fallbackAlpha","nextAlpha","sealPartialTransparentEdges","fillRect","convertDataUrlToOpaqueJpeg","restoreMaskLabelBackups","restoreActiveObject","exportImageFile","rawDataUrl","finalDataUrl","sourceDataUrl","reencodeDataUrlAs","bytes","base64","globalThis","atob","binary","buffer","ArrayBuffer","Uint8Array","i","charCodeAt","bufferCtor","Buffer","from","dataUrlToBytes","fileName","baseName","ext","extensionForFormat","replace","resolveFileName","File","downloadImage","TypeError","file","objectUrl","URL","createObjectURL","link","download","name","href","body","appendChild","click","removeChild","revokeObjectURL","triggerFileDownload","SUPPORTED_IMAGE_EXTENSIONS","gif","bmp","SUPPORTED_IMAGE_MIME_TYPES","values","isSupportedImageDataUrl","resetFileInput","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","integerWidth","integerHeight","setDimensions","imageBase64","loadOptions","bundle","placeholderHidden","placeholderElement","containerScrollTop","containerScrollLeft","isImageLoadedToCanvas","getIsImageLoadedToCanvas","lastSnapshot","canvasJson","serializeCanvas","maskCounter","annotationCounter","getCurrentScale","getCurrentRotation","getBaseImageScale","setPlaceholderVisible","decode","hasNaturalImageDimensions","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","replayRollback","errorMessage","animateProps","guard","propCount","completed","settled","aborters","unregisterAborter","settle","abortAndSettle","duration","animationResult","animate","onChange","onComplete","handles","flatMap","handle","collectAnimationAborters","fail","TransformController","scaleImage","factor","imageObject","clamped","targetAbs","topLeft","computeTopLeftPoint","setPositionByOrigin","afterTransformSnap","rotateImage","degrees","centre","getCenterPoint","animationFailed","restoreOrigin","newTopLeft","flipHorizontal","flipImage","flipVertical","property","resetImageTransform","setSuppressSaveState","first","getCoords","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","gap","previousMask","getLastMask","previousRight","getScaledWidth","polygonPoints","requiredWidth","requiredHeight","nextWidth","nextHeight","expandCanvasIfNeeded","generated","isFabricObjectLike","originProps","Ellipse","polygon","Polygon","deltaX","deltaY","nextId","setLastMask","placeMaskObject","removeSelectedMask","selectedMasks","getSelectedMaskObjects","removeLabelForMask","removeAllMasks","createLabelForMask","labelTextObject","indexForGetText","labelText","FabricText","syncMaskLabel","coords","center","vx","vy","dist","sqrt","getMaskListDocument","DomBindings","resolveElementId","resolveDocument","bindIfExists","eventType","handler","getElementById","wrapped","registry","elementKey","removeAll","size","show","setAttribute","LAYOUT_EPSILON","INTERNAL_OPERATION_TOKEN","INTERNAL_ALLOW_DURING_ANIMATION_QUEUE","CROP_MODE_CONTROL_KEYS","CROP_MODE_ENABLED_KEYS","CROP_SESSION_ALLOWED_OPERATIONS","TEXT_MODE_ENABLED_KEYS","DRAW_MODE_ENABLED_KEYS","MOSAIC_MODE_CONTROL_KEYS","MOSAIC_MODE_ENABLED_KEYS","MOSAIC_SESSION_ALLOWED_OPERATIONS","IMAGE_EDITOR_OPERATIONS","TOOL_MODE_ALLOWED_OPERATIONS","mosaic","draw","ImageEditor","fabricModuleOrOptions","detected","fabricOrOptions","maybeOptions","globalScope","isFabricLoaded","globalFabric","readGlobalFabric","detectFabric","currentLayoutMode","currentMosaicConfig","currentTextConfig","currentDrawConfig","rawDefaultLayoutMode","operationGuard","animQueue","init","idMap","elements","canvasContainer","imagePlaceholder","scalePercentageInput","rotateLeftDegreesInput","rotateRightDegreesInput","rotateLeftButton","rotateRightButton","flipHorizontalButton","flipVerticalButton","createMaskButton","removeSelectedMaskButton","removeAllMasksButton","mergeMasksButton","annotationList","enterTextModeButton","exitTextModeButton","textColorInput","textFontSizeInput","enterDrawModeButton","exitDrawModeButton","drawColorInput","drawBrushSizeInput","removeSelectedAnnotationButton","removeAllAnnotationsButton","deleteSelectedObjectButton","mergeAnnotationsButton","bringSelectedObjectForwardButton","sendSelectedObjectBackwardButton","bringSelectedObjectToFrontButton","sendSelectedObjectToBackButton","downloadImageButton","maskList","zoomInButton","zoomOutButton","resetImageTransformButton","undoButton","redoButton","imageInput","enterCropModeButton","cropAspectRatioSelect","applyCropButton","cancelCropButton","enterMosaicModeButton","exitMosaicModeButton","mosaicBrushSizeInput","mosaicBlockSizeInput","uploadArea","initCanvas","domBindings","canvasElement","transformController","buildTransformContext","bindDomEvents","updatePlaceholderStatus","containerId","parentElement","placeholderId","initialWidth","initialHeight","preserveObjectStacking","handleSelectionChanged","selected","onObjectEvent","handleObjectMovingScalingRotating","handleObjectModified","getLiveCanvasOrThrow","bindElementIfExists","inputId","files","loadImageFile","enterDrawMode","removeSelectedAnnotation","deleteSelectedObject","bringSelectedObjectForward","sendSelectedObjectBackward","bringSelectedObjectToFront","sendSelectedObjectToBack","inputEl","step","parsedStep","isNaN","getSelectedCropAspectRatio","cropSession","setCropAspectRatio","bindMosaicSizeInput","applyValue","parsed","setMosaicBrushSize","setMosaicBlockSize","bindStringInput","bindNumberInput","applyTextColorInput","applyTextFontSizeInput","applyDrawColorInput","applyDrawBrushSizeInput","bindKeyboardEvents","keyboardHandler","keyboardDocument","handleKeyboardEvent","isNativeTextInputActive","activeElement","tagName","isContentEditable","isFabricTextEditingActive","buildTextControllerContext","preventDefault","textSession","drawSession","mosaicSession","finalizeActiveTextEditingIfNeeded","mime","inferImageMimeType","reader","FileReader","fileReaderResult","result","onabort","readAsDataURL","readFileAsDataUrl","loadImageInternal","canRunIdleOperation","getOperationContext","previousImage","hadMasks","getMasks","hadAnnotations","emitOptionCallback","loadImageContext","getRuntimeOptions","v","setPlaceholderVisibleImpl","loadImageImpl","lastMask","imageInfo","getImageInfo","emitMasksChanged","getInternalOperationToken","canRunDuringAnimationQueue","withInternalOperationOptions","withAnimationQueueBypass","activeToolMode","getActiveToolMode","isExpectedIdleGuardError","isToolModeActive","setLayoutMode","isInternalOperation","internal","activeOperation","callbackName","args","displayWidth","displayHeight","rotation","getAnnotationsImpl","getMaskCollectionSignature","join","getAnnotationCollectionSignature","getEditorState","hasImage","maskCount","annotationCount","isFlippedHorizontally","isFlippedVertically","isCropMode","isMosaicMode","isTextMode","isDrawMode","lastEmittedIsBusy","buildSelection","selectedAnnotations","selectedObjectKind","selectedMask","selectedAnnotation","withSelectionChangeContext","previous","nextSelectionChangeContext","isSupportedImageMimeType","inferCurrentImageMimeType","setCanvasSizePx","widthPx","heightPx","alignObjectBoundingBoxToCanvasTopLeft","measureLayoutViewport","getScrollbarStableViewportCanvasSize","updateCanvasSizeToImageBounds","shouldStabilizeContainedViewport","stabilizeContainedViewport","imageFitsViewport","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","previousAnnotationSignature","restoredState","loadFromStateImpl","restoredMasks","activeMask","activeAnnotation","activeObj","getActiveMaskForSnapshot","getActiveAnnotationForSnapshot","saveStateImpl","restoreActiveObjectAfterSnapshot","maskToRestore","annotationToRestore","showLabelForMask","updateMaskListSelection","updateAnnotationListSelection","createMaskContext","buildCreateMaskContext","createMaskImpl","removeMaskContext","buildRemoveMaskContext","removeSelectedMaskImpl","removeAllMasksImpl","buildMaskLabelContext","objs","l","buildMaskListContext","getListElementId","onMaskSelected","listId","listEl","innerHTML","listItemElement","className","textContent","dataset","onclick","renderMaskList","selectedId","querySelectorAll","item","isSelected","classList","toggle","enterTextModeImpl","exitTextModeImpl","createTextAnnotationImpl","canvasWithDrawing","previousDrawingMode","isDrawingMode","previousBrush","enterDrawModeImpl","buildDrawControllerContext","exitDrawModeImpl","setTextConfig","applyTextConfigPatch","resetTextConfig","setTextColor","setTextFontSize","setDrawConfig","applyDrawConfigPatch","resetDrawConfig","setDrawColor","setDrawBrushSize","buildAnnotationManagerContext","removeAllAnnotationsImpl","updateAnnotation","updateAnnotationImpl","updateSelectedAnnotation","Boolean","updateSelectedAnnotationImpl","selectedObjects","getSelectedCanvasObjects","moveSelectedEditableObject","buildAnnotationListContext","onAnnotationSelected","renderAnnotationList","invalidFields","invalid","getInvalidTextAnnotationConfigFields","getInvalidDrawConfigFields","range","overlayIndexes","getEditableOverlayRange","currentOverlayIndex","nextOverlayIndex","reordered","overlay","operationToken","mergeMasksContext","buildMergeMasksContext","removeAllMasksNoHistory","restoreAnnotations","mergeMasksImpl","exportContext","buildExportServiceContext","downloadImageImpl","exportImageBase64Impl","exportImageFileImpl","snapshot","buildMergeAnnotationsContext","removeAllAnnotationsNoHistory","restoreMasks","labeledMasks","enterMosaicModeImpl","buildMosaicControllerContext","exitMosaicModeImpl","setMosaicConfig","applyMosaicConfigPatch","resetMosaicConfig","nextConfig","getInvalidMosaicConfigFields","isInternal","enterCropModeImpl","buildCropControllerContext","aspectRatioInput","setCropAspectRatioImpl","cancelCropImpl","cropControllerContext","applyCropImpl","s","syncInputValue","inputElement","readOnly","scaleId","scaleInputElement","mosaicConfig","mosaicBrushSizeInputId","brushInput","mosaicBlockSizeInputId","blockInput","textConfig","textColorInputId","textFontSizeInputId","fontInput","drawConfig","drawColorInputId","drawBrushSizeInputId","mergeAnnotationsImpl","hasMasks","hasAnnotations","hasSelectedMask","hasSelectedAnnotation","hasSelectedEditableObject","isDefaultTransform","isInCropMode","isInMosaicMode","isInTextMode","isInDrawMode","isMosaicApplying","setControlEnabled","isEnabled","controlElement","recordElementOriginalState","formControl","nextDisabled","disabled","originalAria","elementOriginalAriaDisabledMap","removeAttribute","elementOriginalPointerEventsMap","getAttribute","elementOriginalDisabledMap","restoreElementOriginalStates"],"mappings":"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lwB,QAAUi8B,EAC7B/L,EAAmBgM,aAAa,cAAeD,EAAO,QAAU,SAEhE1Y,IACAA,EAAiBvjB,OAASi8B,EAC1B1Y,EAAiB2Y,aAAa,cAAeD,EAAO,OAAS,SAErE,CCmBA,MAAME,GAAiB,GACjBC,GAA2B9kC,OAAO,gCAClC+kC,GAAwC/kC,OAAO,wCAC/CglC,GAAyB,CAC3B,uBACA,yBACA,0BACA,mBACA,oBACA,uBACA,qBACA,mBACA,2BACA,uBACA,mBACA,yBACA,sBACA,qBACA,iBACA,oBACA,sBACA,qBACA,iBACA,qBACA,iCACA,6BACA,6BACA,mCACA,mCACA,mCACA,iCACA,sBACA,eACA,gBACA,4BACA,aACA,aACA,aACA,sBACA,wBACA,kBACA,mBACA,wBACA,uBACA,uBACA,wBAEEC,GAAyB,CAC3B,wBACA,kBACA,oBAEEC,GAAkC,IAAIhsC,IAAI,CAAC,qBAAsB,YAAa,eAC9EisC,GAAyB,CAC3B,qBACA,iBACA,qBAEEC,GAAyB,CAC3B,qBACA,iBACA,sBAEEC,GAA2B,CAC7B,uBACA,yBACA,0BACA,mBACA,oBACA,uBACA,qBACA,mBACA,2BACA,uBACA,mBACA,yBACA,sBACA,qBACA,iBACA,oBACA,sBACA,qBACA,iBACA,qBACA,iCACA,6BACA,6BACA,mCACA,mCACA,mCACA,iCACA,sBACA,eACA,gBACA,4BACA,aACA,aACA,aACA,sBACA,wBACA,kBACA,mBACA,wBACA,uBACA,uBACA,wBAEEC,GAA2B,CAC7B,uBACA,uBACA,wBAEEC,GAAoC,IAAIrsC,IAAI,CAC9C,iBACA,cACA,kBACA,oBACA,qBACA,qBACA,cAGEssC,GAA0B,IAAItsC,IAAI,CACpC,OACA,YACA,gBACA,YACA,aACA,cACA,iBACA,eACA,sBACA,aACA,qBACA,iBACA,aACA,uBACA,gBACA,eACA,gBACA,kBACA,eACA,kBACA,gBACA,eACA,gBACA,kBACA,eACA,mBACA,2BACA,mBACA,2BACA,uBACA,uBACA,mBACA,6BACA,6BACA,6BACA,2BACA,gBACA,qBACA,YACA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"}
|