{"version":3,"file":"index.mjs","names":["fromBlob","Square"],"sources":["../lib/background-source.tsx","../lib/editor/utils/svg-point.ts","../lib/editor/index.tsx","../lib/editor/artboard/base.tsx","../lib/editor/artboard/bounds.ts","../lib/editor/artboard/crop.tsx","../lib/editor/artboard/ellipse.tsx","../lib/editor/artboard/line.tsx","../lib/editor/artboard/pen.tsx","../lib/editor/artboard/rect.tsx","../lib/editor/artboard/text.tsx","../lib/editor/artboard/index.tsx","../lib/editor/drawables/drag-indicator.tsx","../lib/editor/cropables/square.tsx","../lib/editor/cropables/index.tsx","../lib/editor/drawables/ellipse.tsx","../lib/editor/drawables/line.tsx","../lib/editor/drawables/path.tsx","../lib/editor/drawables/rect.tsx","../lib/editor/drawables/text.tsx","../lib/editor/drawables/index.tsx","../lib/editor/drawables/resize.ts","../lib/editor/drawables/translate.ts","../lib/editor/uncontrolled.tsx"],"sourcesContent":["import type { FileTypeResult } from 'file-type';\nimport { fileTypeFromBlob as fromBlob } from 'file-type';\nimport type * as PdfJs from 'pdfjs-dist';\nimport type { DocumentInitParameters } from 'pdfjs-dist/types/src/display/api';\nimport type { FunctionComponent, ReactNode } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\n\ntype Source = string | Blob | URL;\n\nexport type RenderProps =\n  | {\n      state: 'LOADING';\n    }\n  | {\n      state: 'ERROR';\n      error: {\n        code: string;\n        details?: Error;\n      };\n    }\n  | {\n      state: 'LOADED';\n      url: string;\n      width: number;\n      height: number;\n    };\n\nexport type RenderPropFunc = (source: RenderProps) => ReactNode;\n\ntype Props = {\n  source: Source;\n  documentInitParameters?: Omit<DocumentInitParameters, 'url' | 'data'>;\n  page?: number;\n  hqPdf?: boolean;\n  children: RenderPropFunc;\n  fetcher?: (url: string) => Promise<Blob>;\n  pdfjs: () => Promise<typeof PdfJs>;\n};\n\nconst toBlob = (canvas: HTMLCanvasElement): Promise<Blob> =>\n  new Promise((resolve) => {\n    canvas.toBlob((blob) => {\n      if (blob) resolve(blob);\n    });\n  });\n\nconst defaultFetcher = async (url: string): Promise<Blob> => {\n  const res = await fetch(url);\n  return res.blob();\n};\n\nconst BackgroundSource: FunctionComponent<Props> = ({\n  fetcher = defaultFetcher,\n  source,\n  documentInitParameters,\n  page,\n  pdfjs,\n  hqPdf,\n  children,\n}) => {\n  const [sourceState, setSourceState] = useState<RenderProps>({ state: 'LOADING' });\n\n  const pdfToPng = useCallback(\n    async (blob: Blob, page: number, zoom: number) => {\n      if (!pdfjs) {\n        throw new Error('Missing pdfjs prop in BackgroundSource');\n      }\n\n      const pdfjsToUse = await pdfjs();\n      const pdfDocumentProxy = await pdfjsToUse.getDocument({\n        ...documentInitParameters,\n        url: URL.createObjectURL(blob),\n      }).promise;\n      const pdfPageProxy = await pdfDocumentProxy.getPage(page);\n      const viewport = pdfPageProxy.getViewport({ scale: zoom, rotation: 0 });\n      const canvas = document.createElement('canvas');\n      canvas.height = viewport.height;\n      canvas.width = viewport.width;\n\n      const context = canvas.getContext('2d');\n\n      if (!context) {\n        throw new Error('Missing CanvasContext 2d');\n      }\n\n      const renderContext = {\n        canvasContext: context,\n        viewport,\n        canvas,\n      };\n\n      await pdfPageProxy.render(renderContext).promise;\n\n      const height = viewport.height / zoom;\n      const width = viewport.width / zoom;\n\n      if (typeof canvas.toBlob === 'function') {\n        const blobToUse = await toBlob(canvas);\n        const png = (URL || window.webkitURL).createObjectURL(blobToUse);\n\n        return { png, width, height };\n      }\n\n      return {\n        png: canvas.toDataURL(),\n        width,\n        height,\n      };\n    },\n    [pdfjs, documentInitParameters],\n  );\n\n  const updateSource = useCallback(\n    async (sourceToUse: Source, initialSource: Source) => {\n      if (typeof window !== 'undefined' && sourceToUse instanceof window.URL) {\n        await updateSource(sourceToUse, initialSource);\n      }\n\n      if (typeof sourceToUse === 'string') {\n        setSourceState({ state: 'LOADING' });\n        try {\n          const blob = await fetcher(sourceToUse);\n          if (source !== initialSource) {\n            return;\n          }\n\n          await updateSource(blob, initialSource);\n        } catch (e) {\n          setSourceState({\n            state: 'ERROR',\n            error: { code: 'FETCHER_THREW_ERROR', details: e as Error },\n          });\n        }\n      }\n\n      if (sourceToUse instanceof Blob) {\n        setSourceState({ state: 'LOADING' });\n        let fileType: FileTypeResult | undefined;\n        try {\n          fileType = await fromBlob(sourceToUse);\n        } catch (e) {\n          setSourceState({\n            state: 'ERROR',\n            error: { code: 'DETERMINE_FILE_TYPE_FAILED', details: e as Error },\n          });\n        }\n\n        if (source !== initialSource) {\n          return;\n        }\n\n        if (!fileType) {\n          setSourceState({ state: 'ERROR', error: { code: 'UNKNOWN_FILE_TYPE' } });\n          return;\n        }\n\n        if (fileType.mime === 'application/pdf') {\n          try {\n            const imageToUse = await pdfToPng(sourceToUse, page ?? 1, 1);\n\n            if (source !== initialSource) {\n              return;\n            }\n\n            setSourceState({\n              state: 'LOADED',\n              url: imageToUse.png,\n              width: imageToUse.width,\n              height: imageToUse.height,\n            });\n          } catch (e) {\n            if (source !== initialSource) {\n              return;\n            }\n            setSourceState({\n              state: 'ERROR',\n              error: { code: 'PDF_TO_PNG_FAILED', details: e as Error },\n            });\n          }\n\n          if (hqPdf) {\n            try {\n              const hqImageToUse = await pdfToPng(sourceToUse, page ?? 1, 5);\n\n              if (source !== initialSource) {\n                return;\n              }\n\n              setSourceState({\n                state: 'LOADED',\n                url: hqImageToUse.png,\n                width: hqImageToUse.width,\n                height: hqImageToUse.height,\n              });\n            } catch (e) {\n              console.error('Failed to render PDF in higher quality', e);\n            }\n          }\n        } else {\n          try {\n            const url = (URL || window.webkitURL).createObjectURL(sourceToUse);\n\n            const img = document.createElement('img');\n            const imageElementPromise = new Promise<HTMLImageElement>((res, rej) => {\n              img.onload = () => {\n                res(img);\n              };\n              img.onerror = rej;\n            });\n            img.src = url;\n\n            const { height, width } = await imageElementPromise;\n\n            if (source !== initialSource) {\n              return;\n            }\n\n            setSourceState({\n              state: 'LOADED',\n              url,\n              width,\n              height,\n            });\n          } catch (e) {\n            if (source !== initialSource) {\n              return;\n            }\n            console.error(e);\n            setSourceState({\n              state: 'ERROR',\n              error: { code: 'DETERMINE_IMG_DIMENSIONS_FAILED', details: e as Error },\n            });\n          }\n        }\n      }\n    },\n    [fetcher, hqPdf, pdfToPng, source, page],\n  );\n\n  useEffect(() => {\n    updateSource(source, source);\n  }, [source, updateSource]);\n\n  return children(sourceState);\n};\n\nexport default BackgroundSource;\n","export type Coords = { x: number; y: number };\n\ntype ClientPoint = {\n  clientX: number;\n  clientY: number;\n};\n\nexport const createSvgPointTransformer = (element: SVGGraphicsElement) => {\n  const svg = element.closest('svg');\n  const inverseMatrix = element.getScreenCTM()?.inverse();\n\n  if (!svg || !inverseMatrix) {\n    return null;\n  }\n\n  return ({ clientX, clientY }: ClientPoint): Coords => {\n    const point = svg.createSVGPoint();\n    point.x = clientX;\n    point.y = clientY;\n\n    const transformedPoint = point.matrixTransform(inverseMatrix);\n    return { x: transformedPoint.x, y: transformedPoint.y };\n  };\n};\n","import type {\n  CSSProperties,\n  FunctionComponent,\n  PropsWithChildren,\n  MouseEvent as ReactMouseEvent,\n  WheelEvent as ReactWheelEvent,\n} from 'react';\nimport { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createSvgPointTransformer } from './utils';\n\ntype Crop = {\n  x: number;\n  y: number;\n  height: number;\n  width: number;\n};\n\nexport type Props = PropsWithChildren<{\n  backgroundUrl: string;\n  width: number;\n  height: number;\n  crop?: Crop;\n  zoom: number;\n  translateX: number;\n  translateY: number;\n  rotate: 0 | 90 | 180 | 270;\n  onZoom: (newZoom: number) => void;\n  minZoom?: number;\n  maxZoom?: number;\n  allowDrag: boolean;\n  onDragStart?: () => void;\n  onDragEnd?: () => void;\n  onDrag: (x: number, y: number) => void;\n  canvasStyle?: CSSProperties;\n  canvasClassName?: string;\n  drawMode?: string | null;\n  heightRatio?: number;\n}>;\n\nexport const PixelRatioContext = createContext(1);\n\nconst Editor: FunctionComponent<Props> = ({\n  heightRatio = 1,\n  height,\n  canvasClassName,\n  canvasStyle,\n  crop,\n  drawMode,\n  allowDrag,\n  onDrag,\n  onDragEnd,\n  onDragStart,\n  minZoom,\n  onZoom,\n  maxZoom,\n  zoom,\n  translateX,\n  translateY,\n  rotate,\n  width,\n  backgroundUrl,\n  children,\n}) => {\n  const referenceRectZoom = useRef<SVGImageElement>(null);\n  const referenceRectNoZoom = useRef<SVGRectElement>(null);\n  const [heightRatioToUse, setHeightRatioToUse] = useState<number>(heightRatio);\n\n  const zoomTranslate = useMemo(() => {\n    const matrix = [zoom, 0, 0, zoom, translateX, translateY];\n\n    if (rotate === 0) {\n      matrix[4] -= (width / 2) * (zoom - 1);\n      matrix[5] -= (height / 2) * (zoom - 1);\n    } else if (rotate === 90) {\n      // 1 0 0 1 x y -> 0 1 -1 0 x y\n      matrix[1] = matrix[0]; // eslint-disable-line prefer-destructuring\n      matrix[0] = 0;\n      matrix[2] = -matrix[3];\n      matrix[3] = 0;\n\n      matrix[4] += height + (height / 2) * (zoom - 1);\n      matrix[5] -= (width / 2) * (zoom - 1);\n    } else if (rotate === 180) {\n      // 1 0 0 1 x y -> -1 0 0 -1 x y\n      matrix[0] *= -1;\n      matrix[3] *= -1;\n\n      matrix[4] += width + (width / 2) * (zoom - 1);\n      matrix[5] += height + (height / 2) * (zoom - 1);\n    } else if (rotate === 270) {\n      // 1 0 0 1 x y -> 0 -1 1 0 x y\n      matrix[1] = -matrix[0];\n      matrix[0] = 0;\n      matrix[2] = matrix[3]; // eslint-disable-line prefer-destructuring\n      matrix[3] = 0;\n\n      matrix[4] -= (height / 2) * (zoom - 1);\n      matrix[5] += width + (width / 2) * (zoom - 1);\n    }\n\n    return `matrix(${matrix[0]}, ${matrix[1]}, ${matrix[2]}, ${matrix[3]}, ${matrix[4]}, ${matrix[5]})`;\n  }, [height, rotate, translateX, translateY, width, zoom]);\n\n  const recalcPixelRatio = useCallback(() => {\n    if (!referenceRectZoom.current) {\n      return;\n    }\n    setHeightRatioToUse(height / referenceRectZoom.current.getBoundingClientRect().height);\n  }, [height]);\n\n  const svgMouseDownHandler = useCallback(\n    (e: ReactMouseEvent<SVGElement>) => {\n      if (allowDrag) {\n        if (!referenceRectNoZoom.current) {\n          return;\n        }\n\n        const transformPoint = createSvgPointTransformer(referenceRectNoZoom.current);\n\n        if (!transformPoint) {\n          return;\n        }\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        if (onDragStart) {\n          onDragStart();\n        }\n\n        const lastCoords = transformPoint(e);\n\n        const mouseMoveHandler = (e2: MouseEvent) => {\n          const newCoords = transformPoint(e2);\n          onDrag(translateX + newCoords.x - lastCoords.x, translateY + newCoords.y - lastCoords.y);\n        };\n\n        const mouseUpHandler = () => {\n          window.removeEventListener('mousemove', mouseMoveHandler);\n          window.removeEventListener('mouseup', mouseUpHandler);\n\n          if (onDragEnd) {\n            onDragEnd();\n          }\n        };\n\n        window.addEventListener('mousemove', mouseMoveHandler);\n        window.addEventListener('mouseup', mouseUpHandler);\n      }\n    },\n    [allowDrag, onDrag, onDragEnd, onDragStart, translateX, translateY],\n  );\n\n  const handleWheel = useCallback(\n    (e: ReactWheelEvent<SVGElement>) => {\n      e.preventDefault();\n\n      const newZoom = Math.min(maxZoom || 4, Math.max(minZoom || 1, zoom - e.deltaY / 100));\n\n      onZoom(newZoom);\n    },\n    [maxZoom, minZoom, zoom, onZoom],\n  );\n\n  const canvasStyleToUse = useMemo(\n    () => ({\n      cursor: allowDrag ? 'move' : undefined,\n      ...canvasStyle,\n    }),\n    [allowDrag, canvasStyle],\n  );\n\n  const { widthToUse, heightToUse } = useMemo(() => {\n    if (rotate === 90 || rotate === 270) {\n      return { heightToUse: width, widthToUse: height };\n    }\n    return { heightToUse: height, widthToUse: width };\n  }, [height, rotate, width]);\n\n  const { vHeight, vWidth, vX, vY } = useMemo(() => {\n    if (crop && drawMode !== 'crop') {\n      const { height: cropHeight, width: cropWidth, x, y } = crop;\n\n      return {\n        vHeight: cropHeight,\n        vWidth: cropWidth,\n        vX: x,\n        vY: y,\n      };\n    }\n    return { vHeight: heightToUse, vWidth: widthToUse, vX: 0, vY: 0 };\n  }, [crop, drawMode, heightToUse, widthToUse]);\n\n  useEffect(() => {\n    window.addEventListener('resize', recalcPixelRatio);\n    recalcPixelRatio();\n    return () => {\n      window.removeEventListener('resize', recalcPixelRatio);\n    };\n  }, [recalcPixelRatio]);\n\n  return (\n    <svg\n      viewBox={`${vX} ${vY} ${vWidth} ${vHeight}`}\n      width=\"100%\"\n      height=\"100%\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n      onMouseDown={svgMouseDownHandler}\n      onWheel={handleWheel}\n      style={canvasStyleToUse}\n      className={canvasClassName}\n    >\n      <title>SVG editor canvas</title>\n      <style>\n        {`\n            @keyframes dash {\n              to {\n                stroke-dashoffset: 96;\n              }\n            }\n          `}\n      </style>\n      {/* invisible rect to determine actual width/height and convert\n          stuff to viewBox coordinates */}\n      <rect\n        x={`${vX}`}\n        y={`${vY}`}\n        width={`${vWidth}`}\n        height={`${vHeight}`}\n        ref={referenceRectNoZoom}\n        fill=\"none\"\n      />\n      {/* the zoomable part of the svg */}\n      <g transform={zoomTranslate}>\n        <image\n          xlinkHref={backgroundUrl}\n          x=\"0\"\n          y=\"0\"\n          height={`${height}`}\n          width={`${width}`}\n          ref={referenceRectZoom}\n        />\n        <PixelRatioContext.Provider value={heightRatioToUse / zoom}>\n          {children}\n        </PixelRatioContext.Provider>\n      </g>\n    </svg>\n  );\n};\n\nexport default Editor;\n","import type {\n  CSSProperties,\n  FunctionComponent,\n  PropsWithChildren,\n  MouseEvent as ReactMouseEvent,\n} from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport { createSvgPointTransformer } from '../utils';\nimport type { DragCurrent, DragStart } from './types';\n\ntype Props = PropsWithChildren<{\n  width: number;\n  height: number;\n  onMouseDown: (payload: DragStart, event: ReactMouseEvent) => void;\n  onMouseMove: (payload: DragCurrent, event: MouseEvent) => void;\n  onMouseUp: (payload: DragCurrent, event: MouseEvent) => void;\n}>;\n\nconst baseStyle: CSSProperties = {\n  cursor: 'crosshair',\n  transition: 'fill 180ms ease, stroke 180ms ease, stroke-width 180ms ease',\n};\n\nconst ArtboardBase: FunctionComponent<Props> = ({\n  width,\n  height,\n  children,\n  onMouseUp,\n  onMouseDown,\n  onMouseMove,\n}) => {\n  const [isHovered, setIsHovered] = useState(false);\n  const [isDrawing, setIsDrawing] = useState(false);\n\n  const style = useMemo<CSSProperties>(\n    () => ({\n      ...baseStyle,\n      cursor: isDrawing ? 'grabbing' : 'crosshair',\n      fill: isDrawing\n        ? 'rgba(100, 116, 139, 0.035)'\n        : isHovered\n          ? 'rgba(148, 163, 184, 0.03)'\n          : 'transparent',\n      stroke: isDrawing ? '#64748b' : isHovered ? '#94a3b8' : 'transparent',\n      strokeWidth: isDrawing ? 1 : 0.75,\n      strokeDasharray: isDrawing ? '2.5 6' : undefined,\n    }),\n    [isDrawing, isHovered],\n  );\n\n  const handleArtboardMouseDown = useCallback(\n    (e: ReactMouseEvent<SVGRectElement>) => {\n      const artboard = e.currentTarget;\n\n      const transformPoint = createSvgPointTransformer(artboard);\n\n      if (!transformPoint) {\n        return;\n      }\n\n      e.stopPropagation();\n\n      setIsDrawing(true);\n\n      const start = transformPoint(e);\n      onMouseDown({ start }, e);\n\n      const mouseMoveHandler = (e2: MouseEvent) => {\n        onMouseMove({ start, current: transformPoint(e2) }, e2);\n      };\n\n      const mouseUpHandler = (e2: MouseEvent) => {\n        window.removeEventListener('mousemove', mouseMoveHandler);\n        window.removeEventListener('mouseup', mouseUpHandler);\n\n        setIsDrawing(false);\n\n        onMouseUp({ start, current: transformPoint(e2) }, e2);\n      };\n\n      window.addEventListener('mousemove', mouseMoveHandler);\n      window.addEventListener('mouseup', mouseUpHandler);\n    },\n    [onMouseDown, onMouseMove, onMouseUp],\n  );\n\n  return (\n    <g>\n      <rect\n        style={style}\n        onMouseDown={handleArtboardMouseDown}\n        onMouseEnter={() => setIsHovered(true)}\n        onMouseLeave={() => setIsHovered(false)}\n        pointerEvents=\"bounding-box\"\n        key=\"artboard\"\n        fill=\"none\"\n        x=\"0\"\n        y=\"0\"\n        width={`${width}`}\n        height={`${height}`}\n      />\n      {children}\n    </g>\n  );\n};\n\nexport default ArtboardBase;\n","import type { BoundsInput } from './types';\n\ntype RectBounds = {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n};\n\ntype SizeBounds = {\n  width: number;\n  height: number;\n};\n\ntype MinCheckMode = 'either' | 'both';\n\nexport const getRectBoundsFromCoords = ({\n  startCoord,\n  currentCoord,\n}: BoundsInput): RectBounds | null => {\n  if (!startCoord || !currentCoord) {\n    return null;\n  }\n\n  const lowerX = Math.min(startCoord.x, currentCoord.x);\n  const lowerY = Math.min(startCoord.y, currentCoord.y);\n  const higherX = Math.max(startCoord.x, currentCoord.x);\n  const higherY = Math.max(startCoord.y, currentCoord.y);\n\n  const width = higherX - lowerX;\n  const height = higherY - lowerY;\n\n  if (width === 0 || height === 0) {\n    return null;\n  }\n\n  return {\n    x: lowerX,\n    y: lowerY,\n    width,\n    height,\n  };\n};\n\nexport const isBelowMinSize = (\n  bounds: SizeBounds,\n  minWidth: number,\n  minHeight: number,\n  mode: MinCheckMode = 'either',\n) => {\n  if (mode === 'both') {\n    return bounds.width < minWidth && bounds.height < minHeight;\n  }\n\n  return bounds.width < minWidth || bounds.height < minHeight;\n};\n\nexport const getEllipseBoundsFromCoords = (input: BoundsInput) => {\n  const rectBounds = getRectBoundsFromCoords(input);\n\n  if (!rectBounds) {\n    return null;\n  }\n\n  return {\n    cx: rectBounds.x + rectBounds.width / 2,\n    cy: rectBounds.y + rectBounds.height / 2,\n    rx: rectBounds.width / 2,\n    ry: rectBounds.height / 2,\n    width: rectBounds.width,\n    height: rectBounds.height,\n  };\n};\n\nexport const getLinePointsFromCoords = ({ startCoord, currentCoord }: BoundsInput) => {\n  if (!startCoord || !currentCoord) {\n    return null;\n  }\n\n  return {\n    x1: startCoord.x,\n    y1: startCoord.y,\n    x2: currentCoord.x,\n    y2: currentCoord.y,\n  };\n};\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport type { Coords } from '../utils';\nimport ArtboardBase from './base';\nimport { getRectBoundsFromCoords, isBelowMinSize } from './bounds';\nimport type {\n  ArtboardCanvasProps,\n  ArtboardMinSizeProps,\n  BoundsInput,\n  DragCurrent,\n  DragStart,\n} from './types';\n\nexport type Crop = {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n};\n\ntype Props = PropsWithChildren<\n  ArtboardCanvasProps &\n    ArtboardMinSizeProps & {\n      onCropEnd: (crop: Crop) => void;\n      onCropStart: () => void;\n    }\n>;\n\nconst ArtboardCrop: FunctionComponent<Props> = ({\n  width,\n  height,\n  children,\n  onCropEnd,\n  onCropStart,\n  minHeight,\n  minWidth,\n}) => {\n  const [startCoord, setStartCoord] = useState<Coords | undefined>();\n  const [currentCoord, setCurrentCoord] = useState<Coords | undefined>();\n\n  const getRectBounds = useCallback(\n    ({ startCoord, currentCoord }: BoundsInput) => {\n      const rectBounds = getRectBoundsFromCoords({ startCoord, currentCoord });\n\n      if (!rectBounds || isBelowMinSize(rectBounds, minWidth, minHeight)) {\n        return null;\n      }\n\n      return rectBounds;\n    },\n    [minHeight, minWidth],\n  );\n\n  const onMouseDown = useCallback(\n    ({ start }: DragStart) => {\n      onCropStart();\n      setStartCoord(start);\n    },\n    [onCropStart],\n  );\n\n  const onMouseMove = useCallback(({ current }: DragCurrent) => {\n    setCurrentCoord(current);\n  }, []);\n\n  const onMouseUp = useCallback(\n    ({ current, start }: DragCurrent) => {\n      const rectBounds = getRectBounds({ startCoord: start, currentCoord: current });\n\n      if (rectBounds) {\n        onCropEnd(rectBounds);\n      }\n      setCurrentCoord(undefined);\n      setStartCoord(undefined);\n    },\n    [getRectBounds, onCropEnd],\n  );\n\n  const rectBounds = useMemo(\n    () => getRectBounds({ startCoord, currentCoord }),\n    [currentCoord, getRectBounds, startCoord],\n  );\n\n  return (\n    <ArtboardBase\n      onMouseDown={onMouseDown}\n      onMouseMove={onMouseMove}\n      onMouseUp={onMouseUp}\n      width={width}\n      height={height}\n    >\n      {children}\n      {rectBounds && (\n        <path\n          d={`M0 0 H${width} V${height} H0 Z M${rectBounds.x} ${rectBounds.y} H${rectBounds.x + rectBounds.width} V${rectBounds.y + rectBounds.height} H${rectBounds.x} Z`}\n          fillRule=\"evenodd\"\n          fill=\"rgba(0,0,0,0.7)\"\n        />\n      )}\n    </ArtboardBase>\n  );\n};\n\nexport default ArtboardCrop;\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport type { Coords } from '../utils';\nimport ArtboardBase from './base';\nimport { getEllipseBoundsFromCoords, isBelowMinSize } from './bounds';\nimport type {\n  ArtboardCanvasProps,\n  ArtboardDrawCallbacksProps,\n  ArtboardFillProps,\n  ArtboardMinSizeProps,\n  ArtboardStrokeProps,\n  BoundsInput,\n  DragCurrent,\n  DragStart,\n} from './types';\n\ntype Props = PropsWithChildren<\n  ArtboardCanvasProps &\n    ArtboardDrawCallbacksProps &\n    ArtboardFillProps &\n    ArtboardStrokeProps &\n    ArtboardMinSizeProps\n>;\n\nconst ArtboardEllipse: FunctionComponent<Props> = ({\n  drawingStrokeWidth,\n  drawingStroke,\n  width,\n  drawingFill,\n  minWidth,\n  minHeight,\n  height,\n  onDrawStart,\n  onDrawEnd,\n  children,\n}) => {\n  const [startCoord, setStartCoord] = useState<Coords | undefined>();\n  const [currentCoord, setCurrentCoord] = useState<Coords | undefined>();\n  const getEllipseBounds = useCallback(\n    ({ startCoord, currentCoord }: BoundsInput) => {\n      const ellipseBounds = getEllipseBoundsFromCoords({ startCoord, currentCoord });\n\n      if (!ellipseBounds || isBelowMinSize(ellipseBounds, minWidth, minHeight)) {\n        return null;\n      }\n\n      return {\n        cx: ellipseBounds.cx,\n        cy: ellipseBounds.cy,\n        rx: ellipseBounds.rx,\n        ry: ellipseBounds.ry,\n      };\n    },\n    [minHeight, minWidth],\n  );\n\n  const onMouseDown = useCallback(\n    ({ start }: DragStart) => {\n      onDrawStart();\n      setStartCoord(start);\n    },\n    [onDrawStart],\n  );\n\n  const onMouseMove = useCallback(({ current }: DragCurrent) => {\n    setCurrentCoord(current);\n  }, []);\n\n  const onMouseUp = useCallback(\n    ({ current, start }: DragCurrent) => {\n      const ellipseBounds = getEllipseBounds({ startCoord: start, currentCoord: current });\n\n      if (ellipseBounds) {\n        const id = crypto.randomUUID();\n        onDrawEnd({\n          type: 'ellipse',\n          id,\n          ...ellipseBounds,\n          fill: drawingFill,\n          stroke: drawingStroke,\n          strokeWidth: drawingStrokeWidth,\n        });\n      }\n      setCurrentCoord(undefined);\n      setStartCoord(undefined);\n    },\n    [getEllipseBounds, onDrawEnd, drawingFill, drawingStroke, drawingStrokeWidth],\n  );\n\n  const ellipseBounds = useMemo(\n    () => getEllipseBounds({ currentCoord, startCoord }),\n    [currentCoord, getEllipseBounds, startCoord],\n  );\n\n  return (\n    <ArtboardBase\n      onMouseDown={onMouseDown}\n      onMouseMove={onMouseMove}\n      onMouseUp={onMouseUp}\n      width={width}\n      height={height}\n    >\n      {children}\n      {ellipseBounds && (\n        <ellipse\n          {...ellipseBounds}\n          key=\"ellipse\"\n          fill={drawingFill}\n          stroke={drawingStroke}\n          strokeWidth={drawingStrokeWidth}\n        />\n      )}\n    </ArtboardBase>\n  );\n};\n\nexport default ArtboardEllipse;\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport type { Coords } from '../utils';\nimport ArtboardBase from './base';\nimport { getLinePointsFromCoords } from './bounds';\nimport type {\n  ArtboardCanvasProps,\n  ArtboardDrawCallbacksProps,\n  ArtboardStrokeProps,\n  DragCurrent,\n  DragStart,\n} from './types';\n\ntype Props = PropsWithChildren<\n  ArtboardCanvasProps & ArtboardDrawCallbacksProps & ArtboardStrokeProps\n>;\n\nconst ArtboardLine: FunctionComponent<Props> = ({\n  drawingStroke,\n  drawingStrokeWidth,\n  width,\n  onDrawEnd,\n  onDrawStart,\n  height,\n  children,\n}) => {\n  const [startCoord, setStartCoord] = useState<Coords | undefined>();\n  const [currentCoord, setCurrentCoord] = useState<Coords | undefined>();\n\n  const getLinePoints = useCallback(getLinePointsFromCoords, []);\n\n  const onMouseDown = useCallback(\n    ({ start }: DragStart) => {\n      onDrawStart();\n      setStartCoord(start);\n    },\n    [onDrawStart],\n  );\n\n  const onMouseMove = useCallback(({ current }: DragCurrent) => {\n    setCurrentCoord(current);\n  }, []);\n\n  const onMouseUp = useCallback(\n    ({ current, start }: DragCurrent) => {\n      const linePoints = getLinePoints({ startCoord: start, currentCoord: current });\n\n      if (linePoints) {\n        const id = crypto.randomUUID();\n        onDrawEnd({\n          type: 'line',\n          id,\n          ...linePoints,\n          stroke: drawingStroke,\n          strokeWidth: drawingStrokeWidth,\n        });\n      }\n      setCurrentCoord(undefined);\n      setStartCoord(undefined);\n    },\n    [drawingStroke, drawingStrokeWidth, getLinePoints, onDrawEnd],\n  );\n\n  const points = useMemo(\n    () => getLinePoints({ currentCoord, startCoord }),\n    [currentCoord, getLinePoints, startCoord],\n  );\n\n  return (\n    <ArtboardBase\n      onMouseDown={onMouseDown}\n      onMouseMove={onMouseMove}\n      onMouseUp={onMouseUp}\n      width={width}\n      height={height}\n    >\n      {children}\n      {points && <line {...points} stroke={drawingStroke} strokeWidth={drawingStrokeWidth} />}\n    </ArtboardBase>\n  );\n};\n\nexport default ArtboardLine;\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { useCallback, useState } from 'react';\nimport type { Coords } from '../utils';\nimport ArtboardBase from './base';\nimport type { ArtboardCanvasProps, ArtboardDrawCallbacksProps, ArtboardStrokeProps } from './types';\n\ntype Props = PropsWithChildren<\n  ArtboardCanvasProps & ArtboardDrawCallbacksProps & ArtboardStrokeProps\n>;\n\nconst ArtboardPen: FunctionComponent<Props> = ({\n  onDrawEnd,\n  drawingStrokeWidth,\n  width,\n  onDrawStart,\n  height,\n  drawingStroke,\n  children,\n}) => {\n  const [drawingPoints, setDrawingPoints] = useState<ReadonlyArray<Coords> | undefined>(undefined);\n\n  const onMouseDown = useCallback(\n    ({ start }: { start: Coords }) => {\n      onDrawStart();\n      setDrawingPoints([start]);\n    },\n    [onDrawStart],\n  );\n\n  const onMouseMove = useCallback(({ current }: { current: Coords }) => {\n    setDrawingPoints((existingDrawingPoints) => [...(existingDrawingPoints || []), current]);\n  }, []);\n\n  const onMouseUp = useCallback(\n    ({ current }: { current: Coords; start: Coords }) => {\n      setDrawingPoints((existingDrawingPoints) => {\n        const points = [...(existingDrawingPoints || []), current];\n\n        const id = crypto.randomUUID();\n        onDrawEnd({\n          type: 'path',\n          id,\n          points,\n          stroke: drawingStroke,\n          strokeWidth: drawingStrokeWidth,\n        });\n\n        return undefined;\n      });\n    },\n    [onDrawEnd, drawingStroke, drawingStrokeWidth],\n  );\n  return (\n    <ArtboardBase\n      onMouseDown={onMouseDown}\n      onMouseMove={onMouseMove}\n      onMouseUp={onMouseUp}\n      width={width}\n      height={height}\n    >\n      {children}\n      {drawingPoints && (\n        <path\n          key=\"pen\"\n          d={`M ${drawingPoints.map((p) => p && `${p.x} ${p.y}`).join('L')}`}\n          fill=\"none\"\n          strokeWidth={drawingStrokeWidth}\n          stroke={drawingStroke}\n        />\n      )}\n    </ArtboardBase>\n  );\n};\n\nexport default ArtboardPen;\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport type { Coords } from '../utils';\nimport ArtboardBase from './base';\nimport { getRectBoundsFromCoords, isBelowMinSize } from './bounds';\nimport type {\n  ArtboardCanvasProps,\n  ArtboardDrawCallbacksProps,\n  ArtboardFillProps,\n  ArtboardMinSizeProps,\n  ArtboardStrokeProps,\n  BoundsInput,\n  DragCurrent,\n  DragStart,\n} from './types';\n\ntype Props = PropsWithChildren<\n  ArtboardCanvasProps &\n    ArtboardDrawCallbacksProps &\n    ArtboardFillProps &\n    ArtboardStrokeProps &\n    ArtboardMinSizeProps\n>;\n\nconst ArtboardRect: FunctionComponent<Props> = ({\n  width,\n  drawingStrokeWidth,\n  drawingStroke,\n  onDrawEnd,\n  drawingFill,\n  minWidth,\n  onDrawStart,\n  minHeight,\n  height,\n  children,\n}) => {\n  const [startCoord, setStartCoord] = useState<Coords | undefined>();\n  const [currentCoord, setCurrentCoord] = useState<Coords | undefined>();\n\n  const getRectBounds = useCallback(\n    ({ startCoord, currentCoord }: BoundsInput) => {\n      const rectBounds = getRectBoundsFromCoords({ startCoord, currentCoord });\n\n      if (!rectBounds || isBelowMinSize(rectBounds, minWidth, minHeight)) {\n        return null;\n      }\n\n      return rectBounds;\n    },\n    [minHeight, minWidth],\n  );\n\n  const onMouseDown = useCallback(\n    ({ start }: DragStart) => {\n      onDrawStart();\n      setStartCoord(start);\n    },\n    [onDrawStart],\n  );\n\n  const onMouseMove = useCallback(({ current }: DragCurrent) => {\n    setCurrentCoord(current);\n  }, []);\n\n  const onMouseUp = useCallback(\n    ({ current, start }: DragCurrent) => {\n      const rectBounds = getRectBounds({ startCoord: start, currentCoord: current });\n\n      if (rectBounds) {\n        const id = crypto.randomUUID();\n        onDrawEnd({\n          type: 'rect',\n          id,\n          ...rectBounds,\n          fill: drawingFill,\n          stroke: drawingStroke,\n          strokeWidth: drawingStrokeWidth,\n        });\n      }\n      setCurrentCoord(undefined);\n      setStartCoord(undefined);\n    },\n    [getRectBounds, onDrawEnd, drawingFill, drawingStroke, drawingStrokeWidth],\n  );\n\n  const rectBounds = useMemo(\n    () => getRectBounds({ startCoord, currentCoord }),\n    [currentCoord, getRectBounds, startCoord],\n  );\n  return (\n    <ArtboardBase\n      onMouseDown={onMouseDown}\n      onMouseMove={onMouseMove}\n      onMouseUp={onMouseUp}\n      width={width}\n      height={height}\n    >\n      {children}\n      {rectBounds && (\n        <rect\n          key=\"rect\"\n          {...rectBounds}\n          fill={drawingFill}\n          stroke={drawingStroke}\n          strokeWidth={drawingStrokeWidth}\n        />\n      )}\n    </ArtboardBase>\n  );\n};\n\nexport default ArtboardRect;\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport type { Coords } from '../utils';\nimport ArtboardBase from './base';\nimport { getRectBoundsFromCoords, isBelowMinSize } from './bounds';\nimport type {\n  ArtboardCanvasProps,\n  ArtboardDrawCallbacksProps,\n  ArtboardFillProps,\n  ArtboardMinSizeProps,\n  ArtboardTextProps,\n  BoundsInput,\n  DragCurrent,\n  DragStart,\n} from './types';\n\ntype Props = PropsWithChildren<\n  ArtboardCanvasProps &\n    ArtboardDrawCallbacksProps &\n    ArtboardFillProps &\n    ArtboardMinSizeProps &\n    ArtboardTextProps\n>;\n\nconst ArtboardText: FunctionComponent<Props> = ({\n  minHeight,\n  minWidth,\n  text,\n  width,\n  height,\n  onDrawEnd,\n  onDrawStart,\n  drawingFill,\n  fontSize,\n  children,\n}) => {\n  const [startCoord, setStartCoord] = useState<Coords | undefined>();\n  const [currentCoord, setCurrentCoord] = useState<Coords | undefined>();\n\n  const getTextBounds = useCallback(\n    ({ startCoord, currentCoord }: BoundsInput) => {\n      const textBounds = getRectBoundsFromCoords({ startCoord, currentCoord });\n\n      if (!textBounds || isBelowMinSize(textBounds, minWidth, minHeight, 'both')) {\n        return null;\n      }\n\n      return {\n        x: textBounds.x,\n        y: textBounds.y,\n        height: textBounds.height,\n        width: textBounds.width,\n      };\n    },\n    [minHeight, minWidth],\n  );\n\n  const onMouseDown = useCallback(\n    ({ start }: DragStart) => {\n      onDrawStart();\n      setStartCoord(start);\n    },\n    [onDrawStart],\n  );\n\n  const onMouseMove = useCallback(({ current }: DragCurrent) => {\n    setCurrentCoord(current);\n  }, []);\n\n  const onMouseUp = useCallback(\n    ({ current, start }: DragCurrent) => {\n      const textBounds = getTextBounds({ startCoord: start, currentCoord: current });\n\n      if (textBounds) {\n        const id = crypto.randomUUID();\n        onDrawEnd({\n          type: 'text',\n          id,\n          ...textBounds,\n          text,\n          fill: drawingFill,\n          fontSize,\n        });\n      }\n      setCurrentCoord(undefined);\n      setStartCoord(undefined);\n    },\n    [getTextBounds, onDrawEnd, text, drawingFill, fontSize],\n  );\n\n  const textBounds = useMemo(\n    () => getTextBounds({ startCoord, currentCoord }),\n    [currentCoord, getTextBounds, startCoord],\n  );\n\n  const keyedText = useMemo(() => {\n    const seen = new Map<string, number>();\n    return text.map((line) => {\n      const occurrence = (seen.get(line) ?? 0) + 1;\n      seen.set(line, occurrence);\n      return { line, key: `${line}-${occurrence}` };\n    });\n  }, [text]);\n\n  return (\n    <ArtboardBase\n      onMouseDown={onMouseDown}\n      onMouseMove={onMouseMove}\n      onMouseUp={onMouseUp}\n      width={width}\n      height={height}\n    >\n      {children}\n      {textBounds && (\n        <text\n          {...textBounds}\n          letterSpacing=\"1\"\n          fill={drawingFill}\n          fontFamily=\"Arial, Helvetica, sans-serif\"\n          fontSize={`${fontSize}px`}\n          alignmentBaseline=\"hanging\"\n        >\n          {keyedText.map(({ line, key }) => (\n            <tspan key={key} x={textBounds.x} dy={fontSize}>\n              {line}\n            </tspan>\n          ))}\n        </text>\n      )}\n    </ArtboardBase>\n  );\n};\n\nexport default ArtboardText;\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport type { Drawable } from '../drawables';\nimport type { Crop } from './crop';\nimport ArtboardCrop from './crop';\nimport ArtboardEllipse from './ellipse';\nimport ArtboardLine from './line';\nimport ArtboardPen from './pen';\nimport ArtboardRect from './rect';\nimport ArtboardText from './text';\n\ntype Props = PropsWithChildren<{\n  drawMode: null | 'pen' | 'rect' | 'ellipse' | 'line' | 'crop' | 'text';\n  height: number;\n  width: number;\n  onCropEnd: (crop: Crop) => void;\n  onDrawEnd: (drawable: Drawable) => void;\n  onDrawStart: () => void;\n  onCropStart: () => void;\n  drawingStroke: string;\n  drawingStrokeWidth: number;\n  drawingFill: string;\n  minHeight: number;\n  minWidth: number;\n  fontSize: number;\n  text: ReadonlyArray<string>;\n}>;\n\nconst artboards: Record<NonNullable<Props['drawMode']>, FunctionComponent<Props>> = {\n  pen: ArtboardPen,\n  rect: ArtboardRect,\n  text: ArtboardText,\n  ellipse: ArtboardEllipse,\n  line: ArtboardLine,\n  crop: ArtboardCrop,\n};\n\nconst ArtboardComponent: FunctionComponent<Props> = (props) => {\n  const Artboard = props.drawMode ? artboards[props.drawMode] : undefined;\n\n  if (!Artboard) {\n    return <>{props.children}</>;\n  }\n\n  return <Artboard {...props} />;\n};\n\nexport default ArtboardComponent;\n","import type { CSSProperties, FunctionComponent } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport type {\n  DragIndicatorBoundsOverrideProps,\n  DragIndicatorBoundsProps,\n  DragIndicatorCursorProps,\n  DragIndicatorMouseDownHandler,\n  DragIndicatorResizeHandleMouseDown,\n  DragIndicatorResizeHandlesProps,\n} from './types';\n\ntype Props = DragIndicatorBoundsProps &\n  DragIndicatorBoundsOverrideProps &\n  DragIndicatorResizeHandlesProps &\n  DragIndicatorCursorProps & {\n    id: string;\n    onDragIndicatorMouseDown: DragIndicatorMouseDownHandler;\n    selected: boolean;\n    animation?: boolean;\n  };\n\nfunction inverseDirection(\n  inverseCursorHorizontal: boolean | undefined | null,\n  inverseCursorVertical: boolean | undefined | null,\n  direction: 'nw' | 'ne' | 'se' | 'sw',\n): 'nw' | 'ne' | 'se' | 'sw' {\n  let [v, h] = `${direction}`;\n\n  if (inverseCursorVertical) {\n    v = v === 'n' ? 's' : 'n';\n  }\n\n  if (inverseCursorHorizontal) {\n    h = h === 'e' ? 'w' : 'e';\n  }\n\n  return `${v}${h}` as 'nw' | 'ne' | 'se' | 'sw';\n}\n\nconst DragIndicator: FunctionComponent<Props> = ({\n  id,\n  onDragIndicatorMouseDown,\n  onResizeHandleTopLeftMouseDown,\n  onResizeHandleTopRightMouseDown,\n  onResizeHandleBottomLeftMouseDown,\n  onResizeHandleBottomRightMouseDown,\n  diX,\n  diY,\n  diWidth,\n  diHeight,\n  diStrokeWidth,\n  selected,\n  inverseCursorHorizontal,\n  inverseCursorVertical,\n  animation = true,\n  diRight,\n  diTop,\n  diLeft,\n  diBottom,\n}) => {\n  const overlayStrokeWidth = useMemo(() => Math.max(0.65, diStrokeWidth * 0.62), [diStrokeWidth]);\n  const handleRadius = useMemo(() => Math.max(4, diStrokeWidth * 1.25), [diStrokeWidth]);\n\n  const diStyles: CSSProperties = useMemo(\n    () => ({\n      fill: selected ? 'rgba(100, 116, 139, 0.045)' : 'transparent',\n      stroke: selected ? '#64748b' : 'none',\n      strokeWidth: overlayStrokeWidth,\n      strokeDasharray: `${overlayStrokeWidth * 1.1} ${overlayStrokeWidth * 1.5}`,\n      animation: animation ? 'dash 8s linear forwards infinite' : 'none',\n      cursor: 'move',\n      transition: 'fill 180ms ease, stroke 180ms ease',\n      opacity: selected ? 0.95 : 1,\n    }),\n    [animation, overlayStrokeWidth, selected],\n  );\n\n  const makeResizeHandleStyles = useCallback(\n    (direction: 'nw' | 'ne' | 'se' | 'sw') => ({\n      fill: selected ? '#94a3b8' : 'none',\n      stroke: selected ? '#f8fafc' : 'none',\n      strokeWidth: 0.7,\n      transition: 'fill 180ms ease, stroke 180ms ease',\n      cursor: `${inverseDirection(inverseCursorHorizontal, inverseCursorVertical, direction)}-resize`,\n    }),\n    [inverseCursorHorizontal, inverseCursorVertical, selected],\n  );\n\n  const diTopToUse = useMemo(() => diTop ?? diY, [diTop, diY]);\n  const diBottomToUse = useMemo(() => diBottom ?? diY + diHeight, [diBottom, diHeight, diY]);\n  const diLeftToUse = useMemo(() => diLeft ?? diX, [diLeft, diX]);\n  const diRightToUse = useMemo(() => diRight ?? diX + diWidth, [diRight, diWidth, diX]);\n\n  const resizeHandles = useMemo(\n    () =>\n      [\n        {\n          key: 'top-left',\n          direction: 'nw' as const,\n          cx: diLeftToUse,\n          cy: diTopToUse,\n          onMouseDown: onResizeHandleTopLeftMouseDown,\n        },\n        {\n          key: 'top-right',\n          direction: 'ne' as const,\n          cx: diRightToUse,\n          cy: diTopToUse,\n          onMouseDown: onResizeHandleTopRightMouseDown,\n        },\n        {\n          key: 'bottom-left',\n          direction: 'sw' as const,\n          cx: diLeftToUse,\n          cy: diBottomToUse,\n          onMouseDown: onResizeHandleBottomLeftMouseDown,\n        },\n        {\n          key: 'bottom-right',\n          direction: 'se' as const,\n          cx: diRightToUse,\n          cy: diBottomToUse,\n          onMouseDown: onResizeHandleBottomRightMouseDown,\n        },\n      ].filter(\n        (\n          handle,\n        ): handle is {\n          key: string;\n          direction: 'nw' | 'ne' | 'sw' | 'se';\n          cx: number;\n          cy: number;\n          onMouseDown: DragIndicatorResizeHandleMouseDown;\n        } => Boolean(handle.onMouseDown),\n      ),\n    [\n      diBottomToUse,\n      diLeftToUse,\n      diRightToUse,\n      diTopToUse,\n      onResizeHandleBottomLeftMouseDown,\n      onResizeHandleBottomRightMouseDown,\n      onResizeHandleTopLeftMouseDown,\n      onResizeHandleTopRightMouseDown,\n    ],\n  );\n\n  return (\n    <g>\n      <rect\n        style={diStyles}\n        pointerEvents=\"bounding-box\"\n        x={diX}\n        y={diY}\n        width={diWidth}\n        height={diHeight}\n        strokeWidth={diStrokeWidth}\n        onMouseDown={onDragIndicatorMouseDown}\n      />\n      {resizeHandles.map((handle) => (\n        <circle\n          key={handle.key}\n          pointerEvents=\"bounding-box\"\n          style={makeResizeHandleStyles(handle.direction)}\n          cx={handle.cx}\n          cy={handle.cy}\n          r={handleRadius}\n          onMouseDown={handle.onMouseDown}\n          data-id={id}\n        />\n      ))}\n    </g>\n  );\n};\n\nexport default DragIndicator;\n","import type { FunctionComponent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback } from 'react';\nimport DragIndicator from '../drawables/drag-indicator';\nimport type { CropBoxProps, CropInteractionProps } from './types';\n\ntype Props = CropBoxProps & CropInteractionProps;\n\nconst RectCrop: FunctionComponent<Props> = ({\n  x,\n  y,\n  width,\n  height,\n  diStrokeWidth,\n  onResizeHandleMouseDown,\n  onDragIndicatorMouseDown,\n  id,\n}) => {\n  const handleResizeHandleTopLeftMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, 'left', 'top'),\n    [onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleTopRightMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, 'right', 'top'),\n    [onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleBottomLeftMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, 'left', 'bottom'),\n    [onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleBottomRightMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, 'right', 'bottom'),\n    [onResizeHandleMouseDown],\n  );\n\n  return (\n    <g pointerEvents=\"bounding-box\">\n      <DragIndicator\n        id={id}\n        onDragIndicatorMouseDown={onDragIndicatorMouseDown}\n        onResizeHandleTopLeftMouseDown={handleResizeHandleTopLeftMouseDown}\n        onResizeHandleTopRightMouseDown={handleResizeHandleTopRightMouseDown}\n        onResizeHandleBottomLeftMouseDown={handleResizeHandleBottomLeftMouseDown}\n        onResizeHandleBottomRightMouseDown={handleResizeHandleBottomRightMouseDown}\n        diX={x}\n        diY={y}\n        diWidth={width}\n        diHeight={height}\n        diStrokeWidth={diStrokeWidth}\n        selected\n      />\n    </g>\n  );\n};\n\nexport default RectCrop;\n","import type { FunctionComponent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { ResizeHandleX, ResizeHandleY } from '../drawables/types';\nimport { createSvgPointTransformer } from '../utils';\nimport Square from './square';\nimport type { Crop, CropResizeHandler, CropTranslateHandler } from './types';\n\nexport type { Crop } from './types';\n\ntype Props = {\n  height: number;\n  width: number;\n  canTransformCrop: boolean;\n  onCropTranslate: CropTranslateHandler;\n  onCropTranslateEnd?: CropTranslateHandler;\n  onRemoveCrop?: () => void;\n  onResizeCrop: CropResizeHandler;\n  onResizeCropEnd?: CropResizeHandler;\n  onConfirmCrop?: () => void;\n  crop?: Crop;\n  diStrokeWidth: number;\n};\n\nconst Cropables: FunctionComponent<Props> = ({\n  diStrokeWidth,\n  onCropTranslateEnd,\n  onResizeCropEnd,\n  width,\n  crop,\n  canTransformCrop,\n  onConfirmCrop,\n  onCropTranslate,\n  onRemoveCrop,\n  onResizeCrop,\n  height,\n}) => {\n  const referenceRect = useRef<SVGRectElement>(null);\n\n  const onWindowKeyPress = useCallback(\n    (event: KeyboardEvent) => {\n      const eventTarget = event.target as HTMLElement;\n      const tagName = eventTarget?.tagName.toLowerCase();\n\n      if (\n        tagName !== 'input' &&\n        tagName !== 'textarea' &&\n        !eventTarget.isContentEditable &&\n        crop &&\n        canTransformCrop\n      ) {\n        if (onConfirmCrop && event.key === 'Enter') {\n          event.preventDefault();\n          onConfirmCrop();\n        }\n        if (\n          onRemoveCrop &&\n          (event.key === 'Backspace' ||\n            event.key === 'Delete' ||\n            event.key === 'Escape' ||\n            event.key === 'Esc')\n        ) {\n          event.preventDefault();\n          onRemoveCrop();\n        }\n      }\n    },\n    [canTransformCrop, crop, onConfirmCrop, onRemoveCrop],\n  );\n\n  const handleDragIndicatorMouseDown = useCallback(\n    (e: ReactMouseEvent) => {\n      if (!canTransformCrop) {\n        return;\n      }\n\n      if (!referenceRect.current) {\n        return;\n      }\n\n      const transformPoint = createSvgPointTransformer(referenceRect.current);\n\n      if (!transformPoint) {\n        return;\n      }\n\n      e.stopPropagation();\n\n      // move the drawable with the mouse\n      let lastCoords = transformPoint(e);\n\n      const mouseMoveHandler = (e2: MouseEvent) => {\n        const currentCoords = transformPoint(e2);\n\n        onCropTranslate(currentCoords.x - lastCoords.x, currentCoords.y - lastCoords.y);\n\n        lastCoords = currentCoords;\n      };\n\n      const mouseUpHandler = (e3: MouseEvent) => {\n        const currentCoords = transformPoint(e3);\n        if (onCropTranslateEnd) {\n          onCropTranslateEnd(currentCoords.x - lastCoords.x, currentCoords.y - lastCoords.y);\n        }\n\n        window.removeEventListener('mousemove', mouseMoveHandler);\n        window.removeEventListener('mouseup', mouseUpHandler);\n      };\n\n      window.addEventListener('mousemove', mouseMoveHandler);\n      window.addEventListener('mouseup', mouseUpHandler);\n    },\n    [canTransformCrop, onCropTranslate, onCropTranslateEnd],\n  );\n\n  const handleResizeHandleMouseDown = useCallback(\n    (e: ReactMouseEvent, handleX: ResizeHandleX, handleY: ResizeHandleY) => {\n      if (!canTransformCrop) {\n        return;\n      }\n\n      e.stopPropagation();\n\n      if (!referenceRect.current) {\n        return;\n      }\n\n      const transformPoint = createSvgPointTransformer(referenceRect.current);\n\n      if (!transformPoint) {\n        return;\n      }\n\n      const mouseMoveHandler = (e2: MouseEvent) => {\n        const newCoords = transformPoint(e2);\n        onResizeCrop(handleX, handleY, newCoords.x, newCoords.y);\n      };\n\n      const mouseUpHandler = (e3: MouseEvent) => {\n        const newCoords = transformPoint(e3);\n        if (onResizeCropEnd) {\n          onResizeCropEnd(handleX, handleY, newCoords.x, newCoords.y);\n        }\n\n        window.removeEventListener('mousemove', mouseMoveHandler);\n        window.removeEventListener('mouseup', mouseUpHandler);\n      };\n\n      window.addEventListener('mouseup', mouseUpHandler);\n      window.addEventListener('mousemove', mouseMoveHandler);\n    },\n    [canTransformCrop, onResizeCrop, onResizeCropEnd],\n  );\n\n  useEffect(() => {\n    window.addEventListener('keydown', onWindowKeyPress);\n    return () => {\n      window.removeEventListener('keydown', onWindowKeyPress);\n    };\n  }, [onWindowKeyPress]);\n\n  const pointerEvents = useMemo(\n    () => (canTransformCrop ? 'visiblePainted' : 'none'),\n    [canTransformCrop],\n  );\n\n  if (!crop) {\n    return null;\n  }\n\n  const { x, y, height: cropHeight, width: cropWidth } = crop;\n\n  return (\n    <g pointerEvents={pointerEvents}>\n      <path\n        d={`M0 0 H${width} V${height} H0 Z M${x} ${y} H${x + cropWidth} V${y + cropHeight} H${x} Z`}\n        fillRule=\"evenodd\"\n        fill=\"rgba(0,0,0,0.5)\"\n      />\n      <rect ref={referenceRect} x=\"0\" y=\"0\" width={`${width}`} height={`${height}`} fill=\"none\" />\n      {canTransformCrop && (\n        <Square\n          id=\"crop\"\n          x={x}\n          y={y}\n          height={cropHeight}\n          width={cropWidth}\n          diStrokeWidth={diStrokeWidth}\n          onDragIndicatorMouseDown={handleDragIndicatorMouseDown}\n          onResizeHandleMouseDown={handleResizeHandleMouseDown}\n        />\n      )}\n    </g>\n  );\n};\n\nexport default Cropables;\n","import type { CSSProperties, FunctionComponent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport DragIndicator from './drag-indicator';\nimport type { DrawableResizableProps, EllipseDrawableShapeProps } from './types';\n\ntype Props = EllipseDrawableShapeProps & DrawableResizableProps;\n\nconst EllipseDrawable: FunctionComponent<Props> = ({\n  id,\n  cx,\n  cy,\n  rx,\n  ry,\n  fill,\n  stroke,\n  strokeWidth,\n  selected,\n  dragIndicatorStrokeWidth: diStrokeWidth,\n  canSelectDrawable,\n  onResizeHandleMouseDown,\n  onDragIndicatorMouseDown,\n  onSelect,\n}) => {\n  const handleClick = useCallback(\n    (e: ReactMouseEvent) => {\n      onSelect(e, id);\n    },\n    [id, onSelect],\n  );\n\n  const handleResizeHandleTopLeftMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'left', 'top'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleTopRightMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'right', 'top'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleBottomLeftMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'left', 'bottom'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleBottomRightMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'right', 'bottom'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleDragIndicatorMouseDown = useCallback(\n    (e: ReactMouseEvent) => onDragIndicatorMouseDown(e, id),\n    [id, onDragIndicatorMouseDown],\n  );\n\n  const strokeWidthHalf = useMemo(() => strokeWidth / 2, [strokeWidth]);\n\n  const diX = useMemo(() => cx - rx - strokeWidthHalf, [cx, rx, strokeWidthHalf]);\n  const diY = useMemo(() => cy - ry - strokeWidthHalf, [cy, ry, strokeWidthHalf]);\n  const diWidth = useMemo(() => rx * 2 + strokeWidth, [rx, strokeWidth]);\n  const diHeight = useMemo(() => ry * 2 + strokeWidth, [ry, strokeWidth]);\n\n  const style: CSSProperties = useMemo(\n    () => ({ cursor: canSelectDrawable ? 'pointer' : undefined }),\n    [canSelectDrawable],\n  );\n\n  return (\n    <g>\n      <ellipse\n        cx={cx}\n        cy={cy}\n        rx={rx}\n        ry={ry}\n        fill={fill}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        pointerEvents=\"visible\"\n        onClick={handleClick}\n        style={style}\n      />\n      {selected && (\n        <DragIndicator\n          id={id}\n          onDragIndicatorMouseDown={handleDragIndicatorMouseDown}\n          onResizeHandleTopLeftMouseDown={handleResizeHandleTopLeftMouseDown}\n          onResizeHandleTopRightMouseDown={handleResizeHandleTopRightMouseDown}\n          onResizeHandleBottomLeftMouseDown={handleResizeHandleBottomLeftMouseDown}\n          onResizeHandleBottomRightMouseDown={handleResizeHandleBottomRightMouseDown}\n          diX={diX}\n          diY={diY}\n          diWidth={diWidth}\n          diHeight={diHeight}\n          diStrokeWidth={diStrokeWidth}\n          selected={selected}\n        />\n      )}\n    </g>\n  );\n};\n\nexport default EllipseDrawable;\n","import type { CSSProperties, FunctionComponent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport DragIndicator from './drag-indicator';\nimport type { DrawableResizableProps, LineDrawableShapeProps } from './types';\n\ntype Props = LineDrawableShapeProps & DrawableResizableProps;\n\nconst BASE_INTERACTIVE_STYLE: CSSProperties = {\n  transition: 'opacity 180ms ease, filter 180ms ease',\n  vectorEffect: 'non-scaling-stroke',\n};\n\nconst LineDrawable: FunctionComponent<Props> = ({\n  onSelect,\n  id,\n  onResizeHandleMouseDown,\n  onDragIndicatorMouseDown,\n  x1,\n  x2,\n  y1,\n  y2,\n  stroke,\n  strokeWidth,\n  selected,\n  dragIndicatorStrokeWidth: diStrokeWidth,\n  canSelectDrawable,\n}) => {\n  const handleClick = useCallback(\n    (e: ReactMouseEvent) => {\n      onSelect(e, id);\n    },\n    [onSelect, id],\n  );\n\n  const handleResizeHandleTopLeftMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'left', 'top'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleBottomRightMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'right', 'bottom'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleDragIndicatorMouseDown = useCallback(\n    (e: ReactMouseEvent) => onDragIndicatorMouseDown(e, id),\n    [id, onDragIndicatorMouseDown],\n  );\n  const strokeWidthHalf = strokeWidth / 2;\n\n  const lowerX = Math.min(x1, x2);\n  const higherX = Math.max(x1, x2);\n  const lowerY = Math.min(y1, y2);\n  const higherY = Math.max(y1, y2);\n\n  const diX = lowerX - strokeWidthHalf;\n  const diY = lowerY - strokeWidthHalf;\n  const diWidth = higherX - lowerX + strokeWidth;\n  const diHeight = higherY - lowerY + strokeWidth;\n\n  const isDiHorizontalInverse = lowerX !== x1;\n  const diHorizontalInverse = isDiHorizontalInverse ? -1 : 1;\n\n  const isDiVerticalInverse = lowerY !== y1;\n  const diVerticalInverse = isDiVerticalInverse ? -1 : 1;\n\n  const style: CSSProperties = useMemo(\n    () => ({\n      ...BASE_INTERACTIVE_STYLE,\n      cursor: canSelectDrawable ? 'pointer' : 'default',\n      opacity: selected ? 0.97 : 0.9,\n      filter: selected ? 'drop-shadow(0 0 2px rgba(100, 116, 139, 0.16))' : 'none',\n      strokeLinecap: 'round',\n      strokeLinejoin: 'round',\n    }),\n    [canSelectDrawable, selected],\n  );\n\n  return (\n    <g>\n      <line\n        x1={x1}\n        x2={x2}\n        y1={y1}\n        y2={y2}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        onClick={handleClick}\n        pointerEvents=\"visible-painted\"\n        style={style}\n      />\n      {selected && (\n        <DragIndicator\n          id={id}\n          onDragIndicatorMouseDown={handleDragIndicatorMouseDown}\n          onResizeHandleTopLeftMouseDown={handleResizeHandleTopLeftMouseDown}\n          onResizeHandleBottomRightMouseDown={handleResizeHandleBottomRightMouseDown}\n          diX={diX}\n          diY={diY}\n          diWidth={diWidth}\n          diHeight={diHeight}\n          diStrokeWidth={diStrokeWidth}\n          selected={selected}\n          diLeft={x1 - strokeWidthHalf * diHorizontalInverse}\n          diRight={x2 + strokeWidthHalf * diHorizontalInverse}\n          diTop={y1 - strokeWidthHalf * diVerticalInverse}\n          diBottom={y2 + strokeWidthHalf * diVerticalInverse}\n          inverseCursorHorizontal={isDiHorizontalInverse}\n          inverseCursorVertical={isDiVerticalInverse}\n        />\n      )}\n    </g>\n  );\n};\n\nexport default LineDrawable;\n","import type { CSSProperties, FunctionComponent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport DragIndicator from './drag-indicator';\nimport type { DrawableSelectableProps, PathDrawableShapeProps } from './types';\n\ntype Props = PathDrawableShapeProps & DrawableSelectableProps;\n\nconst PathDrawable: FunctionComponent<Props> = ({\n  onSelect,\n  id,\n  onDragIndicatorMouseDown,\n  points,\n  stroke,\n  strokeWidth,\n  selected,\n  dragIndicatorStrokeWidth: diStrokeWidth,\n  canSelectDrawable,\n}) => {\n  const handleClick = useCallback(\n    (e: ReactMouseEvent) => {\n      onSelect(e, id);\n    },\n    [onSelect, id],\n  );\n\n  const handleDragIndicatorMouseDown = useCallback(\n    (e: ReactMouseEvent) => {\n      onDragIndicatorMouseDown(e, id);\n    },\n    [onDragIndicatorMouseDown, id],\n  );\n\n  const strokeWidthHalf = useMemo(() => strokeWidth / 2, [strokeWidth]);\n\n  const lowestX = useMemo(\n    () => points.reduce((accum, p) => Math.min(p.x, accum), Number.MAX_SAFE_INTEGER),\n    [points],\n  );\n  const lowestY = useMemo(\n    () => points.reduce((accum, p) => Math.min(p.y, accum), Number.MAX_SAFE_INTEGER),\n    [points],\n  );\n  const highestX = useMemo(() => points.reduce((accum, p) => Math.max(p.x, accum), 0), [points]);\n  const highestY = useMemo(() => points.reduce((accum, p) => Math.max(p.y, accum), 0), [points]);\n\n  const diX = useMemo(() => lowestX - strokeWidthHalf, [lowestX, strokeWidthHalf]);\n  const diY = useMemo(() => lowestY - strokeWidthHalf, [lowestY, strokeWidthHalf]);\n  const diWidth = useMemo(() => highestX - lowestX + strokeWidth, [highestX, lowestX, strokeWidth]);\n  const diHeight = useMemo(\n    () => highestY - lowestY + strokeWidth,\n    [highestY, lowestY, strokeWidth],\n  );\n  const style: CSSProperties = useMemo(\n    () => ({ cursor: canSelectDrawable ? 'pointer' : undefined }),\n    [canSelectDrawable],\n  );\n\n  // guard against corrupt data\n  if (points.length === 0) {\n    return null;\n  }\n\n  return (\n    <g>\n      <path\n        d={`M ${points.map((p) => `${p.x} ${p.y}`).join('L')}`}\n        fill=\"none\"\n        strokeWidth={strokeWidth}\n        stroke={stroke}\n        onClick={handleClick}\n        pointerEvents=\"visible-painted\"\n        style={style}\n      />\n      {selected && (\n        <DragIndicator\n          id={id}\n          onDragIndicatorMouseDown={handleDragIndicatorMouseDown}\n          diX={diX}\n          diY={diY}\n          diWidth={diWidth}\n          diHeight={diHeight}\n          diStrokeWidth={diStrokeWidth}\n          selected={selected}\n        />\n      )}\n    </g>\n  );\n};\n\nexport default PathDrawable;\n","import type { CSSProperties, FunctionComponent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport DragIndicator from './drag-indicator';\nimport type { DrawableResizableProps, RectDrawableShapeProps } from './types';\n\ntype Props = RectDrawableShapeProps & DrawableResizableProps;\n\nconst RectDrawable: FunctionComponent<Props> = ({\n  id,\n  onDragIndicatorMouseDown,\n  onResizeHandleMouseDown,\n  onSelect,\n  x,\n  y,\n  width,\n  height,\n  fill,\n  stroke,\n  strokeWidth,\n  selected,\n  dragIndicatorStrokeWidth: diStrokeWidth,\n  canSelectDrawable,\n}) => {\n  const handleClick = useCallback(\n    (e: ReactMouseEvent) => {\n      onSelect(e, id);\n    },\n    [id, onSelect],\n  );\n\n  const handleResizeHandleTopLeftMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'left', 'top'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleTopRightMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'right', 'top'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleBottomLeftMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'left', 'bottom'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleResizeHandleBottomRightMouseDown = useCallback(\n    (e: ReactMouseEvent) => onResizeHandleMouseDown(e, id, 'right', 'bottom'),\n    [id, onResizeHandleMouseDown],\n  );\n\n  const handleDragIndicatorMouseDown = useCallback(\n    (e: ReactMouseEvent) => {\n      onDragIndicatorMouseDown(e, id);\n    },\n    [id, onDragIndicatorMouseDown],\n  );\n\n  const strokeWidthHalf = useMemo(() => strokeWidth / 2, [strokeWidth]);\n\n  const diX = useMemo(() => x - strokeWidthHalf, [strokeWidthHalf, x]);\n  const diY = useMemo(() => y - strokeWidthHalf, [strokeWidthHalf, y]);\n  const diWidth = useMemo(() => width + strokeWidth, [strokeWidth, width]);\n  const diHeight = useMemo(() => height + strokeWidth, [height, strokeWidth]);\n\n  const style: CSSProperties = useMemo(\n    () => ({ cursor: canSelectDrawable ? 'pointer' : undefined }),\n    [canSelectDrawable],\n  );\n  return (\n    <g data-id={id} onClick={handleClick} pointerEvents=\"bounding-box\">\n      <rect\n        x={x}\n        y={y}\n        width={width}\n        height={height}\n        fill={fill}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        style={style}\n      />\n      {selected && (\n        <DragIndicator\n          id={id}\n          onDragIndicatorMouseDown={handleDragIndicatorMouseDown}\n          onResizeHandleTopLeftMouseDown={handleResizeHandleTopLeftMouseDown}\n          onResizeHandleTopRightMouseDown={handleResizeHandleTopRightMouseDown}\n          onResizeHandleBottomLeftMouseDown={handleResizeHandleBottomLeftMouseDown}\n          onResizeHandleBottomRightMouseDown={handleResizeHandleBottomRightMouseDown}\n          diX={diX}\n          diY={diY}\n          diWidth={diWidth}\n          diHeight={diHeight}\n          diStrokeWidth={diStrokeWidth}\n          selected={selected}\n        />\n      )}\n    </g>\n  );\n};\n\nexport default RectDrawable;\n","import type { CSSProperties, FunctionComponent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport DragIndicator from './drag-indicator';\nimport type { DrawableSelectableProps, TextDrawableShapeProps } from './types';\n\ntype Props = TextDrawableShapeProps & DrawableSelectableProps;\n\nconst TextDrawable: FunctionComponent<Props> = ({\n  id,\n  text,\n  x,\n  y,\n  selected,\n  dragIndicatorStrokeWidth: diStrokeWidth,\n  canSelectDrawable,\n  fontSize,\n  fill,\n  onSelect,\n  onDragIndicatorMouseDown,\n}) => {\n  const [height, setHeight] = useState<number>(0);\n  const [width, setWidth] = useState<number>(0);\n\n  const handleTextRef = useCallback((textElement: SVGTextElement) => {\n    if (textElement) {\n      setHeight(textElement.getBBox().height);\n      setWidth(textElement.getBBox().width);\n    }\n  }, []);\n\n  const handleClick = useCallback(\n    (e: ReactMouseEvent) => {\n      onSelect(e, id);\n    },\n    [id, onSelect],\n  );\n\n  const handleDragIndicatorMouseDown = useCallback(\n    (e: ReactMouseEvent) => {\n      onDragIndicatorMouseDown(e, id);\n    },\n    [id, onDragIndicatorMouseDown],\n  );\n\n  const strokeWidthHalf = useMemo(() => diStrokeWidth / 2, [diStrokeWidth]);\n\n  const diX = useMemo(() => x - strokeWidthHalf, [strokeWidthHalf, x]);\n  const diY = useMemo(() => y - strokeWidthHalf, [strokeWidthHalf, y]);\n  const diWidth = useMemo(() => width + diStrokeWidth, [diStrokeWidth, width]);\n  const diHeight = useMemo(() => height + diStrokeWidth, [diStrokeWidth, height]);\n\n  const style: CSSProperties = useMemo(\n    () => ({ cursor: canSelectDrawable ? 'pointer' : undefined }),\n    [canSelectDrawable],\n  );\n\n  const keyedText = useMemo(() => {\n    const seen = new Map<string, number>();\n    return text.map((line) => {\n      const occurrence = (seen.get(line) ?? 0) + 1;\n      seen.set(line, occurrence);\n      return { line, key: `${line}-${occurrence}` };\n    });\n  }, [text]);\n\n  if (text && !text.length) {\n    return null;\n  }\n\n  return (\n    <g>\n      <text\n        ref={handleTextRef}\n        x={x}\n        y={y}\n        alignmentBaseline=\"hanging\"\n        letterSpacing=\"1\"\n        fontFamily=\"Arial, Helvetica, sans-serif\"\n        fontSize={`${fontSize}px`}\n        onClick={handleClick}\n        pointerEvents=\"visible-painted\"\n        fill={fill}\n        style={style}\n      >\n        {keyedText.map(({ line, key }) => (\n          <tspan key={key} x={x} dy={fontSize}>\n            {line}\n          </tspan>\n        ))}\n      </text>\n      {selected && (\n        <DragIndicator\n          id={id}\n          onDragIndicatorMouseDown={handleDragIndicatorMouseDown}\n          diX={diX}\n          diY={diY}\n          diWidth={diWidth}\n          diHeight={diHeight}\n          diStrokeWidth={diStrokeWidth}\n          selected={selected}\n        />\n      )}\n    </g>\n  );\n};\nexport default TextDrawable;\n","import type { FunctionComponent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { createSvgPointTransformer } from '../utils';\nimport EllipseDrawable from './ellipse';\nimport LineDrawable from './line';\nimport PathDrawable from './path';\nimport RectDrawable from './rect';\nimport TextDrawable from './text';\nimport type {\n  Drawable,\n  DrawableResizeHandler,\n  DrawableTranslateHandler,\n  ResizeHandleX,\n  ResizeHandleY,\n} from './types';\n\nexport type { Drawable } from './types';\n\ntype Props = {\n  canSelectDrawable?: boolean;\n  selectedDrawable?: string;\n  onSelectDrawable: (id?: string) => void;\n  onDrawableTranslate: DrawableTranslateHandler;\n  onDrawableTranslateEnd?: DrawableTranslateHandler;\n  onRemoveDrawable?: (id: string) => void;\n  onResizeDrawable: DrawableResizeHandler;\n  onResizeDrawableEnd?: DrawableResizeHandler;\n  drawables: ReadonlyArray<Drawable>;\n  diStrokeWidth: number;\n  width: number;\n  height: number;\n};\n\nconst DrawableComp: FunctionComponent<Props> = ({\n  diStrokeWidth,\n  canSelectDrawable = true,\n  selectedDrawable,\n  onRemoveDrawable,\n  drawables,\n  onDrawableTranslate,\n  onDrawableTranslateEnd,\n  onResizeDrawableEnd,\n  onResizeDrawable,\n  width,\n  onSelectDrawable,\n  height,\n}) => {\n  const referenceRect = useRef<SVGRectElement>(null);\n  const onWindowKeyPress = useCallback(\n    (event: KeyboardEvent) => {\n      const eventTarget = event.target as HTMLElement;\n      const tagName = eventTarget?.tagName.toLowerCase();\n\n      if (\n        tagName !== 'input' &&\n        tagName !== 'textarea' &&\n        !eventTarget.isContentEditable &&\n        selectedDrawable\n      ) {\n        if (onRemoveDrawable) {\n          if (event.key === 'Escape' || event.key === 'Esc') {\n            event.preventDefault();\n            onSelectDrawable(undefined);\n          } else if (event.key === 'Backspace' || event.key === 'Delete') {\n            event.preventDefault();\n            onRemoveDrawable(selectedDrawable);\n          }\n        }\n      }\n    },\n    [onRemoveDrawable, onSelectDrawable, selectedDrawable],\n  );\n\n  const handleDragIndicatorMouseDown = (e: ReactMouseEvent, id: string) => {\n    if (!canSelectDrawable) {\n      return;\n    }\n\n    if (!referenceRect.current) {\n      return;\n    }\n\n    const transformPoint = createSvgPointTransformer(referenceRect.current);\n\n    if (!transformPoint) {\n      return;\n    }\n\n    e.stopPropagation();\n\n    // select the drawable, if not yet selected\n    if (selectedDrawable !== id) {\n      onSelectDrawable(id);\n    }\n\n    // move the drawable with the mouse\n    let lastCoords = transformPoint(e);\n\n    const mouseMoveHandler = (e2: MouseEvent) => {\n      const currentCoords = transformPoint(e2);\n\n      onDrawableTranslate(id, currentCoords.x - lastCoords.x, currentCoords.y - lastCoords.y);\n\n      lastCoords = currentCoords;\n    };\n\n    const mouseUpHandler = (e3: MouseEvent) => {\n      const currentCoords = transformPoint(e3);\n      if (onDrawableTranslateEnd) {\n        onDrawableTranslateEnd(id, currentCoords.x - lastCoords.x, currentCoords.y - lastCoords.y);\n      }\n\n      window.removeEventListener('mousemove', mouseMoveHandler);\n      window.removeEventListener('mouseup', mouseUpHandler);\n    };\n\n    window.addEventListener('mousemove', mouseMoveHandler);\n    window.addEventListener('mouseup', mouseUpHandler);\n  };\n\n  const handleDrawableSelect = (e: ReactMouseEvent, id: string) => {\n    if (!canSelectDrawable) {\n      return;\n    }\n\n    e.stopPropagation();\n    onSelectDrawable(id);\n  };\n\n  const handleResizeHandleMouseDown = (\n    e: ReactMouseEvent,\n    id: string,\n    handleX: ResizeHandleX,\n    handleY: ResizeHandleY,\n  ) => {\n    if (!canSelectDrawable) {\n      return;\n    }\n\n    e.stopPropagation();\n\n    if (!referenceRect.current) {\n      return;\n    }\n\n    const transformPoint = createSvgPointTransformer(referenceRect.current);\n\n    if (!transformPoint) {\n      return;\n    }\n\n    const mouseMoveHandler = (e2: MouseEvent) => {\n      const newCoords = transformPoint(e2);\n\n      onResizeDrawable(e, id, handleX, handleY, newCoords.x, newCoords.y);\n    };\n\n    const mouseUpHandler = (e3: MouseEvent) => {\n      const newCoords = transformPoint(e3);\n      if (onResizeDrawableEnd) {\n        onResizeDrawableEnd(e, id, handleX, handleY, newCoords.x, newCoords.y);\n      }\n\n      window.removeEventListener('mousemove', mouseMoveHandler);\n      window.removeEventListener('mouseup', mouseUpHandler);\n    };\n\n    window.addEventListener('mouseup', mouseUpHandler);\n    window.addEventListener('mousemove', mouseMoveHandler);\n  };\n\n  const sortBySelected = useCallback(\n    (drawableA: Drawable, drawableB: Drawable) => {\n      if (selectedDrawable === drawableA.id) {\n        return 1;\n      }\n\n      if (selectedDrawable === drawableB.id) {\n        return -1;\n      }\n\n      return 0;\n    },\n    [selectedDrawable],\n  );\n\n  const isSelected = useCallback((id: string) => selectedDrawable === id, [selectedDrawable]);\n\n  const sharedSelectableProps = {\n    onSelect: handleDrawableSelect,\n    onDragIndicatorMouseDown: handleDragIndicatorMouseDown,\n    dragIndicatorStrokeWidth: diStrokeWidth,\n    canSelectDrawable,\n  };\n\n  const sharedResizableProps = {\n    ...sharedSelectableProps,\n    onResizeHandleMouseDown: handleResizeHandleMouseDown,\n  };\n\n  const renderDrawable = (item: Drawable) => {\n    switch (item.type) {\n      case 'ellipse':\n        return (\n          <EllipseDrawable\n            key={item.id}\n            id={item.id}\n            cx={item.cx}\n            cy={item.cy}\n            rx={item.rx}\n            ry={item.ry}\n            fill={item.fill}\n            stroke={item.stroke}\n            strokeWidth={item.strokeWidth}\n            selected={isSelected(item.id)}\n            {...sharedResizableProps}\n          />\n        );\n      case 'line':\n        return (\n          <LineDrawable\n            key={item.id}\n            id={item.id}\n            x1={item.x1}\n            x2={item.x2}\n            y1={item.y1}\n            y2={item.y2}\n            stroke={item.stroke}\n            strokeWidth={item.strokeWidth}\n            selected={isSelected(item.id)}\n            {...sharedResizableProps}\n          />\n        );\n      case 'path':\n        return (\n          <PathDrawable\n            key={item.id}\n            id={item.id}\n            points={item.points}\n            stroke={item.stroke}\n            strokeWidth={item.strokeWidth}\n            selected={isSelected(item.id)}\n            {...sharedSelectableProps}\n          />\n        );\n      case 'rect':\n        return (\n          <RectDrawable\n            key={item.id}\n            id={item.id}\n            x={item.x}\n            y={item.y}\n            width={item.width}\n            height={item.height}\n            fill={item.fill}\n            stroke={item.stroke}\n            strokeWidth={item.strokeWidth}\n            selected={isSelected(item.id)}\n            {...sharedResizableProps}\n          />\n        );\n      case 'text':\n        return (\n          <TextDrawable\n            key={item.id}\n            id={item.id}\n            x={item.x}\n            y={item.y}\n            fill={item.fill}\n            text={item.text}\n            fontSize={item.fontSize}\n            selected={isSelected(item.id)}\n            {...sharedSelectableProps}\n          />\n        );\n      default:\n        console.error('item of unknown type could not be drawn', item); // eslint-disable-line no-console\n        return null;\n    }\n  };\n\n  useEffect(() => {\n    window.addEventListener('keydown', onWindowKeyPress);\n    return () => {\n      window.removeEventListener('keydown', onWindowKeyPress);\n    };\n  }, [onWindowKeyPress]);\n  return (\n    <g>\n      <rect ref={referenceRect} x=\"0\" y=\"0\" width={`${width}`} height={`${height}`} fill=\"none\" />\n      {[...drawables].sort(sortBySelected).map(renderDrawable)}\n    </g>\n  );\n};\n\nexport default DrawableComp;\n","import type { Drawable, ResizeHandleX, ResizeHandleY } from './types';\n\nconst rectMinWidth = 10;\nconst ellipseMinWidth = 10;\n\nexport default function resizeDrawable<T extends Drawable>(\n  drawable: T,\n  handleX: ResizeHandleX,\n  handleY: ResizeHandleY,\n  newX: number,\n  newY: number,\n): T {\n  switch (drawable.type) {\n    case 'rect': {\n      let { x, y, width, height } = drawable;\n\n      if (handleX === 'left') {\n        width = Math.max(rectMinWidth, width - (newX - x));\n        x = newX;\n      } else if (handleX === 'right') {\n        width = Math.max(rectMinWidth, newX - x);\n      }\n\n      if (handleY === 'top') {\n        height = Math.max(rectMinWidth, height - (newY - y));\n        y = newY;\n      } else if (handleY === 'bottom') {\n        height = Math.max(rectMinWidth, newY - y);\n      }\n\n      return {\n        ...drawable,\n        x,\n        y,\n        width,\n        height,\n      };\n    }\n    case 'ellipse': {\n      let { cx, cy, rx, ry } = drawable;\n\n      if (handleX === 'left') {\n        const moveRight = newX - (cx - rx);\n        const moveRightHalf = moveRight / 2;\n        rx = Math.max(ellipseMinWidth, rx - moveRightHalf);\n        cx += moveRightHalf;\n      } else if (handleX === 'right') {\n        const moveRight = newX - (cx + rx);\n        const moveRightHalf = moveRight / 2;\n        rx = Math.max(ellipseMinWidth, rx + moveRightHalf);\n        cx += moveRightHalf;\n      }\n\n      if (handleY === 'top') {\n        const moveUp = newY - (cy - ry);\n        const moveUpHalf = moveUp / 2;\n        ry = Math.max(ellipseMinWidth, ry - moveUpHalf);\n        cy += moveUpHalf;\n      } else if (handleY === 'bottom') {\n        const moveUp = newY - (cy + ry);\n        const moveUpHalf = moveUp / 2;\n        ry = Math.max(ellipseMinWidth, ry + moveUpHalf);\n        cy += moveUpHalf;\n      }\n\n      /* if (handleY === 'top') {\n        ry = ry - ((newY - y) / 2);\n        y = newY;\n      } else if (handleY === 'bottom') {\n        ry = (newY - y) / 2;\n      } */\n\n      return {\n        ...drawable,\n        cx,\n        cy,\n        rx,\n        ry,\n      };\n    }\n    case 'line': {\n      let { x1, x2, y1, y2 } = drawable;\n\n      if (handleX === 'left') {\n        x1 = newX;\n      } else if (handleX === 'right') {\n        x2 = newX;\n      }\n\n      if (handleY === 'top') {\n        y1 = newY;\n      } else if (handleY === 'bottom') {\n        y2 = newY;\n      }\n\n      return {\n        ...drawable,\n        x1,\n        x2,\n        y1,\n        y2,\n      };\n    }\n    default:\n      console.warn(\"Can't resize drawable of type %s\", drawable.type); // eslint-disable-line no-console\n      return drawable;\n  }\n}\n","import type { Drawable } from './types';\n\nexport default function translateDrawable<T extends Drawable>(\n  drawable: T,\n  x: number,\n  y: number,\n): T {\n  switch (drawable.type) {\n    case 'rect':\n      return {\n        ...drawable,\n        x: drawable.x + x,\n        y: drawable.y + y,\n      };\n    case 'text':\n      return {\n        ...drawable,\n        x: drawable.x + x,\n        y: drawable.y + y,\n      };\n    case 'ellipse':\n      return {\n        ...drawable,\n        cx: drawable.cx + x,\n        cy: drawable.cy + y,\n      };\n    case 'path':\n      return {\n        ...drawable,\n        points: drawable.points.map((old) => ({\n          x: old.x + x,\n          y: old.y + y,\n        })),\n      };\n    case 'line':\n      return {\n        ...drawable,\n        x1: drawable.x1 + x,\n        x2: drawable.x2 + x,\n        y1: drawable.y1 + y,\n        y2: drawable.y2 + y,\n      };\n    default:\n      console.error('Unknown drawable type', drawable); // eslint-disable-line no-console\n      return drawable;\n  }\n}\n","import type { FunctionComponent } from 'react';\nimport { useCallback, useState } from 'react';\nimport Editor, { type Props as EditorProps } from '.';\n\nexport type Props = Omit<\n  EditorProps,\n  'zoom' | 'translateX' | 'translateY' | 'onDrag' | 'onZoom'\n> & {\n  initialZoom?: number;\n  initialTranslateX?: number;\n  initialTranslateY?: number;\n  onZoom?: (zoom: number) => void;\n};\n\nconst UncontrolledEditor: FunctionComponent<Props> = ({\n  onZoom,\n  initialZoom,\n  initialTranslateY,\n  initialTranslateX,\n  ...props\n}) => {\n  const [zoom, setZoom] = useState(initialZoom ?? 1);\n  const [translateX, setTranslateX] = useState(initialTranslateX ?? 0);\n  const [translateY, setTranslateY] = useState(initialTranslateY ?? 0);\n\n  const handleDrag = useCallback((x: number, y: number) => {\n    setTranslateY(y);\n    setTranslateX(x);\n  }, []);\n\n  const handleZoom = useCallback(\n    (zoomToUse: number) => {\n      setZoom(zoomToUse);\n      if (onZoom) {\n        onZoom(zoomToUse);\n      }\n    },\n    [onZoom],\n  );\n\n  return (\n    <Editor\n      zoom={zoom}\n      translateX={translateX}\n      translateY={translateY}\n      onDrag={handleDrag}\n      onZoom={handleZoom}\n      {...props}\n    />\n  );\n};\n\nexport default UncontrolledEditor;\n"],"mappings":"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"}