react-os-shell 3.16.2 → 3.16.3
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/{chunk-RNXBHVCZ.js → Browser-PTRUZ73Y.js} +10 -12
- package/dist/Browser-PTRUZ73Y.js.map +1 -0
- package/dist/{Documents-KQ2YMWX5.js → Documents-U4JJQFWL.js} +4 -3
- package/dist/Documents-U4JJQFWL.js.map +1 -0
- package/dist/{chunk-EFTDLYWR.js → Files-VQHPKNSN.js} +13 -13
- package/dist/Files-VQHPKNSN.js.map +1 -0
- package/dist/{Notepad-NOMFXBKY.js → Notepad-4QHMNSLQ.js} +4 -3
- package/dist/Notepad-4QHMNSLQ.js.map +1 -0
- package/dist/{PomodoroTimer-BQVEKF45.js → PomodoroTimer-WVA3ZB4J.js} +3 -3
- package/dist/{PomodoroTimer-BQVEKF45.js.map → PomodoroTimer-WVA3ZB4J.js.map} +1 -1
- package/dist/{chunk-4BSHCQM6.js → Preview-YIHTIPXD.js} +16 -1119
- package/dist/Preview-YIHTIPXD.js.map +1 -0
- package/dist/Spreadsheet-CU6UCLDP.js +506 -0
- package/dist/Spreadsheet-CU6UCLDP.js.map +1 -0
- package/dist/apps/index.d.ts +97 -75
- package/dist/apps/index.js +14 -15
- package/dist/apps/index.js.map +1 -1
- package/dist/{chunk-QCGWXJX3.js → chunk-2Q4LCCVB.js} +5 -7
- package/dist/chunk-2Q4LCCVB.js.map +1 -0
- package/dist/chunk-4SQU5YV6.js +24 -0
- package/dist/chunk-4SQU5YV6.js.map +1 -0
- package/dist/chunk-BFBWLCO6.js +16 -0
- package/dist/chunk-BFBWLCO6.js.map +1 -0
- package/dist/chunk-BV6SQ46N.js +24 -0
- package/dist/chunk-BV6SQ46N.js.map +1 -0
- package/dist/chunk-DINNWYVB.js +98 -0
- package/dist/chunk-DINNWYVB.js.map +1 -0
- package/dist/{chunk-ZMDLIYIK.js → chunk-GP4Y3VCB.js} +4 -510
- package/dist/chunk-GP4Y3VCB.js.map +1 -0
- package/dist/chunk-QU5L5ZYM.js +1103 -0
- package/dist/chunk-QU5L5ZYM.js.map +1 -0
- package/dist/{chunk-SJNGOGS5.js → chunk-UFR3CXIF.js} +4 -95
- package/dist/chunk-UFR3CXIF.js.map +1 -0
- package/dist/chunk-UPO23MX4.js +17 -0
- package/dist/chunk-UPO23MX4.js.map +1 -0
- package/dist/chunk-WTJY2AEO.js +7 -0
- package/dist/chunk-WTJY2AEO.js.map +1 -0
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/Browser-NM54NOXT.js +0 -7
- package/dist/Browser-NM54NOXT.js.map +0 -1
- package/dist/Documents-KQ2YMWX5.js.map +0 -1
- package/dist/Files-GOQMZWQU.js +0 -12
- package/dist/Files-GOQMZWQU.js.map +0 -1
- package/dist/Notepad-NOMFXBKY.js.map +0 -1
- package/dist/Preview-GGC5263S.js +0 -8
- package/dist/Preview-GGC5263S.js.map +0 -1
- package/dist/Spreadsheet-S6BVMBSM.js +0 -7
- package/dist/Spreadsheet-S6BVMBSM.js.map +0 -1
- package/dist/chunk-4BSHCQM6.js.map +0 -1
- package/dist/chunk-EFTDLYWR.js.map +0 -1
- package/dist/chunk-QCGWXJX3.js.map +0 -1
- package/dist/chunk-RNXBHVCZ.js.map +0 -1
- package/dist/chunk-SJNGOGS5.js.map +0 -1
- package/dist/chunk-ZMDLIYIK.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apps/ImageAnnotator.tsx"],"names":["ImageAnnotator"],"mappings":"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","file":"chunk-QU5L5ZYM.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; borderColor: string | null; background: string | null; padding: number };\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 TEXT_PADDING_DEFAULT = 6;\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\nexport interface 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 [textBorderColor, setTextBorderColor] = useState<string | null>(null);\n const [textBg, setTextBg] = useState<string | null>(null);\n const [textPadding, setTextPadding] = useState(TEXT_PADDING_DEFAULT);\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 setTextBorderColor(selected.borderColor);\n setTextBg(selected.background);\n setTextPadding(selected.padding);\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 // If a text box is already being edited, commit it first. Previously this\n // overwrote `pendingText` outright, so clicking elsewhere on the image\n // (which races the textarea's blur-commit) silently discarded whatever\n // had been typed. Commit-then-stop keeps the typed text on the image.\n if (pendingText) { commitText(); return; }\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 const setTextBorderColorAndApply = (c: string | null) => {\n setTextBorderColor(c);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, borderColor: c } : a,\n ));\n };\n const setTextBgAndApply = (c: string | null) => {\n setTextBg(c);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, background: c } : a,\n ));\n };\n const setTextPaddingAndApply = (p: number) => {\n setTextPadding(p);\n if (!selectedId) return;\n setAnnotations(prev => prev.map(a =>\n (a.id === selectedId && a.type === 'text') ? { ...a, padding: p } : a,\n ));\n };\n\n // ── text input ─────────────────────────────────────────────────────────────\n const commitText = (explicitValue?: string) => {\n if (!pendingText) return;\n // Prefer the live textarea value handed in by the editor: relying on the\n // `pendingText.value` state alone can lose the last keystroke(s) when the\n // commit races a state flush (blur / Enter / clicking elsewhere).\n const value = explicitValue ?? 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 borderColor: textBorderColor,\n background: textBg,\n padding: textPadding,\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 {/* Text-box border / fill / padding. Border + fill are off by\n default (plain label); adding either makes the padding matter. */}\n <label className=\"flex items-center gap-1 text-gray-600\">\n <span>Border</span>\n {textBorderColor ? (\n <>\n <input\n type=\"color\"\n value={textBorderColor}\n onChange={(e) => setTextBorderColorAndApply(e.target.value)}\n title=\"Text-box border color\"\n className=\"h-5 w-6 rounded border border-gray-300 bg-white p-0 cursor-pointer\"\n />\n <button onClick={() => setTextBorderColorAndApply(null)} title=\"Remove border\" className=\"px-0.5 text-gray-400 hover:text-gray-700\">✕</button>\n </>\n ) : (\n <button onClick={() => setTextBorderColorAndApply(color)} title=\"Add a border\" className=\"px-1.5 py-0.5 rounded border border-gray-300 text-gray-600 hover:bg-gray-100\">Add</button>\n )}\n </label>\n <label className=\"flex items-center gap-1 text-gray-600\">\n <span>Fill</span>\n {textBg ? (\n <>\n <input\n type=\"color\"\n value={textBg}\n onChange={(e) => setTextBgAndApply(e.target.value)}\n title=\"Text-box background color\"\n className=\"h-5 w-6 rounded border border-gray-300 bg-white p-0 cursor-pointer\"\n />\n <button onClick={() => setTextBgAndApply(null)} title=\"Remove fill\" className=\"px-0.5 text-gray-400 hover:text-gray-700\">✕</button>\n </>\n ) : (\n <button onClick={() => setTextBgAndApply('#ffffff')} title=\"Add a background fill\" className=\"px-1.5 py-0.5 rounded border border-gray-300 text-gray-600 hover:bg-gray-100\">Add</button>\n )}\n </label>\n <label className=\"flex items-center gap-1.5 text-gray-600\">\n <span>Pad</span>\n <input type=\"range\" min={0} max={40} step={1} value={textPadding} onChange={(e) => setTextPaddingAndApply(Number(e.target.value))} className=\"w-14 accent-blue-500\" />\n <span className=\"tabular-nums w-6 text-right\">{textPadding}</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 borderColor={textBorderColor}\n background={textBg}\n padding={textPadding}\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 const pad = anno.padding ?? 0;\n const hasBox = !!anno.borderColor || !!anno.background;\n const box = boundingBox(anno);\n const borderW = anno.borderColor ? Math.max(1, Math.round(anno.size / 12)) : 0;\n // Interactive/double-click handlers live on the <g> so the whole box (not\n // just the glyphs) is a hit target — much easier to select a bordered label.\n body = (\n <g {...interactive} {...dblc}>\n {hasBox && (\n <rect\n x={box.x - pad} y={box.y - pad}\n width={Math.max(0, box.w) + pad * 2} height={Math.max(0, box.h) + pad * 2}\n rx={Math.min(8, pad)} ry={Math.min(8, pad)}\n fill={anno.background ?? 'none'}\n stroke={anno.borderColor ?? 'none'}\n strokeWidth={borderW}\n />\n )}\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 >\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 </g>\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, borderColor, background, padding, 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 borderColor: string | null;\n background: string | null;\n padding: number;\n scale: number;\n onChange: (value: string) => void;\n onCommit: (value?: string) => 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 // Always commit the CURRENT DOM value, not the (possibly one-keystroke-stale)\n // state prop — this is what stops the last characters, or the whole label,\n // from vanishing on blur / Enter.\n const commit = () => onCommit(ref.current?.value);\n const borderW = borderColor ? Math.max(1, Math.round(size / 12)) : 0;\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={commit}\n onKeyDown={(e) => {\n if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n else if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); commit(); }\n }}\n placeholder=\"Type then Enter…\"\n rows={1}\n className=\"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 // Mirror the committed box so the editor is WYSIWYG. With no custom\n // border, show a dashed hint so the edit box stays visible.\n padding: `${padding * scale}px`,\n borderRadius: `${Math.min(8, padding) * scale}px`,\n border: borderColor ? `${borderW * scale}px solid ${borderColor}` : '1px dashed #60a5fa',\n background: background ?? 'rgba(255,255,255,0.95)',\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"]}
|
|
@@ -1,98 +1,7 @@
|
|
|
1
|
-
import { setPdfPreview } from './chunk-4BSHCQM6.js';
|
|
2
|
-
import { toast_default } from './chunk-VENYVK3L.js';
|
|
3
|
-
import { setSpreadsheetPreview } from './chunk-ZMDLIYIK.js';
|
|
4
1
|
import { navIcons } from './chunk-ZF6AYO4G.js';
|
|
5
|
-
import {
|
|
2
|
+
import { isValidElement, cloneElement } from 'react';
|
|
6
3
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
4
|
|
|
8
|
-
var DEFAULT_SEPARATOR = /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5 shrink-0 text-gray-300", viewBox: "0 0 20 20", fill: "currentColor", "aria-hidden": true, children: /* @__PURE__ */ jsx(
|
|
9
|
-
"path",
|
|
10
|
-
{
|
|
11
|
-
fillRule: "evenodd",
|
|
12
|
-
d: "M7.21 14.77a.75.75 0 0 1 .02-1.06L11.168 10 7.23 6.29a.75.75 0 1 1 1.04-1.08l4.5 4.25a.75.75 0 0 1 0 1.08l-4.5 4.25a.75.75 0 0 1-1.06-.02Z",
|
|
13
|
-
clipRule: "evenodd"
|
|
14
|
-
}
|
|
15
|
-
) });
|
|
16
|
-
function Breadcrumbs({ items, separator, maxItems = 0, className }) {
|
|
17
|
-
if (items.length === 0) return null;
|
|
18
|
-
const sep = separator ?? DEFAULT_SEPARATOR;
|
|
19
|
-
const crumbs = [];
|
|
20
|
-
const lastIndex = items.length - 1;
|
|
21
|
-
if (maxItems > 0 && items.length > maxItems && maxItems >= 2) {
|
|
22
|
-
const tailCount = Math.max(1, maxItems - 1);
|
|
23
|
-
crumbs.push({ kind: "item", item: items[0], isLast: false });
|
|
24
|
-
crumbs.push({ kind: "ellipsis" });
|
|
25
|
-
for (let i = items.length - tailCount; i <= lastIndex; i++) {
|
|
26
|
-
crumbs.push({ kind: "item", item: items[i], isLast: i === lastIndex });
|
|
27
|
-
}
|
|
28
|
-
} else {
|
|
29
|
-
items.forEach((item, i) => crumbs.push({ kind: "item", item, isLast: i === lastIndex }));
|
|
30
|
-
}
|
|
31
|
-
return /* @__PURE__ */ jsx("nav", { "aria-label": "Breadcrumb", className: `min-w-0 ${className ?? ""}`, children: /* @__PURE__ */ jsx("ol", { className: "flex items-center gap-1.5 text-sm", children: crumbs.map((crumb, i) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
32
|
-
i > 0 && /* @__PURE__ */ jsx("li", { "aria-hidden": true, className: "flex items-center", children: sep }),
|
|
33
|
-
/* @__PURE__ */ jsx("li", { className: "flex min-w-0 items-center", children: crumb.kind === "ellipsis" ? /* @__PURE__ */ jsx("span", { className: "px-0.5 text-gray-400 select-none", "aria-label": "Hidden crumbs", children: "\u2026" }) : crumb.isLast || !crumb.item.onClick ? /* @__PURE__ */ jsxs(
|
|
34
|
-
"span",
|
|
35
|
-
{
|
|
36
|
-
"aria-current": crumb.isLast ? "page" : void 0,
|
|
37
|
-
className: `inline-flex min-w-0 items-center gap-1 truncate ${crumb.isLast ? "font-medium text-gray-900" : "text-gray-500"}`,
|
|
38
|
-
children: [
|
|
39
|
-
crumb.item.icon,
|
|
40
|
-
/* @__PURE__ */ jsx("span", { className: "truncate", children: crumb.item.label })
|
|
41
|
-
]
|
|
42
|
-
}
|
|
43
|
-
) : /* @__PURE__ */ jsxs(
|
|
44
|
-
"button",
|
|
45
|
-
{
|
|
46
|
-
type: "button",
|
|
47
|
-
onClick: crumb.item.onClick,
|
|
48
|
-
className: "inline-flex min-w-0 items-center gap-1 truncate rounded px-1 -mx-1 text-gray-500 transition-colors hover:text-gray-900 hover:underline focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-400",
|
|
49
|
-
children: [
|
|
50
|
-
crumb.item.icon,
|
|
51
|
-
/* @__PURE__ */ jsx("span", { className: "truncate", children: crumb.item.label })
|
|
52
|
-
]
|
|
53
|
-
}
|
|
54
|
-
) })
|
|
55
|
-
] }, i)) }) });
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// src/utils/openPreviewFile.ts
|
|
59
|
-
var PREVIEW_OPENED_EVENT = "react-os-shell:preview-opened";
|
|
60
|
-
function getServer() {
|
|
61
|
-
const override = typeof window !== "undefined" && window.__REACT_OS_SHELL_FILE_SERVER__;
|
|
62
|
-
return (override || "http://localhost:4000").replace(/\/$/, "");
|
|
63
|
-
}
|
|
64
|
-
async function openPreviewFile(opts) {
|
|
65
|
-
const { filePath, filename, kind, onStaged } = opts;
|
|
66
|
-
try {
|
|
67
|
-
const res = await fetch(
|
|
68
|
-
`${getServer()}/api/file?path=${encodeURIComponent(filePath)}`,
|
|
69
|
-
{ credentials: "include" }
|
|
70
|
-
);
|
|
71
|
-
if (!res.ok) {
|
|
72
|
-
toast_default.error(`Download failed (${res.status})`);
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
const blob = await res.blob();
|
|
76
|
-
if (kind === "csv") {
|
|
77
|
-
const text = await blob.text();
|
|
78
|
-
setSpreadsheetPreview({ csv: text, filename });
|
|
79
|
-
onStaged?.("/spreadsheet");
|
|
80
|
-
} else {
|
|
81
|
-
const url = URL.createObjectURL(blob);
|
|
82
|
-
setPdfPreview({ url, filename, kind });
|
|
83
|
-
onStaged?.("/preview");
|
|
84
|
-
}
|
|
85
|
-
if (typeof window !== "undefined") {
|
|
86
|
-
window.dispatchEvent(new CustomEvent(PREVIEW_OPENED_EVENT, {
|
|
87
|
-
detail: { filePath, filename, kind }
|
|
88
|
-
}));
|
|
89
|
-
}
|
|
90
|
-
return true;
|
|
91
|
-
} catch (e) {
|
|
92
|
-
toast_default.error(e?.message || "Open failed");
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
5
|
var ICON_GRADIENTS = [
|
|
97
6
|
"from-blue-500 to-blue-700",
|
|
98
7
|
"from-indigo-500 to-purple-600",
|
|
@@ -257,6 +166,6 @@ function consumeFilesViewRequest() {
|
|
|
257
166
|
return req;
|
|
258
167
|
}
|
|
259
168
|
|
|
260
|
-
export {
|
|
261
|
-
//# sourceMappingURL=chunk-
|
|
262
|
-
//# sourceMappingURL=chunk-
|
|
169
|
+
export { DesktopItemMiniIcon, FILES_OPEN_DESKTOP_FOLDER_EVENT, FILES_SHOW_TRASH_EVENT, FileIconTile, FolderGlyph, consumeFilesViewRequest, desktopItemTypeLabel, getDesktopFoldersSnapshot, hashGradient, peekFilesViewRequest, publishDesktopFolders, requestFilesDesktopFolderView, requestFilesTrashView, subscribeDesktopFolders };
|
|
170
|
+
//# sourceMappingURL=chunk-UFR3CXIF.js.map
|
|
171
|
+
//# sourceMappingURL=chunk-UFR3CXIF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shell/desktopIcons.tsx"],"names":[],"mappings":"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","file":"chunk-UFR3CXIF.js","sourcesContent":["/**\n * Shared desktop-icon building blocks.\n *\n * Desktop.tsx renders the desktop surface; Files.tsx renders desktop shortcut\n * folders inside the Files app; MobileHome.tsx renders the mobile home grid.\n * All three import the icon tiles, entity-icon config and the desktop-folder\n * bridge from here so the surfaces never visually diverge — and so Desktop\n * and Files never import each other (that would be an import cycle).\n */\nimport { isValidElement, cloneElement, type ReactElement, type ReactNode } from 'react';\nimport { navIcons } from '../shell-config/nav';\nimport type { PreviewFileKind } from '../utils/openPreviewFile';\n\n// ── Gradient tiles ──────────────────────────────────────────────────────────\n// Per-app colored tile background, shared by the mobile home grid and the\n// desktop \"page\" shortcuts. Tailwind's JIT scans the source so each gradient\n// class string must appear in full somewhere — keep them inline.\nexport const ICON_GRADIENTS = [\n 'from-blue-500 to-blue-700',\n 'from-indigo-500 to-purple-600',\n 'from-purple-500 to-pink-600',\n 'from-pink-500 to-rose-600',\n 'from-red-500 to-rose-600',\n 'from-orange-500 to-red-600',\n 'from-amber-500 to-orange-600',\n 'from-yellow-500 to-amber-500',\n 'from-lime-500 to-green-600',\n 'from-green-500 to-emerald-600',\n 'from-emerald-500 to-teal-600',\n 'from-teal-500 to-cyan-600',\n 'from-cyan-500 to-sky-600',\n 'from-sky-500 to-blue-600',\n 'from-violet-500 to-fuchsia-600',\n];\n\nexport function hashGradient(seed: string): string {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h << 5) - h + seed.charCodeAt(i);\n return ICON_GRADIENTS[Math.abs(h) % ICON_GRADIENTS.length];\n}\n\n// ── Entity icon config ──────────────────────────────────────────────────────\nexport const ENTITY_ICON_COLORS: Record<string, string> = {\n order: 'text-blue-600', purchase_order: 'text-purple-600', invoice: 'text-green-600',\n client: 'text-indigo-600', manufacturer: 'text-orange-600', shipment: 'text-teal-600',\n part_number: 'text-gray-600', project: 'text-pink-600', mould: 'text-red-600',\n design: 'text-cyan-600', brand: 'text-amber-600', price_sheet: 'text-emerald-600',\n folder: 'text-yellow-600', page: 'text-blue-500',\n};\nexport const ENTITY_ICONS: Record<string, string> = {\n order: 'SO', purchase_order: 'PO', invoice: 'INV', client: 'CLI',\n manufacturer: 'MFR', shipment: 'DN', part_number: 'PN', project: 'PRJ',\n mould: 'MLD', design: 'DSN', brand: 'BRD', price_sheet: 'PS',\n vendor_invoice: 'VI', vendor_payment: 'VP', warranty_claim: 'WC',\n qc_report: 'QC', vendor_shipment: 'GRN', bank_account: 'BA',\n wheel_finish: 'WF', weight_log: 'WL', production_progress: 'PP',\n vendor_price_sheet: 'VPS', proposal: 'PR', folder: 'FLD',\n};\n\n// Glyphs and colors for the auto-tracked preview shortcuts that live in the\n// Documents folder. Keyed by `fileKind`, not `entityType`.\nexport const PREVIEW_FILE_CODES: Record<PreviewFileKind, string> = {\n pdf: 'PDF', dxf: 'DXF', '3d': 'STP', image: 'IMG', csv: 'CSV',\n};\nexport const PREVIEW_FILE_COLORS: Record<PreviewFileKind, string> = {\n pdf: 'text-red-600', dxf: 'text-blue-600', '3d': 'text-purple-600',\n image: 'text-emerald-600', csv: 'text-green-600',\n};\n\nexport interface DesktopItem {\n entityType: string;\n entityId: string;\n label: string;\n x?: number;\n y?: number;\n folderId?: string; // if inside a folder\n // Legacy free-form position inside the old folder window (pixels, relative\n // to the folder body). Folders now open in the Files app, which lists items\n // in a table — kept so previously-persisted shortcuts keep parsing.\n folderX?: number;\n folderY?: number;\n // Set for `entityType: 'preview-file'` shortcuts auto-recorded when the\n // user previews a file. `filePath` is the server-relative path passed\n // back into `openPreviewFile` on shortcut click.\n filePath?: string;\n fileKind?: PreviewFileKind;\n}\n\n/** Solid amber folder — the exact glyph the Files app uses for folders, so\n * desktop folders and Files-app folders read as the same object. */\nexport function FolderGlyph({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M2.25 7.125A2.25 2.25 0 014.5 4.875h4.504c.61 0 1.193.243 1.624.673l1.494 1.494a.75.75 0 00.53.22h7.098A2.25 2.25 0 0122 9.51v8.366A2.25 2.25 0 0119.75 20.125H4.25A2.25 2.25 0 012 17.875V7.125z\" />\n </svg>\n );\n}\n\n/** Page shortcuts reuse the consumer-registered nav icons; historically the\n * label was tried first, then the route. */\nfunction pageGlyph(entityId?: string, label?: string): ReactNode {\n return (label && navIcons[label]) || (entityId ? navIcons[entityId] : undefined);\n}\n\nconst PAGE_FALLBACK_GLYPH = (\n <svg className=\"h-7 w-7\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6z\" />\n </svg>\n);\n\n// Shared 48×48 tile used by the desktop icon renderer (and anything else\n// that needs a full-size shortcut tile), so all surfaces stay in sync.\nexport function FileIconTile({ entityType, isSelected, entityId, label, fileKind }: {\n entityType: string;\n isSelected: boolean;\n entityId?: string;\n label?: string;\n fileKind?: PreviewFileKind;\n}) {\n const isPreviewFile = entityType === 'preview-file' && fileKind;\n const previewColor = isPreviewFile ? PREVIEW_FILE_COLORS[fileKind!] : null;\n const previewCode = isPreviewFile ? PREVIEW_FILE_CODES[fileKind!] : null;\n if (entityType === 'folder') {\n return (\n <div className={`w-12 h-12 flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''}`}>\n <FolderGlyph className=\"h-12 w-12 text-amber-500 drop-shadow-[0_2px_3px_rgba(0,0,0,0.3)]\" />\n </div>\n );\n }\n if (entityType === 'page') {\n // App shortcut — colored gradient tile with the white nav glyph, same\n // treatment as the mobile home grid (and the same hash seed, the route,\n // so an app keeps its color across surfaces).\n const icon = pageGlyph(entityId, label);\n const gradient = hashGradient(entityId || label || 'page');\n return (\n <div className={`w-12 h-12 flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''}`}>\n <span className={`h-11 w-11 rounded-xl bg-gradient-to-br ${gradient} flex items-center justify-center text-white border border-white/30 drop-shadow-[0_2px_3px_rgba(0,0,0,0.3)]`}>\n {icon && isValidElement(icon)\n ? cloneElement(icon as ReactElement, { className: 'h-7 w-7 text-white' })\n : PAGE_FALLBACK_GLYPH}\n </span>\n </div>\n );\n }\n return (\n <div className={`w-12 h-12 relative flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''}`}>\n <svg className={`w-10 h-12 drop-shadow-[0_2px_3px_rgba(0,0,0,0.3)] ${previewColor ?? ENTITY_ICON_COLORS[entityType] ?? 'text-gray-500'}`} viewBox=\"0 0 40 48\" fill=\"none\">\n <path d=\"M4 0h22l10 10v34a4 4 0 01-4 4H4a4 4 0 01-4-4V4a4 4 0 014-4z\" fill=\"white\" fillOpacity=\"0.92\" />\n <path d=\"M26 0l10 10H30a4 4 0 01-4-4V0z\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <path d=\"M4 0h22l10 10v34a4 4 0 01-4 4H4a4 4 0 01-4-4V4a4 4 0 014-4z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeOpacity=\"0.5\" />\n </svg>\n <span className={`absolute inset-0 flex items-center justify-center text-[9px] font-bold pt-2 ${previewColor ?? ENTITY_ICON_COLORS[entityType] ?? 'text-gray-600'}`}>\n {previewCode ?? ENTITY_ICONS[entityType] ?? entityType.slice(0, 3).toUpperCase()}\n </span>\n </div>\n );\n}\n\n/** Compact row icon for desktop shortcuts listed inside the Files app. */\nexport function DesktopItemMiniIcon({ item }: { item: DesktopItem }) {\n if (item.entityType === 'folder') {\n return <FolderGlyph className=\"h-4 w-4 shrink-0 text-amber-500\" />;\n }\n if (item.entityType === 'page') {\n const icon = pageGlyph(item.entityId, item.label);\n return (\n <span className={`h-4 w-4 rounded bg-gradient-to-br ${hashGradient(item.entityId || item.label || 'page')} flex items-center justify-center text-white shrink-0`}>\n {icon && isValidElement(icon)\n ? cloneElement(icon as ReactElement, { className: 'h-3 w-3 text-white' })\n : <span className=\"h-1.5 w-1.5 rounded-[2px] border border-white/80\" />}\n </span>\n );\n }\n const color = (item.entityType === 'preview-file' && item.fileKind\n ? PREVIEW_FILE_COLORS[item.fileKind]\n : ENTITY_ICON_COLORS[item.entityType]) ?? 'text-gray-400';\n return (\n <svg className={`h-4 w-4 shrink-0 ${color}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n );\n}\n\n/** Short type tag shown in the Files-app listing of a desktop folder. */\nexport function desktopItemTypeLabel(item: DesktopItem): string {\n if (item.entityType === 'preview-file' && item.fileKind) return PREVIEW_FILE_CODES[item.fileKind];\n if (item.entityType === 'page') return 'App';\n if (item.entityType === 'folder') return 'Folder';\n return ENTITY_ICONS[item.entityType] ?? item.entityType.slice(0, 3).toUpperCase();\n}\n\n// ── Desktop-folder bridge ───────────────────────────────────────────────────\n//\n// Desktop folders are virtual — shortcut collections persisted in the user's\n// prefs, not directories on the file server. The Files app shows them anyway\n// (sidebar section + folder listing), so Desktop publishes its live folder\n// state here and Files subscribes via useSyncExternalStore. Mutations route\n// back through the callbacks so persistence stays in Desktop's host-aware\n// save path.\n\nexport interface DesktopFoldersSnapshot {\n folders: { id: string; name: string; itemCount: number }[];\n itemsByFolder: Record<string, DesktopItem[]>;\n /** Clear `folderId` on these shortcuts — they reappear on the desktop. */\n moveToDesktop: (items: DesktopItem[]) => void;\n /** Delete these shortcuts entirely. */\n removeShortcuts: (items: DesktopItem[]) => void;\n}\n\nlet desktopFoldersSnapshot: DesktopFoldersSnapshot | null = null;\nconst desktopFoldersListeners = new Set<() => void>();\n\nexport function publishDesktopFolders(next: DesktopFoldersSnapshot | null) {\n desktopFoldersSnapshot = next;\n desktopFoldersListeners.forEach(l => l());\n}\n\nexport function subscribeDesktopFolders(listener: () => void): () => void {\n desktopFoldersListeners.add(listener);\n return () => { desktopFoldersListeners.delete(listener); };\n}\n\nexport function getDesktopFoldersSnapshot(): DesktopFoldersSnapshot | null {\n return desktopFoldersSnapshot;\n}\n\n// ── Files-app view side channel ─────────────────────────────────────────────\n//\n// Used by the desktop Trash icon and desktop folders to open the Files app\n// on a specific view. Two cases handled:\n// 1) Files isn't open yet — the flag below is read once on first mount.\n// 2) Files is already open — the event tells the live instance to flip view.\n// The caller follows up with `openPage('/files')` either way.\n\nexport type FilesViewRequest = 'trash' | { view: 'desktop-folder'; folderId: string };\n\nexport const FILES_VIEW_FLAG = '__REACT_OS_SHELL_FILES_VIEW__';\nexport const FILES_SHOW_TRASH_EVENT = 'react-os-shell:files-show-trash';\nexport const FILES_OPEN_DESKTOP_FOLDER_EVENT = 'react-os-shell:files-open-desktop-folder';\n\nexport function requestFilesTrashView() {\n if (typeof window === 'undefined') return;\n (window as any)[FILES_VIEW_FLAG] = 'trash' satisfies FilesViewRequest;\n window.dispatchEvent(new CustomEvent(FILES_SHOW_TRASH_EVENT));\n}\n\nexport function requestFilesDesktopFolderView(folderId: string) {\n if (typeof window === 'undefined') return;\n (window as any)[FILES_VIEW_FLAG] = { view: 'desktop-folder', folderId } satisfies FilesViewRequest;\n window.dispatchEvent(new CustomEvent(FILES_OPEN_DESKTOP_FOLDER_EVENT, { detail: { folderId } }));\n}\n\n/** Read the pending view request without clearing it. Side-effect free so\n * it is safe inside a `useState` initializer (StrictMode double-invokes\n * those; a read-and-clear there would hand the second invocation null). */\nexport function peekFilesViewRequest(): FilesViewRequest | null {\n if (typeof window === 'undefined') return null;\n const raw = (window as any)[FILES_VIEW_FLAG];\n if (raw === 'trash') return 'trash';\n if (raw && typeof raw === 'object' && raw.view === 'desktop-folder' && typeof raw.folderId === 'string') return raw;\n return null;\n}\n\n/** Read-and-clear the pending view request (Files calls this once mounted). */\nexport function consumeFilesViewRequest(): FilesViewRequest | null {\n const req = peekFilesViewRequest();\n if (typeof window !== 'undefined') (window as any)[FILES_VIEW_FLAG] = null;\n return req;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { requestFilesTrashView } from './chunk-UFR3CXIF.js';
|
|
2
|
+
|
|
3
|
+
// src/apps/_filesShared.ts
|
|
4
|
+
var filesDemoTree = null;
|
|
5
|
+
function setFilesDemoTree(tree) {
|
|
6
|
+
filesDemoTree = tree;
|
|
7
|
+
}
|
|
8
|
+
function getFilesDemoTree() {
|
|
9
|
+
return filesDemoTree;
|
|
10
|
+
}
|
|
11
|
+
function openFilesInTrashMode() {
|
|
12
|
+
requestFilesTrashView();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { getFilesDemoTree, openFilesInTrashMode, setFilesDemoTree };
|
|
16
|
+
//# sourceMappingURL=chunk-UPO23MX4.js.map
|
|
17
|
+
//# sourceMappingURL=chunk-UPO23MX4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apps/_filesShared.ts"],"names":[],"mappings":";;;AAwBA,IAAI,aAAA,GAAwC,IAAA;AAErC,SAAS,iBAAiB,IAAA,EAA8B;AAC7D,EAAA,aAAA,GAAgB,IAAA;AAClB;AAGO,SAAS,gBAAA,GAA2C;AACzD,EAAA,OAAO,aAAA;AACT;AAKO,SAAS,oBAAA,GAAuB;AACrC,EAAA,qBAAA,EAAsB;AACxB","file":"chunk-UPO23MX4.js","sourcesContent":["/**\n * Files app config — the tiny consumer-facing surface of the Files app\n * (demo-tree injection + trash-mode open). Lives apart from Files.tsx so\n * importing these from `react-os-shell/apps` never drags the Files\n * implementation into a host's startup bundle; the Files window component\n * stays behind its React.lazy dynamic import.\n */\nimport { requestFilesTrashView } from '../shell/desktopIcons';\n\n/**\n * Demo filesystem. When a consumer (e.g. the demo app) injects a static tree\n * via `setFilesDemoTree`, Files browses it in-memory — no file server needed.\n * Browse-only: upload / new-folder / rename / delete / trash are hidden while a\n * demo tree is set. Consumers with a real file server never call it, so their\n * behaviour is unchanged.\n */\nexport interface FilesDemoNode {\n name: string;\n kind: 'file' | 'folder';\n size?: number;\n modifiedAt?: string;\n children?: FilesDemoNode[];\n}\n\nlet filesDemoTree: FilesDemoNode[] | null = null;\n\nexport function setFilesDemoTree(tree: FilesDemoNode[] | null) {\n filesDemoTree = tree;\n}\n\n/** @internal Current injected demo tree, if any — read by Files.tsx. */\nexport function getFilesDemoTree(): FilesDemoNode[] | null {\n return filesDemoTree;\n}\n\n// Side-channel for opening Files on a specific view (trash, desktop folder).\n// The flag + event plumbing lives in shell/desktopIcons.tsx; this wrapper is\n// kept because consumers import it from the package.\nexport function openFilesInTrashMode() {\n requestFilesTrashView();\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";AAIO,IAAM,OAAA,GAAwD,QAAA;AAG9D,IAAM,WAAA,GAAc","file":"chunk-WTJY2AEO.js","sourcesContent":["declare const __PKG_VERSION__: string | undefined;\n\n/** Package version, injected by tsup at build time. Stays as an empty\n * string when the source is consumed without a build (e.g. tests). */\nexport const VERSION: string = typeof __PKG_VERSION__ === 'string' ? __PKG_VERSION__ : '';\n\n/** Legacy alias kept so existing consumers do not break. */\nexport const APP_VERSION = VERSION;\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import { subscribePomo, getPomoSnapshot } from './chunk-OPDXBMON.js';
|
|
2
2
|
export { setShellTodoProvider } from './chunk-OPDXBMON.js';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
export { ImageAnnotator_default as ImageAnnotator } from './chunk-QU5L5ZYM.js';
|
|
4
|
+
import { PREVIEW_OPENED_EVENT, openPreviewFile } from './chunk-DINNWYVB.js';
|
|
5
|
+
export { Breadcrumbs } from './chunk-DINNWYVB.js';
|
|
5
6
|
import { SidebarLayout } from './chunk-YG45DAUT.js';
|
|
6
7
|
export { SidebarLayout } from './chunk-YG45DAUT.js';
|
|
7
|
-
import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, setSoundForType, previewSound, setAllSounds, playLogout } from './chunk-D7PYW2QS.js';
|
|
8
|
-
import { setPdfPreview } from './chunk-4BSHCQM6.js';
|
|
9
|
-
export { ImageAnnotator_default as ImageAnnotator } from './chunk-4BSHCQM6.js';
|
|
10
8
|
import { toast_default } from './chunk-VENYVK3L.js';
|
|
11
9
|
export { toast_default as toast } from './chunk-VENYVK3L.js';
|
|
12
|
-
import {
|
|
13
|
-
|
|
10
|
+
import { publishDesktopFolders, requestFilesTrashView, FolderGlyph, requestFilesDesktopFolderView, FileIconTile, hashGradient } from './chunk-UFR3CXIF.js';
|
|
11
|
+
import { setPdfPreview } from './chunk-BV6SQ46N.js';
|
|
12
|
+
import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, setSoundForType, previewSound, setAllSounds, playLogout } from './chunk-D7PYW2QS.js';
|
|
14
13
|
import { useAuth, useShellAuth } from './chunk-ADJ3CERD.js';
|
|
15
14
|
export { ShellAuthProvider, setShellAuthBridge, useShellAuth } from './chunk-ADJ3CERD.js';
|
|
16
|
-
import {
|
|
17
|
-
export {
|
|
15
|
+
import { EditableGrid } from './chunk-GP4Y3VCB.js';
|
|
16
|
+
export { EditableGrid } from './chunk-GP4Y3VCB.js';
|
|
17
|
+
import './chunk-4SQU5YV6.js';
|
|
18
|
+
import { APP_VERSION, VERSION } from './chunk-WTJY2AEO.js';
|
|
19
|
+
export { VERSION } from './chunk-WTJY2AEO.js';
|
|
18
20
|
import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, WINDOW_REGISTRY, isPageEntry, Modal, useShellPrefs, useIsMobile, ModalActions, useModalActive, client_default, LoadingSpinner, CancelButton, setWindowPosition, ThumbCard, activateModal } from './chunk-ZCL4X6PU.js';
|
|
19
21
|
export { CancelButton, CopyButton, DocFavStar, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ShellPrefsProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, registerModalEscapeInterceptor, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useLocalStoragePrefs, useModalActive, useShellPrefs, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-ZCL4X6PU.js';
|
|
20
22
|
export { ConfirmProvider, confirm, confirmDestructive, prompt } from './chunk-UBN4IUDE.js';
|