import type { OverlayRect } from "../components/editor/domEditOverlayGeometry"; import type { DomEditSelection } from "../components/editor/domEditing"; import { readElementCropInsets } from "../components/editor/domEditOverlayCrop"; /** Selection-box crop hug: the outline that makes the selection box hug the * element's committed inset crop. Crop is always-on (no mode) — the draggable * handles live in {@link DomEditCropHandles}; this only shapes the box border. * The box div itself always sits at the FULL element bounds; the hug is purely * visual — the element's inset clip-path scaled into overlay space. */ export function useCropOverlay(params: { selection: DomEditSelection | null; overlayRect: OverlayRect | null; }) { const { selection, overlayRect } = params; const cropInsets = selection ? readElementCropInsets(selection.element) : null; const hasCropInsets = Boolean( cropInsets && (cropInsets.top > 0 || cropInsets.right > 0 || cropInsets.bottom > 0 || cropInsets.left > 0), ); // Scaled insets for the crop outline child. The box div stays border-less at // full bounds; a child draws the outline ON the crop boundary (a clip on the // box would swallow the border everywhere the crop edge doesn't touch the // element edge). const sx = overlayRect && overlayRect.editScaleX > 0 ? overlayRect.editScaleX : 1; const sy = overlayRect && overlayRect.editScaleY > 0 ? overlayRect.editScaleY : 1; const cropOutlineInsetPx = cropInsets && hasCropInsets ? { top: cropInsets.top * sy, right: cropInsets.right * sx, bottom: cropInsets.bottom * sy, left: cropInsets.left * sx, } : undefined; return { hasCropInsets, cropOutlineInsetPx }; }