{"version":3,"sources":["../src/usePainter.ts","../src/helpers/saveCanvasHelpers.ts","../src/helpers/objectUrlHelpers.ts","../src/helpers/importImageHelpers.ts","../src/helpers/eventHelpers.ts","../src/helpers/canvasHelpers.ts","../src/helpers/miscHelpers.ts","../src/ReactPainter.tsx","../src/index.ts"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { canvasToBlob } from './helpers/saveCanvasHelpers';\nimport { importImage } from './helpers/importImageHelpers';\nimport { extractOffSetFromEvent } from './helpers/eventHelpers';\nimport { getCanvasDimensionsScaledForImage } from './helpers/canvasHelpers';\nimport { fileToUrl, revokeUrl } from './helpers/objectUrlHelpers';\nimport { composeFn } from './helpers/miscHelpers';\nimport type {\n  LineJoinType,\n  LineCapType,\n  PropsGetterInput,\n  PropsGetterResult,\n} from './ReactPainter';\n\nexport interface UsePainterProps {\n  height?: number;\n  width?: number;\n  initialColor?: string;\n  initialLineWidth?: number;\n  initialLineJoin?: LineJoinType;\n  initialLineCap?: LineCapType;\n  onSave?: (blob: Blob) => void;\n  image?: File | string;\n}\n\nexport interface UsePainterResult {\n  canvas: JSX.Element;\n  triggerSave: () => void;\n  getCanvasProps: (props?: PropsGetterInput) => PropsGetterResult;\n  imageCanDownload: boolean | null;\n  imageDownloadUrl: string | null;\n  setColor: (color: string) => void;\n  setLineWidth: (width: number) => void;\n  setLineJoin: (type: LineJoinType) => void;\n  setLineCap: (type: LineCapType) => void;\n}\n\nexport function usePainter({\n  height = 300,\n  width = 300,\n  initialColor = '#000',\n  initialLineWidth = 5,\n  initialLineJoin = 'round',\n  initialLineCap = 'round',\n  onSave,\n  image,\n}: UsePainterProps = {}): UsePainterResult {\n  const [color, setColorState] = useState(initialColor);\n  const [lineWidth, setLineWidthState] = useState(initialLineWidth);\n  const [lineJoin, setLineJoinState] = useState<LineJoinType>(initialLineJoin);\n  const [lineCap, setLineCapState] = useState<LineCapType>(initialLineCap);\n  const [isDrawing, setIsDrawing] = useState(false);\n  const [canvasHeight, setCanvasHeight] = useState(0);\n  const [canvasWidth, setCanvasWidth] = useState(0);\n  const [imageCanDownload, setImageCanDownload] = useState<boolean | null>(null);\n  const [imageDownloadUrl, setImageDownloadUrl] = useState<string | null>(null);\n\n  const canvasRef = useRef<HTMLCanvasElement | null>(null);\n  const ctx = useRef<CanvasRenderingContext2D | null>(null);\n  const lastX = useRef(0);\n  const lastY = useRef(0);\n  const scalingFactor = useRef(1);\n\n  // Use refs for values accessed in stable callbacks to avoid stale closures\n  const colorRef = useRef(color);\n  const lineWidthRef = useRef(lineWidth);\n  const lineJoinRef = useRef(lineJoin);\n  const lineCapRef = useRef(lineCap);\n  const isDrawingRef = useRef(isDrawing);\n  const onSaveRef = useRef(onSave);\n\n  colorRef.current = color;\n  lineWidthRef.current = lineWidth;\n  lineJoinRef.current = lineJoin;\n  lineCapRef.current = lineCap;\n  isDrawingRef.current = isDrawing;\n  onSaveRef.current = onSave;\n\n  const initCanvasContext = useCallback(() => {\n    if (!canvasRef.current) return;\n    ctx.current = canvasRef.current.getContext('2d');\n    if (!ctx.current) return;\n    ctx.current.strokeStyle = colorRef.current;\n    ctx.current.lineWidth = lineWidthRef.current * scalingFactor.current;\n    ctx.current.lineJoin = lineJoinRef.current;\n    ctx.current.lineCap = lineCapRef.current;\n  }, []);\n\n  const initCanvasNoImage = useCallback(\n    (w: number, h: number) => {\n      if (!canvasRef.current) return;\n      canvasRef.current.width = w;\n      canvasRef.current.height = h;\n      setCanvasHeight(h);\n      setCanvasWidth(w);\n      initCanvasContext();\n    },\n    [initCanvasContext]\n  );\n\n  const initCanvasWithImage = useCallback(\n    (w: number, imgWidth: number, imgHeight: number) => {\n      if (!canvasRef.current) return;\n      const [cvWidth, cvHeight, scalingRatio] = getCanvasDimensionsScaledForImage(\n        w,\n        imgWidth,\n        imgHeight\n      );\n      canvasRef.current.width = imgWidth;\n      canvasRef.current.height = imgHeight;\n      setCanvasHeight(cvHeight);\n      setCanvasWidth(cvWidth);\n      scalingFactor.current = 1 / scalingRatio;\n      initCanvasContext();\n    },\n    [initCanvasContext]\n  );\n\n  // Mount: initialize canvas and optionally load image\n  useEffect(() => {\n    document.body.style.touchAction = 'none';\n\n    if (image) {\n      importImage(image)\n        .then(({ img, imgWidth, imgHeight }) => {\n          initCanvasWithImage(width, imgWidth, imgHeight);\n          ctx.current?.drawImage(img, 0, 0, imgWidth, imgHeight);\n          setImageCanDownload(true);\n        })\n        .catch(() => {\n          setImageCanDownload(false);\n          initCanvasNoImage(width, height);\n        });\n    } else {\n      initCanvasNoImage(width, height);\n    }\n\n    return () => {\n      document.body.style.touchAction = '';\n    };\n    // Only run on mount\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  // Clean up download URL on unmount\n  useEffect(() => {\n    return () => {\n      if (imageDownloadUrl) {\n        revokeUrl(imageDownloadUrl);\n      }\n    };\n  }, [imageDownloadUrl]);\n\n  const handleMouseDown = useCallback(\n    (e: React.SyntheticEvent<HTMLCanvasElement>) => {\n      if (!canvasRef.current) return;\n      const { offsetX, offsetY } = extractOffSetFromEvent(\n        e,\n        scalingFactor.current,\n        canvasRef.current\n      );\n      lastX.current = offsetX;\n      lastY.current = offsetY;\n      setIsDrawing(true);\n    },\n    []\n  );\n\n  const handleMouseMove = useCallback(\n    (e: React.SyntheticEvent<HTMLCanvasElement>) => {\n      if (isDrawingRef.current && ctx.current && canvasRef.current) {\n        const { offsetX, offsetY } = extractOffSetFromEvent(\n          e,\n          scalingFactor.current,\n          canvasRef.current\n        );\n        const context = ctx.current;\n        context.strokeStyle = colorRef.current;\n        context.lineWidth = lineWidthRef.current * scalingFactor.current;\n        context.lineCap = lineCapRef.current;\n        context.lineJoin = lineJoinRef.current;\n        context.beginPath();\n        context.moveTo(lastX.current, lastY.current);\n        context.lineTo(offsetX, offsetY);\n        context.stroke();\n        lastX.current = offsetX;\n        lastY.current = offsetY;\n      }\n    },\n    []\n  );\n\n  const handleMouseUp = useCallback(() => {\n    setIsDrawing(false);\n  }, []);\n\n  const handleSave = useCallback(() => {\n    if (!canvasRef.current) return;\n    canvasToBlob(canvasRef.current, 'image/png')\n      .then((blob: Blob) => {\n        onSaveRef.current?.(blob);\n        setImageDownloadUrl(fileToUrl(blob));\n      })\n      .catch((err) => console.error('in usePainter handleSave', err));\n  }, []);\n\n  const setColor = useCallback((c: string) => {\n    setColorState(c);\n  }, []);\n\n  const setLineWidth = useCallback((w: number) => {\n    setLineWidthState(w);\n  }, []);\n\n  const setLineJoin = useCallback((type: LineJoinType) => {\n    setLineJoinState(type);\n  }, []);\n\n  const setLineCap = useCallback((type: LineCapType) => {\n    setLineCapState(type);\n  }, []);\n\n  const getCanvasProps = useCallback(\n    (props: PropsGetterInput = {}): PropsGetterResult => {\n      const {\n        onMouseDown,\n        onTouchStart,\n        onMouseMove,\n        onTouchMove,\n        onMouseUp,\n        onTouchEnd,\n        style,\n        ref,\n        ...restProps\n      } = props;\n      return {\n        onMouseDown: composeFn(onMouseDown, handleMouseDown),\n        onMouseMove: composeFn(onMouseMove, handleMouseMove),\n        onMouseUp: composeFn(onMouseUp, handleMouseUp),\n        onTouchEnd: composeFn(onTouchEnd, handleMouseUp),\n        onTouchMove: composeFn(onTouchMove, handleMouseMove),\n        onTouchStart: composeFn(onTouchStart, handleMouseDown),\n        ref: composeFn(ref, (canvasElement: HTMLCanvasElement) => {\n          canvasRef.current = canvasElement;\n        }),\n        style: {\n          height: canvasHeight,\n          width: canvasWidth,\n          ...style,\n        },\n        ...restProps,\n      };\n    },\n    [canvasHeight, canvasWidth, handleMouseDown, handleMouseMove, handleMouseUp]\n  );\n\n  const canvas = React.createElement('canvas', getCanvasProps());\n\n  return {\n    canvas,\n    triggerSave: handleSave,\n    getCanvasProps,\n    imageCanDownload,\n    imageDownloadUrl,\n    setColor,\n    setLineWidth,\n    setLineJoin,\n    setLineCap,\n  };\n}\n","const dataUrlToArrayBuffer = (dataURI: string): [string, ArrayBuffer] => {\n  const type = dataURI.match(/:([^}]*);/)[1];\n  const byteString = atob(dataURI.split(',')[1]);\n  const ia = new Uint8Array(byteString.length);\n  for (let i = 0; i < byteString.length; i++) {\n    ia[i] = byteString.charCodeAt(i);\n  }\n  return [type, ia.buffer];\n};\n\nconst canvasToBlob = (canvas: HTMLCanvasElement, type: string): Promise<Blob> =>\n  new Promise(resolve => {\n    if (canvas.toBlob) {\n      canvas.toBlob(blob => resolve(blob), type);\n    } else {\n      const dataURL = canvas.toDataURL(type);\n      const [generatedType, buffer] = dataUrlToArrayBuffer(dataURL);\n      resolve(new Blob([buffer], { type: generatedType }));\n    }\n  });\n\nexport { canvasToBlob };\n","const fileToUrl = (file: File | Blob): string => {\n  const url = window.URL || (window as any).webkitURL;\n  try {\n    return url.createObjectURL(file);\n  } catch {\n    return '';\n  }\n};\n\nconst revokeUrl = (objectUrl: string): void => {\n  try {\n    window.URL.revokeObjectURL(objectUrl);\n  } catch {\n    // fail silently because they is no major disruption to user exp\n  }\n};\n\nexport { fileToUrl, revokeUrl };\n","import { fileToUrl } from './objectUrlHelpers';\n\ninterface ImportImageResponse {\n  img: HTMLImageElement | ImageBitmap;\n  imgWidth: number;\n  imgHeight: number;\n}\n\nconst makeAjaxHeadRequest = (\n  url: string,\n  withCredentials: boolean = false\n): Promise<any> =>\n  new Promise((resolve, reject) => {\n    try {\n      const request = new XMLHttpRequest();\n      request.open('HEAD', url);\n      request.timeout = 1000;\n      request.withCredentials = withCredentials;\n      request.onreadystatechange = () => {\n        if (request.readyState === 4) {\n          if (request.status === 200) {\n            resolve(request.response);\n          } else {\n            reject(request.response);\n          }\n        }\n      };\n      request.ontimeout = () => {\n        reject('Timeout');\n      };\n      request.send();\n    } catch (e) {\n      reject(e);\n    }\n  });\n\nconst checkImageCrossOriginAllowed = (\n  imageUrl: string\n): Promise<{\n  anonymous: boolean;\n  withCredentials: boolean;\n}> =>\n  new Promise(resolve => {\n    Promise.all(\n      // First try without credentials, then with credentials\n      // (at the end report which one of the two works - it can be both)\n      // Have to map, else Promise.all would fail if any request fail\n      [makeAjaxHeadRequest(imageUrl), makeAjaxHeadRequest(imageUrl, true)].map(promise =>\n        promise\n          .then(result => ({\n            result,\n            success: true\n          }))\n          .catch(error => ({\n            error,\n            success: false\n          }))\n      )\n    )\n      .then(results =>\n        resolve({\n          anonymous: results[0].success,\n          withCredentials: results[1].success\n        })\n      )\n      .catch(() =>\n        resolve({\n          anonymous: false,\n          withCredentials: false\n        })\n      );\n  });\n\nconst importImageFromUrl = (url: string): Promise<ImportImageResponse> => {\n  const img = new Image();\n  return new Promise((resolve, reject) => {\n    img.onload = () => {\n      resolve({\n        img,\n        imgWidth: img.naturalWidth,\n        imgHeight: img.naturalHeight\n      });\n    };\n    checkImageCrossOriginAllowed(url).then(({ anonymous, withCredentials }) => {\n      if (anonymous || withCredentials) {\n        img.crossOrigin = anonymous ? 'anonymous' : 'use-credentials';\n        img.src = url;\n      } else {\n        reject();\n      }\n    });\n  });\n};\n\nconst importImageFromBitmapSrc = (bitmapSrc: File): Promise<ImportImageResponse> =>\n  new Promise((resolve, reject) => {\n    window\n      .createImageBitmap(bitmapSrc)\n      .then(img =>\n        resolve({\n          img,\n          imgWidth: img.width,\n          imgHeight: img.height\n        })\n      )\n      .catch(err => reject(err));\n  });\n\nconst importImageFromFile = (file: File): Promise<ImportImageResponse> => {\n  const img = new Image();\n  return new Promise(resolve => {\n    img.onload = () => {\n      resolve({\n        img,\n        imgWidth: img.naturalWidth,\n        imgHeight: img.naturalHeight\n      });\n    };\n    img.src = fileToUrl(file);\n  });\n};\n\nconst importImage = (image: string | File): Promise<ImportImageResponse> => {\n  if (typeof image === 'string') {\n    return importImageFromUrl(image);\n  } else if ('createImageBitMap' in window) {\n    return importImageFromBitmapSrc(image);\n  } else {\n    return importImageFromFile(image);\n  }\n};\n\nexport { importImage };\n","import { SyntheticEvent } from 'react';\n\nconst extractOffSetFromEvent = (\n  e: SyntheticEvent<HTMLCanvasElement>,\n  scalingFactor: number,\n  canvasRef: HTMLCanvasElement\n) => {\n  const {\n    offsetX,\n    offsetY,\n    touches,\n    clientX: mouseClientX,\n    clientY: mouseClientY\n  } = e.nativeEvent as any;\n  // If offset coords are directly on the event we use them\n  if (offsetX && offsetY) {\n    return {\n      offsetX: offsetX * scalingFactor,\n      offsetY: offsetY * scalingFactor\n    };\n  }\n  // Otherwise we need to calculate them as difference between (x, y) of event and (left, top) corner of canvas\n  // We need to check whether user is using a touch device or just the mouse and extract\n  // the touch/click coords accordingly\n  const clientX = touches && touches.length ? touches[0].clientX : mouseClientX;\n  const clientY = touches && touches.length ? touches[0].clientY : mouseClientY;\n  const rect = canvasRef.getBoundingClientRect();\n  const x = (clientX - rect.left) * scalingFactor;\n  const y = (clientY - rect.top) * scalingFactor;\n  return {\n    offsetX: x,\n    offsetY: y\n  };\n};\n\nexport { extractOffSetFromEvent };\n","const getCanvasDimensionsScaledForImage = (\n  cvWidth: number,\n  imageWidth: number,\n  imageHeight: number\n) => {\n  if (imageWidth <= cvWidth) {\n    return [imageWidth, imageHeight, 1];\n  }\n  const scalingRatio = cvWidth / imageWidth;\n  return [cvWidth, scalingRatio * imageHeight, scalingRatio];\n};\n\nexport { getCanvasDimensionsScaledForImage };\n","type AnyFunction = (...params: any[]) => any;\n\nconst composeFn = (...fns: (AnyFunction | undefined)[]) => (...args: any[]) =>\n  fns.forEach(fn => fn && fn(...args));\n\nexport { composeFn };\n","import React from 'react';\nimport { usePainter } from './usePainter';\n\nexport type LineJoinType = 'round' | 'bevel' | 'miter';\nexport type LineCapType = 'round' | 'butt' | 'square';\n\nexport interface CanvasProps {\n  onMouseDown: React.MouseEventHandler<HTMLCanvasElement>;\n  onTouchStart: React.TouchEventHandler<HTMLCanvasElement>;\n  onMouseMove: React.MouseEventHandler<HTMLCanvasElement>;\n  onTouchMove: React.TouchEventHandler<HTMLCanvasElement>;\n  onMouseUp: React.MouseEventHandler<HTMLCanvasElement>;\n  onTouchEnd: React.TouchEventHandler<HTMLCanvasElement>;\n  style: React.CSSProperties;\n  ref: (ref: HTMLCanvasElement) => void;\n}\n\nexport interface PropsGetterInput extends Partial<CanvasProps> {\n  [key: string]: any;\n}\n\nexport interface PropsGetterResult extends CanvasProps {\n  [key: string]: any;\n}\n\nexport interface RenderProps {\n  canvas: JSX.Element;\n  triggerSave: () => void;\n  getCanvasProps: (props: PropsGetterInput) => PropsGetterResult;\n  imageCanDownload: boolean | null;\n  imageDownloadUrl: string | null;\n  setColor: (color: string) => void;\n  setLineWidth: (width: number) => void;\n  setLineJoin: (type: LineJoinType) => void;\n  setLineCap: (type: LineCapType) => void;\n}\n\nexport interface ReactPainterProps {\n  height?: number;\n  width?: number;\n  initialColor?: string;\n  initialLineWidth?: number;\n  initialLineJoin?: LineJoinType;\n  initialLineCap?: LineCapType;\n  onSave?: (blob: Blob) => void;\n  image?: File | string;\n  render?: (props: RenderProps) => JSX.Element;\n}\n\nexport interface PainterState {\n  canvasHeight: number;\n  canvasWidth: number;\n  imageCanDownload: boolean | null;\n  imageDownloadUrl: string | null;\n  isDrawing: boolean;\n  color: string;\n  lineWidth: number;\n  lineJoin: LineJoinType;\n  lineCap: LineCapType;\n}\n\nexport const ReactPainter: React.FC<ReactPainterProps> = ({\n  render,\n  ...painterProps\n}) => {\n  const {\n    canvas,\n    triggerSave,\n    getCanvasProps,\n    imageCanDownload,\n    imageDownloadUrl,\n    setColor,\n    setLineWidth,\n    setLineJoin,\n    setLineCap,\n  } = usePainter(painterProps);\n\n  if (typeof render === 'function') {\n    return render({\n      canvas,\n      getCanvasProps,\n      imageCanDownload,\n      imageDownloadUrl,\n      setColor,\n      setLineCap,\n      setLineJoin,\n      setLineWidth,\n      triggerSave,\n    });\n  }\n\n  return canvas;\n};\n","import { ReactPainter } from './ReactPainter';\n\nexport { ReactPainter } from './ReactPainter';\nexport { usePainter } from './usePainter';\nexport type { UsePainterProps, UsePainterResult } from './usePainter';\n\nexport default ReactPainter;\n"],"mappings":"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","names":[]}