react-os-shell 0.2.30 → 0.2.35

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/apps/ImageAnnotator.tsx"],"names":["ImageAnnotator"],"mappings":"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","file":"chunk-KUIPWCTJ.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"]}
package/dist/index.d.ts CHANGED
@@ -380,6 +380,10 @@ interface BugReportConfig {
380
380
  }>;
381
381
  /** Mark a report resolved or reopened, with an optional admin note. */
382
382
  resolve?: (id: string, is_resolved: boolean, resolution_note?: string) => Promise<BugReport>;
383
+ /** Permanently delete a report. When omitted the Delete button in
384
+ * `<BugReportDetail>` is hidden — the consumer's permission system
385
+ * decides whether to expose the capability at all. */
386
+ delete?: (id: string) => Promise<void>;
383
387
  }
384
388
  declare function BugReportConfigProvider({ value, children }: {
385
389
  value: BugReportConfig;
@@ -396,9 +400,10 @@ declare function BugReportProvider({ children }: {
396
400
 
397
401
  interface Props {
398
402
  report: BugReport;
403
+ /** Called after a successful delete so the parent window can close itself. */
399
404
  onClose?: () => void;
400
405
  }
401
- declare function BugReportDetail({ report }: Props): react_jsx_runtime.JSX.Element;
406
+ declare function BugReportDetail({ report, onClose }: Props): react_jsx_runtime.JSX.Element;
402
407
 
403
408
  type SemanticGroup = 'success' | 'active' | 'queued' | 'info' | 'pending' | 'warning' | 'danger' | 'draft' | 'neutral';
404
409
  declare function StatusBadgeProvider({ groups, children, }: {
package/dist/index.js CHANGED
@@ -5,13 +5,15 @@ import { useGoogleAuth } from './chunk-46LICZUM.js';
5
5
  import { useShellPrefs } from './chunk-36VM54SC.js';
6
6
  export { ShellPrefsProvider, useLocalStoragePrefs, useShellPrefs } from './chunk-36VM54SC.js';
7
7
  import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, playLogout, setSoundForType, previewSound, setAllSounds } from './chunk-D7PYW2QS.js';
8
- import { setPdfPreview } from './chunk-VOD2AMU4.js';
8
+ import { setPdfPreview } from './chunk-IY7JJVHR.js';
9
+ import './chunk-KUIPWCTJ.js';
9
10
  import { toast_default } from './chunk-WIJ45SYD.js';
10
11
  export { toast_default as toast } from './chunk-WIJ45SYD.js';
11
12
  import { useWindowManager, glassStyle, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, Modal, startMenuCategories, useIsMobile, navSections, isSection, GLASS_INPUT_BG, navIcons, sectionIcons, ModalActions, useModalActive, WINDOW_REGISTRY, isPageEntry, LoadingSpinner, ThumbCard, activateModal } from './chunk-T2NQXP2J.js';
12
13
  export { CancelButton, CopyButton, DocFavStar, GLASS_DIVIDER, GLASS_INPUT_BG, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, WindowManagerProvider, WindowTitle, glassStyle, isEntityEntry, isPageEntry, setShellApiClient, setShellNavIcons, setShellWindowRegistry, useModalActive, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-T2NQXP2J.js';
14
+ import { confirm } from './chunk-PLGHQ7QW.js';
13
15
  export { ConfirmProvider, confirm, confirmDestructive, prompt } from './chunk-PLGHQ7QW.js';
14
- import { createContext, useState, useRef, useEffect, useCallback, useLayoutEffect, useContext, isValidElement, cloneElement, useSyncExternalStore, useMemo, Suspense } from 'react';
16
+ import { createContext, lazy, useState, useRef, useEffect, useCallback, useLayoutEffect, useContext, Suspense, isValidElement, cloneElement, useSyncExternalStore, useMemo } from 'react';
15
17
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
16
18
  import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react';
17
19
  import { createPortal } from 'react-dom';
@@ -480,6 +482,7 @@ function BugReportProvider({ children }) {
480
482
  const [previewUrl, setPreviewUrl] = useState(null);
481
483
  const [description, setDescription] = useState("");
482
484
  const [reportType, setReportType] = useState("bug");
485
+ const [annotating, setAnnotating] = useState(false);
483
486
  const resolveRef = useRef();
484
487
  const openFn = useCallback((s) => {
485
488
  setScreenshot(s);
@@ -538,8 +541,26 @@ function BugReportProvider({ children }) {
538
541
  }
539
542
  )
540
543
  ] }),
541
- previewUrl && /* @__PURE__ */ jsx("div", { className: "mt-4 rounded-md border border-gray-200 overflow-hidden bg-gray-50 max-h-64", children: /* @__PURE__ */ jsx("img", { src: previewUrl, alt: "Screenshot preview", className: "w-full h-auto max-h-64 object-contain" }) }),
542
- !previewUrl && /* @__PURE__ */ jsx("div", { className: "mt-4 rounded-md border border-dashed border-gray-300 px-4 py-6 text-center text-sm text-gray-500", children: "Screenshot capture failed \u2014 your description will still be sent." }),
544
+ previewUrl && /* @__PURE__ */ jsxs("div", { className: "mt-4", children: [
545
+ /* @__PURE__ */ jsxs("div", { className: "relative rounded-md border border-gray-200 overflow-hidden bg-gray-50 max-h-64", children: [
546
+ /* @__PURE__ */ jsx("img", { src: previewUrl, alt: "Screenshot preview", className: "w-full h-auto max-h-64 object-contain" }),
547
+ /* @__PURE__ */ jsxs(
548
+ "button",
549
+ {
550
+ type: "button",
551
+ onClick: () => setAnnotating(true),
552
+ className: "absolute top-2 right-2 inline-flex items-center gap-1 px-2.5 py-1 rounded-md bg-white/95 backdrop-blur border border-gray-200 shadow-sm text-xs font-medium text-gray-700 hover:bg-white",
553
+ title: "Mark up the screenshot \u2014 circle, arrow, mosaic, text\u2026",
554
+ children: [
555
+ /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.7, children: /* @__PURE__ */ jsx("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.487zm0 0L19.5 7.125" }) }),
556
+ "Annotate"
557
+ ]
558
+ }
559
+ )
560
+ ] }),
561
+ /* @__PURE__ */ jsx("p", { className: "mt-1 text-[11px] text-gray-400", children: "Click Annotate to mark up the screenshot before sending." })
562
+ ] }),
563
+ !previewUrl && /* @__PURE__ */ jsx(UploadDropZone, { onSelect: (blob) => setScreenshot(blob) }),
543
564
  /* @__PURE__ */ jsxs("label", { className: "mt-4 block text-sm font-medium text-gray-700", children: [
544
565
  isBug ? "What went wrong?" : "What's your suggestion?",
545
566
  /* @__PURE__ */ jsx("span", { className: "font-normal text-gray-400 ml-1", children: "(optional)" })
@@ -579,28 +600,93 @@ function BugReportProvider({ children }) {
579
600
  )
580
601
  ] })
581
602
  ] }) })
