@rocketium/auto-adapt 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils/sizeMatching.ts","../src/utils/typeGuards.ts","../src/utils/scaling.ts","../src/adapter.ts","../src/types/canvas.ts","../src/types/capsule.ts"],"names":["CreativeElementCategory","WORD_STYLE_TYPE","TextAnimationType","AnimationSpecialCase"],"mappings":"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","file":"index.js","sourcesContent":["import type { AutoFitSizes } from './types/canvas';\n\nexport const FALLBACK_AUTO_FIT_SIZES: AutoFitSizes = [1, Infinity];\n/** Element covering more than this % of canvas uses skew path */\nexport const THRESHOLD_FOR_NOT_SKEWING = 90;\n/** Weight for aspect-ratio similarity in size matching (90%) */\nexport const ASPECT_RATIO_WEIGHT = 0.9;\n/** Weight for euclidean distance in size matching (10%) */\nexport const SCALE_DISTANCE_WEIGHT = 0.1;\nexport const MIN_MATCH_PERCENTAGE = 20;\nexport const MAX_MATCH_PERCENTAGE = 100;\nexport const DEFAULT_BORDER_PROPERTIES = {\n\tstroke: 'rgba(0, 0, 0, 1)',\n\tstrokeWidth: 0,\n\tstrokeDashArray: [0, 0] as number[],\n};\n","import { ASPECT_RATIO_WEIGHT, MAX_MATCH_PERCENTAGE, MIN_MATCH_PERCENTAGE, SCALE_DISTANCE_WEIGHT } from '../constants';\nimport { DatabaseSize } from '../types/capsule';\n\nexport const getNormalizedSizeValue = (sizeValue: string): string => {\n\tswitch (sizeValue) {\n\t\tcase 'square':\n\t\t\treturn '720x720';\n\t\tcase 'landscape':\n\t\t\treturn '1280x720';\n\t\tcase 'portrait':\n\t\t\treturn '720x1280';\n\t\tdefault:\n\t\t\treturn sizeValue;\n\t}\n};\n\nconst getEuclideanDistanceBetweenPoints = ({\n\tx1,\n\ty1,\n\tx2,\n\ty2,\n}: {\n\tx1: number;\n\ty1: number;\n\tx2: number;\n\ty2: number;\n}): number => {\n\tconst widthDifference = x2 - x1;\n\tconst heightDifference = y2 - y1;\n\treturn Math.sqrt(widthDifference * widthDifference + heightDifference * heightDifference);\n};\n\nexport const getEuclideanDistanceBetweenSizes = ({ size1, size2 }: { size1: string; size2: string }): number => {\n\tconst firstSize = getNormalizedSizeValue(size1);\n\tconst secondSize = getNormalizedSizeValue(size2);\n\tconst [firstSizeWidth, firstSizeHeight] = firstSize.split('x').map(Number);\n\tconst [secondSizeWidth, secondSizeHeight] = secondSize.split('x').map(Number);\n\treturn getEuclideanDistanceBetweenPoints({\n\t\tx1: firstSizeWidth ?? 0,\n\t\ty1: firstSizeHeight ?? 0,\n\t\tx2: secondSizeWidth ?? 0,\n\t\ty2: secondSizeHeight ?? 0,\n\t});\n};\n\n// ============================================================================\n// Shared scoring logic\n// ============================================================================\n\ntype SizeInput = { key: string; width: number; height: number };\ntype ScoredSize = SizeInput & { matchPercentage: number };\n\n/**\n * Core scoring algorithm used by both string-based and object-based size matching.\n * Computes a weighted score (90% aspect ratio similarity + 10% euclidean distance)\n * for each candidate size relative to the target, and returns scored results\n * sorted descending by matchPercentage.\n */\nconst computeSizeMatchScores = (sizes: SizeInput[], adaptSize: string): ScoredSize[] => {\n\tconst [adaptWidth, adaptHeight] = getNormalizedSizeValue(adaptSize).split('x').map(Number);\n\tconst adaptRatio = adaptWidth / adaptHeight;\n\n\tconst sizeDistanceMap = new Map<string, { aspectRatioDistance: number; euclideanDistance: number }>();\n\n\tfor (const size of sizes) {\n\t\tconst ratio = size.width / size.height;\n\t\tif (isNaN(ratio) || isNaN(adaptRatio)) continue;\n\n\t\tconst aspectRatioDistance = Math.abs(adaptRatio - ratio);\n\t\tconst euclideanDistance = getEuclideanDistanceBetweenPoints({\n\t\t\tx1: adaptWidth,\n\t\t\ty1: adaptHeight,\n\t\t\tx2: size.width,\n\t\t\ty2: size.height,\n\t\t});\n\n\t\tsizeDistanceMap.set(size.key, { aspectRatioDistance, euclideanDistance });\n\t}\n\n\tconst maxAspectRatioDistance = Math.max(...Array.from(sizeDistanceMap.values()).map((v) => v.aspectRatioDistance));\n\tconst maxEuclideanDistance = Math.max(...Array.from(sizeDistanceMap.values()).map((v) => v.euclideanDistance));\n\n\tconst scored: ScoredSize[] = [];\n\n\tfor (const size of sizes) {\n\t\tconst distances = sizeDistanceMap.get(size.key);\n\t\tif (!distances) {\n\t\t\tscored.push({ ...size, matchPercentage: MIN_MATCH_PERCENTAGE });\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst normalizedAspectRatio =\n\t\t\tmaxAspectRatioDistance === 0 ? 1 : 1 - distances.aspectRatioDistance / maxAspectRatioDistance;\n\t\tconst normalizedEuclidean =\n\t\t\tmaxEuclideanDistance === 0 ? 1 : 1 - distances.euclideanDistance / maxEuclideanDistance;\n\n\t\tconst rawScore = normalizedAspectRatio * ASPECT_RATIO_WEIGHT + normalizedEuclidean * SCALE_DISTANCE_WEIGHT;\n\t\tconst matchPercentage = Math.round(\n\t\t\tMath.max(MIN_MATCH_PERCENTAGE, Math.min(MAX_MATCH_PERCENTAGE, rawScore * 100)),\n\t\t);\n\n\t\tscored.push({ ...size, matchPercentage });\n\t}\n\n\tscored.sort((a, b) => b.matchPercentage - a.matchPercentage);\n\treturn scored;\n};\n\n/**\n * Finds the closest match among string-based sizes (e.g. ['720x720', '1080x1920']).\n * Returns the single best match and all sorted match percentages.\n */\nexport const findClosestSizeWithMatches = ({\n\tavailableSizes,\n\tadaptSize,\n}: {\n\tavailableSizes: string[];\n\tadaptSize: string;\n}): { closestSize: string; sortedMatches: Record<string, number> } => {\n\tconst sizeInputs: SizeInput[] = availableSizes.map((s) => {\n\t\tconst normalized = getNormalizedSizeValue(s);\n\t\tconst [width, height] = normalized.split('x').map(Number);\n\t\treturn { key: s, width, height };\n\t});\n\n\tconst scored = computeSizeMatchScores(sizeInputs, adaptSize);\n\n\t// Determine closest by primary aspect-ratio distance, secondary euclidean distance\n\tconst [adaptWidth, adaptHeight] = getNormalizedSizeValue(adaptSize).split('x').map(Number);\n\tconst adaptRatio = adaptWidth / adaptHeight;\n\n\tlet closestSize = availableSizes[0];\n\tlet minAspectRatioDistance = Number.MAX_VALUE;\n\tlet minEuclideanDistance = Number.MAX_VALUE;\n\n\tfor (const input of sizeInputs) {\n\t\tconst ratio = input.width / input.height;\n\t\tif (isNaN(ratio) || isNaN(adaptRatio)) continue;\n\n\t\tconst aspectRatioDistance = Math.abs(adaptRatio - ratio);\n\t\tconst euclideanDistance = getEuclideanDistanceBetweenPoints({\n\t\t\tx1: adaptWidth,\n\t\t\ty1: adaptHeight,\n\t\t\tx2: input.width,\n\t\t\ty2: input.height,\n\t\t});\n\n\t\tif (\n\t\t\taspectRatioDistance < minAspectRatioDistance ||\n\t\t\t(aspectRatioDistance === minAspectRatioDistance && euclideanDistance < minEuclideanDistance)\n\t\t) {\n\t\t\tminAspectRatioDistance = aspectRatioDistance;\n\t\t\tminEuclideanDistance = euclideanDistance;\n\t\t\tclosestSize = input.key;\n\t\t}\n\t}\n\n\treturn {\n\t\tclosestSize,\n\t\tsortedMatches: scored.reduce(\n\t\t\t(acc, { key, matchPercentage }) => {\n\t\t\t\tacc[key] = matchPercentage;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, number>,\n\t\t),\n\t};\n};\n\n/**\n * Finds closest matches among size objects (Record<sizeId, DatabaseSize>).\n * Returns enriched size objects with _id and matchPercentage, sorted descending.\n */\nexport const findClosestSizeObjectsWithMatches = ({\n\tavailableSizes,\n\tadaptSize,\n}: {\n\tavailableSizes: Record<string, DatabaseSize>;\n\tadaptSize: string;\n}): (DatabaseSize & { _id: string; matchPercentage: number })[] => {\n\tif (Object.keys(availableSizes).length === 0) {\n\t\treturn [];\n\t}\n\n\tconst sizeInputs: SizeInput[] = Object.entries(availableSizes).map(([key, sizeObj]) => ({\n\t\tkey,\n\t\twidth: sizeObj.width,\n\t\theight: sizeObj.height,\n\t}));\n\n\tconst scored = computeSizeMatchScores(sizeInputs, adaptSize);\n\n\treturn scored.map((s) => ({\n\t\t_id: s.key,\n\t\t...availableSizes[s.key],\n\t\tmatchPercentage: s.matchPercentage,\n\t}));\n};\n\n/**\n * Find the best reference size from available size objects.\n * Uses weighted scoring: 90% aspect-ratio similarity, 10% euclidean distance.\n * Returns the sizeId (key) of the best match.\n */\nexport const findBestReferenceSize = (availableSizes: Record<string, DatabaseSize>, targetSize: string): string => {\n\tconst sizeKeys = Object.keys(availableSizes);\n\tif (sizeKeys.length === 1) {\n\t\treturn sizeKeys[0];\n\t}\n\ttry {\n\t\tconst sortedMatches = findClosestSizeObjectsWithMatches({\n\t\t\tavailableSizes,\n\t\t\tadaptSize: targetSize,\n\t\t});\n\n\t\treturn sortedMatches[0]?._id || sizeKeys[0];\n\t} catch (error) {\n\t\tconsole.warn('Error finding closest size, using first available:', error);\n\t\treturn sizeKeys[0];\n\t}\n};\n","import type {\n\tCanvasElementJSON,\n\tGroupContainerJSON,\n\tImageContainerJSON,\n\tPathJSON,\n\tRoundedRectJSON,\n\tSvgJSON,\n\tTextContainerJSON,\n} from '../types/canvas';\n\nexport const isTextJSON = (object: CanvasElementJSON): object is TextContainerJSON => {\n\treturn object.dataType === 'TEXT';\n};\n\nexport const isImageJSON = (object: CanvasElementJSON): object is ImageContainerJSON => {\n\treturn object.dataType === 'IMAGE';\n};\n\nexport const isShapeJSON = (object: CanvasElementJSON): object is PathJSON | RoundedRectJSON | SvgJSON => {\n\treturn object.dataType === 'SHAPE';\n};\n\nexport const isSVGContainerJSON = (object: CanvasElementJSON): object is SvgJSON => {\n\treturn object?.type === 'svg-container' && object?.dataType === 'SHAPE';\n};\n\nexport const isRoundedRectJSON = (object: CanvasElementJSON): object is RoundedRectJSON => {\n\treturn object?.type === 'rounded-rect' && object?.dataType === 'SHAPE';\n};\n\nexport const isGroupJSON = (object: CanvasElementJSON | undefined): object is GroupContainerJSON => {\n\treturn object?.dataType === 'GROUP';\n};\n\nexport const isCreativeBoxJSON = (object: CanvasElementJSON): boolean => {\n\treturn object?.dataType === 'CREATIVE_BOX';\n};\n\nexport const isAudioJSON = (object: CanvasElementJSON): boolean => {\n\treturn object?.dataType === 'AUDIO';\n};\n","import type {\n\tAutoFitSizes,\n\tBorder,\n\tCanvasElementJSON,\n\tImageContainerJSON,\n\tPadding,\n\tPathJSON,\n\tRadius,\n\tRoundedRectJSON,\n\tSvgJSON,\n\tTextContainerJSON,\n\tWordStyle,\n} from '../types/canvas';\nimport { DEFAULT_BORDER_PROPERTIES, FALLBACK_AUTO_FIT_SIZES, THRESHOLD_FOR_NOT_SKEWING } from '../constants';\nimport { isAudioJSON, isCreativeBoxJSON, isGroupJSON } from './typeGuards';\nimport { getNormalizedSizeValue } from './sizeMatching';\n\n// ============================================================================\n// Numeric Property Accessors\n// ============================================================================\n\nexport const num = (obj: CanvasElementJSON, key: string, fallback = 0): number => {\n\tif (key in obj) {\n\t\tconst val = (obj as Record<string, unknown>)[key];\n\t\treturn typeof val === 'number' ? val : fallback;\n\t}\n\treturn fallback;\n};\n\n// ============================================================================\n// Area & Skew Checks\n// ============================================================================\n\nexport const getAreaPercentageOfElementOnCanvasJSON = ({\n\telement,\n\tcanvasDimensions,\n}: {\n\telement: CanvasElementJSON;\n\tcanvasDimensions: { height: number; width: number };\n}): number => {\n\tconst canvasWidth = typeof canvasDimensions.width === 'number' ? canvasDimensions.width : 0;\n\tconst canvasHeight = typeof canvasDimensions.height === 'number' ? canvasDimensions.height : 0;\n\n\t// No `?? 1` for scaleX — matches frontend behavior where undefined scaleX produces NaN,\n\t// causing the skew check to return false (NaN > threshold is false).\n\tconst elementWidth = ('width' in element ? element.width : 1) * ('scaleX' in element ? element.scaleX! : 1);\n\tconst elementHeight =\n\t\t('height' in element ? element.height : 1) * ('scaleY' in element ? element.scaleY ?? 1 : 1);\n\tconst elementTop = 'top' in element ? element.top : 0;\n\tconst elementLeft = 'left' in element ? element.left : 0;\n\n\tconst elementRight = elementLeft + elementWidth;\n\tconst elementBottom = elementTop + elementHeight;\n\n\tconst canvasArea = canvasWidth * canvasHeight;\n\tif (canvasArea === 0) {\n\t\treturn 0;\n\t}\n\n\tconst intersectionWidth = Math.min(elementRight, canvasWidth) - Math.max(elementLeft, 0);\n\tconst intersectionHeight = Math.min(elementBottom, canvasHeight) - Math.max(elementTop, 0);\n\tconst intersectionArea = Math.max(intersectionWidth, 0) * Math.max(intersectionHeight, 0);\n\n\treturn Math.round((intersectionArea / canvasArea) * 100);\n};\n\nexport const checkIfElementShouldBeSkewed = ({\n\tareaPercentage,\n\treferenceLengths,\n\ttype,\n}: {\n\tareaPercentage: number;\n\treferenceLengths: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tcanvasWidth: number;\n\t\tcanvasHeight: number;\n\t};\n\ttype: string;\n}): boolean => {\n\tif (type === 'GROUP') return false;\n\tif (areaPercentage > THRESHOLD_FOR_NOT_SKEWING) return true;\n\n\tconst spansFullWidth =\n\t\tMath.floor(referenceLengths.left) <= 0 && Math.floor(referenceLengths.width) >= referenceLengths.canvasWidth;\n\tconst spansFullHeight =\n\t\tMath.floor(referenceLengths.top) <= 0 && Math.floor(referenceLengths.height) >= referenceLengths.canvasHeight;\n\n\treturn spansFullWidth || spansFullHeight;\n};\n\n// ============================================================================\n// Property Scaling Helpers\n// ============================================================================\n\nexport const scaleCornerRadius = (cornerRadius: Radius | undefined, scalingRatio: number): Radius => {\n\treturn {\n\t\ttl: (cornerRadius?.tl || 0) * scalingRatio,\n\t\ttr: (cornerRadius?.tr || 0) * scalingRatio,\n\t\tbl: (cornerRadius?.bl || 0) * scalingRatio,\n\t\tbr: (cornerRadius?.br || 0) * scalingRatio,\n\t};\n};\n\nexport const scalePadding = (padding: Padding | undefined, scalingRatio: number): Padding => {\n\tconst p = padding ?? { top: 0, right: 0, bottom: 0, left: 0 };\n\treturn {\n\t\t...p,\n\t\ttop: p.top ? p.top * scalingRatio : 0,\n\t\tright: p.right ? p.right * scalingRatio : 0,\n\t\tbottom: p.bottom ? p.bottom * scalingRatio : 0,\n\t\tleft: p.left ? p.left * scalingRatio : 0,\n\t};\n};\n\nexport const getScaledBorderJSON = ({\n\tobject,\n\tscalingRatio,\n}: {\n\tobject: CanvasElementJSON;\n\tscalingRatio: number;\n}): { border?: Border } => {\n\tif (isCreativeBoxJSON(object) || isGroupJSON(object) || isAudioJSON(object)) {\n\t\treturn {};\n\t}\n\tif (!('border' in object) || !object?.border) return {};\n\n\tconst border = object.border as Border;\n\n\tif (!border.strokeWidth) return {};\n\n\treturn {\n\t\tborder: {\n\t\t\t...DEFAULT_BORDER_PROPERTIES,\n\t\t\t...border,\n\t\t\tstrokeWidth: border.strokeWidth * scalingRatio,\n\t\t},\n\t};\n};\n\nexport const adaptWordStyleFontSizes = ({\n\twordStyle,\n\tscalingRatio,\n}: {\n\twordStyle: WordStyle[];\n\tscalingRatio: number;\n}): WordStyle[] => {\n\tif (!wordStyle || wordStyle.length === 0) {\n\t\treturn wordStyle;\n\t}\n\n\treturn wordStyle.map((style) => {\n\t\tif (!style.data?.styles?.fontSize) {\n\t\t\treturn style;\n\t\t}\n\n\t\tconst currentFontSizeUnit = style.data.styles.fontSizeUnit ?? '%';\n\t\tconst adaptedFontSize =\n\t\t\tcurrentFontSizeUnit === 'px'\n\t\t\t\t? Math.round(style.data.styles.fontSize * scalingRatio)\n\t\t\t\t: style.data.styles.fontSize;\n\n\t\treturn {\n\t\t\t...style,\n\t\t\tdata: {\n\t\t\t\t...style.data,\n\t\t\t\tstyles: {\n\t\t\t\t\t...style.data.styles,\n\t\t\t\t\tfontSize: adaptedFontSize,\n\t\t\t\t\tfontSizeUnit: currentFontSizeUnit,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t});\n};\n\nexport const scaleAutoFitSizes = (\n\tautoFitSizes: [number | null, number | null] | undefined,\n\tscalingRatio: number,\n\tfallbackHeight: number,\n): AutoFitSizes => {\n\tif (autoFitSizes && autoFitSizes.length === 2) {\n\t\treturn autoFitSizes.map((size) => Math.ceil((size ?? fallbackHeight) * scalingRatio)) as AutoFitSizes;\n\t}\n\treturn [...FALLBACK_AUTO_FIT_SIZES] as AutoFitSizes;\n};\n\n// ============================================================================\n// Non-Skew Positioning (edge alignment, centering, quadrant-based)\n// ============================================================================\n\nexport const getValuesWithoutSkewingJSON = ({\n\tclosestSize,\n\tadaptSize,\n\tobject,\n}: {\n\tclosestSize: string;\n\tadaptSize: string;\n\tobject: CanvasElementJSON;\n}): { left: number; top: number; width: number; height: number } => {\n\tconst referenceSize = getNormalizedSizeValue(closestSize);\n\tconst [referenceWidth, referenceHeight] = referenceSize.split('x').map(Number);\n\tconst [adaptWidth, adaptHeight] = adaptSize.split('x').map(Number);\n\n\tconst top = num(object, 'top');\n\tconst left = num(object, 'left');\n\tconst scaleX = num(object, 'scaleX', 1);\n\tconst scaleY = num(object, 'scaleY', 1);\n\tconst width = num(object, 'width', 1) * scaleX;\n\tconst height = num(object, 'height', 1) * scaleY;\n\n\tconst widthScaleFactor = adaptWidth / referenceWidth;\n\tconst heightScaleFactor = adaptHeight / referenceHeight;\n\tconst scaleFactor = Math.min(widthScaleFactor, heightScaleFactor);\n\tconst elementWidthInNewSize = Math.ceil(width * scaleFactor);\n\tconst elementHeightInNewSize = Math.ceil(height * scaleFactor);\n\n\tconst distanceFromRight = Math.abs(left + width - referenceWidth);\n\tconst distanceFromBottom = Math.abs(top + height - referenceHeight);\n\tconst distanceFromLeft = Math.abs(left);\n\tconst distanceFromTop = Math.abs(top);\n\n\tconst ALIGNMENT_THRESHOLD = 1;\n\n\tif (\n\t\tdistanceFromRight < ALIGNMENT_THRESHOLD ||\n\t\tdistanceFromLeft < ALIGNMENT_THRESHOLD ||\n\t\tdistanceFromBottom < ALIGNMENT_THRESHOLD ||\n\t\tdistanceFromTop < ALIGNMENT_THRESHOLD\n\t) {\n\t\tlet elementLeftInNewSize: number;\n\t\tlet elementTopInNewSize: number;\n\n\t\tif (distanceFromRight < ALIGNMENT_THRESHOLD) {\n\t\t\telementLeftInNewSize = adaptWidth - elementWidthInNewSize;\n\t\t} else if (distanceFromLeft < ALIGNMENT_THRESHOLD) {\n\t\t\telementLeftInNewSize = 0;\n\t\t} else {\n\t\t\tconst elementLeftPercentage = left / referenceWidth;\n\t\t\telementLeftInNewSize = Math.ceil(elementLeftPercentage * adaptWidth);\n\t\t}\n\n\t\tif (distanceFromBottom < ALIGNMENT_THRESHOLD) {\n\t\t\telementTopInNewSize = adaptHeight - elementHeightInNewSize;\n\t\t} else if (distanceFromTop < ALIGNMENT_THRESHOLD) {\n\t\t\telementTopInNewSize = 0;\n\t\t} else {\n\t\t\tconst elementTopPercentage = top / referenceHeight;\n\t\t\telementTopInNewSize = Math.ceil(elementTopPercentage * adaptHeight);\n\t\t}\n\n\t\treturn {\n\t\t\tleft: elementLeftInNewSize,\n\t\t\ttop: elementTopInNewSize,\n\t\t\twidth: elementWidthInNewSize / scaleX,\n\t\t\theight: elementHeightInNewSize / scaleY,\n\t\t};\n\t}\n\n\tconst elementCenterX = left + width / 2;\n\tconst elementCenterY = top + height / 2;\n\tconst elementRight = left + width;\n\tconst elementBottom = top + height;\n\n\tconst canvasCenterX = referenceWidth / 2;\n\tconst canvasCenterY = referenceHeight / 2;\n\n\tconst leftArea =\n\t\tMath.max(0, Math.min(elementRight, canvasCenterX) - Math.max(left, 0)) *\n\t\tMath.max(0, Math.min(elementBottom, referenceHeight) - Math.max(top, 0));\n\tconst rightArea =\n\t\tMath.max(0, Math.min(elementRight, referenceWidth) - Math.max(left, canvasCenterX)) *\n\t\tMath.max(0, Math.min(elementBottom, referenceHeight) - Math.max(top, 0));\n\n\tconst totalArea = leftArea + rightArea;\n\tconst CENTER_THRESHOLD = 0.05;\n\n\tconst isHorizontallyCentered = Math.abs(leftArea - rightArea) / totalArea < CENTER_THRESHOLD;\n\n\tif (isHorizontallyCentered) {\n\t\tconst centerXPercentage = elementCenterX / referenceWidth;\n\t\tconst centerYPercentage = elementCenterY / referenceHeight;\n\t\tconst newCenterX = centerXPercentage * adaptWidth;\n\t\tconst newCenterY = centerYPercentage * adaptHeight;\n\n\t\treturn {\n\t\t\tleft: newCenterX - elementWidthInNewSize / 2,\n\t\t\ttop: newCenterY - elementHeightInNewSize / 2,\n\t\t\twidth: elementWidthInNewSize,\n\t\t\theight: elementHeightInNewSize,\n\t\t};\n\t}\n\n\tconst isInRightHalf = elementCenterX > canvasCenterX;\n\tconst isInBottomHalf = elementCenterY > canvasCenterY;\n\n\tconst referenceX = isInRightHalf ? elementRight / referenceWidth : left / referenceWidth;\n\tconst referenceY = isInBottomHalf ? elementBottom / referenceHeight : top / referenceHeight;\n\n\tconst newX = referenceX * adaptWidth;\n\tconst newY = referenceY * adaptHeight;\n\n\treturn {\n\t\tleft: isInRightHalf ? newX - elementWidthInNewSize : newX,\n\t\ttop: isInBottomHalf ? newY - elementHeightInNewSize : newY,\n\t\twidth: elementWidthInNewSize,\n\t\theight: elementHeightInNewSize,\n\t};\n};\n\n// ============================================================================\n// Per-Type Adapt Helpers (Non-Skew Path)\n// ============================================================================\n\nexport const adaptTextNoSkew = (\n\tobject: TextContainerJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n\tclosestHeight: number,\n): TextContainerJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\twidth: values.width,\n\t\theight: values.height,\n\t\twordSpacing: object.wordSpacing ? object.wordSpacing * scalingRatio : 0,\n\t\tpadding: scalePadding(object.padding, scalingRatio),\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t\tautoFitSizes: scaleAutoFitSizes(object.autoFitSizes, scalingRatio, closestHeight),\n\t\tfontSize: object.fontSize * scalingRatio,\n\t\twordStyle: adaptWordStyleFontSizes({ wordStyle: object.wordStyle || [], scalingRatio }),\n\t};\n};\n\nexport const adaptImageNoSkew = (\n\tobject: ImageContainerJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n\twidthRatio: number,\n\theightRatio: number,\n): ImageContainerJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\twidth: values.width,\n\t\theight: values.height,\n\t\timageScale: (object.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (object.imageLeft ?? 0) * widthRatio,\n\t\timageTop: (object.imageTop ?? 0) * heightRatio,\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t};\n};\n\nexport const adaptSvgNoSkew = (\n\tobject: SvgJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n\twidthRatio: number,\n\theightRatio: number,\n): SvgJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\twidth: values.width,\n\t\theight: values.height,\n\t\timageScale: (object.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (object.imageLeft ?? 0) * widthRatio,\n\t\timageTop: (object.imageTop ?? 0) * heightRatio,\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t} as SvgJSON;\n};\n\nexport const adaptRoundedRectNoSkew = (\n\tobject: RoundedRectJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n): RoundedRectJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\twidth: values.width,\n\t\theight: values.height,\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t};\n};\n\nexport const adaptShapeNoSkew = (\n\tobject: PathJSON | RoundedRectJSON | SvgJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n): CanvasElementJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\tscaleX: (object.scaleX ?? 1) * scalingRatio,\n\t\tscaleY: (object.scaleY ?? 1) * scalingRatio,\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t} as CanvasElementJSON;\n};\n\n// ============================================================================\n// Per-Type Adapt Helpers (Skew Path)\n// ============================================================================\n\nexport const adaptTextSkew = (\n\tobject: TextContainerJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n\tclosestHeight: number,\n): TextContainerJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\twidth: object.width * widthRatio,\n\t\theight: object.height * heightRatio,\n\t\tautoFitSizes: scaleAutoFitSizes(object.autoFitSizes, scalingRatio, closestHeight),\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\tfontSize: object.fontSize * scalingRatio,\n\t\twordStyle: adaptWordStyleFontSizes({ wordStyle: object.wordStyle || [], scalingRatio }),\n\t};\n};\n\nexport const adaptImageSkew = (\n\tobject: ImageContainerJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n): ImageContainerJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\twidth: object.width * widthRatio,\n\t\theight: object.height * heightRatio,\n\t\timageScale: (object.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (object.imageLeft ?? 0) * widthRatio,\n\t\timageTop: (object.imageTop ?? 0) * heightRatio,\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t};\n};\n\nexport const adaptSvgSkew = (\n\tobject: SvgJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n): SvgJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\twidth: object.width * widthRatio,\n\t\theight: object.height * heightRatio,\n\t\timageScale: (object.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (object.imageLeft ?? 0) * widthRatio,\n\t\timageTop: (object.imageTop ?? 0) * heightRatio,\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t} as SvgJSON;\n};\n\nexport const adaptRoundedRectSkew = (\n\tobject: RoundedRectJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n): RoundedRectJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\twidth: object.width * widthRatio,\n\t\theight: object.height * heightRatio,\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t};\n};\n\nexport const adaptShapeSkew = (\n\tobject: PathJSON | RoundedRectJSON | SvgJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n): CanvasElementJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\tscaleX: (object.scaleX ?? 1) * widthRatio,\n\t\tscaleY: (object.scaleY ?? 1) * heightRatio,\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t} as CanvasElementJSON;\n};\n\n// ============================================================================\n// Group Child Adapt Helpers\n// ============================================================================\n\nexport const adaptGroupChildText = (\n\tgroupObject: TextContainerJSON,\n\tscalingRatio: number,\n\tclosestHeight: number,\n\tparentObject: CanvasElementJSON,\n): TextContainerJSON => {\n\treturn {\n\t\t...groupObject,\n\t\tleft: groupObject.left * scalingRatio,\n\t\ttop: groupObject.top * scalingRatio,\n\t\twidth: groupObject.width * scalingRatio,\n\t\theight: groupObject.height * scalingRatio,\n\t\twordSpacing: groupObject.wordSpacing ? groupObject.wordSpacing * scalingRatio : 0,\n\t\tpadding: scalePadding(groupObject.padding, scalingRatio),\n\t\tcornerRadius: scaleCornerRadius(groupObject.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object: parentObject, scalingRatio }),\n\t\tautoFitSizes: scaleAutoFitSizes(groupObject.autoFitSizes, scalingRatio, closestHeight),\n\t\tfontSize: groupObject.fontSize * scalingRatio,\n\t\twordStyle: adaptWordStyleFontSizes({ wordStyle: groupObject.wordStyle || [], scalingRatio }),\n\t};\n};\n\nexport const adaptGroupChildImage = (\n\tgroupObject: ImageContainerJSON,\n\tscalingRatio: number,\n\tparentObject: CanvasElementJSON,\n): ImageContainerJSON => {\n\treturn {\n\t\t...groupObject,\n\t\tleft: groupObject.left * scalingRatio,\n\t\ttop: groupObject.top * scalingRatio,\n\t\twidth: groupObject.width * scalingRatio,\n\t\theight: groupObject.height * scalingRatio,\n\t\timageScale: (groupObject.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (groupObject.imageLeft ?? 0) * scalingRatio,\n\t\timageTop: (groupObject.imageTop ?? 0) * scalingRatio,\n\t\tcornerRadius: scaleCornerRadius(groupObject.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object: parentObject, scalingRatio }),\n\t};\n};\n\nexport const adaptGroupChildSvg = (\n\tsvgContainer: SvgJSON,\n\tscalingRatio: number,\n\tparentObject: CanvasElementJSON,\n): SvgJSON => {\n\treturn {\n\t\t...svgContainer,\n\t\tleft: svgContainer.left * scalingRatio,\n\t\ttop: svgContainer.top * scalingRatio,\n\t\twidth: svgContainer.width * scalingRatio,\n\t\theight: svgContainer.height * scalingRatio,\n\t\timageScale: (svgContainer.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (svgContainer.imageLeft ?? 0) * scalingRatio,\n\t\timageTop: (svgContainer.imageTop ?? 0) * scalingRatio,\n\t\t...getScaledBorderJSON({ object: parentObject, scalingRatio }),\n\t} as SvgJSON;\n};\n\nexport const adaptGroupChildRoundedRect = (\n\troundedRectObject: RoundedRectJSON,\n\tscalingRatio: number,\n\tparentObject: CanvasElementJSON,\n): RoundedRectJSON => {\n\treturn {\n\t\t...roundedRectObject,\n\t\tleft: roundedRectObject.left * scalingRatio,\n\t\ttop: roundedRectObject.top * scalingRatio,\n\t\twidth: roundedRectObject.width * scalingRatio,\n\t\theight: roundedRectObject.height * scalingRatio,\n\t\tcornerRadius: scaleCornerRadius(roundedRectObject.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object: parentObject, scalingRatio }),\n\t};\n};\n\nexport const adaptGroupChildShape = (\n\tgroupObject: CanvasElementJSON,\n\tscalingRatio: number,\n\tparentObject: CanvasElementJSON,\n): CanvasElementJSON => {\n\treturn {\n\t\t...groupObject,\n\t\tleft: num(groupObject, 'left') * scalingRatio,\n\t\ttop: num(groupObject, 'top') * scalingRatio,\n\t\tscaleX: num(groupObject, 'scaleX', 1) * scalingRatio,\n\t\tscaleY: num(groupObject, 'scaleY', 1) * scalingRatio,\n\t\t...getScaledBorderJSON({ object: parentObject, scalingRatio }),\n\t} as CanvasElementJSON;\n};\n","import type { CanvasElementJSON, CanvasElementWithOverrides } from './types/canvas';\nimport type { ServerCapsule } from './types/capsule';\nimport { findBestReferenceSize } from './utils/sizeMatching';\nimport {\n\tisTextJSON,\n\tisImageJSON,\n\tisShapeJSON,\n\tisSVGContainerJSON,\n\tisRoundedRectJSON,\n\tisGroupJSON,\n} from './utils/typeGuards';\nimport {\n\tnum,\n\tgetAreaPercentageOfElementOnCanvasJSON,\n\tcheckIfElementShouldBeSkewed,\n\tgetValuesWithoutSkewingJSON,\n\tgetScaledBorderJSON,\n\tadaptTextNoSkew,\n\tadaptImageNoSkew,\n\tadaptSvgNoSkew,\n\tadaptRoundedRectNoSkew,\n\tadaptShapeNoSkew,\n\tadaptTextSkew,\n\tadaptImageSkew,\n\tadaptSvgSkew,\n\tadaptRoundedRectSkew,\n\tadaptShapeSkew,\n\tadaptGroupChildText,\n\tadaptGroupChildImage,\n\tadaptGroupChildSvg,\n\tadaptGroupChildRoundedRect,\n\tadaptGroupChildShape,\n} from './utils/scaling';\n\n// ============================================================================\n// Core Adapt Function (ported from frontend getAdaptedObjectsJSON)\n// Adapts canvas elements from reference size to target size with skew/non-skew paths\n// ============================================================================\n\nexport const getAdaptedObjectsJSON = ({\n\tadaptSize,\n\tobjects,\n\tclosestSize,\n}: {\n\tadaptSize: string;\n\tobjects: Record<string, CanvasElementJSON>;\n\tclosestSize: string;\n}): Record<string, CanvasElementJSON> => {\n\tconst [adaptWidth, adaptHeight] = adaptSize.split('x').map(Number);\n\tconst [closestWidth, closestHeight] = closestSize.split('x').map(Number);\n\n\tconst widthRatio = adaptWidth / closestWidth;\n\tconst heightRatio = adaptHeight / closestHeight;\n\tconst scalingRatio = Math.min(widthRatio, heightRatio);\n\n\tconst newObjects: Record<string, CanvasElementJSON> = {};\n\n\tfor (const objectId of Object.keys(objects)) {\n\t\tconst object = objects[objectId];\n\n\t\tif (object.dataType === 'CREATIVE_BOX') {\n\t\t\tnewObjects[objectId] = {\n\t\t\t\t...object,\n\t\t\t\theight: adaptHeight,\n\t\t\t\twidth: adaptWidth,\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (object.dataType === 'AUDIO') {\n\t\t\tnewObjects[objectId] = object;\n\t\t\tcontinue;\n\t\t}\n\n\t\tgetAreaPercentageOfElementOnCanvasJSON({\n\t\t\telement: object,\n\t\t\tcanvasDimensions: { width: closestWidth, height: closestHeight },\n\t\t});\n\t\tconst areaPercentage = getAreaPercentageOfElementOnCanvasJSON({\n\t\t\telement: object,\n\t\t\tcanvasDimensions: { width: closestWidth, height: closestHeight },\n\t\t});\n\n\t\tconst shouldSkew = checkIfElementShouldBeSkewed({\n\t\t\tareaPercentage,\n\t\t\treferenceLengths: {\n\t\t\t\tleft: object.left ?? 0,\n\t\t\t\ttop: object.top ?? 0,\n\t\t\t\twidth: object.width ?? 1,\n\t\t\t\theight: object.height ?? 1,\n\t\t\t\tcanvasWidth: closestWidth,\n\t\t\t\tcanvasHeight: closestHeight,\n\t\t\t},\n\t\t\ttype: object.dataType,\n\t\t});\n\n\t\t// ---- NON-SKEW PATH ----\n\t\tif (!shouldSkew) {\n\t\t\tconst values = getValuesWithoutSkewingJSON({ closestSize, adaptSize, object });\n\n\t\t\tif (values.left === 0 && values.height === 0 && values.top === 0 && values.width === 0) {\n\t\t\t\tthrow new Error('Invalid values');\n\t\t\t}\n\n\t\t\tif ('groupPath' in object && object.groupPath) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isTextJSON(object)) {\n\t\t\t\tnewObjects[objectId] = adaptTextNoSkew(object, values, scalingRatio, closestHeight);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isImageJSON(object)) {\n\t\t\t\tnewObjects[objectId] = adaptImageNoSkew(object, values, scalingRatio, widthRatio, heightRatio);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isShapeJSON(object)) {\n\t\t\t\tif (isSVGContainerJSON(object)) {\n\t\t\t\t\tnewObjects[objectId] = adaptSvgNoSkew(object, values, scalingRatio, widthRatio, heightRatio);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (isRoundedRectJSON(object)) {\n\t\t\t\t\tnewObjects[objectId] = adaptRoundedRectNoSkew(object, values, scalingRatio);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tnewObjects[objectId] = adaptShapeNoSkew(object, values, scalingRatio);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isGroupJSON(object)) {\n\t\t\t\tnewObjects[objectId] = {\n\t\t\t\t\t...object,\n\t\t\t\t\tleft: values.left,\n\t\t\t\t\ttop: values.top,\n\t\t\t\t\twidth: values.width,\n\t\t\t\t\theight: values.height,\n\t\t\t\t};\n\n\t\t\t\tfor (const groupObjectId of object.objects) {\n\t\t\t\t\tconst groupObject = objects[groupObjectId];\n\t\t\t\t\tif (!groupObject) continue;\n\n\t\t\t\t\tif (isTextJSON(groupObject)) {\n\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildText(\n\t\t\t\t\t\t\tgroupObject,\n\t\t\t\t\t\t\tscalingRatio,\n\t\t\t\t\t\t\tclosestHeight,\n\t\t\t\t\t\t\tobject,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (isImageJSON(groupObject)) {\n\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildImage(groupObject, scalingRatio, object);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (isShapeJSON(groupObject)) {\n\t\t\t\t\t\tif (isSVGContainerJSON(groupObject)) {\n\t\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildSvg(groupObject, scalingRatio, object);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isRoundedRectJSON(groupObject)) {\n\t\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildRoundedRect(\n\t\t\t\t\t\t\t\tgroupObject,\n\t\t\t\t\t\t\t\tscalingRatio,\n\t\t\t\t\t\t\t\tobject,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildShape(groupObject, scalingRatio, object);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// ---- SKEW PATH ----\n\t\tif (isTextJSON(object)) {\n\t\t\tnewObjects[objectId] = adaptTextSkew(object, widthRatio, heightRatio, scalingRatio, closestHeight);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isImageJSON(object)) {\n\t\t\tnewObjects[objectId] = adaptImageSkew(object, widthRatio, heightRatio, scalingRatio);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isShapeJSON(object)) {\n\t\t\tif (isSVGContainerJSON(object)) {\n\t\t\t\tnewObjects[objectId] = adaptSvgSkew(object, widthRatio, heightRatio, scalingRatio);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (isRoundedRectJSON(object)) {\n\t\t\t\tnewObjects[objectId] = adaptRoundedRectSkew(object, widthRatio, heightRatio, scalingRatio);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnewObjects[objectId] = adaptShapeSkew(object, widthRatio, heightRatio, scalingRatio);\n\t\t\tcontinue;\n\t\t}\n\n\t\tnewObjects[objectId] = {\n\t\t\t...object,\n\t\t\tleft: num(object, 'left') * widthRatio,\n\t\t\ttop: num(object, 'top') * heightRatio,\n\t\t\twidth: num(object, 'width', 1) * widthRatio,\n\t\t\theight: num(object, 'height', 1) * heightRatio,\n\t\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t\t} as CanvasElementJSON;\n\t}\n\n\treturn newObjects;\n};\n\n// ============================================================================\n// Overrides Resolution\n// ============================================================================\n\n/**\n * Resolve CanvasElementWithOverrides to flat CanvasElementJSON for a given sizeId.\n * Applies overrides[sizeId] onto the base object.\n */\nexport const resolveObjectsForSize = (\n\tobjects: Record<string, CanvasElementWithOverrides<CanvasElementJSON>>,\n\tsizeId: string,\n): Record<string, CanvasElementJSON> => {\n\tconst resolved: Record<string, CanvasElementJSON> = {};\n\tfor (const [id, obj] of Object.entries(objects)) {\n\t\tconst sizeOverrides = obj.overrides?.[sizeId] || {};\n\t\tconst { overrides: _overrides, zIndex: _zIndex, ...base } = obj as Record<string, unknown>;\n\t\tresolved[id] = { ...base, ...sizeOverrides } as CanvasElementJSON;\n\t}\n\treturn resolved;\n};\n\n/**\n * Convert adapted flat objects back to overrides on the original objects.\n * For each layer, the adapted result is stored as overrides[newSizeId].\n */\nexport const applyAdaptedAsOverrides = (\n\toriginalObjects: Record<string, CanvasElementWithOverrides<CanvasElementJSON>>,\n\tadaptedObjects: Record<string, CanvasElementJSON>,\n\tnewSizeId: string,\n): Record<string, CanvasElementWithOverrides<CanvasElementJSON>> => {\n\tconst result = JSON.parse(JSON.stringify(originalObjects)) as Record<\n\t\tstring,\n\t\tCanvasElementWithOverrides<CanvasElementJSON>\n\t>;\n\n\tfor (const [layerId, adapted] of Object.entries(adaptedObjects)) {\n\t\tif (!result[layerId]) continue;\n\n\t\tconst existingOverrides = result[layerId].overrides || {};\n\t\tresult[layerId].overrides = {\n\t\t\t...existingOverrides,\n\t\t\t[newSizeId]: {\n\t\t\t\t...adapted,\n\t\t\t\tzIndex: result[layerId].overrides?.[newSizeId]?.zIndex ?? result[layerId].zIndex ?? 0,\n\t\t\t} as Partial<CanvasElementJSON> & { zIndex: number },\n\t\t};\n\t}\n\n\treturn result;\n};\n\n// ============================================================================\n// Capsule Construction\n// ============================================================================\n\n/**\n * Builds a new ServerCapsule with an added size. Handles canvasData.variant.sizes,\n * savedCustomDimensions, newAddedSizes, and creativesOrder.\n */\nexport const buildNewCapsule = ({\n\toriginalCapsule,\n\tupdatedObjects,\n\tsizeId,\n\treferenceCreativeId,\n\tsizeToGenerate,\n\tsizeName,\n\tsizeCategory,\n\tvideoLength,\n}: {\n\toriginalCapsule: ServerCapsule;\n\tupdatedObjects: Record<string, CanvasElementWithOverrides<CanvasElementJSON>>;\n\tsizeId: string;\n\treferenceCreativeId: string;\n\tsizeToGenerate: string;\n\tsizeName?: string;\n\tsizeCategory?: string;\n\tvideoLength?: number;\n}): ServerCapsule => {\n\tconst [widthOfNewSize, heightOfNewSize] = sizeToGenerate.split('x').map(Number);\n\n\tconst canvasData = JSON.parse(JSON.stringify(originalCapsule.canvasData));\n\tcanvasData.variant.objects = updatedObjects;\n\n\tcanvasData.variant.sizes[sizeId] = {\n\t\twidth: widthOfNewSize,\n\t\theight: heightOfNewSize,\n\t\tid: sizeId,\n\t\tdisplayName: sizeName || sizeToGenerate,\n\t\trulers: [],\n\t\t...(videoLength !== undefined && { videoLength }),\n\t};\n\n\tconst creativesOrder = originalCapsule.creativesOrder;\n\tconst finalCreativesOrder =\n\t\tcreativesOrder && creativesOrder.length > 0\n\t\t\t? [...creativesOrder, sizeId]\n\t\t\t: [referenceCreativeId, sizeId];\n\n\tconst newSizeData = {\n\t\tname: sizeName || sizeToGenerate,\n\t\twidth: widthOfNewSize,\n\t\theight: heightOfNewSize,\n\t\tactive: true,\n\t\tthumbnail: '',\n\t\tcreativeUrl: '',\n\t\t...(sizeCategory && { category: sizeCategory }),\n\t};\n\n\treturn {\n\t\t...originalCapsule,\n\t\tcanvasData,\n\t\tsavedCustomDimensions: {\n\t\t\t...originalCapsule.savedCustomDimensions,\n\t\t\t[sizeId]: newSizeData,\n\t\t},\n\t\tnewAddedSizes: {\n\t\t\t...originalCapsule.newAddedSizes,\n\t\t\t[sizeId]: newSizeData,\n\t\t},\n\t\tcreativesOrder: finalCreativesOrder,\n\t};\n};\n\n// ============================================================================\n// Top-Level Entry Function\n// ============================================================================\n\n/**\n * Generate a base layout for a new size.\n *\n * Takes the original capsule and target size params, returns a new ServerCapsule\n * with the adapted layout. Follows the frontend's getAdaptedObjectsJSON logic exactly.\n */\nexport const generateBaseLayoutForSize = ({\n\toriginalCapsule,\n\tcapsuleId,\n\tcreativeId,\n\tsizeId,\n\tsizeToGenerate,\n\tsizeName,\n\tsizeCategory,\n}: {\n\toriginalCapsule: ServerCapsule;\n\tcapsuleId: string;\n\tcreativeId: string | null;\n\tsizeId: string;\n\tsizeToGenerate: string;\n\tsizeName?: string;\n\tsizeCategory?: string;\n}): ServerCapsule => {\n\tconst availableSizes = originalCapsule.canvasData.variant?.sizes;\n\n\tif (!availableSizes || Object.keys(availableSizes).length === 0) {\n\t\tthrow new Error(`No sizes available in capsule: ${capsuleId}`);\n\t}\n\n\tlet referenceCreativeId: string;\n\n\tif (creativeId && availableSizes[creativeId]) {\n\t\treferenceCreativeId = creativeId;\n\t\tconsole.log(`[BaseLayoutAdapter] Using provided reference size: ${referenceCreativeId}`);\n\t} else {\n\t\treferenceCreativeId = findBestReferenceSize(availableSizes, sizeToGenerate);\n\t\tconsole.log(\n\t\t\t`[BaseLayoutAdapter] Found best reference size: ${referenceCreativeId} for target: ${sizeToGenerate}`,\n\t\t);\n\n\t\tif (creativeId && !availableSizes[creativeId]) {\n\t\t\tconsole.warn(\n\t\t\t\t`[BaseLayoutAdapter] Provided creativeId ${creativeId} not found, using ${referenceCreativeId}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst currentSize = availableSizes[referenceCreativeId];\n\tconst closestSize = `${currentSize.width}x${currentSize.height}`;\n\tconst variantObjects = originalCapsule.canvasData.variant.objects;\n\n\tconst resolvedObjects = resolveObjectsForSize(variantObjects, referenceCreativeId);\n\n\tconst adaptedObjects = getAdaptedObjectsJSON({\n\t\tadaptSize: sizeToGenerate,\n\t\tobjects: resolvedObjects,\n\t\tclosestSize,\n\t});\n\n\tconst updatedObjects = applyAdaptedAsOverrides(variantObjects, adaptedObjects, sizeId);\n\n\treturn buildNewCapsule({\n\t\toriginalCapsule,\n\t\tupdatedObjects,\n\t\tsizeId,\n\t\treferenceCreativeId,\n\t\tsizeToGenerate,\n\t\tsizeName,\n\t\tsizeCategory,\n\t\tvideoLength: currentSize?.videoLength,\n\t});\n};\n","import type { fabric } from 'fabric';\nimport type { IGradientOptions, IObjectOptions, IPatternOptions } from 'fabric/fabric-impl';\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\nexport type Prettify<T> = {\n\t[P in keyof T]: T[P];\n};\n\n// ============================================================================\n// Primitive Types\n// ============================================================================\n\nexport type Radius = {\n\ttl?: number;\n\ttr?: number;\n\tbl?: number;\n\tbr?: number;\n};\n\nexport type AutoFitSizes = [number, number];\n\nexport type Scale =\n\t| { scale: number; scaleX?: never; scaleY?: never }\n\t| { scale?: never; scaleX: number; scaleY: number };\n\nexport type ObjectFit = 'fill' | 'fit' | 'crop';\nexport type TextCase = 'uppercase' | 'lowercase' | 'titlecase' | 'none';\nexport type FontStyle = 'normal' | 'italic' | 'oblique';\nexport type ORIGIN_X = 'left' | 'center' | 'right';\nexport type ORIGIN_Y = 'top' | 'middle' | 'bottom';\n\nexport type FontMetaData = {\n\tfontId: string;\n\tfontUrl: string;\n};\n\nexport type ObjectPosition =\n\t| 'top-left'\n\t| 'top-center'\n\t| 'top-right'\n\t| 'center-left'\n\t| 'center'\n\t| 'center-right'\n\t| 'bottom-left'\n\t| 'bottom-center'\n\t| 'bottom-right'\n\t| 'custom';\n\nexport type Padding = {\n\tall?: number;\n\ttop?: number;\n\tright?: number;\n\tbottom?: number;\n\tleft?: number;\n};\n\n// ============================================================================\n// Border & Fill Types\n// ============================================================================\n\nexport type BorderPosition = 'center' | 'inside' | 'outside';\n\nexport type Border = {\n\tcolor?: string;\n\tstyle?: 'dashed' | 'solid';\n\ttop?: number;\n\tright?: number;\n\tbottom?: number;\n\tleft?: number;\n\tposition?: BorderPosition;\n\tdashWidth?: number;\n\tdashGap?: number;\n\tdashCap?: string;\n\tstroke?: string;\n\tstrokeWidth?: number;\n\tstrokeDashArray?: number[];\n};\n\nexport type FillOptions = IGradientOptions | IPatternOptions | string;\nexport type SerializedFillType = string | IPatternOptions | IGradientOptions;\nexport type SerializedFabricShadow = Pick<fabric.Shadow, 'color' | 'blur' | 'offsetX' | 'offsetY'>;\n\nexport type SerializedImageFilter = {\n\tbrightness?: number;\n\tsaturation?: number;\n\tcontrast?: number;\n\tinvert?: boolean;\n\tblur?: number;\n};\n\nexport type ColorMap = {\n\t[key: string]: FillOptions;\n};\n\n// ============================================================================\n// Element Constants & Enums\n// ============================================================================\n\nexport const CANVAS_EDITOR_ELEMENT = {\n\tTEXT: 'TEXT',\n\tSHAPE: 'SHAPE',\n\tIMAGE: 'IMAGE',\n\tGROUP: 'GROUP',\n\tCREATIVE_BOX: 'CREATIVE_BOX',\n\tVIDEO: 'VIDEO',\n\tAUDIO: 'AUDIO',\n\tCANVAS_MASK: 'CANVAS_MASK',\n} as const;\n\nexport type CANVAS_EDITOR_ELEMENT_TYPE = (typeof CANVAS_EDITOR_ELEMENT)[keyof typeof CANVAS_EDITOR_ELEMENT];\n\nexport enum CreativeElementCategory {\n\tHERO_IMAGE = 'HERO_IMAGE',\n\tPRODUCT_IMAGE = 'PRODUCT_IMAGE',\n\tBACKGROUND = 'BACKGROUND',\n\tLOGO = 'LOGO',\n\tICON = 'ICON',\n\tHEADLINE = 'HEADLINE',\n\tSUBHEADLINE = 'SUBHEADLINE',\n\tBODY_COPY = 'BODY_COPY',\n\tPRICE = 'PRICE',\n\tCTA = 'CTA',\n\tTERMS_CONDITIONS = 'TERMS_CONDITIONS',\n\tREVIEWS_TESTIMONIALS = 'REVIEWS_TESTIMONIALS',\n\tWARRANTY_INFO = 'WARRANTY_INFO',\n\tBADGE = 'BADGE',\n\tNEW_PRODUCT_LABEL = 'NEW_PRODUCT_LABEL',\n\tOTHER = 'OTHER',\n}\n\n// ============================================================================\n// Layer & Group Types\n// ============================================================================\n\nexport type LayerRules = {\n\teditingLocked?: boolean;\n\tmaxCharCount?: number;\n};\n\nexport type GroupPath = string | null;\n\n// ============================================================================\n// Word Style Types\n// ============================================================================\n\nexport enum WORD_STYLE_TYPE {\n\tWORD_STYLE = 'WORD_STYLE',\n\tMISSING_GLYPH = 'MISSING_GLYPH',\n\tVARIABLES = 'VARIABLES',\n}\n\nexport type WordStyleStyles = {\n\tfontFamily?: string;\n\tfontSize?: number;\n\tfontSizeUnit?: 'px' | '%';\n\tfontWeight?: string | number;\n\tfontStyle?: FontStyle;\n\ttextDecoration?: string;\n\ttextAlign?: string;\n\ttextBackgroundColor?: string;\n\tfill?: string;\n\tstroke?: string;\n\tstrokeWidth?: number;\n\tdeltaY?: number;\n\tlinethrough?: boolean;\n\tunderline?: boolean;\n\tsubscript?: boolean;\n\tsuperscript?: boolean;\n\tlinethroughOffset?: number;\n\tunderlineOffset?: number;\n\toffsets?: {\n\t\tlinethrough?: number;\n\t\tunderline?: number;\n\t\toverline?: number;\n\t};\n};\n\nexport type WordStyle = {\n\tid: string;\n\ttype?: WORD_STYLE_TYPE;\n\tvariableId?: string;\n\tfontMetaDataWS?: {\n\t\tfontId?: string;\n\t\tfontUrl?: string;\n\t\tname?: string;\n\t} | null;\n\tdata: {\n\t\tstart: number;\n\t\tend: number;\n\t\tstyles: WordStyleStyles;\n\t};\n};\n\nexport type WordStyles = Array<WordStyle>;\n\n// ============================================================================\n// Animation Types (inlined from Animations module)\n// ============================================================================\n\nexport type Point = {\n\tx: number;\n\ty: number;\n};\n\nexport type TranslateKeyframes = {\n\tid: string;\n\toffset: number;\n\tx: number;\n\ty: number;\n\tP1?: Point;\n\tP2?: Point;\n};\n\nexport type ScaleKeyframes = {\n\tid: string;\n\toffset: number;\n\tscaleX: number;\n\tscaleY: number;\n};\n\nexport type RotateKeyframes = {\n\tid: string;\n\toffset: number;\n\tangle: number;\n};\n\nexport type OpacityKeyframes = {\n\tid: string;\n\toffset: number;\n\topacity: number;\n};\n\nexport type AnimationTrack = {\n\ttranslate?: TranslateKeyframes[];\n\tscale?: ScaleKeyframes[];\n\trotate?: RotateKeyframes[];\n\topacity?: OpacityKeyframes[];\n};\n\nexport type AnimationReference = Partial<{\n\tcoordinates: Point;\n\torigin: Point;\n\tscale: Point;\n\trotate: number;\n\topacity: number;\n\ttrack: AnimationTrack;\n\toriginalReference: AnimationReference;\n}>;\n\nexport enum TextAnimationType {\n\tCHARACTER = 'character',\n\tWORD = 'word',\n\tLINE = 'line',\n}\n\nexport enum AnimationSpecialCase {\n\tTYPING_EFFECT = 'typing-effect',\n\tNONE = 'none',\n}\n\nexport type TextAnimationKeyframe = {\n\toffset: number;\n\ty?: number;\n\topacity?: number;\n};\n\nexport type TextAnimation = {\n\t_id: string;\n\ttype: TextAnimationType;\n\tclipped?: boolean;\n\treverse?: boolean;\n\tspecialCase?: AnimationSpecialCase | null;\n\tname: string;\n\tkeyframes: TextAnimationKeyframe[];\n\tstart: number;\n\tend: number;\n\tloop?: number;\n};\n\n// ============================================================================\n// Serialized Fabric Types (needed for BaseElementJSON)\n// ============================================================================\n\nexport type SerializedRoundedRect = SerializedFabricBaseObject & {\n\tproperties?: {\n\t\tlayerStartTime?: number;\n\t\tlayerEndTime?: number;\n\t\tvisible?: boolean;\n\t\tfill?: string;\n\t\toutputFormat?: string;\n\t\tlayerRules?: LayerRules;\n\t\tclipPathId?: string;\n\t\tclipPathParentId?: string;\n\t};\n\tanimatable?: boolean;\n};\n\nexport type SerializedFabricBaseObject = Pick<\n\tIObjectOptions,\n\t| 'originX'\n\t| 'originY'\n\t| 'left'\n\t| 'top'\n\t| 'width'\n\t| 'height'\n\t| 'stroke'\n\t| 'strokeWidth'\n\t| 'strokeDashArray'\n\t| 'strokeLineCap'\n\t| 'strokeDashOffset'\n\t| 'strokeLineJoin'\n\t| 'strokeUniform'\n\t| 'strokeMiterLimit'\n\t| 'scaleX'\n\t| 'scaleY'\n\t| 'angle'\n\t| 'flipX'\n\t| 'flipY'\n\t| 'opacity'\n\t| 'visible'\n\t| 'backgroundColor'\n\t| 'fillRule'\n\t| 'paintFirst'\n\t| 'globalCompositeOperation'\n\t| 'skewX'\n\t| 'skewY'\n\t| 'data'\n\t| 'selectable'\n\t| 'hoverCursor'\n\t| 'moveCursor'\n\t| 'hasControls'\n\t| 'hasBorders'\n\t| 'lockRotation'\n\t| 'lockMovementY'\n\t| 'lockScalingX'\n\t| 'lockScalingY'\n\t| 'lockSkewingX'\n\t| 'lockSkewingY'\n\t| 'lockScalingFlip'\n\t| 'inverted'\n\t| 'absolutePositioned'\n\t| 'centeredScaling'\n> & {\n\tversion: '5.3.0';\n\ttype:\n\t\t| 'rect'\n\t\t| 'circle'\n\t\t| 'triangle'\n\t\t| 'line'\n\t\t| 'polygon'\n\t\t| 'polyline'\n\t\t| 'path'\n\t\t| 'group'\n\t\t| 'image'\n\t\t| 'text'\n\t\t| 'rounded-rect'\n\t\t| 'text-container'\n\t\t| 'image-container'\n\t\t| 'custom-textbox'\n\t\t| 'shape-container'\n\t\t| 'video-container'\n\t\t| 'audio-container'\n\t\t| 'svg-container'\n\t\t| 'group-container';\n\tfill?: SerializedFillType;\n\tshadow?: SerializedFabricShadow;\n\tglobalCompositeOperation: GlobalCompositeOperation;\n\trx?: number;\n\try?: number;\n\tevented?: boolean;\n\tclipPath?: SerializedRoundedRect;\n};\n\n// ============================================================================\n// Base Element JSON\n// ============================================================================\n\nexport type BaseElementJSON = {\n\tid: string;\n\ttype: SerializedFabricBaseObject['type'];\n\tdisplayText: string;\n\tdataType: CANVAS_EDITOR_ELEMENT_TYPE;\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n\tangle: number;\n\topacity: number;\n\tshadow: SerializedFabricShadow | null;\n\tvisible: boolean;\n\tglobalCompositeOperation: GlobalCompositeOperation;\n\tselectable: boolean;\n\tfill: SerializedFillType;\n\tborder: Border;\n\tpadding: Padding;\n\tcornerRadius: Radius;\n\tlayerRules?: LayerRules;\n\tgroupPath: GroupPath;\n\tanimationTrack?: AnimationTrack;\n\tanimationReference?: AnimationReference;\n\tscaleX?: number;\n\tscaleY?: number;\n\tcategory?: CreativeElementCategory;\n};\n\n// ============================================================================\n// Canvas Element JSON Types\n// ============================================================================\n\nexport type CreativeBoxJSON = Omit<\n\tBaseElementJSON,\n\t| 'left'\n\t| 'top'\n\t| 'angle'\n\t| 'opacity'\n\t| 'shadow'\n\t| 'visible'\n\t| 'globalCompositeOperation'\n\t| 'selectable'\n\t| 'border'\n\t| 'padding'\n\t| 'cornerRadius'\n\t| 'layerRules'\n> & {\n\ttype: 'rect';\n\tdataType: 'CREATIVE_BOX';\n\tzIndex: number;\n\tlayerRules?: LayerRules;\n};\n\nexport type ImageContainerJSON = Omit<BaseElementJSON, 'type'> & {\n\ttype: 'image-container';\n\tdataType: 'IMAGE';\n\tobjectPosition: ObjectPosition;\n\timageOriginX: ORIGIN_X;\n\timageOriginY: ORIGIN_Y;\n\timageScale: number;\n\timageRotation: number;\n\timageLeft: number;\n\timageTop: number;\n\timageWidth: number;\n\timageHeight: number;\n\tobjectFit: ObjectFit;\n\tsrc: string;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\texportSrc?: string;\n\toriginalSrc?: string;\n\tdisplayText: string;\n\tlayerRules?: LayerRules;\n\tflipX?: boolean;\n\tflipY?: boolean;\n\tfilter?: Partial<SerializedImageFilter>;\n\tanimationTrack?: AnimationTrack;\n\tanimationReference?: AnimationReference;\n};\n\nexport type PathJSON = Omit<BaseElementJSON, 'border' | 'padding' | 'cornerRadius'> & {\n\ttype: 'shape-container';\n\tdataType: 'SHAPE';\n\tpath: (string | number)[][];\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\tpropertiesFill?: string;\n\tlayerRules?: LayerRules;\n} & Scale;\n\nexport type RoundedRectJSON = Omit<BaseElementJSON, 'border' | 'padding'> & {\n\ttype: 'rounded-rect';\n\tdataType: 'SHAPE';\n\tscale: number;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\tpropertiesFill?: string;\n\tdisplayText: string;\n\tlayerRules?: LayerRules;\n};\n\nexport type TextContainerJSON = Omit<BaseElementJSON, 'type'> & {\n\ttype: 'text-container';\n\tdataType: 'TEXT';\n\tautoFit: boolean;\n\tautoFitSizes: [number | null, number | null];\n\ttextCase: TextCase;\n\tserializedText: string;\n\tfontMetaData: FontMetaData;\n\tobjectPosition: ObjectPosition;\n\ttextleft: number;\n\ttextTop: number;\n\ttextHeight: number;\n\ttextFill: SerializedFillType;\n\tfontFamily: string;\n\tfontWeight: number | string;\n\tfontSize: number;\n\ttext: string;\n\tunderline: boolean;\n\toverline: boolean;\n\tlinethrough: boolean;\n\ttextAlign: string;\n\tfontStyle: '' | 'normal' | 'italic' | 'oblique';\n\tlineHeight: number;\n\tcharSpacing: number;\n\tstyles: unknown[];\n\twordStyle: WordStyles;\n\tmissingGlyphChars: [];\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\twordSpacing?: number;\n\toffsets: {\n\t\tlinethrough?: number;\n\t};\n\tlinethroughOffset: -0.315;\n\tunderlineOffset: 0.1;\n\tdisplayText: string;\n\ttextAnimationTrack?: TextAnimation;\n};\n\nexport type VideoContainerJSON = Omit<BaseElementJSON, 'type'> & {\n\ttype: 'video-container';\n\tdataType: 'VIDEO';\n\tobjectPosition: ObjectPosition;\n\timageScale: number;\n\timageLeft: number;\n\timageTop: number;\n\timageWidth: number;\n\timageHeight: number;\n\tobjectFit: ObjectFit;\n\tsrc: string;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\tvolume?: number;\n\ttrimmerStartTime?: number;\n\tdisplayText: string;\n\tlayerRules?: LayerRules;\n\timageOriginX: ORIGIN_X;\n\timageOriginY: ORIGIN_Y;\n\tflipX: boolean;\n\tflipY: boolean;\n\tfilter: Partial<SerializedImageFilter>;\n\timageRotation: number;\n\toriginalSrc?: string;\n\texportSrc?: string;\n\tanimationTrack?: AnimationTrack;\n\tanimationReference?: AnimationReference;\n};\n\nexport type AudioContainerJSON = {\n\ttype: 'audio-container';\n\tdataType: 'AUDIO';\n\tsrc: string;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tvolume?: number;\n\tid: string;\n\tdisplayText: string;\n\tselectable?: boolean;\n\ttrimmerStartTime?: number;\n\tlayerRules?: LayerRules;\n};\n\nexport type SvgJSON = Omit<BaseElementJSON, 'border' | 'padding' | 'cornerRadius' | 'fill'> & {\n\ttype: 'svg-container';\n\tdataType: 'SHAPE';\n\tsrc: string;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\tobjectFit?: ObjectFit;\n\timageRotation?: number;\n\tobjectPosition?: ObjectPosition;\n\timageLeft?: number;\n\timageTop?: number;\n\timageWidth?: number;\n\timageHeight?: number;\n\tflipX?: boolean;\n\tflipY?: boolean;\n\timageScale: number;\n\tanimationTrack?: AnimationTrack;\n\tanimationReference?: AnimationReference;\n\tcolorMap?: ColorMap;\n\timageOriginX?: ORIGIN_X;\n\timageOriginY?: ORIGIN_Y;\n} & Scale;\n\nexport type GroupContainerJSON = Omit<\n\tBaseElementJSON,\n\t'type' | 'fill' | 'border' | 'padding' | 'cornerRadius' | 'layerRules'\n> & {\n\ttype: 'group-container';\n\tdataType: 'GROUP';\n\tobjects: string[];\n\tisAlreadyGrouped: boolean;\n\tisMaskedGroup: boolean;\n\tpropertiesVisible?: boolean;\n\tlayerRules?: LayerRules;\n};\n\n// ============================================================================\n// Union & Overrides\n// ============================================================================\n\nexport type CanvasElementJSON =\n\t| CreativeBoxJSON\n\t| ImageContainerJSON\n\t| PathJSON\n\t| RoundedRectJSON\n\t| TextContainerJSON\n\t| VideoContainerJSON\n\t| AudioContainerJSON\n\t| SvgJSON\n\t| GroupContainerJSON;\n\nexport type CanvasElementWithOverrides<T extends CanvasElementJSON> = Prettify<\n\tT & {\n\t\tzIndex: number;\n\t\toverrides: Record<string, Partial<T> & { zIndex: number }>;\n\t}\n>;\n","import { CanvasElementJSON, CanvasElementWithOverrides } from './canvas';\n\nexport type DatabaseVariant = {\n\tid: string;\n\tsizes: Record<string, DatabaseSize>;\n\tobjects: Record<string, CanvasElementWithOverrides<CanvasElementJSON>>;\n};\n\nexport type DatabaseSize = {\n\twidth: number;\n\theight: number;\n\tid: string;\n\trulers: Record<string, RulerLine>;\n\tshowRulers?: boolean;\n\tshowGrid: boolean;\n\tgrid?: GridOption;\n\trulersLocked?: boolean;\n\tdisplayName: string;\n\tvideoLength?: number;\n};\n\nexport const RULER_AXIS = {\n\tX: 'x',\n\tY: 'y',\n} as const;\n\nexport type RULER_AXIS_TYPE = (typeof RULER_AXIS)[keyof typeof RULER_AXIS];\n\nexport type RulerLine = {\n\taxis: RULER_AXIS_TYPE;\n\tvalue: number;\n\tid: string;\n};\n\nexport type GridOption = {\n\tsize: number;\n\tunit: 'PIXEL';\n\tcolor: string;\n\tsubdivisions: number;\n};\n\nexport type SavedCustomDimensions = {\n\tactive: boolean;\n\tname: string;\n\tcreativeUrl: string;\n\tthumbnail?: string;\n\twidth?: number;\n\theight?: number;\n\tfileName?: string;\n\tfileNameSource?: 'formula' | 'manual';\n};\n\nexport type OutputFormat = 'image' | 'video';\n\nexport interface ServerCapsule {\n\tvideoLength: number;\n\tname: string;\n\timage: string;\n\tauthor: string;\n\ttimestamp: string;\n\tversion: number;\n\tisDeleted: boolean;\n\tcollaborators: string[];\n\ttags: string[];\n\torientation: string;\n\tvideoBackground: string;\n\tbranding: boolean;\n\toutputFormat: OutputFormat;\n\tbrandPalettes: [];\n\tcapsuleErrors: [];\n\twithCanvas: boolean;\n\tcreativesOrder: string[];\n\t_id: string;\n\tcapsuleId: string;\n\taudio: {\n\t\tlink: string;\n\t};\n\tauthorId: string;\n\tcanvasData: {\n\t\tmetadata: {};\n\t\tvariant: DatabaseVariant;\n\t};\n\tcards: {\n\t\tid: string;\n\t\ttags: string[];\n\t\ttype: string;\n\t\tgroups: [];\n\t\timage: string;\n\t\toptions: [];\n\t\tautoTimeBasedOnElements: boolean;\n\t}[];\n\tcreatedAt: string;\n\tcreatedUsingStylingPanel: null;\n\tcustomDimensions: {\n\t\t_id: string;\n\t\twidth: number;\n\t\theight: number;\n\t};\n\texportSettings: {\n\t\tquality: string;\n\t};\n\tlastModified: string;\n\tlastModifiedId: string;\n\tlistId: string;\n\tlogoImage: string;\n\tlogoLoop: boolean;\n\tlogoPosition: string;\n\tlogoSize: number;\n\tmetadata: {\n\t\tplatform: string;\n\t\tshareString: string;\n\t\tisSaved: boolean;\n\t\tname: string;\n\t\tassetGroup: string;\n\t\temail: string;\n\t};\n\tsavedCustomDimensions: Record<string, SavedCustomDimensions>;\n\tshortId: string;\n\tteamId: string;\n\tthemeId: string;\n\ttitle: string;\n\tupdatedAt: string;\n\tvideoBackgroundExtraClasses: string;\n\tvideoIndex: number;\n\tvideoStyling: null;\n\tvideoTemplateRules: null;\n\tvisibility: string;\n\tnewAddedSizes?: Record<string, SavedCustomDimensions>;\n\tsourceCapsuleId?: string | null;\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils/sizeMatching.ts","../src/utils/typeGuards.ts","../src/utils/scaling.ts","../src/adapter.ts","../src/types/canvas.ts","../src/types/capsule.ts"],"names":["CreativeElementCategory","WORD_STYLE_TYPE","TextAnimationType","AnimationSpecialCase"],"mappings":"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","file":"index.js","sourcesContent":["import type { AutoFitSizes } from './types/canvas';\n\nexport const FALLBACK_AUTO_FIT_SIZES: AutoFitSizes = [1, Infinity];\n/** Element covering more than this % of canvas uses skew path */\nexport const THRESHOLD_FOR_NOT_SKEWING = 90;\n/** Weight for aspect-ratio similarity in size matching (90%) */\nexport const ASPECT_RATIO_WEIGHT = 0.9;\n/** Weight for euclidean distance in size matching (10%) */\nexport const SCALE_DISTANCE_WEIGHT = 0.1;\nexport const MIN_MATCH_PERCENTAGE = 20;\nexport const MAX_MATCH_PERCENTAGE = 100;\nexport const DEFAULT_BORDER_PROPERTIES = {\n\tstroke: 'rgba(0, 0, 0, 1)',\n\tstrokeWidth: 0,\n\tstrokeDashArray: [0, 0] as number[],\n};\n","import { ASPECT_RATIO_WEIGHT, MAX_MATCH_PERCENTAGE, MIN_MATCH_PERCENTAGE, SCALE_DISTANCE_WEIGHT } from '../constants';\nimport { DatabaseSize } from '../types/capsule';\n\nexport const getNormalizedSizeValue = (sizeValue: string): string => {\n\tswitch (sizeValue) {\n\t\tcase 'square':\n\t\t\treturn '720x720';\n\t\tcase 'landscape':\n\t\t\treturn '1280x720';\n\t\tcase 'portrait':\n\t\t\treturn '720x1280';\n\t\tdefault:\n\t\t\treturn sizeValue;\n\t}\n};\n\nconst getEuclideanDistanceBetweenPoints = ({\n\tx1,\n\ty1,\n\tx2,\n\ty2,\n}: {\n\tx1: number;\n\ty1: number;\n\tx2: number;\n\ty2: number;\n}): number => {\n\tconst widthDifference = x2 - x1;\n\tconst heightDifference = y2 - y1;\n\treturn Math.sqrt(widthDifference * widthDifference + heightDifference * heightDifference);\n};\n\nexport const getEuclideanDistanceBetweenSizes = ({ size1, size2 }: { size1: string; size2: string }): number => {\n\tconst firstSize = getNormalizedSizeValue(size1);\n\tconst secondSize = getNormalizedSizeValue(size2);\n\tconst [firstSizeWidth, firstSizeHeight] = firstSize.split('x').map(Number);\n\tconst [secondSizeWidth, secondSizeHeight] = secondSize.split('x').map(Number);\n\treturn getEuclideanDistanceBetweenPoints({\n\t\tx1: firstSizeWidth ?? 0,\n\t\ty1: firstSizeHeight ?? 0,\n\t\tx2: secondSizeWidth ?? 0,\n\t\ty2: secondSizeHeight ?? 0,\n\t});\n};\n\n// ============================================================================\n// Shared scoring logic\n// ============================================================================\n\ntype SizeInput = { key: string; width: number; height: number };\ntype ScoredSize = SizeInput & { matchPercentage: number };\n\n/**\n * Core scoring algorithm used by both string-based and object-based size matching.\n * Computes a weighted score (90% aspect ratio similarity + 10% euclidean distance)\n * for each candidate size relative to the target, and returns scored results\n * sorted descending by matchPercentage.\n */\nconst computeSizeMatchScores = (sizes: SizeInput[], adaptSize: string): ScoredSize[] => {\n\tconst [adaptWidth, adaptHeight] = getNormalizedSizeValue(adaptSize).split('x').map(Number);\n\tconst adaptRatio = adaptWidth / adaptHeight;\n\n\tconst sizeDistanceMap = new Map<string, { aspectRatioDistance: number; euclideanDistance: number }>();\n\n\tfor (const size of sizes) {\n\t\tconst ratio = size.width / size.height;\n\t\tif (isNaN(ratio) || isNaN(adaptRatio)) continue;\n\n\t\tconst aspectRatioDistance = Math.abs(adaptRatio - ratio);\n\t\tconst euclideanDistance = getEuclideanDistanceBetweenPoints({\n\t\t\tx1: adaptWidth,\n\t\t\ty1: adaptHeight,\n\t\t\tx2: size.width,\n\t\t\ty2: size.height,\n\t\t});\n\n\t\tsizeDistanceMap.set(size.key, { aspectRatioDistance, euclideanDistance });\n\t}\n\n\tconst maxAspectRatioDistance = Math.max(...Array.from(sizeDistanceMap.values()).map((v) => v.aspectRatioDistance));\n\tconst maxEuclideanDistance = Math.max(...Array.from(sizeDistanceMap.values()).map((v) => v.euclideanDistance));\n\n\tconst scored: ScoredSize[] = [];\n\n\tfor (const size of sizes) {\n\t\tconst distances = sizeDistanceMap.get(size.key);\n\t\tif (!distances) {\n\t\t\tscored.push({ ...size, matchPercentage: MIN_MATCH_PERCENTAGE });\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst normalizedAspectRatio =\n\t\t\tmaxAspectRatioDistance === 0 ? 1 : 1 - distances.aspectRatioDistance / maxAspectRatioDistance;\n\t\tconst normalizedEuclidean =\n\t\t\tmaxEuclideanDistance === 0 ? 1 : 1 - distances.euclideanDistance / maxEuclideanDistance;\n\n\t\tconst rawScore = normalizedAspectRatio * ASPECT_RATIO_WEIGHT + normalizedEuclidean * SCALE_DISTANCE_WEIGHT;\n\t\tconst matchPercentage = Math.round(\n\t\t\tMath.max(MIN_MATCH_PERCENTAGE, Math.min(MAX_MATCH_PERCENTAGE, rawScore * 100)),\n\t\t);\n\n\t\tscored.push({ ...size, matchPercentage });\n\t}\n\n\tscored.sort((a, b) => b.matchPercentage - a.matchPercentage);\n\treturn scored;\n};\n\n/**\n * Finds the closest match among string-based sizes (e.g. ['720x720', '1080x1920']).\n * Returns the single best match and all sorted match percentages.\n */\nexport const findClosestSizeWithMatches = ({\n\tavailableSizes,\n\tadaptSize,\n}: {\n\tavailableSizes: string[];\n\tadaptSize: string;\n}): { closestSize: string; sortedMatches: Record<string, number> } => {\n\tconst sizeInputs: SizeInput[] = availableSizes.map((s) => {\n\t\tconst normalized = getNormalizedSizeValue(s);\n\t\tconst [width, height] = normalized.split('x').map(Number);\n\t\treturn { key: s, width, height };\n\t});\n\n\tconst scored = computeSizeMatchScores(sizeInputs, adaptSize);\n\n\t// Determine closest by primary aspect-ratio distance, secondary euclidean distance\n\tconst [adaptWidth, adaptHeight] = getNormalizedSizeValue(adaptSize).split('x').map(Number);\n\tconst adaptRatio = adaptWidth / adaptHeight;\n\n\tlet closestSize = availableSizes[0];\n\tlet minAspectRatioDistance = Number.MAX_VALUE;\n\tlet minEuclideanDistance = Number.MAX_VALUE;\n\n\tfor (const input of sizeInputs) {\n\t\tconst ratio = input.width / input.height;\n\t\tif (isNaN(ratio) || isNaN(adaptRatio)) continue;\n\n\t\tconst aspectRatioDistance = Math.abs(adaptRatio - ratio);\n\t\tconst euclideanDistance = getEuclideanDistanceBetweenPoints({\n\t\t\tx1: adaptWidth,\n\t\t\ty1: adaptHeight,\n\t\t\tx2: input.width,\n\t\t\ty2: input.height,\n\t\t});\n\n\t\tif (\n\t\t\taspectRatioDistance < minAspectRatioDistance ||\n\t\t\t(aspectRatioDistance === minAspectRatioDistance && euclideanDistance < minEuclideanDistance)\n\t\t) {\n\t\t\tminAspectRatioDistance = aspectRatioDistance;\n\t\t\tminEuclideanDistance = euclideanDistance;\n\t\t\tclosestSize = input.key;\n\t\t}\n\t}\n\n\treturn {\n\t\tclosestSize,\n\t\tsortedMatches: scored.reduce(\n\t\t\t(acc, { key, matchPercentage }) => {\n\t\t\t\tacc[key] = matchPercentage;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, number>,\n\t\t),\n\t};\n};\n\n/**\n * Finds closest matches among size objects (Record<sizeId, DatabaseSize>).\n * Returns enriched size objects with _id and matchPercentage, sorted descending.\n */\nexport const findClosestSizeObjectsWithMatches = ({\n\tavailableSizes,\n\tadaptSize,\n}: {\n\tavailableSizes: Record<string, DatabaseSize>;\n\tadaptSize: string;\n}): (DatabaseSize & { _id: string; matchPercentage: number })[] => {\n\tif (Object.keys(availableSizes).length === 0) {\n\t\treturn [];\n\t}\n\n\tconst sizeInputs: SizeInput[] = Object.entries(availableSizes).map(([key, sizeObj]) => ({\n\t\tkey,\n\t\twidth: sizeObj.width,\n\t\theight: sizeObj.height,\n\t}));\n\n\tconst scored = computeSizeMatchScores(sizeInputs, adaptSize);\n\n\treturn scored.map((s) => ({\n\t\t_id: s.key,\n\t\t...availableSizes[s.key],\n\t\tmatchPercentage: s.matchPercentage,\n\t}));\n};\n\n/**\n * Find the best reference size from available size objects.\n * Uses weighted scoring: 90% aspect-ratio similarity, 10% euclidean distance.\n * Returns the sizeId (key) of the best match.\n */\nexport const findBestReferenceSize = (availableSizes: Record<string, DatabaseSize>, targetSize: string): string => {\n\tconst sizeKeys = Object.keys(availableSizes);\n\tif (sizeKeys.length === 1) {\n\t\treturn sizeKeys[0];\n\t}\n\ttry {\n\t\tconst sortedMatches = findClosestSizeObjectsWithMatches({\n\t\t\tavailableSizes,\n\t\t\tadaptSize: targetSize,\n\t\t});\n\n\t\treturn sortedMatches[0]?._id || sizeKeys[0];\n\t} catch (error) {\n\t\tconsole.warn('Error finding closest size, using first available:', error);\n\t\treturn sizeKeys[0];\n\t}\n};\n","import type {\n\tCanvasElementJSON,\n\tGroupContainerJSON,\n\tImageContainerJSON,\n\tPathJSON,\n\tRoundedRectJSON,\n\tSvgJSON,\n\tTextContainerJSON,\n\tVideoContainerJSON,\n} from '../types/canvas';\n\nexport const isTextJSON = (object: CanvasElementJSON): object is TextContainerJSON => {\n\treturn object.dataType === 'TEXT';\n};\n\nexport const isImageJSON = (object: CanvasElementJSON): object is ImageContainerJSON => {\n\treturn object.dataType === 'IMAGE';\n};\n\nexport const isShapeJSON = (object: CanvasElementJSON): object is PathJSON | RoundedRectJSON | SvgJSON => {\n\treturn object.dataType === 'SHAPE';\n};\n\nexport const isSVGContainerJSON = (object: CanvasElementJSON): object is SvgJSON => {\n\treturn object?.type === 'svg-container' && object?.dataType === 'SHAPE';\n};\n\nexport const isRoundedRectJSON = (object: CanvasElementJSON): object is RoundedRectJSON => {\n\treturn object?.type === 'rounded-rect' && object?.dataType === 'SHAPE';\n};\n\nexport const isGroupJSON = (object: CanvasElementJSON | undefined): object is GroupContainerJSON => {\n\treturn object?.dataType === 'GROUP';\n};\n\nexport const isCreativeBoxJSON = (object: CanvasElementJSON): boolean => {\n\treturn object?.dataType === 'CREATIVE_BOX';\n};\n\nexport const isVideoJSON = (object: CanvasElementJSON): object is VideoContainerJSON => {\n\treturn object?.dataType === 'VIDEO';\n};\n\nexport const isAudioJSON = (object: CanvasElementJSON): boolean => {\n\treturn object?.dataType === 'AUDIO';\n};\n","import type {\n\tAutoFitSizes,\n\tBorder,\n\tCanvasElementJSON,\n\tImageContainerJSON,\n\tPadding,\n\tPathJSON,\n\tRadius,\n\tRoundedRectJSON,\n\tSvgJSON,\n\tTextContainerJSON,\n\tWordStyle,\n} from '../types/canvas';\nimport { DEFAULT_BORDER_PROPERTIES, FALLBACK_AUTO_FIT_SIZES, THRESHOLD_FOR_NOT_SKEWING } from '../constants';\nimport { isAudioJSON, isCreativeBoxJSON, isGroupJSON } from './typeGuards';\nimport { getNormalizedSizeValue } from './sizeMatching';\n\n// ============================================================================\n// Numeric Property Accessors\n// ============================================================================\n\nexport const num = (obj: CanvasElementJSON, key: string, fallback = 0): number => {\n\tif (key in obj) {\n\t\tconst val = (obj as Record<string, unknown>)[key];\n\t\treturn typeof val === 'number' ? val : fallback;\n\t}\n\treturn fallback;\n};\n\n// ============================================================================\n// Area & Skew Checks\n// ============================================================================\n\nexport const getAreaPercentageOfElementOnCanvasJSON = ({\n\telement,\n\tcanvasDimensions,\n}: {\n\telement: CanvasElementJSON;\n\tcanvasDimensions: { height: number; width: number };\n}): number => {\n\tconst canvasWidth = typeof canvasDimensions.width === 'number' ? canvasDimensions.width : 0;\n\tconst canvasHeight = typeof canvasDimensions.height === 'number' ? canvasDimensions.height : 0;\n\n\t// No `?? 1` for scaleX — matches frontend behavior where undefined scaleX produces NaN,\n\t// causing the skew check to return false (NaN > threshold is false).\n\tconst elementWidth = ('width' in element ? element.width : 1) * ('scaleX' in element ? element.scaleX! : 1);\n\tconst elementHeight =\n\t\t('height' in element ? element.height : 1) * ('scaleY' in element ? element.scaleY ?? 1 : 1);\n\tconst elementTop = 'top' in element ? element.top : 0;\n\tconst elementLeft = 'left' in element ? element.left : 0;\n\n\tconst elementRight = elementLeft + elementWidth;\n\tconst elementBottom = elementTop + elementHeight;\n\n\tconst canvasArea = canvasWidth * canvasHeight;\n\tif (canvasArea === 0) {\n\t\treturn 0;\n\t}\n\n\tconst intersectionWidth = Math.min(elementRight, canvasWidth) - Math.max(elementLeft, 0);\n\tconst intersectionHeight = Math.min(elementBottom, canvasHeight) - Math.max(elementTop, 0);\n\tconst intersectionArea = Math.max(intersectionWidth, 0) * Math.max(intersectionHeight, 0);\n\n\treturn Math.round((intersectionArea / canvasArea) * 100);\n};\n\nexport const checkIfElementShouldBeSkewed = ({\n\tareaPercentage,\n\treferenceLengths,\n\ttype,\n}: {\n\tareaPercentage: number;\n\treferenceLengths: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tcanvasWidth: number;\n\t\tcanvasHeight: number;\n\t};\n\ttype: string;\n}): boolean => {\n\tif (type === 'GROUP') return false;\n\tif (areaPercentage > THRESHOLD_FOR_NOT_SKEWING) return true;\n\n\tconst spansFullWidth =\n\t\tMath.floor(referenceLengths.left) <= 0 && Math.floor(referenceLengths.width) >= referenceLengths.canvasWidth;\n\tconst spansFullHeight =\n\t\tMath.floor(referenceLengths.top) <= 0 && Math.floor(referenceLengths.height) >= referenceLengths.canvasHeight;\n\n\treturn spansFullWidth || spansFullHeight;\n};\n\n// ============================================================================\n// Property Scaling Helpers\n// ============================================================================\n\nexport const scaleCornerRadius = (cornerRadius: Radius | undefined, scalingRatio: number): Radius => {\n\treturn {\n\t\ttl: (cornerRadius?.tl || 0) * scalingRatio,\n\t\ttr: (cornerRadius?.tr || 0) * scalingRatio,\n\t\tbl: (cornerRadius?.bl || 0) * scalingRatio,\n\t\tbr: (cornerRadius?.br || 0) * scalingRatio,\n\t};\n};\n\nexport const scalePadding = (padding: Padding | undefined, scalingRatio: number): Padding => {\n\tconst p = padding ?? { top: 0, right: 0, bottom: 0, left: 0 };\n\treturn {\n\t\t...p,\n\t\ttop: p.top ? p.top * scalingRatio : 0,\n\t\tright: p.right ? p.right * scalingRatio : 0,\n\t\tbottom: p.bottom ? p.bottom * scalingRatio : 0,\n\t\tleft: p.left ? p.left * scalingRatio : 0,\n\t};\n};\n\nexport const getScaledBorderJSON = ({\n\tobject,\n\tscalingRatio,\n}: {\n\tobject: CanvasElementJSON;\n\tscalingRatio: number;\n}): { border?: Border } => {\n\tif (isCreativeBoxJSON(object) || isGroupJSON(object) || isAudioJSON(object)) {\n\t\treturn {};\n\t}\n\tif (!('border' in object) || !object?.border) return {};\n\n\tconst border = object.border as Border;\n\n\tif (!border.strokeWidth) return {};\n\n\treturn {\n\t\tborder: {\n\t\t\t...DEFAULT_BORDER_PROPERTIES,\n\t\t\t...border,\n\t\t\tstrokeWidth: border.strokeWidth * scalingRatio,\n\t\t},\n\t};\n};\n\nexport const adaptWordStyleFontSizes = ({\n\twordStyle,\n\tscalingRatio,\n}: {\n\twordStyle: WordStyle[];\n\tscalingRatio: number;\n}): WordStyle[] => {\n\tif (!wordStyle || wordStyle.length === 0) {\n\t\treturn wordStyle;\n\t}\n\n\treturn wordStyle.map((style) => {\n\t\tif (!style.data?.styles?.fontSize) {\n\t\t\treturn style;\n\t\t}\n\n\t\tconst currentFontSizeUnit = style.data.styles.fontSizeUnit ?? '%';\n\t\tconst adaptedFontSize =\n\t\t\tcurrentFontSizeUnit === 'px'\n\t\t\t\t? Math.round(style.data.styles.fontSize * scalingRatio)\n\t\t\t\t: style.data.styles.fontSize;\n\n\t\treturn {\n\t\t\t...style,\n\t\t\tdata: {\n\t\t\t\t...style.data,\n\t\t\t\tstyles: {\n\t\t\t\t\t...style.data.styles,\n\t\t\t\t\tfontSize: adaptedFontSize,\n\t\t\t\t\tfontSizeUnit: currentFontSizeUnit,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t});\n};\n\nexport const scaleAutoFitSizes = (\n\tautoFitSizes: [number | null, number | null] | undefined,\n\tscalingRatio: number,\n\tfallbackHeight: number,\n): AutoFitSizes => {\n\tif (autoFitSizes && autoFitSizes.length === 2) {\n\t\treturn autoFitSizes.map((size) => Math.ceil((size ?? fallbackHeight) * scalingRatio)) as AutoFitSizes;\n\t}\n\treturn [...FALLBACK_AUTO_FIT_SIZES] as AutoFitSizes;\n};\n\n// ============================================================================\n// Non-Skew Positioning (edge alignment, centering, quadrant-based)\n// ============================================================================\n\nexport const getValuesWithoutSkewingJSON = ({\n\tclosestSize,\n\tadaptSize,\n\tobject,\n}: {\n\tclosestSize: string;\n\tadaptSize: string;\n\tobject: CanvasElementJSON;\n}): { left: number; top: number; width: number; height: number } => {\n\tconst referenceSize = getNormalizedSizeValue(closestSize);\n\tconst [referenceWidth, referenceHeight] = referenceSize.split('x').map(Number);\n\tconst [adaptWidth, adaptHeight] = adaptSize.split('x').map(Number);\n\n\tconst top = num(object, 'top');\n\tconst left = num(object, 'left');\n\tconst scaleX = num(object, 'scaleX', 1);\n\tconst scaleY = num(object, 'scaleY', 1);\n\tconst width = num(object, 'width', 1) * scaleX;\n\tconst height = num(object, 'height', 1) * scaleY;\n\n\tconst widthScaleFactor = adaptWidth / referenceWidth;\n\tconst heightScaleFactor = adaptHeight / referenceHeight;\n\tconst scaleFactor = Math.min(widthScaleFactor, heightScaleFactor);\n\tconst elementWidthInNewSize = Math.ceil(width * scaleFactor);\n\tconst elementHeightInNewSize = Math.ceil(height * scaleFactor);\n\n\tconst distanceFromRight = Math.abs(left + width - referenceWidth);\n\tconst distanceFromBottom = Math.abs(top + height - referenceHeight);\n\tconst distanceFromLeft = Math.abs(left);\n\tconst distanceFromTop = Math.abs(top);\n\n\tconst ALIGNMENT_THRESHOLD = 1;\n\n\tif (\n\t\tdistanceFromRight < ALIGNMENT_THRESHOLD ||\n\t\tdistanceFromLeft < ALIGNMENT_THRESHOLD ||\n\t\tdistanceFromBottom < ALIGNMENT_THRESHOLD ||\n\t\tdistanceFromTop < ALIGNMENT_THRESHOLD\n\t) {\n\t\tlet elementLeftInNewSize: number;\n\t\tlet elementTopInNewSize: number;\n\n\t\tif (distanceFromRight < ALIGNMENT_THRESHOLD) {\n\t\t\telementLeftInNewSize = adaptWidth - elementWidthInNewSize;\n\t\t} else if (distanceFromLeft < ALIGNMENT_THRESHOLD) {\n\t\t\telementLeftInNewSize = 0;\n\t\t} else {\n\t\t\tconst elementLeftPercentage = left / referenceWidth;\n\t\t\telementLeftInNewSize = Math.ceil(elementLeftPercentage * adaptWidth);\n\t\t}\n\n\t\tif (distanceFromBottom < ALIGNMENT_THRESHOLD) {\n\t\t\telementTopInNewSize = adaptHeight - elementHeightInNewSize;\n\t\t} else if (distanceFromTop < ALIGNMENT_THRESHOLD) {\n\t\t\telementTopInNewSize = 0;\n\t\t} else {\n\t\t\tconst elementTopPercentage = top / referenceHeight;\n\t\t\telementTopInNewSize = Math.ceil(elementTopPercentage * adaptHeight);\n\t\t}\n\n\t\treturn {\n\t\t\tleft: elementLeftInNewSize,\n\t\t\ttop: elementTopInNewSize,\n\t\t\twidth: elementWidthInNewSize / scaleX,\n\t\t\theight: elementHeightInNewSize / scaleY,\n\t\t};\n\t}\n\n\tconst elementCenterX = left + width / 2;\n\tconst elementCenterY = top + height / 2;\n\tconst elementRight = left + width;\n\tconst elementBottom = top + height;\n\n\tconst canvasCenterX = referenceWidth / 2;\n\tconst canvasCenterY = referenceHeight / 2;\n\n\tconst leftArea =\n\t\tMath.max(0, Math.min(elementRight, canvasCenterX) - Math.max(left, 0)) *\n\t\tMath.max(0, Math.min(elementBottom, referenceHeight) - Math.max(top, 0));\n\tconst rightArea =\n\t\tMath.max(0, Math.min(elementRight, referenceWidth) - Math.max(left, canvasCenterX)) *\n\t\tMath.max(0, Math.min(elementBottom, referenceHeight) - Math.max(top, 0));\n\n\tconst totalArea = leftArea + rightArea;\n\tconst CENTER_THRESHOLD = 0.05;\n\n\tconst isHorizontallyCentered = Math.abs(leftArea - rightArea) / totalArea < CENTER_THRESHOLD;\n\n\tif (isHorizontallyCentered) {\n\t\tconst centerXPercentage = elementCenterX / referenceWidth;\n\t\tconst centerYPercentage = elementCenterY / referenceHeight;\n\t\tconst newCenterX = centerXPercentage * adaptWidth;\n\t\tconst newCenterY = centerYPercentage * adaptHeight;\n\n\t\treturn {\n\t\t\tleft: newCenterX - elementWidthInNewSize / 2,\n\t\t\ttop: newCenterY - elementHeightInNewSize / 2,\n\t\t\twidth: elementWidthInNewSize,\n\t\t\theight: elementHeightInNewSize,\n\t\t};\n\t}\n\n\tconst isInRightHalf = elementCenterX > canvasCenterX;\n\tconst isInBottomHalf = elementCenterY > canvasCenterY;\n\n\tconst referenceX = isInRightHalf ? elementRight / referenceWidth : left / referenceWidth;\n\tconst referenceY = isInBottomHalf ? elementBottom / referenceHeight : top / referenceHeight;\n\n\tconst newX = referenceX * adaptWidth;\n\tconst newY = referenceY * adaptHeight;\n\n\treturn {\n\t\tleft: isInRightHalf ? newX - elementWidthInNewSize : newX,\n\t\ttop: isInBottomHalf ? newY - elementHeightInNewSize : newY,\n\t\twidth: elementWidthInNewSize,\n\t\theight: elementHeightInNewSize,\n\t};\n};\n\n// ============================================================================\n// Per-Type Adapt Helpers (Non-Skew Path)\n// ============================================================================\n\nexport const adaptTextNoSkew = (\n\tobject: TextContainerJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n\tclosestHeight: number,\n): TextContainerJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\twidth: values.width,\n\t\theight: values.height,\n\t\twordSpacing: object.wordSpacing ? object.wordSpacing * scalingRatio : 0,\n\t\tpadding: scalePadding(object.padding, scalingRatio),\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t\tautoFitSizes: scaleAutoFitSizes(object.autoFitSizes, scalingRatio, closestHeight),\n\t\tfontSize: object.fontSize * scalingRatio,\n\t\twordStyle: adaptWordStyleFontSizes({ wordStyle: object.wordStyle || [], scalingRatio }),\n\t};\n};\n\nexport const adaptImageNoSkew = (\n\tobject: ImageContainerJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n\twidthRatio: number,\n\theightRatio: number,\n): ImageContainerJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\twidth: values.width,\n\t\theight: values.height,\n\t\timageScale: (object.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (object.imageLeft ?? 0) * widthRatio,\n\t\timageTop: (object.imageTop ?? 0) * heightRatio,\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t};\n};\n\nexport const adaptSvgNoSkew = (\n\tobject: SvgJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n\twidthRatio: number,\n\theightRatio: number,\n): SvgJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\twidth: values.width,\n\t\theight: values.height,\n\t\timageScale: (object.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (object.imageLeft ?? 0) * widthRatio,\n\t\timageTop: (object.imageTop ?? 0) * heightRatio,\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t} as SvgJSON;\n};\n\nexport const adaptRoundedRectNoSkew = (\n\tobject: RoundedRectJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n): RoundedRectJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\twidth: values.width,\n\t\theight: values.height,\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t};\n};\n\nexport const adaptShapeNoSkew = (\n\tobject: PathJSON | RoundedRectJSON | SvgJSON,\n\tvalues: { left: number; top: number; width: number; height: number },\n\tscalingRatio: number,\n): CanvasElementJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: values.left,\n\t\ttop: values.top,\n\t\tscaleX: (object.scaleX ?? 1) * scalingRatio,\n\t\tscaleY: (object.scaleY ?? 1) * scalingRatio,\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t} as CanvasElementJSON;\n};\n\n// ============================================================================\n// Per-Type Adapt Helpers (Skew Path)\n// ============================================================================\n\nexport const adaptTextSkew = (\n\tobject: TextContainerJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n\tclosestHeight: number,\n): TextContainerJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\twidth: object.width * widthRatio,\n\t\theight: object.height * heightRatio,\n\t\tautoFitSizes: scaleAutoFitSizes(object.autoFitSizes, scalingRatio, closestHeight),\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object: object as CanvasElementJSON, scalingRatio }),\n\t\tfontSize: object.fontSize * scalingRatio,\n\t\twordStyle: adaptWordStyleFontSizes({ wordStyle: object.wordStyle || [], scalingRatio }),\n\t};\n};\n\nexport const adaptImageSkew = (\n\tobject: ImageContainerJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n): ImageContainerJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\twidth: object.width * widthRatio,\n\t\theight: object.height * heightRatio,\n\t\timageScale: (object.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (object.imageLeft ?? 0) * widthRatio,\n\t\timageTop: (object.imageTop ?? 0) * heightRatio,\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object: object as CanvasElementJSON, scalingRatio }),\n\t};\n};\n\nexport const adaptSvgSkew = (\n\tobject: SvgJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n): SvgJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\twidth: object.width * widthRatio,\n\t\theight: object.height * heightRatio,\n\t\timageScale: (object.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (object.imageLeft ?? 0) * widthRatio,\n\t\timageTop: (object.imageTop ?? 0) * heightRatio,\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t} as SvgJSON;\n};\n\nexport const adaptRoundedRectSkew = (\n\tobject: RoundedRectJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n): RoundedRectJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\twidth: object.width * widthRatio,\n\t\theight: object.height * heightRatio,\n\t\tcornerRadius: scaleCornerRadius(object.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t};\n};\n\nexport const adaptShapeSkew = (\n\tobject: PathJSON | RoundedRectJSON | SvgJSON,\n\twidthRatio: number,\n\theightRatio: number,\n\tscalingRatio: number,\n): CanvasElementJSON => {\n\treturn {\n\t\t...object,\n\t\tleft: object.left * widthRatio,\n\t\ttop: object.top * heightRatio,\n\t\tscaleX: (object.scaleX ?? 1) * widthRatio,\n\t\tscaleY: (object.scaleY ?? 1) * heightRatio,\n\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t} as CanvasElementJSON;\n};\n\n// ============================================================================\n// Group Child Adapt Helpers\n// ============================================================================\n\nexport const adaptGroupChildText = (\n\tgroupObject: TextContainerJSON,\n\tscalingRatio: number,\n\tclosestHeight: number,\n): TextContainerJSON => {\n\treturn {\n\t\t...groupObject,\n\t\tleft: groupObject.left * scalingRatio,\n\t\ttop: groupObject.top * scalingRatio,\n\t\twidth: groupObject.width * scalingRatio,\n\t\theight: groupObject.height * scalingRatio,\n\t\twordSpacing: groupObject.wordSpacing ? groupObject.wordSpacing * scalingRatio : 0,\n\t\tpadding: scalePadding(groupObject.padding, scalingRatio),\n\t\tcornerRadius: scaleCornerRadius(groupObject.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object: groupObject as CanvasElementJSON, scalingRatio }),\n\t\tautoFitSizes: scaleAutoFitSizes(groupObject.autoFitSizes, scalingRatio, closestHeight),\n\t\tfontSize: groupObject.fontSize * scalingRatio,\n\t\twordStyle: adaptWordStyleFontSizes({ wordStyle: groupObject.wordStyle || [], scalingRatio }),\n\t};\n};\n\nexport const adaptGroupChildImage = (\n\tgroupObject: ImageContainerJSON,\n\tscalingRatio: number,\n): ImageContainerJSON => {\n\treturn {\n\t\t...groupObject,\n\t\tleft: groupObject.left * scalingRatio,\n\t\ttop: groupObject.top * scalingRatio,\n\t\twidth: groupObject.width * scalingRatio,\n\t\theight: groupObject.height * scalingRatio,\n\t\timageScale: (groupObject.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (groupObject.imageLeft ?? 0) * scalingRatio,\n\t\timageTop: (groupObject.imageTop ?? 0) * scalingRatio,\n\t\tcornerRadius: scaleCornerRadius(groupObject.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object: groupObject as CanvasElementJSON, scalingRatio }),\n\t};\n};\n\nexport const adaptGroupChildSvg = (\n\tsvgContainer: SvgJSON,\n\tscalingRatio: number,\n): SvgJSON => {\n\treturn {\n\t\t...svgContainer,\n\t\tleft: svgContainer.left * scalingRatio,\n\t\ttop: svgContainer.top * scalingRatio,\n\t\twidth: svgContainer.width * scalingRatio,\n\t\theight: svgContainer.height * scalingRatio,\n\t\timageScale: (svgContainer.imageScale ?? 1) * scalingRatio,\n\t\timageLeft: (svgContainer.imageLeft ?? 0) * scalingRatio,\n\t\timageTop: (svgContainer.imageTop ?? 0) * scalingRatio,\n\t\t...getScaledBorderJSON({ object: svgContainer as CanvasElementJSON, scalingRatio }),\n\t} as SvgJSON;\n};\n\nexport const adaptGroupChildRoundedRect = (\n\troundedRectObject: RoundedRectJSON,\n\tscalingRatio: number,\n): RoundedRectJSON => {\n\treturn {\n\t\t...roundedRectObject,\n\t\tleft: roundedRectObject.left * scalingRatio,\n\t\ttop: roundedRectObject.top * scalingRatio,\n\t\twidth: roundedRectObject.width * scalingRatio,\n\t\theight: roundedRectObject.height * scalingRatio,\n\t\tcornerRadius: scaleCornerRadius(roundedRectObject.cornerRadius, scalingRatio),\n\t\t...getScaledBorderJSON({ object: roundedRectObject as CanvasElementJSON, scalingRatio }),\n\t};\n};\n\nexport const adaptGroupChildShape = (\n\tgroupObject: CanvasElementJSON,\n\tscalingRatio: number,\n): CanvasElementJSON => {\n\treturn {\n\t\t...groupObject,\n\t\tleft: num(groupObject, 'left') * scalingRatio,\n\t\ttop: num(groupObject, 'top') * scalingRatio,\n\t\tscaleX: num(groupObject, 'scaleX', 1) * scalingRatio,\n\t\tscaleY: num(groupObject, 'scaleY', 1) * scalingRatio,\n\t\t...getScaledBorderJSON({ object: groupObject, scalingRatio }),\n\t} as CanvasElementJSON;\n};\n","import type { CanvasElementJSON, CanvasElementWithOverrides } from './types/canvas';\nimport type { ServerCapsule } from './types/capsule';\nimport { findBestReferenceSize } from './utils/sizeMatching';\nimport {\n\tisTextJSON,\n\tisImageJSON,\n\tisVideoJSON,\n\tisShapeJSON,\n\tisSVGContainerJSON,\n\tisRoundedRectJSON,\n\tisGroupJSON,\n\tisCreativeBoxJSON,\n\tisAudioJSON,\n} from './utils/typeGuards';\nimport {\n\tnum,\n\tgetAreaPercentageOfElementOnCanvasJSON,\n\tcheckIfElementShouldBeSkewed,\n\tgetValuesWithoutSkewingJSON,\n\tgetScaledBorderJSON,\n\tadaptTextNoSkew,\n\tadaptImageNoSkew,\n\tadaptSvgNoSkew,\n\tadaptRoundedRectNoSkew,\n\tadaptShapeNoSkew,\n\tadaptTextSkew,\n\tadaptImageSkew,\n\tadaptSvgSkew,\n\tadaptRoundedRectSkew,\n\tadaptShapeSkew,\n\tadaptGroupChildText,\n\tadaptGroupChildImage,\n\tadaptGroupChildSvg,\n\tadaptGroupChildRoundedRect,\n\tadaptGroupChildShape,\n} from './utils/scaling';\n\n// ============================================================================\n// Core Adapt Function (ported from frontend getAdaptedObjectsJSON)\n// Adapts canvas elements from reference size to target size with skew/non-skew paths\n// ============================================================================\n\nexport const getAdaptedObjectsJSON = ({\n\tadaptSize,\n\tobjects,\n\tclosestSize,\n}: {\n\tadaptSize: string;\n\tobjects: Record<string, CanvasElementJSON>;\n\tclosestSize: string;\n}): Record<string, CanvasElementJSON> => {\n\tconst [adaptWidth, adaptHeight] = adaptSize.split('x').map(Number);\n\tconst [closestWidth, closestHeight] = closestSize.split('x').map(Number);\n\n\tconst widthRatio = adaptWidth / closestWidth;\n\tconst heightRatio = adaptHeight / closestHeight;\n\tconst scalingRatio = Math.min(widthRatio, heightRatio);\n\n\tconst newObjects: Record<string, CanvasElementJSON> = {};\n\n\tfor (const objectId of Object.keys(objects)) {\n\t\tconst object = objects[objectId];\n\n\t\tif (object.dataType === 'CREATIVE_BOX') {\n\t\t\tnewObjects[objectId] = {\n\t\t\t\t...object,\n\t\t\t\theight: adaptHeight,\n\t\t\t\twidth: adaptWidth,\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (object.dataType === 'AUDIO') {\n\t\t\tnewObjects[objectId] = object;\n\t\t\tcontinue;\n\t\t}\n\n\t\tgetAreaPercentageOfElementOnCanvasJSON({\n\t\t\telement: object,\n\t\t\tcanvasDimensions: { width: closestWidth, height: closestHeight },\n\t\t});\n\t\tconst areaPercentage = getAreaPercentageOfElementOnCanvasJSON({\n\t\t\telement: object,\n\t\t\tcanvasDimensions: { width: closestWidth, height: closestHeight },\n\t\t});\n\n\t\tconst shouldSkew = checkIfElementShouldBeSkewed({\n\t\t\tareaPercentage,\n\t\t\treferenceLengths: {\n\t\t\t\tleft: object.left ?? 0,\n\t\t\t\ttop: object.top ?? 0,\n\t\t\t\twidth: object.width ?? 1,\n\t\t\t\theight: object.height ?? 1,\n\t\t\t\tcanvasWidth: closestWidth,\n\t\t\t\tcanvasHeight: closestHeight,\n\t\t\t},\n\t\t\ttype: object.dataType,\n\t\t});\n\n\t\t// ---- NON-SKEW PATH ----\n\t\tif (!shouldSkew) {\n\t\t\tconst values = getValuesWithoutSkewingJSON({ closestSize, adaptSize, object });\n\n\t\t\tif (values.left === 0 && values.height === 0 && values.top === 0 && values.width === 0) {\n\t\t\t\tthrow new Error('Invalid values');\n\t\t\t}\n\n\t\t\tif ('groupPath' in object && object.groupPath) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isTextJSON(object)) {\n\t\t\t\tnewObjects[objectId] = adaptTextNoSkew(object, values, scalingRatio, closestHeight);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isImageJSON(object)) {\n\t\t\t\tnewObjects[objectId] = adaptImageNoSkew(object, values, scalingRatio, widthRatio, heightRatio);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isShapeJSON(object)) {\n\t\t\t\tif (isSVGContainerJSON(object)) {\n\t\t\t\t\tnewObjects[objectId] = adaptSvgNoSkew(object, values, scalingRatio, widthRatio, heightRatio);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (isRoundedRectJSON(object)) {\n\t\t\t\t\tnewObjects[objectId] = adaptRoundedRectNoSkew(object, values, scalingRatio);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tnewObjects[objectId] = adaptShapeNoSkew(object, values, scalingRatio);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isGroupJSON(object)) {\n\t\t\t\tnewObjects[objectId] = {\n\t\t\t\t\t...object,\n\t\t\t\t\tleft: values.left,\n\t\t\t\t\ttop: values.top,\n\t\t\t\t\twidth: values.width,\n\t\t\t\t\theight: values.height,\n\t\t\t\t};\n\n\t\t\t\tfor (const groupObjectId of object.objects) {\n\t\t\t\t\tconst groupObject = objects[groupObjectId];\n\t\t\t\t\tif (!groupObject) continue;\n\n\t\t\t\t\tif (isTextJSON(groupObject)) {\n\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildText(\n\t\t\t\t\t\t\tgroupObject,\n\t\t\t\t\t\t\tscalingRatio,\n\t\t\t\t\t\t\tclosestHeight,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (isImageJSON(groupObject)) {\n\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildImage(groupObject, scalingRatio);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (isShapeJSON(groupObject)) {\n\t\t\t\t\t\tif (isSVGContainerJSON(groupObject)) {\n\t\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildSvg(groupObject, scalingRatio);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isRoundedRectJSON(groupObject)) {\n\t\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildRoundedRect(\n\t\t\t\t\t\t\t\tgroupObject,\n\t\t\t\t\t\t\t\tscalingRatio,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnewObjects[groupObjectId] = adaptGroupChildShape(groupObject, scalingRatio);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// ---- SKEW PATH ----\n\t\tif (isTextJSON(object)) {\n\t\t\tnewObjects[objectId] = adaptTextSkew(object, widthRatio, heightRatio, scalingRatio, closestHeight);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isImageJSON(object)) {\n\t\t\tnewObjects[objectId] = adaptImageSkew(object, widthRatio, heightRatio, scalingRatio);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isShapeJSON(object)) {\n\t\t\tif (isSVGContainerJSON(object)) {\n\t\t\t\tnewObjects[objectId] = adaptSvgSkew(object, widthRatio, heightRatio, scalingRatio);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (isRoundedRectJSON(object)) {\n\t\t\t\tnewObjects[objectId] = adaptRoundedRectSkew(object, widthRatio, heightRatio, scalingRatio);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnewObjects[objectId] = adaptShapeSkew(object, widthRatio, heightRatio, scalingRatio);\n\t\t\tcontinue;\n\t\t}\n\n\t\tnewObjects[objectId] = {\n\t\t\t...object,\n\t\t\tleft: num(object, 'left') * widthRatio,\n\t\t\ttop: num(object, 'top') * heightRatio,\n\t\t\twidth: num(object, 'width', 1) * widthRatio,\n\t\t\theight: num(object, 'height', 1) * heightRatio,\n\t\t\t...getScaledBorderJSON({ object, scalingRatio }),\n\t\t} as CanvasElementJSON;\n\t}\n\n\treturn newObjects;\n};\n\n// ============================================================================\n// Overrides Resolution\n// ============================================================================\n\n/**\n * Resolve CanvasElementWithOverrides to flat CanvasElementJSON for a given sizeId.\n * Applies overrides[sizeId] onto the base object.\n */\nexport const resolveObjectsForSize = (\n\tobjects: Record<string, CanvasElementWithOverrides<CanvasElementJSON>>,\n\tsizeId: string,\n): Record<string, CanvasElementJSON> => {\n\tconst resolved: Record<string, CanvasElementJSON> = {};\n\tfor (const [id, obj] of Object.entries(objects)) {\n\t\tconst sizeOverrides = obj.overrides?.[sizeId] || {};\n\t\tconst { overrides: _overrides, zIndex: _zIndex, ...base } = obj as Record<string, unknown>;\n\t\tresolved[id] = { ...base, ...sizeOverrides } as CanvasElementJSON;\n\t}\n\treturn resolved;\n};\n\n/**\n * Convert adapted flat objects back to overrides on the original objects.\n * For each layer, the adapted result is stored as overrides[newSizeId].\n */\nexport const applyAdaptedAsOverrides = (\n\toriginalObjects: Record<string, CanvasElementWithOverrides<CanvasElementJSON>>,\n\tadaptedObjects: Record<string, CanvasElementJSON>,\n\tnewSizeId: string,\n): Record<string, CanvasElementWithOverrides<CanvasElementJSON>> => {\n\tconst result = JSON.parse(JSON.stringify(originalObjects)) as Record<\n\t\tstring,\n\t\tCanvasElementWithOverrides<CanvasElementJSON>\n\t>;\n\n\tfor (const [layerId, adapted] of Object.entries(adaptedObjects)) {\n\t\tif (!result[layerId]) continue;\n\n\t\tconst existingOverrides = result[layerId].overrides || {};\n\t\tresult[layerId].overrides = {\n\t\t\t...existingOverrides,\n\t\t\t[newSizeId]: {\n\t\t\t\t...adapted,\n\t\t\t\tzIndex: result[layerId].overrides?.[newSizeId]?.zIndex ?? result[layerId].zIndex ?? 0,\n\t\t\t} as Partial<CanvasElementJSON> & { zIndex: number },\n\t\t};\n\t}\n\n\treturn result;\n};\n\n// ============================================================================\n// Layout-Only Merge (for vector similarity flow)\n// ============================================================================\n\nconst LAYOUT_KEYS_COMMON = ['left', 'top', 'width', 'height', 'angle', 'visible'] as const;\nconst LAYOUT_KEYS_TEXT_EXTRA = ['fontSize', 'autoFitSizes', 'padding', 'wordSpacing'] as const;\nconst LAYOUT_KEYS_IMAGE_VIDEO_EXTRA = ['imageScale', 'imageLeft', 'imageTop', 'objectFit', 'imageOriginX', 'imageOriginY'] as const;\nconst LAYOUT_KEYS_SVG_EXTRA = ['imageScale', 'imageLeft', 'imageTop', 'scaleX', 'scaleY', 'objectFit', 'imageOriginX', 'imageOriginY'] as const;\nconst LAYOUT_KEYS_PATH = ['left', 'top', 'angle', 'visible', 'scaleX', 'scaleY'] as const;\n\n/**\n * Get the list of layout/positioning property keys for a given element type.\n * These are the only properties that should be taken from a reference layout\n * (e.g. output capsule from vector search) while preserving all styling/branding\n * from the base object.\n */\nconst getLayoutKeysForElement = (element: CanvasElementJSON): readonly string[] => {\n\tif (isCreativeBoxJSON(element) || isAudioJSON(element)) {\n\t\treturn [];\n\t}\n\tif (isTextJSON(element)) {\n\t\treturn [...LAYOUT_KEYS_COMMON, ...LAYOUT_KEYS_TEXT_EXTRA];\n\t}\n\tif (isImageJSON(element) || isVideoJSON(element)) {\n\t\treturn [...LAYOUT_KEYS_COMMON, ...LAYOUT_KEYS_IMAGE_VIDEO_EXTRA];\n\t}\n\tif (isShapeJSON(element)) {\n\t\tif (isSVGContainerJSON(element)) {\n\t\t\treturn [...LAYOUT_KEYS_COMMON, ...LAYOUT_KEYS_SVG_EXTRA];\n\t\t}\n\t\tif (isRoundedRectJSON(element)) {\n\t\t\treturn LAYOUT_KEYS_COMMON;\n\t\t}\n\t\treturn LAYOUT_KEYS_PATH;\n\t}\n\tif (isGroupJSON(element)) {\n\t\treturn LAYOUT_KEYS_COMMON;\n\t}\n\treturn LAYOUT_KEYS_COMMON;\n};\n\n/**\n * Merge only layout/positioning properties from a reference object onto a base object.\n *\n * Used in the vector similarity flow: the base object comes from base-layout-adapt\n * of the INPUT capsule (preserving all styling, branding, content), while the\n * reference provides the spatial arrangement from the OUTPUT capsule.\n *\n * Properties transferred per type:\n * - All: left, top, width, height, angle, visible\n * - Text: + fontSize, autoFitSizes, padding, wordSpacing\n * - Image/Video: + imageScale, imageLeft, imageTop\n * - SVG: + imageScale, imageLeft, imageTop, scaleX, scaleY\n * - Path: left, top, scaleX, scaleY, angle, visible (no width/height)\n * - Group: left, top, width, height, angle, visible (children handled separately)\n * - CreativeBox/Audio: no merge (pass-through)\n */\nexport const mergeLayoutFromReference = (\n\tbase: CanvasElementJSON,\n\tlayoutReference: CanvasElementJSON,\n): CanvasElementJSON => {\n\tif (isCreativeBoxJSON(base) || isAudioJSON(base)) {\n\t\treturn base;\n\t}\n\n\tconst layoutKeys = getLayoutKeysForElement(base);\n\tconst merged = { ...base } as Record<string, unknown>;\n\tconst ref = layoutReference as Record<string, unknown>;\n\n\tfor (const key of layoutKeys) {\n\t\tif (ref[key] !== undefined) {\n\t\t\tmerged[key] = ref[key];\n\t\t}\n\t}\n\n\treturn merged as CanvasElementJSON;\n};\n\n/**\n * Batch version: merges layout from reference objects onto base objects.\n * For each layer, if a matching reference exists, layout properties are taken from it;\n * otherwise the base-adapted object is kept as-is.\n */\nexport const mergeLayoutFromReferenceObjects = (\n\tbaseObjects: Record<string, CanvasElementJSON>,\n\treferenceObjects: Record<string, CanvasElementJSON>,\n): Record<string, CanvasElementJSON> => {\n\tconst merged: Record<string, CanvasElementJSON> = {};\n\tfor (const [layerId, baseObj] of Object.entries(baseObjects)) {\n\t\tif (referenceObjects[layerId]) {\n\t\t\tmerged[layerId] = mergeLayoutFromReference(baseObj, referenceObjects[layerId]);\n\t\t} else {\n\t\t\tmerged[layerId] = baseObj;\n\t\t}\n\t}\n\treturn merged;\n};\n\n// ============================================================================\n// Capsule Construction\n// ============================================================================\n\n/**\n * Builds a new ServerCapsule with an added size. Handles canvasData.variant.sizes,\n * savedCustomDimensions, newAddedSizes, and creativesOrder.\n */\nexport const buildNewCapsule = ({\n\toriginalCapsule,\n\tupdatedObjects,\n\tsizeId,\n\treferenceCreativeId,\n\tsizeToGenerate,\n\tsizeName,\n\tsizeCategory,\n\tvideoLength,\n}: {\n\toriginalCapsule: ServerCapsule;\n\tupdatedObjects: Record<string, CanvasElementWithOverrides<CanvasElementJSON>>;\n\tsizeId: string;\n\treferenceCreativeId: string;\n\tsizeToGenerate: string;\n\tsizeName?: string;\n\tsizeCategory?: string;\n\tvideoLength?: number;\n}): ServerCapsule => {\n\tconst [widthOfNewSize, heightOfNewSize] = sizeToGenerate.split('x').map(Number);\n\n\tconst canvasData = JSON.parse(JSON.stringify(originalCapsule.canvasData));\n\tcanvasData.variant.objects = updatedObjects;\n\n\tcanvasData.variant.sizes[sizeId] = {\n\t\twidth: widthOfNewSize,\n\t\theight: heightOfNewSize,\n\t\tid: sizeId,\n\t\tdisplayName: sizeName || sizeToGenerate,\n\t\trulers: [],\n\t\t...(videoLength !== undefined && { videoLength }),\n\t};\n\n\tconst creativesOrder = originalCapsule.creativesOrder;\n\tconst finalCreativesOrder =\n\t\tcreativesOrder && creativesOrder.length > 0\n\t\t\t? [...creativesOrder, sizeId]\n\t\t\t: [referenceCreativeId, sizeId];\n\n\tconst newSizeData = {\n\t\tname: sizeName || sizeToGenerate,\n\t\twidth: widthOfNewSize,\n\t\theight: heightOfNewSize,\n\t\tactive: true,\n\t\tthumbnail: '',\n\t\tcreativeUrl: '',\n\t\t...(sizeCategory && { category: sizeCategory }),\n\t};\n\n\treturn {\n\t\t...originalCapsule,\n\t\tcanvasData,\n\t\tsavedCustomDimensions: {\n\t\t\t...originalCapsule.savedCustomDimensions,\n\t\t\t[sizeId]: newSizeData,\n\t\t},\n\t\tnewAddedSizes: {\n\t\t\t...originalCapsule.newAddedSizes,\n\t\t\t[sizeId]: newSizeData,\n\t\t},\n\t\tcreativesOrder: finalCreativesOrder,\n\t};\n};\n\n// ============================================================================\n// Top-Level Entry Function\n// ============================================================================\n\n/**\n * Generate a base layout for a new size.\n *\n * Takes the original capsule and target size params, returns a new ServerCapsule\n * with the adapted layout. Follows the frontend's getAdaptedObjectsJSON logic exactly.\n */\nexport const generateBaseLayoutForSize = ({\n\toriginalCapsule,\n\tcapsuleId,\n\tcreativeId,\n\tsizeId,\n\tsizeToGenerate,\n\tsizeName,\n\tsizeCategory,\n}: {\n\toriginalCapsule: ServerCapsule;\n\tcapsuleId: string;\n\tcreativeId: string | null;\n\tsizeId: string;\n\tsizeToGenerate: string;\n\tsizeName?: string;\n\tsizeCategory?: string;\n}): ServerCapsule => {\n\tconst availableSizes = originalCapsule.canvasData.variant?.sizes;\n\n\tif (!availableSizes || Object.keys(availableSizes).length === 0) {\n\t\tthrow new Error(`No sizes available in capsule: ${capsuleId}`);\n\t}\n\n\tlet referenceCreativeId: string;\n\n\tif (creativeId && availableSizes[creativeId]) {\n\t\treferenceCreativeId = creativeId;\n\t\tconsole.log(`[BaseLayoutAdapter] Using provided reference size: ${referenceCreativeId}`);\n\t} else {\n\t\treferenceCreativeId = findBestReferenceSize(availableSizes, sizeToGenerate);\n\t\tconsole.log(\n\t\t\t`[BaseLayoutAdapter] Found best reference size: ${referenceCreativeId} for target: ${sizeToGenerate}`,\n\t\t);\n\n\t\tif (creativeId && !availableSizes[creativeId]) {\n\t\t\tconsole.warn(\n\t\t\t\t`[BaseLayoutAdapter] Provided creativeId ${creativeId} not found, using ${referenceCreativeId}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst currentSize = availableSizes[referenceCreativeId];\n\tconst closestSize = `${currentSize.width}x${currentSize.height}`;\n\tconst variantObjects = originalCapsule.canvasData.variant.objects;\n\n\tconst resolvedObjects = resolveObjectsForSize(variantObjects, referenceCreativeId);\n\n\tconst adaptedObjects = getAdaptedObjectsJSON({\n\t\tadaptSize: sizeToGenerate,\n\t\tobjects: resolvedObjects,\n\t\tclosestSize,\n\t});\n\n\tconst updatedObjects = applyAdaptedAsOverrides(variantObjects, adaptedObjects, sizeId);\n\n\treturn buildNewCapsule({\n\t\toriginalCapsule,\n\t\tupdatedObjects,\n\t\tsizeId,\n\t\treferenceCreativeId,\n\t\tsizeToGenerate,\n\t\tsizeName,\n\t\tsizeCategory,\n\t\tvideoLength: currentSize?.videoLength,\n\t});\n};\n","import type { fabric } from 'fabric';\nimport type { IGradientOptions, IObjectOptions, IPatternOptions } from 'fabric/fabric-impl';\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\nexport type Prettify<T> = {\n\t[P in keyof T]: T[P];\n};\n\n// ============================================================================\n// Primitive Types\n// ============================================================================\n\nexport type Radius = {\n\ttl?: number;\n\ttr?: number;\n\tbl?: number;\n\tbr?: number;\n};\n\nexport type AutoFitSizes = [number, number];\n\nexport type Scale =\n\t| { scale: number; scaleX?: never; scaleY?: never }\n\t| { scale?: never; scaleX: number; scaleY: number };\n\nexport type ObjectFit = 'fill' | 'fit' | 'crop';\nexport type TextCase = 'uppercase' | 'lowercase' | 'titlecase' | 'none';\nexport type FontStyle = 'normal' | 'italic' | 'oblique';\nexport type ORIGIN_X = 'left' | 'center' | 'right';\nexport type ORIGIN_Y = 'top' | 'middle' | 'bottom';\n\nexport type FontMetaData = {\n\tfontId: string;\n\tfontUrl: string;\n};\n\nexport type ObjectPosition =\n\t| 'top-left'\n\t| 'top-center'\n\t| 'top-right'\n\t| 'center-left'\n\t| 'center'\n\t| 'center-right'\n\t| 'bottom-left'\n\t| 'bottom-center'\n\t| 'bottom-right'\n\t| 'custom';\n\nexport type Padding = {\n\tall?: number;\n\ttop?: number;\n\tright?: number;\n\tbottom?: number;\n\tleft?: number;\n};\n\n// ============================================================================\n// Border & Fill Types\n// ============================================================================\n\nexport type BorderPosition = 'center' | 'inside' | 'outside';\n\nexport type Border = {\n\tcolor?: string;\n\tstyle?: 'dashed' | 'solid';\n\ttop?: number;\n\tright?: number;\n\tbottom?: number;\n\tleft?: number;\n\tposition?: BorderPosition;\n\tdashWidth?: number;\n\tdashGap?: number;\n\tdashCap?: string;\n\tstroke?: string;\n\tstrokeWidth?: number;\n\tstrokeDashArray?: number[];\n};\n\nexport type FillOptions = IGradientOptions | IPatternOptions | string;\nexport type SerializedFillType = string | IPatternOptions | IGradientOptions;\nexport type SerializedFabricShadow = Pick<fabric.Shadow, 'color' | 'blur' | 'offsetX' | 'offsetY'>;\n\nexport type SerializedImageFilter = {\n\tbrightness?: number;\n\tsaturation?: number;\n\tcontrast?: number;\n\tinvert?: boolean;\n\tblur?: number;\n};\n\nexport type ColorMap = {\n\t[key: string]: FillOptions;\n};\n\n// ============================================================================\n// Element Constants & Enums\n// ============================================================================\n\nexport const CANVAS_EDITOR_ELEMENT = {\n\tTEXT: 'TEXT',\n\tSHAPE: 'SHAPE',\n\tIMAGE: 'IMAGE',\n\tGROUP: 'GROUP',\n\tCREATIVE_BOX: 'CREATIVE_BOX',\n\tVIDEO: 'VIDEO',\n\tAUDIO: 'AUDIO',\n\tCANVAS_MASK: 'CANVAS_MASK',\n} as const;\n\nexport type CANVAS_EDITOR_ELEMENT_TYPE = (typeof CANVAS_EDITOR_ELEMENT)[keyof typeof CANVAS_EDITOR_ELEMENT];\n\nexport enum CreativeElementCategory {\n\tHERO_IMAGE = 'HERO_IMAGE',\n\tPRODUCT_IMAGE = 'PRODUCT_IMAGE',\n\tBACKGROUND = 'BACKGROUND',\n\tLOGO = 'LOGO',\n\tICON = 'ICON',\n\tHEADLINE = 'HEADLINE',\n\tSUBHEADLINE = 'SUBHEADLINE',\n\tBODY_COPY = 'BODY_COPY',\n\tPRICE = 'PRICE',\n\tCTA = 'CTA',\n\tTERMS_CONDITIONS = 'TERMS_CONDITIONS',\n\tREVIEWS_TESTIMONIALS = 'REVIEWS_TESTIMONIALS',\n\tWARRANTY_INFO = 'WARRANTY_INFO',\n\tBADGE = 'BADGE',\n\tNEW_PRODUCT_LABEL = 'NEW_PRODUCT_LABEL',\n\tOTHER = 'OTHER',\n}\n\n// ============================================================================\n// Layer & Group Types\n// ============================================================================\n\nexport type LayerRules = {\n\teditingLocked?: boolean;\n\tmaxCharCount?: number;\n};\n\nexport type GroupPath = string | null;\n\n// ============================================================================\n// Word Style Types\n// ============================================================================\n\nexport enum WORD_STYLE_TYPE {\n\tWORD_STYLE = 'WORD_STYLE',\n\tMISSING_GLYPH = 'MISSING_GLYPH',\n\tVARIABLES = 'VARIABLES',\n}\n\nexport type WordStyleStyles = {\n\tfontFamily?: string;\n\tfontSize?: number;\n\tfontSizeUnit?: 'px' | '%';\n\tfontWeight?: string | number;\n\tfontStyle?: FontStyle;\n\ttextDecoration?: string;\n\ttextAlign?: string;\n\ttextBackgroundColor?: string;\n\tfill?: string;\n\tstroke?: string;\n\tstrokeWidth?: number;\n\tdeltaY?: number;\n\tlinethrough?: boolean;\n\tunderline?: boolean;\n\tsubscript?: boolean;\n\tsuperscript?: boolean;\n\tlinethroughOffset?: number;\n\tunderlineOffset?: number;\n\toffsets?: {\n\t\tlinethrough?: number;\n\t\tunderline?: number;\n\t\toverline?: number;\n\t};\n};\n\nexport type WordStyle = {\n\tid: string;\n\ttype?: WORD_STYLE_TYPE;\n\tvariableId?: string;\n\tfontMetaDataWS?: {\n\t\tfontId?: string;\n\t\tfontUrl?: string;\n\t\tname?: string;\n\t} | null;\n\tdata: {\n\t\tstart: number;\n\t\tend: number;\n\t\tstyles: WordStyleStyles;\n\t};\n};\n\nexport type WordStyles = Array<WordStyle>;\n\n// ============================================================================\n// Animation Types (inlined from Animations module)\n// ============================================================================\n\nexport type Point = {\n\tx: number;\n\ty: number;\n};\n\nexport type TranslateKeyframes = {\n\tid: string;\n\toffset: number;\n\tx: number;\n\ty: number;\n\tP1?: Point;\n\tP2?: Point;\n};\n\nexport type ScaleKeyframes = {\n\tid: string;\n\toffset: number;\n\tscaleX: number;\n\tscaleY: number;\n};\n\nexport type RotateKeyframes = {\n\tid: string;\n\toffset: number;\n\tangle: number;\n};\n\nexport type OpacityKeyframes = {\n\tid: string;\n\toffset: number;\n\topacity: number;\n};\n\nexport type AnimationTrack = {\n\ttranslate?: TranslateKeyframes[];\n\tscale?: ScaleKeyframes[];\n\trotate?: RotateKeyframes[];\n\topacity?: OpacityKeyframes[];\n};\n\nexport type AnimationReference = Partial<{\n\tcoordinates: Point;\n\torigin: Point;\n\tscale: Point;\n\trotate: number;\n\topacity: number;\n\ttrack: AnimationTrack;\n\toriginalReference: AnimationReference;\n}>;\n\nexport enum TextAnimationType {\n\tCHARACTER = 'character',\n\tWORD = 'word',\n\tLINE = 'line',\n}\n\nexport enum AnimationSpecialCase {\n\tTYPING_EFFECT = 'typing-effect',\n\tNONE = 'none',\n}\n\nexport type TextAnimationKeyframe = {\n\toffset: number;\n\ty?: number;\n\topacity?: number;\n};\n\nexport type TextAnimation = {\n\t_id: string;\n\ttype: TextAnimationType;\n\tclipped?: boolean;\n\treverse?: boolean;\n\tspecialCase?: AnimationSpecialCase | null;\n\tname: string;\n\tkeyframes: TextAnimationKeyframe[];\n\tstart: number;\n\tend: number;\n\tloop?: number;\n};\n\n// ============================================================================\n// Serialized Fabric Types (needed for BaseElementJSON)\n// ============================================================================\n\nexport type SerializedRoundedRect = SerializedFabricBaseObject & {\n\tproperties?: {\n\t\tlayerStartTime?: number;\n\t\tlayerEndTime?: number;\n\t\tvisible?: boolean;\n\t\tfill?: string;\n\t\toutputFormat?: string;\n\t\tlayerRules?: LayerRules;\n\t\tclipPathId?: string;\n\t\tclipPathParentId?: string;\n\t};\n\tanimatable?: boolean;\n};\n\nexport type SerializedFabricBaseObject = Pick<\n\tIObjectOptions,\n\t| 'originX'\n\t| 'originY'\n\t| 'left'\n\t| 'top'\n\t| 'width'\n\t| 'height'\n\t| 'stroke'\n\t| 'strokeWidth'\n\t| 'strokeDashArray'\n\t| 'strokeLineCap'\n\t| 'strokeDashOffset'\n\t| 'strokeLineJoin'\n\t| 'strokeUniform'\n\t| 'strokeMiterLimit'\n\t| 'scaleX'\n\t| 'scaleY'\n\t| 'angle'\n\t| 'flipX'\n\t| 'flipY'\n\t| 'opacity'\n\t| 'visible'\n\t| 'backgroundColor'\n\t| 'fillRule'\n\t| 'paintFirst'\n\t| 'globalCompositeOperation'\n\t| 'skewX'\n\t| 'skewY'\n\t| 'data'\n\t| 'selectable'\n\t| 'hoverCursor'\n\t| 'moveCursor'\n\t| 'hasControls'\n\t| 'hasBorders'\n\t| 'lockRotation'\n\t| 'lockMovementY'\n\t| 'lockScalingX'\n\t| 'lockScalingY'\n\t| 'lockSkewingX'\n\t| 'lockSkewingY'\n\t| 'lockScalingFlip'\n\t| 'inverted'\n\t| 'absolutePositioned'\n\t| 'centeredScaling'\n> & {\n\tversion: '5.3.0';\n\ttype:\n\t\t| 'rect'\n\t\t| 'circle'\n\t\t| 'triangle'\n\t\t| 'line'\n\t\t| 'polygon'\n\t\t| 'polyline'\n\t\t| 'path'\n\t\t| 'group'\n\t\t| 'image'\n\t\t| 'text'\n\t\t| 'rounded-rect'\n\t\t| 'text-container'\n\t\t| 'image-container'\n\t\t| 'custom-textbox'\n\t\t| 'shape-container'\n\t\t| 'video-container'\n\t\t| 'audio-container'\n\t\t| 'svg-container'\n\t\t| 'group-container';\n\tfill?: SerializedFillType;\n\tshadow?: SerializedFabricShadow;\n\tglobalCompositeOperation: GlobalCompositeOperation;\n\trx?: number;\n\try?: number;\n\tevented?: boolean;\n\tclipPath?: SerializedRoundedRect;\n};\n\n// ============================================================================\n// Base Element JSON\n// ============================================================================\n\nexport type BaseElementJSON = {\n\tid: string;\n\ttype: SerializedFabricBaseObject['type'];\n\tdisplayText: string;\n\tdataType: CANVAS_EDITOR_ELEMENT_TYPE;\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n\tangle: number;\n\topacity: number;\n\tshadow: SerializedFabricShadow | null;\n\tvisible: boolean;\n\tglobalCompositeOperation: GlobalCompositeOperation;\n\tselectable: boolean;\n\tfill: SerializedFillType;\n\tborder: Border;\n\tpadding: Padding;\n\tcornerRadius: Radius;\n\tlayerRules?: LayerRules;\n\tgroupPath: GroupPath;\n\tanimationTrack?: AnimationTrack;\n\tanimationReference?: AnimationReference;\n\tscaleX?: number;\n\tscaleY?: number;\n\tcategory?: CreativeElementCategory;\n};\n\n// ============================================================================\n// Canvas Element JSON Types\n// ============================================================================\n\nexport type CreativeBoxJSON = Omit<\n\tBaseElementJSON,\n\t| 'left'\n\t| 'top'\n\t| 'angle'\n\t| 'opacity'\n\t| 'shadow'\n\t| 'visible'\n\t| 'globalCompositeOperation'\n\t| 'selectable'\n\t| 'border'\n\t| 'padding'\n\t| 'cornerRadius'\n\t| 'layerRules'\n> & {\n\ttype: 'rect';\n\tdataType: 'CREATIVE_BOX';\n\tzIndex: number;\n\tlayerRules?: LayerRules;\n};\n\nexport type ImageContainerJSON = Omit<BaseElementJSON, 'type'> & {\n\ttype: 'image-container';\n\tdataType: 'IMAGE';\n\tobjectPosition: ObjectPosition;\n\timageOriginX: ORIGIN_X;\n\timageOriginY: ORIGIN_Y;\n\timageScale: number;\n\timageRotation: number;\n\timageLeft: number;\n\timageTop: number;\n\timageWidth: number;\n\timageHeight: number;\n\tobjectFit: ObjectFit;\n\tsrc: string;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\texportSrc?: string;\n\toriginalSrc?: string;\n\tdisplayText: string;\n\tlayerRules?: LayerRules;\n\tflipX?: boolean;\n\tflipY?: boolean;\n\tfilter?: Partial<SerializedImageFilter>;\n\tanimationTrack?: AnimationTrack;\n\tanimationReference?: AnimationReference;\n};\n\nexport type PathJSON = Omit<BaseElementJSON, 'border' | 'padding' | 'cornerRadius'> & {\n\ttype: 'shape-container';\n\tdataType: 'SHAPE';\n\tpath: (string | number)[][];\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\tpropertiesFill?: string;\n\tlayerRules?: LayerRules;\n} & Scale;\n\nexport type RoundedRectJSON = Omit<BaseElementJSON, 'border' | 'padding'> & {\n\ttype: 'rounded-rect';\n\tdataType: 'SHAPE';\n\tscale: number;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\tpropertiesFill?: string;\n\tdisplayText: string;\n\tlayerRules?: LayerRules;\n};\n\nexport type TextContainerJSON = Omit<BaseElementJSON, 'type'> & {\n\ttype: 'text-container';\n\tdataType: 'TEXT';\n\tautoFit: boolean;\n\tautoFitSizes: [number | null, number | null];\n\ttextCase: TextCase;\n\tserializedText: string;\n\tfontMetaData: FontMetaData;\n\tobjectPosition: ObjectPosition;\n\ttextleft: number;\n\ttextTop: number;\n\ttextHeight: number;\n\ttextFill: SerializedFillType;\n\tfontFamily: string;\n\tfontWeight: number | string;\n\tfontSize: number;\n\ttext: string;\n\tunderline: boolean;\n\toverline: boolean;\n\tlinethrough: boolean;\n\ttextAlign: string;\n\tfontStyle: '' | 'normal' | 'italic' | 'oblique';\n\tlineHeight: number;\n\tcharSpacing: number;\n\tstyles: unknown[];\n\twordStyle: WordStyles;\n\tmissingGlyphChars: [];\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\twordSpacing?: number;\n\toffsets: {\n\t\tlinethrough?: number;\n\t};\n\tlinethroughOffset: -0.315;\n\tunderlineOffset: 0.1;\n\tdisplayText: string;\n\ttextAnimationTrack?: TextAnimation;\n};\n\nexport type VideoContainerJSON = Omit<BaseElementJSON, 'type'> & {\n\ttype: 'video-container';\n\tdataType: 'VIDEO';\n\tobjectPosition: ObjectPosition;\n\timageScale: number;\n\timageLeft: number;\n\timageTop: number;\n\timageWidth: number;\n\timageHeight: number;\n\tobjectFit: ObjectFit;\n\tsrc: string;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\tvolume?: number;\n\ttrimmerStartTime?: number;\n\tdisplayText: string;\n\tlayerRules?: LayerRules;\n\timageOriginX: ORIGIN_X;\n\timageOriginY: ORIGIN_Y;\n\tflipX: boolean;\n\tflipY: boolean;\n\tfilter: Partial<SerializedImageFilter>;\n\timageRotation: number;\n\toriginalSrc?: string;\n\texportSrc?: string;\n\tanimationTrack?: AnimationTrack;\n\tanimationReference?: AnimationReference;\n};\n\nexport type AudioContainerJSON = {\n\ttype: 'audio-container';\n\tdataType: 'AUDIO';\n\tsrc: string;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tvolume?: number;\n\tid: string;\n\tdisplayText: string;\n\tselectable?: boolean;\n\ttrimmerStartTime?: number;\n\tlayerRules?: LayerRules;\n};\n\nexport type SvgJSON = Omit<BaseElementJSON, 'border' | 'padding' | 'cornerRadius' | 'fill'> & {\n\ttype: 'svg-container';\n\tdataType: 'SHAPE';\n\tsrc: string;\n\tlayerStartTime?: number;\n\tlayerEndTime?: number;\n\tpropertiesVisible?: boolean;\n\tobjectFit?: ObjectFit;\n\timageRotation?: number;\n\tobjectPosition?: ObjectPosition;\n\timageLeft?: number;\n\timageTop?: number;\n\timageWidth?: number;\n\timageHeight?: number;\n\tflipX?: boolean;\n\tflipY?: boolean;\n\timageScale: number;\n\tanimationTrack?: AnimationTrack;\n\tanimationReference?: AnimationReference;\n\tcolorMap?: ColorMap;\n\timageOriginX?: ORIGIN_X;\n\timageOriginY?: ORIGIN_Y;\n} & Scale;\n\nexport type GroupContainerJSON = Omit<\n\tBaseElementJSON,\n\t'type' | 'fill' | 'border' | 'padding' | 'cornerRadius' | 'layerRules'\n> & {\n\ttype: 'group-container';\n\tdataType: 'GROUP';\n\tobjects: string[];\n\tisAlreadyGrouped: boolean;\n\tisMaskedGroup: boolean;\n\tpropertiesVisible?: boolean;\n\tlayerRules?: LayerRules;\n};\n\n// ============================================================================\n// Union & Overrides\n// ============================================================================\n\nexport type CanvasElementJSON =\n\t| CreativeBoxJSON\n\t| ImageContainerJSON\n\t| PathJSON\n\t| RoundedRectJSON\n\t| TextContainerJSON\n\t| VideoContainerJSON\n\t| AudioContainerJSON\n\t| SvgJSON\n\t| GroupContainerJSON;\n\nexport type CanvasElementWithOverrides<T extends CanvasElementJSON> = Prettify<\n\tT & {\n\t\tzIndex: number;\n\t\toverrides: Record<string, Partial<T> & { zIndex: number }>;\n\t}\n>;\n","import { CanvasElementJSON, CanvasElementWithOverrides } from './canvas';\n\nexport type DatabaseVariant = {\n\tid: string;\n\tsizes: Record<string, DatabaseSize>;\n\tobjects: Record<string, CanvasElementWithOverrides<CanvasElementJSON>>;\n};\n\nexport type DatabaseSize = {\n\twidth: number;\n\theight: number;\n\tid: string;\n\trulers: Record<string, RulerLine>;\n\tshowRulers?: boolean;\n\tshowGrid: boolean;\n\tgrid?: GridOption;\n\trulersLocked?: boolean;\n\tdisplayName: string;\n\tvideoLength?: number;\n};\n\nexport const RULER_AXIS = {\n\tX: 'x',\n\tY: 'y',\n} as const;\n\nexport type RULER_AXIS_TYPE = (typeof RULER_AXIS)[keyof typeof RULER_AXIS];\n\nexport type RulerLine = {\n\taxis: RULER_AXIS_TYPE;\n\tvalue: number;\n\tid: string;\n};\n\nexport type GridOption = {\n\tsize: number;\n\tunit: 'PIXEL';\n\tcolor: string;\n\tsubdivisions: number;\n};\n\nexport type SavedCustomDimensions = {\n\tactive: boolean;\n\tname: string;\n\tcreativeUrl: string;\n\tthumbnail?: string;\n\twidth?: number;\n\theight?: number;\n\tfileName?: string;\n\tfileNameSource?: 'formula' | 'manual';\n};\n\nexport type OutputFormat = 'image' | 'video';\n\nexport interface ServerCapsule {\n\tvideoLength: number;\n\tname: string;\n\timage: string;\n\tauthor: string;\n\ttimestamp: string;\n\tversion: number;\n\tisDeleted: boolean;\n\tcollaborators: string[];\n\ttags: string[];\n\torientation: string;\n\tvideoBackground: string;\n\tbranding: boolean;\n\toutputFormat: OutputFormat;\n\tbrandPalettes: [];\n\tcapsuleErrors: [];\n\twithCanvas: boolean;\n\tcreativesOrder: string[];\n\t_id: string;\n\tcapsuleId: string;\n\taudio: {\n\t\tlink: string;\n\t};\n\tauthorId: string;\n\tcanvasData: {\n\t\tmetadata: {};\n\t\tvariant: DatabaseVariant;\n\t};\n\tcards: {\n\t\tid: string;\n\t\ttags: string[];\n\t\ttype: string;\n\t\tgroups: [];\n\t\timage: string;\n\t\toptions: [];\n\t\tautoTimeBasedOnElements: boolean;\n\t}[];\n\tcreatedAt: string;\n\tcreatedUsingStylingPanel: null;\n\tcustomDimensions: {\n\t\t_id: string;\n\t\twidth: number;\n\t\theight: number;\n\t};\n\texportSettings: {\n\t\tquality: string;\n\t};\n\tlastModified: string;\n\tlastModifiedId: string;\n\tlistId: string;\n\tlogoImage: string;\n\tlogoLoop: boolean;\n\tlogoPosition: string;\n\tlogoSize: number;\n\tmetadata: {\n\t\tplatform: string;\n\t\tshareString: string;\n\t\tisSaved: boolean;\n\t\tname: string;\n\t\tassetGroup: string;\n\t\temail: string;\n\t};\n\tsavedCustomDimensions: Record<string, SavedCustomDimensions>;\n\tshortId: string;\n\tteamId: string;\n\tthemeId: string;\n\ttitle: string;\n\tupdatedAt: string;\n\tvideoBackgroundExtraClasses: string;\n\tvideoIndex: number;\n\tvideoStyling: null;\n\tvideoTemplateRules: null;\n\tvisibility: string;\n\tnewAddedSizes?: Record<string, SavedCustomDimensions>;\n\tsourceCapsuleId?: string | null;\n}\n"]}