"use client"; import { PEN_CURSOR } from "@/preview/components/cursors"; import { usePreviewViewport } from "@/preview/components/preview-viewport"; import { useMaskHandles } from "@/masks/use-mask-handles"; import type { SnapLine } from "@/preview/preview-snap"; import { CornerHandle, CircleHandle, CanvasPathOutline, EdgeHandle, IconHandle, LineOverlay, BoundingBoxOutline, ShapeOutline, } from "./handle-primitives"; const CUSTOM_MASK_ANCHOR_SIZE = 7; const CUSTOM_MASK_TANGENT_SIZE = 6; import { Rotate01Icon, FeatherIcon } from "@hugeicons/core-free-icons"; export function MaskHandles({ onSnapLinesChange, }: { onSnapLinesChange?: (lines: SnapLine[]) => void; }) { const viewport = usePreviewViewport(); const { selectedWithMask, handlePositions, overlays, isCreatingCustomMask, handleCanvasPointerDown, handlePointerDown, handlePointerMove, handlePointerUp, } = useMaskHandles({ onSnapLinesChange }); if (!selectedWithMask) return null; const toOverlay = ({ canvasX, canvasY, }: { canvasX: number; canvasY: number; }) => viewport.canvasToOverlay({ canvasX, canvasY, }); const { x: scaleX, y: scaleY } = viewport.getDisplayScale(); const canvasOrigin = toOverlay({ canvasX: 0, canvasY: 0 }); const onPointerMove = (event: React.PointerEvent) => { if (viewport.handlePanPointerMove({ event })) { return; } handlePointerMove({ event }); }; const onPointerUp = (event: React.PointerEvent) => { if (viewport.handlePanPointerUp({ event })) { return; } handlePointerUp(); }; const handleMaskPointerDown = ({ event, handleId, }: { event: React.PointerEvent; handleId: string; }) => { if (viewport.handlePanPointerDown({ event })) { return; } handlePointerDown({ event, handleId }); }; const handleCanvasOverlayPointerDown = (event: React.PointerEvent) => { if (viewport.handlePanPointerDown({ event })) { return; } handleCanvasPointerDown({ event }); }; return (