582
- ] })
603
+ ] }),
604
+ annotating && previewUrl && /* @__PURE__ */ jsx(
605
+ BugReportAnnotator,
606
+ {
607
+ src: previewUrl,
608
+ onApply: (blob) => {
609
+ setScreenshot(blob);
610
+ setAnnotating(false);
611
+ },
612
+ onCancel: () => setAnnotating(false)
613
+ }
614
+ )
583
615
  ] });
584
616
  }
617
+ var LazyImageAnnotator = lazy(() => import('./ImageAnnotator-CTTMAY5Z.js'));
618
+ function UploadDropZone({ onSelect }) {
619
+ const inputRef = useRef(null);
620
+ const [hover, setHover] = useState(false);
621
+ const accept = (file) => {
622
+ if (!file) return;
623
+ if (!file.type.startsWith("image/")) return;
624
+ onSelect(file);
625
+ };
626
+ return /* @__PURE__ */ jsxs(
627
+ "div",
628
+ {
629
+ onClick: () => inputRef.current?.click(),
630
+ onDragOver: (e) => {
631
+ e.preventDefault();
632
+ setHover(true);
633
+ },
634
+ onDragLeave: () => setHover(false),
635
+ onDrop: (e) => {
636
+ e.preventDefault();
637
+ setHover(false);
638
+ accept(e.dataTransfer.files?.[0]);
639
+ },
640
+ className: `mt-4 rounded-md border border-dashed px-4 py-6 text-center text-sm cursor-pointer transition-colors ${hover ? "border-blue-400 bg-blue-50 text-blue-700" : "border-gray-300 text-gray-500 hover:border-gray-400 hover:bg-gray-50"}`,
641
+ children: [
642
+ /* @__PURE__ */ jsx("p", { className: "text-gray-700 font-medium", children: "Screenshot capture failed" }),
643
+ /* @__PURE__ */ jsxs("p", { className: "mt-1 text-xs text-gray-500", children: [
644
+ "Drop an image here, or ",
645
+ /* @__PURE__ */ jsx("span", { className: "text-blue-600 underline", children: "click to upload" }),
646
+ ". Your description will be sent either way."
647
+ ] }),
648
+ /* @__PURE__ */ jsx(
649
+ "input",
650
+ {
651
+ ref: inputRef,
652
+ type: "file",
653
+ accept: "image/*",
654
+ onChange: (e) => accept(e.target.files?.[0]),
655
+ className: "hidden"
656
+ }
657
+ )
658
+ ]
659
+ }
660
+ );
661
+ }
662
+ function BugReportAnnotator({
663
+ src,
664
+ onApply,
665
+ onCancel
666
+ }) {
667
+ return /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-[10000] bg-black/60 backdrop-blur-sm flex flex-col", children: /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("div", { className: "flex-1 flex items-center justify-center text-sm text-white/80", children: "Loading editor\u2026" }), children: /* @__PURE__ */ jsx("div", { className: "flex-1 m-4 rounded-lg overflow-hidden bg-white shadow-2xl", children: /* @__PURE__ */ jsx(LazyImageAnnotator, { src, filename: "screenshot.png", onApply, onCancel }) }) }) });
668
+ }
585
669
  function StatePill({ resolved }) {
586
670
  return /* @__PURE__ */ jsx("span", { className: `inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${resolved ? "bg-green-100 text-green-800" : "bg-yellow-100 text-yellow-800"}`, children: resolved ? "Resolved" : "Open" });
587
671
  }
