{
  "version": 3,
  "sources": ["../../../../src/lib/shapes/shared/crop.ts"],
  "sourcesContent": ["import {\n\tShapeWithCrop,\n\tTLCropInfo,\n\tTLShapeCrop,\n\tTLShapeId,\n\tVec,\n\tstructuredClone,\n} from '@tldraw/editor'\n\n/** @internal */\nexport const MIN_CROP_SIZE = 8\n\n/** @public */\nexport interface CropBoxOptions {\n\tminWidth?: number\n\tminHeight?: number\n}\n\n/** @public */\nexport function getDefaultCrop() {\n\treturn {\n\t\ttopLeft: { x: 0, y: 0 },\n\t\tbottomRight: { x: 1, y: 1 },\n\t}\n}\n\n/**\n * Original (uncropped) width and height of shape.\n *\n * @public\n */\nexport function getUncroppedSize(\n\tshapeSize: { w: number; h: number },\n\tcrop: TLShapeCrop | null\n): { w: number; h: number } {\n\tif (!crop) return { w: shapeSize.w, h: shapeSize.h }\n\tconst w = shapeSize.w / (crop.bottomRight.x - crop.topLeft.x)\n\tconst h = shapeSize.h / (crop.bottomRight.y - crop.topLeft.y)\n\treturn { w, h }\n}\n\n/** @public */\nexport function getCropBox<T extends ShapeWithCrop>(\n\tshape: T,\n\tinfo: TLCropInfo<T>,\n\topts = {} as CropBoxOptions\n):\n\t| {\n\t\t\tid: TLShapeId\n\t\t\ttype: T['type']\n\t\t\tx: number\n\t\t\ty: number\n\t\t\tprops: ShapeWithCrop['props']\n\t  }\n\t| undefined {\n\tconst { handle, change, crop } = info\n\tconst { w, h } = info.uncroppedSize\n\tconst { minWidth = MIN_CROP_SIZE, minHeight = MIN_CROP_SIZE } = opts\n\n\tconst newCrop = structuredClone(crop)\n\tconst newPoint = new Vec(shape.x, shape.y)\n\tconst pointDelta = new Vec(0, 0)\n\n\tlet hasCropChanged = false\n\n\t// Set y dimension\n\tswitch (handle) {\n\t\tcase 'top':\n\t\tcase 'top_left':\n\t\tcase 'top_right': {\n\t\t\tif (h < minHeight) break\n\t\t\thasCropChanged = true\n\t\t\t// top\n\t\t\tnewCrop.topLeft.y = newCrop.topLeft.y + change.y / h\n\t\t\tconst heightAfterCrop = h * (newCrop.bottomRight.y - newCrop.topLeft.y)\n\n\t\t\tif (heightAfterCrop < minHeight) {\n\t\t\t\tnewCrop.topLeft.y = newCrop.bottomRight.y - minHeight / h\n\t\t\t\tpointDelta.y = (newCrop.topLeft.y - crop.topLeft.y) * h\n\t\t\t} else {\n\t\t\t\tif (newCrop.topLeft.y <= 0) {\n\t\t\t\t\tnewCrop.topLeft.y = 0\n\t\t\t\t\tpointDelta.y = (newCrop.topLeft.y - crop.topLeft.y) * h\n\t\t\t\t} else {\n\t\t\t\t\tpointDelta.y = change.y\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'bottom':\n\t\tcase 'bottom_left':\n\t\tcase 'bottom_right': {\n\t\t\tif (h < minHeight) break\n\t\t\thasCropChanged = true\n\t\t\t// bottom\n\t\t\tnewCrop.bottomRight.y = Math.min(1, newCrop.bottomRight.y + change.y / h)\n\t\t\tconst heightAfterCrop = h * (newCrop.bottomRight.y - newCrop.topLeft.y)\n\n\t\t\tif (heightAfterCrop < minHeight) {\n\t\t\t\tnewCrop.bottomRight.y = newCrop.topLeft.y + minHeight / h\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// Set x dimension\n\tswitch (handle) {\n\t\tcase 'left':\n\t\tcase 'top_left':\n\t\tcase 'bottom_left': {\n\t\t\tif (w < minWidth) break\n\t\t\thasCropChanged = true\n\t\t\t// left\n\t\t\tnewCrop.topLeft.x = newCrop.topLeft.x + change.x / w\n\t\t\tconst widthAfterCrop = w * (newCrop.bottomRight.x - newCrop.topLeft.x)\n\n\t\t\tif (widthAfterCrop < minWidth) {\n\t\t\t\tnewCrop.topLeft.x = newCrop.bottomRight.x - minWidth / w\n\t\t\t\tpointDelta.x = (newCrop.topLeft.x - crop.topLeft.x) * w\n\t\t\t} else {\n\t\t\t\tif (newCrop.topLeft.x <= 0) {\n\t\t\t\t\tnewCrop.topLeft.x = 0\n\t\t\t\t\tpointDelta.x = (newCrop.topLeft.x - crop.topLeft.x) * w\n\t\t\t\t} else {\n\t\t\t\t\tpointDelta.x = change.x\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'right':\n\t\tcase 'top_right':\n\t\tcase 'bottom_right': {\n\t\t\tif (w < minWidth) break\n\t\t\thasCropChanged = true\n\t\t\t// right\n\t\t\tnewCrop.bottomRight.x = Math.min(1, newCrop.bottomRight.x + change.x / w)\n\t\t\tconst widthAfterCrop = w * (newCrop.bottomRight.x - newCrop.topLeft.x)\n\n\t\t\tif (widthAfterCrop < minWidth) {\n\t\t\t\tnewCrop.bottomRight.x = newCrop.topLeft.x + minWidth / w\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\tif (!hasCropChanged) return undefined\n\n\tnewPoint.add(pointDelta.rot(shape.rotation))\n\n\treturn {\n\t\tid: shape.id,\n\t\ttype: shape.type,\n\t\tx: newPoint.x,\n\t\ty: newPoint.y,\n\t\tprops: {\n\t\t\tw: (newCrop.bottomRight.x - newCrop.topLeft.x) * w,\n\t\t\th: (newCrop.bottomRight.y - newCrop.topLeft.y) * h,\n\t\t\tcrop: newCrop,\n\t\t},\n\t}\n}\n"],
  "mappings": "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",
  "names": []
}
