react-os-shell 2.9.4 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Browser-M5FCUZ3B.js → Browser-3SDJFEZW.js} +4 -4
- package/dist/{Browser-M5FCUZ3B.js.map → Browser-3SDJFEZW.js.map} +1 -1
- package/dist/{Documents-ZBSGZ6IS.js → Documents-HCHGAFPB.js} +3 -3
- package/dist/{Documents-ZBSGZ6IS.js.map → Documents-HCHGAFPB.js.map} +1 -1
- package/dist/Files-FYWUNLBY.js +12 -0
- package/dist/{Files-RCBB7L6F.js.map → Files-FYWUNLBY.js.map} +1 -1
- package/dist/{Notepad-MBYDR7WZ.js → Notepad-WRS7EMCK.js} +3 -3
- package/dist/{Notepad-MBYDR7WZ.js.map → Notepad-WRS7EMCK.js.map} +1 -1
- package/dist/Preview-HOLQVFSU.js +8 -0
- package/dist/{Preview-7AIWQDP7.js.map → Preview-HOLQVFSU.js.map} +1 -1
- package/dist/{Spreadsheet-USNVGYAH.js → Spreadsheet-MRUQ4LJR.js} +4 -4
- package/dist/{Spreadsheet-USNVGYAH.js.map → Spreadsheet-MRUQ4LJR.js.map} +1 -1
- package/dist/apps/index.js +12 -13
- package/dist/apps/index.js.map +1 -1
- package/dist/{chunk-JZKFHLA6.js → chunk-D7QQTFM3.js} +3 -3
- package/dist/{chunk-JZKFHLA6.js.map → chunk-D7QQTFM3.js.map} +1 -1
- package/dist/{chunk-XJFI35IK.js → chunk-QS2MEW6R.js} +4 -4
- package/dist/{chunk-XJFI35IK.js.map → chunk-QS2MEW6R.js.map} +1 -1
- package/dist/{chunk-3HIKRXNT.js → chunk-SKNOGIDC.js} +996 -6
- package/dist/chunk-SKNOGIDC.js.map +1 -0
- package/dist/{chunk-5ICRXHJ7.js → chunk-X4MB43G2.js} +4 -4
- package/dist/{chunk-5ICRXHJ7.js.map → chunk-X4MB43G2.js.map} +1 -1
- package/dist/{chunk-AJFUAG54.js → chunk-XRCABX52.js} +3 -3
- package/dist/{chunk-AJFUAG54.js.map → chunk-XRCABX52.js.map} +1 -1
- package/dist/{chunk-2XERB3XN.js → chunk-XVCEFF6M.js} +3 -3
- package/dist/{chunk-2XERB3XN.js.map → chunk-XVCEFF6M.js.map} +1 -1
- package/dist/index.d.ts +1 -125
- package/dist/index.js +15 -510
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/Files-RCBB7L6F.js +0 -13
- package/dist/ImageAnnotator-55NPWJ2R.js +0 -4
- package/dist/ImageAnnotator-55NPWJ2R.js.map +0 -1
- package/dist/Preview-7AIWQDP7.js +0 -9
- package/dist/chunk-3HIKRXNT.js.map +0 -1
- package/dist/chunk-NUPYEVU4.js +0 -999
- package/dist/chunk-NUPYEVU4.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/ImageAnnotator.tsx"],"names":["ImageAnnotator"],"mappings":"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","file":"chunk-NUPYEVU4.js","sourcesContent":["/**\n * Image annotator — opens an image with vector-style annotations layered\n * over it. Each annotation is a real, editable object: select to drag /\n * resize, recolor / restyle from the toolbar, Delete to remove. Zoom\n * scales the editing surface; the underlying image-pixel coordinate\n * system is preserved so saved exports always render at full resolution.\n *\n * Architecture:\n * - <canvas> bottom layer: original image + any committed mosaic\n * regions (mosaic edits real pixels)\n * - <svg> top layer: shapes / arrows / text / freehand. State-\n * driven, every annotation is interactive.\n * - viewBox locked to image-pixel coords so the SVG hit-tests and\n * coordinates are unaffected by the display zoom level.\n *\n * Tools: select (default), draw (freehand), rect, circle, arrow, mosaic,\n * text, crop.\n *\n * Save / Copy buttons live on the OUTER Preview toolbar (alongside Open).\n * The annotator exposes them via `useImperativeHandle` on a forwardRef —\n * see ImageAnnotatorHandle.\n */\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport toast from '../shell/toast';\n\ntype Tool = 'select' | 'draw' | 'rect' | 'circle' | 'arrow' | 'mosaic' | 'text' | 'crop';\ntype Corner = 'nw' | 'ne' | 'se' | 'sw' | 'start' | 'end';\n\ntype RectAnno = { id: string; type: 'rect'; x: number; y: number; w: number; h: number; color: string; stroke: number; radius: number };\ntype CircleAnno = { id: string; type: 'circle'; x: number; y: number; w: number; h: number; color: string; stroke: number };\ntype ArrowAnno = { id: string; type: 'arrow'; x1: number; y1: number; x2: number; y2: number; color: string; stroke: number };\ntype MosaicAnno = { id: string; type: 'mosaic'; x: number; y: number; w: number; h: number };\ntype DrawAnno = { id: string; type: 'draw'; points: { x: number; y: number }[]; color: string; stroke: number };\ntype TextAnno = { id: string; type: 'text'; x: number; y: number; text: string; color: string; size: number; font: string; bold: boolean; italic: boolean; underline: boolean };\ntype Annotation = RectAnno | CircleAnno | ArrowAnno | MosaicAnno | DrawAnno | TextAnno;\n\nconst COLORS = ['#ef4444', '#f97316', '#eab308', '#22c55e', '#3b82f6', '#8b5cf6', '#000000', '#ffffff'];\nconst FONTS = [\n { id: 'system', label: 'System', css: '-apple-system, system-ui, sans-serif' },\n { id: 'serif', label: 'Serif', css: 'Georgia, \"Times New Roman\", serif' },\n { id: 'mono', label: 'Mono', css: 'ui-monospace, \"SF Mono\", Menlo, monospace' },\n { id: 'cursive',label: 'Cursive', css: '\"Brush Script MT\", \"Comic Sans MS\", cursive' },\n];\nconst STROKE_DEFAULT = 4;\nconst TEXT_SIZE_DEFAULT = 24;\nconst RECT_RADIUS_DEFAULT = 12;\nconst MOSAIC_BLOCK = 12;\nconst ZOOM_MIN = 0.25;\nconst ZOOM_MAX = 4;\nconst ZOOM_STEP = 0.25;\n\nconst newId = () => Math.random().toString(36).slice(2, 9);\n\nexport interface ImageAnnotatorHandle {\n copy: () => Promise<void>;\n save: () => Promise<void>;\n}\n\ninterface ImageAnnotatorProps {\n src: string;\n filename: string;\n /** Standalone-mode: when provided, an Apply pill is rendered in the\n * annotator's toolbar that composites the current canvas + SVG into a PNG\n * blob and hands it back. Used by callers like the bug-report dialog that\n * embed the annotator outside the Preview app and want the result. */\n onApply?: (blob: Blob) => void;\n /** Standalone-mode companion to `onApply` — Cancel pill that lets the\n * consumer dismiss the annotator without applying. */\n onCancel?: () => void;\n}\n\nconst ImageAnnotator = forwardRef<ImageAnnotatorHandle, ImageAnnotatorProps>(function ImageAnnotator(\n { src, filename, onApply, onCancel }, ref,\n) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const imageRef = useRef<HTMLImageElement | null>(null);\n\n const [tool, setTool] = useState<Tool>('select');\n const [color, setColor] = useState(COLORS[0]);\n const [stroke, setStroke] = useState(STROKE_DEFAULT);\n const [textSize, setTextSize] = useState(TEXT_SIZE_DEFAULT);\n const [textFont, setTextFont] = useState(FONTS[0].id);\n const [textBold, setTextBold] = useState(true);\n const [textItalic, setTextItalic] = useState(false);\n const [textUnderline, setTextUnderline] = useState(false);\n const [rectRadius, setRectRadius] = useState(RECT_RADIUS_DEFAULT);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [imageSize, setImageSize] = useState<{ w: number; h: number } | null>(null);\n const [fitSize, setFitSize] = useState<{ w: number; h: number } | null>(null);\n const [zoom, setZoom] = useState(1);\n\n const [preview, setPreview] = useState<Annotation | null>(null);\n const [pendingText, setPendingText] = useState<{ x: number; y: number; value: string; editingId?: string } | null>(null);\n const [pendingCrop, setPendingCrop] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n\n const dragRef = useRef<\n | { kind: 'draw'; start: { x: number; y: number } }\n | { kind: 'pen'; points: { x: number; y: number }[] }\n | { kind: 'move'; id: string; start: { x: number; y: number }; original: Annotation }\n | { kind: 'resize'; id: string; corner: Corner; start: { x: number; y: number }; original: Annotation }\n | { kind: 'crop'; start: { x: number; y: number } }\n | null\n >(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const displaySize = useMemo(() => {\n if (!fitSize) return null;\n return { w: fitSize.w * zoom, h: fitSize.h * zoom };\n }, [fitSize, zoom]);\n const scale = displaySize && imageSize ? displaySize.w / imageSize.w : 1;\n\n // ── selected annotation ────────────────────────────────────────────────────\n const selected = useMemo(\n () => annotations.find(a => a.id === selectedId) ?? null,\n [annotations, selectedId],\n );\n\n // When user picks a tool, sync the toolbar inputs to that tool's defaults\n // for new shapes (without affecting selected annotations).\n useEffect(() => {\n if (tool === 'select' && selected) {\n // Reflect the selected annotation in the toolbar.\n if ('color' in selected) setColor(selected.color);\n if ('stroke' in selected) setStroke(selected.stroke);\n if (selected.type === 'rect') setRectRadius(selected.radius);\n if (selected.type === 'text') {\n setTextSize(selected.size);\n setTextFont(selected.font);\n setTextBold(selected.bold);\n setTextItalic(selected.italic);\n setTextUnderline(selected.underline);\n }\n }\n }, [selectedId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── load image ────────────────────────────────────────────────────────────\n useEffect(() => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n imageRef.current = img;\n setImageSize({ w: img.naturalWidth, h: img.naturalHeight });\n setAnnotations([]);\n setSelectedId(null);\n };\n img.onerror = () => toast.error('Failed to load image');\n img.src = src;\n }, [src]);\n\n // Compute fit-to-area display size (independent of zoom).\n useEffect(() => {\n if (!imageSize) return;\n const update = () => {\n const wrap = wrapRef.current;\n if (!wrap) return;\n const r = wrap.getBoundingClientRect();\n const availW = Math.max(0, r.width - 32);\n const availH = Math.max(0, r.height - 32);\n if (availW === 0 || availH === 0) return;\n const ratio = imageSize.w / imageSize.h;\n let w = imageSize.w, h = imageSize.h;\n if (w > availW) { w = availW; h = w / ratio; }\n if (h > availH) { h = availH; w = h * ratio; }\n setFitSize({ w, h });\n };\n update();\n const ro = new ResizeObserver(update);\n if (wrapRef.current) ro.observe(wrapRef.current);\n return () => ro.disconnect();\n }, [imageSize]);\n\n // Render canvas: image + mosaic regions baked in. fitSize in deps so we\n // re-render the moment the canvas mounts (it only mounts when displaySize\n // is computed).\n const mosaicAnnos = useMemo(\n () => annotations.filter(a => a.type === 'mosaic') as MosaicAnno[],\n [annotations],\n );\n useEffect(() => {\n const img = imageRef.current;\n const c = canvasRef.current;\n if (!img || !c || !imageSize) return;\n c.width = imageSize.w;\n c.height = imageSize.h;\n const ctx = c.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n for (const m of mosaicAnnos) applyMosaic(ctx, m);\n }, [imageSize, mosaicAnnos, fitSize]);\n\n // ── coord helpers ─────────────────────────────────────────────────────────\n const evToImage = (e: { clientX: number; clientY: number }): { x: number; y: number } => {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const pt = svg.createSVGPoint();\n pt.x = e.clientX; pt.y = e.clientY;\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n const t = pt.matrixTransform(ctm.inverse());\n return { x: t.x, y: t.y };\n };\n\n // ── drag (window-level) ───────────────────────────────────────────────────\n const beginDrag = (drag: NonNullable<typeof dragRef.current>) => {\n dragRef.current = drag;\n setIsDragging(true);\n };\n\n useEffect(() => {\n if (!isDragging) return;\n const onMove = (ev: PointerEvent) => {\n const drag = dragRef.current;\n if (!drag) return;\n const p = evToImage(ev);\n if (drag.kind === 'draw') {\n setPreview(makeShape(tool, drag.start, p, color, stroke, rectRadius));\n } else if (drag.kind === 'pen') {\n // Append point if it moved enough to matter.\n const last = drag.points[drag.points.length - 1];\n if (Math.abs(p.x - last.x) > 1 || Math.abs(p.y - last.y) > 1) {\n drag.points.push(p);\n setPreview({ id: '', type: 'draw', points: drag.points.slice(), color, stroke });\n }\n } else if (drag.kind === 'crop') {\n setPendingCrop(normalizeRect(drag.start, p));\n } else if (drag.kind === 'move') {\n const dx = p.x - drag.start.x;\n const dy = p.y - drag.start.y;\n setAnnotations(prev => prev.map(a => a.id === drag.id ? translate(drag.original, dx, dy) : a));\n } else if (drag.kind === 'resize') {\n setAnnotations(prev => prev.map(a => a.id === drag.id ? resize(drag.original, drag.corner, p) : a));\n }\n };\n const onUp = () => {\n const drag = dragRef.current;\n dragRef.current = null;\n setIsDragging(false);\n if (drag?.kind === 'draw') {\n setPreview(p => {\n if (!p || isTrivial(p)) return null;\n const anno: Annotation = { ...p, id: newId() } as Annotation;\n setAnnotations(prev => [...prev, anno]);\n setSelectedId(anno.id);\n setTool('select');\n return null;\n });\n } else if (drag?.kind === 'pen') {\n if (drag.points.length < 2) { setPreview(null); return; }\n const anno: DrawAnno = { id: newId(), type: 'draw', points: drag.points, color, stroke };\n setAnnotations(prev => [...prev, anno]);\n setSelectedId(anno.id);\n setTool('select');\n setPreview(null);\n }\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [isDragging, tool, color, stroke, rectRadius]);\n\n const handleAnnoPointerDown = (e: React.PointerEvent<SVGElement>, anno: Annotation) => {\n if (tool !== 'select') return;\n e.stopPropagation();\n setSelectedId(anno.id);\n beginDrag({ kind: 'move', id: anno.id, start: evToImage(e), original: anno });\n };\n\n const handleHandlePointerDown = (e: React.PointerEvent<SVGElement>, anno: Annotation, corner: Corner) => {\n e.stopPropagation();\n beginDrag({ kind: 'resize', id: anno.id, corner, start: evToImage(e), original: anno });\n };\n\n const handleSvgPointerDown = (e: React.PointerEvent<SVGSVGElement>) => {\n if (tool === 'select') {\n setSelectedId(null);\n return;\n }\n if (tool === 'text') {\n const p = evToImage(e);\n setPendingText({ x: p.x, y: p.y, value: '' });\n return;\n }\n const start = evToImage(e);\n if (tool === 'crop') {\n beginDrag({ kind: 'crop', start });\n return;\n }\n if (tool === 'draw') {\n // 'draw' (the registry) means freehand pen here.\n beginDrag({ kind: 'pen', points: [start] });\n setPreview({ id: '', type: 'draw', points: [start], color, stroke });\n return;\n }\n setPreview(makeShape(tool, start, start, color, stroke, rectRadius));\n beginDrag({ kind: 'draw', start });\n };\n\n const handleAnnoDoubleClick = (anno: Annotation) => {\n if (anno.type !== 'text') return;\n setPendingText({ x: anno.x, y: anno.y, value: anno.text, editingId: anno.id });\n };\n\n // Keyboard shortcuts:\n // Delete / Backspace — removes the selected annotation\n // Escape — deselect\n // Cmd/Ctrl-Z — undo last annotation\n useEffect(() => {\n const onKey = (ev: KeyboardEvent) => {\n if (document.activeElement && /^(INPUT|TEXTAREA)$/.test(document.activeElement.tagName)) return;\n if ((ev.metaKey || ev.ctrlKey) && (ev.key === 'z' || ev.key === 'Z') && !ev.shiftKey) {\n ev.preventDefault();\n setAnnotations(prev => prev.slice(0, -1));\n setSelectedId(null);\n return;\n }\n if (!selectedId) return;\n if (ev.key === 'Delete' || ev.key === 'Backspace') {\n ev.preventDefault();\n setAnnotations(prev => prev.filter(a => a.id !== selectedId));\n setSelectedId(null);\n } else if (ev.key === 'Escape') {\n setSelectedId(null);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [selectedId]);\n\n // ── live edits to selected annotation ──────────────────────────────────────\n // Helpers that mutate the selected annotation if there is one, else just\n // change the toolbar default for the next new shape.\n const setColorAndApply = (c: string) => {\n setColor(c);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a => {\n if (a.id !== selectedId) return a;\n if (a.type === 'mosaic') return a;\n return { ...a, color: c } as Annotation;\n }));\n };\n const setStrokeAndApply = (s: number) => {\n setStroke(s);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a => {\n if (a.id !== selectedId) return a;\n if (a.type === 'rect' || a.type === 'circle' || a.type === 'arrow' || a.type === 'draw') {\n return { ...a, stroke: s } as Annotation;\n }\n return a;\n }));\n };\n const setRectRadiusAndApply = (r: number) => {\n setRectRadius(r);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'rect') ? { ...a, radius: r } : a,\n ));\n };\n const setTextSizeAndApply = (s: number) => {\n setTextSize(s);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, size: s } : a,\n ));\n };\n const setTextFontAndApply = (f: string) => {\n setTextFont(f);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, font: f } : a,\n ));\n };\n const toggleTextStyleAndApply = (which: 'bold' | 'italic' | 'underline') => {\n const next = !{ bold: textBold, italic: textItalic, underline: textUnderline }[which];\n if (which === 'bold') setTextBold(next);\n if (which === 'italic') setTextItalic(next);\n if (which === 'underline') setTextUnderline(next);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, [which]: next } : a,\n ));\n };\n\n // ── text input ─────────────────────────────────────────────────────────────\n const commitText = () => {\n if (!pendingText) return;\n const value = pendingText.value;\n if (!value.trim()) {\n if (pendingText.editingId) {\n setAnnotations(prev => prev.filter(a => a.id !== pendingText.editingId));\n }\n setPendingText(null);\n return;\n }\n if (pendingText.editingId) {\n setAnnotations(prev => prev.map(a =>\n a.id === pendingText.editingId && a.type === 'text'\n ? { ...a, text: value }\n : a,\n ));\n } else {\n const anno: TextAnno = {\n id: newId(),\n type: 'text',\n x: pendingText.x,\n y: pendingText.y,\n text: value,\n color,\n size: textSize,\n font: textFont,\n bold: textBold,\n italic: textItalic,\n underline: textUnderline,\n };\n setAnnotations(prev => [...prev, anno]);\n setSelectedId(anno.id);\n setTool('select');\n }\n setPendingText(null);\n };\n\n // ── crop ───────────────────────────────────────────────────────────────────\n const applyCrop = () => {\n if (!pendingCrop || !imageRef.current || !imageSize) return;\n const r = pendingCrop;\n const tmp = document.createElement('canvas');\n tmp.width = Math.round(r.w);\n tmp.height = Math.round(r.h);\n const tctx = tmp.getContext('2d')!;\n const sourceCanvas = document.createElement('canvas');\n sourceCanvas.width = imageSize.w;\n sourceCanvas.height = imageSize.h;\n const sctx = sourceCanvas.getContext('2d')!;\n sctx.drawImage(imageRef.current, 0, 0);\n for (const m of mosaicAnnos) applyMosaic(sctx, m);\n tctx.drawImage(sourceCanvas, r.x, r.y, r.w, r.h, 0, 0, r.w, r.h);\n const newImg = new Image();\n newImg.onload = () => {\n imageRef.current = newImg;\n setImageSize({ w: newImg.naturalWidth, h: newImg.naturalHeight });\n setAnnotations(prev =>\n prev\n .filter(a => a.type !== 'mosaic')\n .map(a => translate(a, -r.x, -r.y))\n .filter(a => withinBounds(a, newImg.naturalWidth, newImg.naturalHeight)),\n );\n setPendingCrop(null);\n };\n newImg.src = tmp.toDataURL('image/png');\n };\n const cancelCrop = () => setPendingCrop(null);\n\n const undoLast = () => {\n setAnnotations(prev => prev.slice(0, -1));\n setSelectedId(null);\n };\n\n // ── export (Save / Copy via outer toolbar through useImperativeHandle) ────\n const compositeToCanvas = async (): Promise<HTMLCanvasElement | null> => {\n const c = canvasRef.current;\n const svg = svgRef.current;\n if (!c || !svg || !imageSize) return null;\n const out = document.createElement('canvas');\n out.width = imageSize.w;\n out.height = imageSize.h;\n const octx = out.getContext('2d')!;\n octx.drawImage(c, 0, 0);\n const clone = svg.cloneNode(true) as SVGSVGElement;\n clone.querySelectorAll('[data-chrome]').forEach(n => n.remove());\n const xml = new XMLSerializer().serializeToString(clone);\n const svgBlob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const svgUrl = URL.createObjectURL(svgBlob);\n const svgImg = new Image();\n await new Promise<void>(resolve => {\n svgImg.onload = () => resolve();\n svgImg.onerror = () => resolve();\n svgImg.src = svgUrl;\n });\n octx.drawImage(svgImg, 0, 0, imageSize.w, imageSize.h);\n URL.revokeObjectURL(svgUrl);\n return out;\n };\n\n useImperativeHandle(ref, () => ({\n save: async () => {\n const out = await compositeToCanvas();\n if (!out) return;\n out.toBlob(blob => {\n if (!blob) { toast.error('Failed to export'); return; }\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const base = filename.replace(/\\.[^.]+$/, '');\n a.download = `${base}-annotated.png`;\n a.click();\n URL.revokeObjectURL(url);\n }, 'image/png');\n },\n copy: async () => {\n if (!('clipboard' in navigator) || typeof ClipboardItem === 'undefined') {\n toast.error('Clipboard images not supported in this browser');\n return;\n }\n const out = await compositeToCanvas();\n if (!out) return;\n out.toBlob(async blob => {\n if (!blob) { toast.error('Failed to copy'); return; }\n try {\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\n toast.success('Copied to clipboard');\n } catch {\n toast.error('Copy failed (clipboard permission?)');\n }\n }, 'image/png');\n },\n }), [imageSize, filename]);\n\n // ── tool definitions ──────────────────────────────────────────────────────\n const tools: { id: Tool; label: string; icon: JSX.Element }[] = useMemo(() => [\n { id: 'select', label: 'Select / Move', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 3l7 17 2-7 7-2L5 3z\" /></svg> },\n { id: 'draw', label: 'Pen / Draw', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487z\" /></svg> },\n { id: 'rect', label: 'Rectangle', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"3\" /></svg> },\n { id: 'circle', label: 'Ellipse', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"6\" /></svg> },\n { id: 'arrow', label: 'Arrow', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 19L19 5m0 0h-7m7 0v7\" /></svg> },\n { id: 'mosaic', label: 'Mosaic', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\" /></svg> },\n { id: 'text', label: 'Text', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M12 6v14M9 20h6\" /></svg> },\n { id: 'crop', label: 'Crop', icon: <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 2v15a1 1 0 001 1h15M2 6h15a1 1 0 011 1v15\" /></svg> },\n ], []);\n\n const btnClass = (active: boolean) =>\n `p-1.5 rounded transition-colors ${active ? 'bg-blue-500 text-white' : 'text-gray-700 hover:bg-gray-200'}`;\n\n // Decide which secondary controls to show based on current context\n // (selected annotation type takes priority over the chosen tool).\n const ctxType = selected?.type ?? (tool === 'select' ? null : tool);\n const showStrokeControl = ctxType === 'rect' || ctxType === 'circle' || ctxType === 'arrow' || ctxType === 'draw';\n const showRectRadius = ctxType === 'rect';\n const showTextControls = ctxType === 'text';\n\n return (\n <div className=\"flex flex-col h-full bg-gray-100\">\n {/* Tool bar */}\n <div className=\"flex items-center gap-1.5 px-3 py-2 border-b border-gray-200 bg-white shrink-0 flex-wrap text-[12px]\">\n {tools.map(t => (\n <button\n key={t.id}\n onClick={() => { setTool(t.id); setSelectedId(null); }}\n title={t.label}\n className={btnClass(tool === t.id)}\n >\n {t.icon}\n </button>\n ))}\n\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n\n {/* Color picker — always visible */}\n <div className=\"flex items-center gap-1\">\n {COLORS.map(c => (\n <button\n key={c}\n onClick={() => setColorAndApply(c)}\n title={c}\n className={`h-5 w-5 rounded-full border ${color === c ? 'ring-2 ring-blue-500 ring-offset-1' : 'border-gray-300'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n\n {showStrokeControl && (\n <>\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Weight</span>\n <input type=\"range\" min={1} max={20} step={1} value={stroke} onChange={(e) => setStrokeAndApply(Number(e.target.value))} className=\"w-16 accent-blue-500\" />\n <span className=\"tabular-nums w-5 text-right\">{stroke}</span>\n </label>\n </>\n )}\n\n {showRectRadius && (\n <>\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Radius</span>\n <input type=\"range\" min={0} max={48} step={1} value={rectRadius} onChange={(e) => setRectRadiusAndApply(Number(e.target.value))} className=\"w-16 accent-blue-500\" />\n <span className=\"tabular-nums w-6 text-right\">{rectRadius}</span>\n </label>\n </>\n )}\n\n {showTextControls && (\n <>\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n <select value={textFont} onChange={(e) => setTextFontAndApply(e.target.value)} className=\"text-xs border border-gray-300 rounded px-1 py-0.5 bg-white\">\n {FONTS.map(f => <option key={f.id} value={f.id}>{f.label}</option>)}\n </select>\n <button onClick={() => toggleTextStyleAndApply('bold')} className={btnClass(textBold)} title=\"Bold\"><span className=\"font-bold\">B</span></button>\n <button onClick={() => toggleTextStyleAndApply('italic')} className={btnClass(textItalic)} title=\"Italic\"><span className=\"italic\">I</span></button>\n <button onClick={() => toggleTextStyleAndApply('underline')} className={btnClass(textUnderline)} title=\"Underline\"><span className=\"underline\">U</span></button>\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Size</span>\n <input type=\"range\" min={10} max={96} step={1} value={textSize} onChange={(e) => setTextSizeAndApply(Number(e.target.value))} className=\"w-16 accent-blue-500\" />\n <span className=\"tabular-nums w-7 text-right\">{textSize}</span>\n </label>\n </>\n )}\n\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n\n {/* Zoom */}\n <button onClick={() => setZoom(z => Math.max(ZOOM_MIN, Math.round((z - ZOOM_STEP) * 100) / 100))} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\" title=\"Zoom out\">−</button>\n <span className=\"text-gray-600 tabular-nums w-10 text-center\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => setZoom(z => Math.min(ZOOM_MAX, Math.round((z + ZOOM_STEP) * 100) / 100))} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\" title=\"Zoom in\">+</button>\n <button onClick={() => setZoom(1)} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\" title=\"Fit to area\">Fit</button>\n\n <div className=\"h-5 w-px bg-gray-300 mx-1\" />\n\n <button onClick={undoLast} disabled={annotations.length === 0} className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-700\">Undo</button>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {pendingCrop && (\n <>\n <button onClick={applyCrop} className=\"px-2 py-1 rounded bg-blue-500 text-white hover:bg-blue-600\">Apply Crop</button>\n <button onClick={cancelCrop} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-700\">Cancel</button>\n </>\n )}\n {onApply && !pendingCrop && (\n <>\n {onCancel && (\n <button onClick={onCancel} className=\"px-3 py-1 rounded hover:bg-gray-200 text-gray-700 text-xs font-medium\">Cancel</button>\n )}\n <button\n onClick={async () => {\n const out = await compositeToCanvas();\n if (!out) { toast.error('Failed to export'); return; }\n out.toBlob(blob => {\n if (!blob) { toast.error('Failed to export'); return; }\n onApply(blob);\n }, 'image/png');\n }}\n className=\"px-3 py-1 rounded bg-blue-500 text-white hover:bg-blue-600 text-xs font-medium\"\n >\n Apply\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Canvas + SVG layered surface */}\n <div ref={wrapRef} className=\"flex-1 overflow-auto bg-gray-200 flex items-center justify-center p-4 relative\">\n {displaySize && imageSize && (\n <div\n className=\"relative shadow-lg rounded overflow-hidden bg-white shrink-0\"\n style={{ width: displaySize.w, height: displaySize.h }}\n >\n <canvas ref={canvasRef} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', display: 'block' }} />\n <svg\n ref={svgRef}\n viewBox={`0 0 ${imageSize.w} ${imageSize.h}`}\n preserveAspectRatio=\"none\"\n style={{\n position: 'absolute', inset: 0, width: '100%', height: '100%',\n touchAction: 'none',\n cursor: tool === 'select' ? 'default' : tool === 'text' ? 'text' : 'crosshair',\n }}\n onPointerDown={handleSvgPointerDown}\n >\n {annotations.map(a => (\n <AnnotationView\n key={a.id}\n anno={a}\n selected={selectedId === a.id}\n zoom={zoom}\n onPointerDown={(e) => handleAnnoPointerDown(e, a)}\n onDoubleClick={() => handleAnnoDoubleClick(a)}\n onHandlePointerDown={(e, corner) => handleHandlePointerDown(e, a, corner)}\n />\n ))}\n {preview && <AnnotationView anno={{ ...preview, id: '__preview' } as Annotation} preview />}\n {pendingCrop && <CropOverlay rect={pendingCrop} imageSize={imageSize} />}\n </svg>\n\n {pendingText && (\n <PendingTextEditor\n pendingText={pendingText}\n color={color}\n size={textSize}\n font={FONTS.find(f => f.id === textFont)?.css ?? FONTS[0].css}\n bold={textBold}\n italic={textItalic}\n underline={textUnderline}\n scale={scale}\n onChange={(value) => setPendingText({ ...pendingText, value })}\n onCommit={commitText}\n onCancel={() => setPendingText(null)}\n />\n )}\n </div>\n )}\n </div>\n\n {/* Hint footer */}\n <div className=\"px-3 py-1.5 border-t border-gray-200 bg-white text-[11px] text-gray-500 shrink-0\">\n {tool === 'select'\n ? (selectedId ? 'Drag to move. Drag a corner to resize. Delete / Backspace removes. Click outside to deselect.' : 'Tap a shape to select. Double-click text to edit.')\n : tool === 'text'\n ? 'Click to drop a text label.'\n : tool === 'crop'\n ? 'Drag a rectangle to set the crop region.'\n : tool === 'draw'\n ? 'Drag to draw freehand.'\n : 'Drag on the image to draw.'}\n </div>\n </div>\n );\n});\n\nexport default ImageAnnotator;\n\n// ── annotation rendering ─────────────────────────────────────────────────────\n\ninterface AnnoViewProps {\n anno: Annotation;\n selected?: boolean;\n preview?: boolean;\n zoom?: number;\n onPointerDown?: (e: React.PointerEvent<SVGElement>) => void;\n onDoubleClick?: () => void;\n onHandlePointerDown?: (e: React.PointerEvent<SVGElement>, corner: Corner) => void;\n}\n\nfunction AnnotationView({ anno, selected, preview, zoom = 1, onPointerDown, onDoubleClick, onHandlePointerDown }: AnnoViewProps) {\n const dim = boundingBox(anno);\n const interactive: any = onPointerDown\n ? { onPointerDown, pointerEvents: 'all', style: { cursor: 'move' } }\n : {};\n const dblc: any = onDoubleClick ? { onDoubleClick } : {};\n\n let body: JSX.Element;\n if (anno.type === 'rect') {\n body = (\n <rect\n x={anno.x} y={anno.y} width={anno.w} height={anno.h}\n rx={anno.radius} ry={anno.radius}\n fill=\"none\" stroke={anno.color} strokeWidth={anno.stroke}\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n {...interactive}\n />\n );\n } else if (anno.type === 'circle') {\n body = (\n <ellipse\n cx={anno.x + anno.w / 2} cy={anno.y + anno.h / 2}\n rx={anno.w / 2} ry={anno.h / 2}\n fill=\"none\" stroke={anno.color} strokeWidth={anno.stroke}\n {...interactive}\n />\n );\n } else if (anno.type === 'arrow') {\n body = <ArrowShape anno={anno} interactive={interactive} />;\n } else if (anno.type === 'draw') {\n body = (\n <path\n d={pointsToPath(anno.points)}\n fill=\"none\" stroke={anno.color} strokeWidth={anno.stroke}\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n {...interactive}\n />\n );\n } else if (anno.type === 'mosaic') {\n body = (\n <rect\n x={anno.x} y={anno.y} width={anno.w} height={anno.h}\n fill=\"rgba(0,0,0,0.001)\"\n stroke={selected ? '#3b82f6' : 'none'}\n strokeWidth={selected ? 2 : 0}\n strokeDasharray={selected ? '6,4' : undefined}\n {...interactive}\n />\n );\n } else {\n // text\n const font = FONTS.find(f => f.id === anno.font)?.css ?? FONTS[0].css;\n body = (\n <text\n x={anno.x} y={anno.y + anno.size}\n fill={anno.color}\n fontSize={anno.size}\n fontWeight={anno.bold ? 700 : 400}\n fontStyle={anno.italic ? 'italic' : 'normal'}\n textDecoration={anno.underline ? 'underline' : undefined}\n fontFamily={font}\n style={{ userSelect: 'none' }}\n {...interactive}\n {...dblc}\n >\n {anno.text.split('\\n').map((line, i) => (\n <tspan key={i} x={anno.x} dy={i === 0 ? 0 : anno.size * 1.2}>{line}</tspan>\n ))}\n </text>\n );\n }\n\n return (\n <g>\n {body}\n {selected && !preview && (\n <>\n <rect\n data-chrome=\"selection\"\n x={dim.x - 4} y={dim.y - 4}\n width={dim.w + 8} height={dim.h + 8}\n fill=\"none\" stroke=\"#3b82f6\" strokeWidth={2 / zoom}\n strokeDasharray={`${6 / zoom},${4 / zoom}`}\n pointerEvents=\"none\"\n />\n {onHandlePointerDown && <ResizeHandles anno={anno} zoom={zoom} onHandlePointerDown={onHandlePointerDown} />}\n </>\n )}\n </g>\n );\n}\n\nfunction ResizeHandles({\n anno, zoom, onHandlePointerDown,\n}: {\n anno: Annotation;\n zoom: number;\n onHandlePointerDown: (e: React.PointerEvent<SVGElement>, corner: Corner) => void;\n}) {\n const r = 6 / zoom;\n const sw = 1.5 / zoom;\n const handleProps = (cursor: string) => ({\n fill: '#fff',\n stroke: '#3b82f6',\n strokeWidth: sw,\n pointerEvents: 'all' as const,\n style: { cursor } as React.CSSProperties,\n 'data-chrome': 'handle',\n });\n\n if (anno.type === 'arrow') {\n return (\n <>\n <circle cx={anno.x1} cy={anno.y1} r={r} {...handleProps('grab')} onPointerDown={(e) => onHandlePointerDown(e, 'start')} />\n <circle cx={anno.x2} cy={anno.y2} r={r} {...handleProps('grab')} onPointerDown={(e) => onHandlePointerDown(e, 'end')} />\n </>\n );\n }\n if (anno.type === 'text' || anno.type === 'draw') {\n return null;\n }\n const x = anno.x, y = anno.y, w = anno.w, h = anno.h;\n return (\n <>\n <circle cx={x} cy={y} r={r} {...handleProps('nwse-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'nw')} />\n <circle cx={x + w} cy={y} r={r} {...handleProps('nesw-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'ne')} />\n <circle cx={x + w} cy={y + h} r={r} {...handleProps('nwse-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'se')} />\n <circle cx={x} cy={y + h} r={r} {...handleProps('nesw-resize')} onPointerDown={(e) => onHandlePointerDown(e, 'sw')} />\n </>\n );\n}\n\nfunction ArrowShape({ anno, interactive }: { anno: ArrowAnno; interactive: any }) {\n const headLen = Math.max(12, anno.stroke * 4);\n const angle = Math.atan2(anno.y2 - anno.y1, anno.x2 - anno.x1);\n const a1 = angle + Math.PI - Math.PI / 7;\n const a2 = angle + Math.PI + Math.PI / 7;\n const head = `M${anno.x2},${anno.y2} L${anno.x2 + headLen * Math.cos(a1)},${anno.y2 + headLen * Math.sin(a1)} L${anno.x2 + headLen * Math.cos(a2)},${anno.y2 + headLen * Math.sin(a2)} Z`;\n return (\n <g {...interactive}>\n <line\n x1={anno.x1} y1={anno.y1} x2={anno.x2} y2={anno.y2}\n stroke={anno.color} strokeWidth={anno.stroke} strokeLinecap=\"round\"\n />\n <path d={head} fill={anno.color} />\n </g>\n );\n}\n\nfunction CropOverlay({ rect, imageSize }: { rect: { x: number; y: number; w: number; h: number }; imageSize: { w: number; h: number } }) {\n return (\n <g pointerEvents=\"none\">\n <path\n d={`M0,0 H${imageSize.w} V${imageSize.h} H0 Z M${rect.x},${rect.y} V${rect.y + rect.h} H${rect.x + rect.w} V${rect.y} Z`}\n fill=\"rgba(0,0,0,0.45)\"\n fillRule=\"evenodd\"\n />\n <rect\n x={rect.x} y={rect.y} width={rect.w} height={rect.h}\n fill=\"none\" stroke=\"#fff\" strokeWidth={2} strokeDasharray=\"8,6\"\n />\n </g>\n );\n}\n\nfunction PendingTextEditor({\n pendingText, color, size, font, bold, italic, underline, scale, onChange, onCommit, onCancel,\n}: {\n pendingText: { x: number; y: number; value: string; editingId?: string };\n color: string;\n size: number;\n font: string;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n scale: number;\n onChange: (value: string) => void;\n onCommit: () => void;\n onCancel: () => void;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n const id = requestAnimationFrame(() => {\n ref.current?.focus();\n ref.current?.select?.();\n });\n return () => cancelAnimationFrame(id);\n }, []);\n return (\n <div\n style={{\n position: 'absolute',\n left: `${pendingText.x * scale}px`,\n top: `${pendingText.y * scale}px`,\n transform: 'translateY(-2px)',\n zIndex: 5,\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <textarea\n ref={ref}\n value={pendingText.value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n else if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); onCommit(); }\n }}\n placeholder=\"Type then Enter…\"\n rows={1}\n className=\"bg-white/95 border border-blue-400 rounded px-1 py-0.5 outline-none resize-none shadow-md\"\n style={{\n color,\n fontSize: `${size * scale}px`,\n fontFamily: font,\n fontWeight: bold ? 700 : 400,\n fontStyle: italic ? 'italic' : 'normal',\n textDecoration: underline ? 'underline' : undefined,\n minWidth: 80,\n }}\n />\n </div>\n );\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction makeShape(\n tool: Tool,\n start: { x: number; y: number },\n end: { x: number; y: number },\n color: string,\n stroke: number,\n rectRadius: number,\n): Annotation | null {\n if (tool === 'rect') {\n const r = normalizeRect(start, end);\n return { id: '', type: 'rect', x: r.x, y: r.y, w: r.w, h: r.h, color, stroke, radius: rectRadius };\n }\n if (tool === 'circle') {\n const r = normalizeRect(start, end);\n return { id: '', type: 'circle', x: r.x, y: r.y, w: r.w, h: r.h, color, stroke };\n }\n if (tool === 'arrow') {\n return { id: '', type: 'arrow', x1: start.x, y1: start.y, x2: end.x, y2: end.y, color, stroke };\n }\n if (tool === 'mosaic') {\n const r = normalizeRect(start, end);\n return { id: '', type: 'mosaic', x: r.x, y: r.y, w: r.w, h: r.h };\n }\n return null;\n}\n\nfunction isTrivial(a: Annotation): boolean {\n if (a.type === 'arrow') return Math.abs(a.x2 - a.x1) < 4 && Math.abs(a.y2 - a.y1) < 4;\n if (a.type === 'draw') return a.points.length < 2;\n if ('w' in a && 'h' in a) return a.w < 4 || a.h < 4;\n return false;\n}\n\nfunction translate(a: Annotation, dx: number, dy: number): Annotation {\n if (a.type === 'arrow') return { ...a, x1: a.x1 + dx, y1: a.y1 + dy, x2: a.x2 + dx, y2: a.y2 + dy };\n if (a.type === 'draw') return { ...a, points: a.points.map(p => ({ x: p.x + dx, y: p.y + dy })) };\n if (a.type === 'text') return { ...a, x: a.x + dx, y: a.y + dy };\n return { ...a, x: a.x + dx, y: a.y + dy } as Annotation;\n}\n\nfunction resize(\n original: Annotation,\n corner: Corner,\n p: { x: number; y: number },\n): Annotation {\n if (original.type === 'arrow') {\n if (corner === 'start') return { ...original, x1: p.x, y1: p.y };\n if (corner === 'end') return { ...original, x2: p.x, y2: p.y };\n return original;\n }\n if (original.type === 'text' || original.type === 'draw') return original;\n const left = original.x;\n const right = original.x + original.w;\n const top = original.y;\n const bottom = original.y + original.h;\n let x1 = left, y1 = top, x2 = right, y2 = bottom;\n if (corner === 'nw') { x1 = p.x; y1 = p.y; }\n if (corner === 'ne') { x2 = p.x; y1 = p.y; }\n if (corner === 'se') { x2 = p.x; y2 = p.y; }\n if (corner === 'sw') { x1 = p.x; y2 = p.y; }\n const r = normalizeRect({ x: x1, y: y1 }, { x: x2, y: y2 });\n return { ...original, x: r.x, y: r.y, w: r.w, h: r.h } as Annotation;\n}\n\nfunction boundingBox(a: Annotation): { x: number; y: number; w: number; h: number } {\n if (a.type === 'arrow') {\n const x = Math.min(a.x1, a.x2);\n const y = Math.min(a.y1, a.y2);\n return { x, y, w: Math.abs(a.x2 - a.x1), h: Math.abs(a.y2 - a.y1) };\n }\n if (a.type === 'draw') {\n if (a.points.length === 0) return { x: 0, y: 0, w: 0, h: 0 };\n let minX = a.points[0].x, maxX = a.points[0].x, minY = a.points[0].y, maxY = a.points[0].y;\n for (const p of a.points) {\n if (p.x < minX) minX = p.x; if (p.x > maxX) maxX = p.x;\n if (p.y < minY) minY = p.y; if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n }\n if (a.type === 'text') {\n const lines = a.text.split('\\n');\n const longest = lines.reduce((m, l) => Math.max(m, l.length), 0);\n return { x: a.x, y: a.y, w: longest * a.size * 0.55, h: lines.length * a.size * 1.2 };\n }\n return { x: a.x, y: a.y, w: a.w, h: a.h };\n}\n\nfunction normalizeRect(a: { x: number; y: number }, b: { x: number; y: number }) {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const w = Math.abs(a.x - b.x);\n const h = Math.abs(a.y - b.y);\n return { x, y, w, h };\n}\n\nfunction withinBounds(a: Annotation, w: number, h: number): boolean {\n const bb = boundingBox(a);\n return bb.x + bb.w > 0 && bb.y + bb.h > 0 && bb.x < w && bb.y < h;\n}\n\nfunction pointsToPath(points: { x: number; y: number }[]): string {\n if (points.length === 0) return '';\n let d = `M ${points[0].x} ${points[0].y}`;\n for (let i = 1; i < points.length; i++) d += ` L ${points[i].x} ${points[i].y}`;\n return d;\n}\n\nfunction applyMosaic(\n ctx: CanvasRenderingContext2D,\n rect: { x: number; y: number; w: number; h: number },\n) {\n const x = Math.round(Math.max(0, rect.x));\n const y = Math.round(Math.max(0, rect.y));\n const w = Math.round(Math.min(ctx.canvas.width - x, rect.w));\n const h = Math.round(Math.min(ctx.canvas.height - y, rect.h));\n if (w < 2 || h < 2) return;\n const data = ctx.getImageData(x, y, w, h);\n const block = MOSAIC_BLOCK;\n for (let by = 0; by < h; by += block) {\n for (let bx = 0; bx < w; bx += block) {\n let r = 0, g = 0, b = 0, a = 0, n = 0;\n const blockW = Math.min(block, w - bx);\n const blockH = Math.min(block, h - by);\n for (let yy = 0; yy < blockH; yy++) {\n for (let xx = 0; xx < blockW; xx++) {\n const i = ((by + yy) * w + (bx + xx)) * 4;\n r += data.data[i]; g += data.data[i + 1]; b += data.data[i + 2]; a += data.data[i + 3];\n n++;\n }\n }\n r = Math.round(r / n); g = Math.round(g / n); b = Math.round(b / n); a = Math.round(a / n);\n for (let yy = 0; yy < blockH; yy++) {\n for (let xx = 0; xx < blockW; xx++) {\n const i = ((by + yy) * w + (bx + xx)) * 4;\n data.data[i] = r; data.data[i + 1] = g; data.data[i + 2] = b; data.data[i + 3] = a;\n }\n }\n }\n }\n ctx.putImageData(data, x, y);\n}\n"]}
|