588
- function BugReportDetail({ report }) {
672
+ function BugReportDetail({ report, onClose }) {
589
673
  const qc = useQueryClient();
590
674
  const config = useBugReport();
591
675
  const { openPage } = useWindowManager();
592
676
  const [resolveOpen, setResolveOpen] = useState(false);
593
677
  const [note, setNote] = useState("");
678
+ const kind = report.report_type === "suggestion" ? "suggestion" : "bug";
679
+ const Kind = kind === "suggestion" ? "Suggestion" : "Bug";
594
680
  const openScreenshot = () => {
595
681
  if (!report.screenshot_url) return;
596
- const filename = `bug-report-${report.id}-screenshot.png`;
682
+ const filename = `${kind}-${report.id}-screenshot.png`;
597
683
  setPdfPreview({ url: report.screenshot_url, filename, kind: "image" });
598
684
  openPage("/preview");
599
685
  };
600
686
  const resolve = useMutation({
601
687
  mutationFn: ({ is_resolved, resolution_note }) => {
602
688
  if (!config?.resolve) {
603
- return Promise.reject(new Error("Bug report resolve is not configured."));
689
+ return Promise.reject(new Error("Resolve is not configured."));
604
690
  }
605
691
  return config.resolve(report.id, is_resolved, resolution_note);
606
692
  },
@@ -610,8 +696,31 @@ function BugReportDetail({ report }) {
610
696
  setResolveOpen(false);
611
697
  setNote("");
612
698
  },
613
- meta: { success: (d) => d.is_resolved ? "Bug report marked resolved." : "Bug report reopened." }
699
+ meta: { success: (d) => d.is_resolved ? `${Kind} marked resolved.` : `${Kind} reopened.` }
614
700
  });
701
+ const del = useMutation({
702
+ mutationFn: () => {
703
+ if (!config?.delete) return Promise.reject(new Error("Delete is not configured."));
704
+ return config.delete(report.id);
705
+ },
706
+ onSuccess: () => {
707
+ qc.invalidateQueries({ queryKey: ["bug-reports"] });
708
+ qc.removeQueries({ queryKey: ["entity", "bug_report", report.id] });
709
+ onClose?.();
710
+ },
711
+ meta: { success: () => `${Kind} deleted.` }
712
+ });
713
+ const handleDelete = async () => {
714
+ const ok = await confirm({
715
+ title: `Delete this ${kind}?`,
716
+ message: "This is permanent and cannot be undone.",
717
+ confirmLabel: "Delete",
718
+ cancelLabel: "Keep",
719
+ variant: "danger"
720
+ });
721
+ if (!ok) return;
722
+ del.mutate();
723
+ };
615
724
  const handleAction = () => {
616
725
  if (report.is_resolved) {
617
726
  resolve.mutate({ is_resolved: false, resolution_note: "" });
@@ -650,16 +759,27 @@ function BugReportDetail({ report }) {
650
759
  className: "w-full rounded-lg border border-gray-200 hover:border-blue-400 transition-colors"
651
760
  }
652
761
  ) }) : /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-dashed border-gray-300 p-6 text-center text-sm text-gray-400", children: "No screenshot was captured for this report." }),
653
- config?.resolve && /* @__PURE__ */ jsx("div", { className: "flex justify-end pt-2 border-t border-gray-200", children: /* @__PURE__ */ jsx(
654
- "button",
655
- {
656
- onClick: handleAction,
657
- disabled: resolve.isPending,
658
- className: `px-3 py-1.5 text-sm rounded-lg font-medium transition-colors ${report.is_resolved ? "bg-white border border-gray-300 text-gray-700 hover:bg-gray-50" : "bg-blue-600 text-white hover:bg-blue-700"}`,
659
- children: resolve.isPending ? "..." : report.is_resolved ? "Reopen" : "Mark Resolved"
660
- }
661
- ) }),
662
- /* @__PURE__ */ jsx(Modal, { open: resolveOpen, onClose: () => !resolve.isPending && setResolveOpen(false), title: `Resolve ${report.report_code}`, size: "md", compact: true, children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
762
+ (config?.resolve || config?.delete) && /* @__PURE__ */ jsxs("div", { className: "flex justify-end items-center gap-2 pt-2 border-t border-gray-200", children: [
763
+ config?.delete && /* @__PURE__ */ jsx(
764
+ "button",
765
+ {
766
+ onClick: handleDelete,
767
+ disabled: del.isPending || resolve.isPending,
768
+ className: "px-3 py-1.5 text-sm rounded-lg font-medium transition-colors bg-white border border-red-300 text-red-700 hover:bg-red-50 disabled:opacity-50 mr-auto",
769
+ children: del.isPending ? "Deleting\u2026" : "Delete"
770
+ }
771
+ ),
772
+ config?.resolve && /* @__PURE__ */ jsx(
773
+ "button",
774
+ {
775
+ onClick: handleAction,
776
+ disabled: resolve.isPending || del.isPending,
777
+ className: `px-3 py-1.5 text-sm rounded-lg font-medium transition-colors ${report.is_resolved ? "bg-white border border-gray-300 text-gray-700 hover:bg-gray-50" : "bg-blue-600 text-white hover:bg-blue-700"}`,
778
+ children: resolve.isPending ? "..." : report.is_resolved ? "Reopen" : "Mark Resolved"
779
+ }
780
+ )
781
+ ] }),
782
+ /* @__PURE__ */ jsx(Modal, { open: resolveOpen, onClose: () => !resolve.isPending && setResolveOpen(false), title: `Resolve ${report.report_code ?? Kind}`, size: "md", compact: true, children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
663
783
  /* @__PURE__ */ jsxs("p", { className: "text-sm text-gray-600", children: [
664
784
  "Add a short note for ",
665
785
  report.reporter_name || "the reporter",
@@ -729,7 +849,7 @@ function StatusBadge({ status }) {
729
849
  }
730
850
 
731
851
  // src/version.ts
732
- var VERSION = "0.2.30" ;
852
+ var VERSION = "0.2.35" ;
733
853
  var APP_VERSION = VERSION;
734
854
 
735
855
  // src/changelog.ts