react-os-shell 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Browser-SP6PGPN5.js → Browser-PNQ5TVRZ.js} +4 -4
- package/dist/{Browser-SP6PGPN5.js.map → Browser-PNQ5TVRZ.js.map} +1 -1
- package/dist/{Documents-QXF5BF3N.js → Documents-L67KOICK.js} +3 -3
- package/dist/{Documents-QXF5BF3N.js.map → Documents-L67KOICK.js.map} +1 -1
- package/dist/{Files-JUO4Q7WI.js → Files-4D6XQRZB.js} +7 -7
- package/dist/{Files-JUO4Q7WI.js.map → Files-4D6XQRZB.js.map} +1 -1
- package/dist/{Notepad-EQ5YTHYQ.js → Notepad-L6QXDCAY.js} +3 -3
- package/dist/{Notepad-EQ5YTHYQ.js.map → Notepad-L6QXDCAY.js.map} +1 -1
- package/dist/Preview-XWX24RJD.js +9 -0
- package/dist/{Preview-FHEOYNOR.js.map → Preview-XWX24RJD.js.map} +1 -1
- package/dist/{Spreadsheet-Q2YHXKP4.js → Spreadsheet-2SWMHJQY.js} +4 -4
- package/dist/{Spreadsheet-Q2YHXKP4.js.map → Spreadsheet-2SWMHJQY.js.map} +1 -1
- package/dist/apps/index.js +12 -12
- package/dist/{chunk-7YHB7JZ3.js → chunk-A7MAQOF3.js} +4 -4
- package/dist/{chunk-7YHB7JZ3.js.map → chunk-A7MAQOF3.js.map} +1 -1
- package/dist/{chunk-IBNOPYS4.js → chunk-BZLRZPLP.js} +3 -3
- package/dist/{chunk-IBNOPYS4.js.map → chunk-BZLRZPLP.js.map} +1 -1
- package/dist/{chunk-4LQVJQ3S.js → chunk-CGSN2MCD.js} +98 -4
- package/dist/chunk-CGSN2MCD.js.map +1 -0
- package/dist/{chunk-FISSBIJU.js → chunk-EH6MIG5E.js} +3 -3
- package/dist/{chunk-FISSBIJU.js.map → chunk-EH6MIG5E.js.map} +1 -1
- package/dist/{chunk-KGDRIEI4.js → chunk-G4H4FQN3.js} +4 -4
- package/dist/{chunk-KGDRIEI4.js.map → chunk-G4H4FQN3.js.map} +1 -1
- package/dist/{chunk-G5VOT4ER.js → chunk-PXCTWRVI.js} +4 -4
- package/dist/{chunk-G5VOT4ER.js.map → chunk-PXCTWRVI.js.map} +1 -1
- package/dist/index.js +6 -6
- package/package.json +1 -1
- package/dist/Preview-FHEOYNOR.js +0 -9
- package/dist/chunk-4LQVJQ3S.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/Preview.tsx"],"names":["sourceMat","v","diag"],"mappings":"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","file":"chunk-4LQVJQ3S.js","sourcesContent":["/**\n * Preview — windowed PDF viewer app.\n *\n * Consumers stage a PDF via `setPdfPreview({ url, filename, ... })` and then\n * call `openPage('/preview')`. The next Preview window to mount drains the\n * staged data — each window owns its own content, so opening a second Preview\n * never disturbs the first. To swap content in an *already-open* window (e.g.\n * a converting placeholder being replaced by the resolved file), keep the\n * handle returned by `setPdfPreview` and call `.update(next)` on it.\n */\nimport { useState, useEffect, useRef, createContext, useContext } from 'react';\nimport { createPortal } from 'react-dom';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport toast from '../shell/toast';\nimport { WindowTitle, getActiveModalId } from '../shell/Modal';\nimport AboutApp from './_about';\nimport ImageAnnotator, { type ImageAnnotatorHandle } from './ImageAnnotator';\n\n/** Slot at the right end of the outer Preview toolbar — each format panel\n * portals its own action buttons (page nav, zoom, layers, download, etc.)\n * here so we render a single toolbar row instead of two stacked. */\nconst ToolbarSlotContext = createContext<HTMLElement | null>(null);\nfunction PanelActions({ children }: { children: React.ReactNode }) {\n const slot = useContext(ToolbarSlotContext);\n return slot ? createPortal(children, slot) : null;\n}\n\n// online-3d-viewer pulls three@0.176, where WebGLRenderer's stencil context\n// attribute defaults to FALSE. Without a stencil buffer the capped section\n// view's mask test always reads zero and the cap never renders. Patch the\n// canvas getContext call once so the WebGL context is created with stencil\n// enabled. Always force stencil:true on webgl context requests — three.js\n// passes stencil:false explicitly when it isn't user-specified, so a\n// \"preserve if already set\" check would skip the path that needs us most.\nlet _stencilContextPatched = false;\nfunction ensureStencilContextAttribute() {\n if (_stencilContextPatched) return;\n if (typeof HTMLCanvasElement === 'undefined') return;\n _stencilContextPatched = true;\n const orig = HTMLCanvasElement.prototype.getContext;\n HTMLCanvasElement.prototype.getContext = function patchedGetContext(\n this: HTMLCanvasElement,\n type: string,\n attrs?: any,\n ) {\n if (type === 'webgl' || type === 'webgl2' || type === 'experimental-webgl') {\n // Force stencil regardless of what the caller asked for.\n attrs = { ...(attrs || {}), stencil: true };\n }\n return (orig as any).call(this, type, attrs);\n } as any;\n // eslint-disable-next-line no-console\n console.info('[Preview] section: canvas getContext patched (force stencil=true)');\n}\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\n// Default the worker to the matching unpkg build (mirrors the consumer's\n// installed npm version exactly). Consumers can override by setting\n// pdfjsLib.GlobalWorkerOptions.workerSrc themselves before opening the\n// Preview window.\nif (typeof window !== 'undefined' && !pdfjsLib.GlobalWorkerOptions.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc =\n `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`;\n}\n\nexport interface PdfPreviewData {\n /** Object URL or remote URL of the PDF. Blob URLs are revoked when the window unmounts.\n * Leave blank when staging a `converting: true` placeholder; call `handle.update({...})`\n * on the handle returned by `setPdfPreview` once conversion finishes. */\n url?: string;\n /** Display name (and download filename). */\n filename: string;\n /** Renderer to use. Defaults to `'pdf'`. `'dxf'` requires the consumer to\n * have `dxf-viewer` installed (it's an optional peer dep). `'image'`\n * renders an `<img>` for raster screenshots / photos. `'3d'` covers\n * STEP / STL / OBJ / GLTF / 3MF / IGES via the optional\n * `online-3d-viewer` peer dep. */\n kind?: 'pdf' | 'dxf' | 'image' | '3d';\n /** Optional download handler — replaces the built-in \"save URL as filename\" if supplied. */\n onDownload?: () => void;\n /** Optional email handler — only shown when supplied. */\n onEmail?: () => void;\n /** Show a progress placeholder while the consumer fetches/converts the file. */\n converting?: boolean;\n /** Headline shown on the converting placeholder (e.g. \"CONVERTING DWG FILE\"). */\n convertingMessage?: string;\n}\n\nconst EVENT_NAME = 'react-os-shell:pdf-preview-update';\n\n/** Handle returned by `setPdfPreview`. Holds the identity of the staged\n * payload so a later `.update()` only targets the window that picked it up\n * (not every open Preview, which would clobber unrelated windows). */\nexport interface PdfPreviewHandle {\n /** Replace the data shown in the window that consumed this staging.\n * No-op if no window ever consumed it, or if that window has been closed. */\n update(next: PdfPreviewData): void;\n}\n\ninterface PendingStage {\n token: number;\n data: PdfPreviewData;\n}\n\nlet pending: PendingStage | null = null;\nlet nextToken = 0;\n\n/** Stage a PDF for the next Preview window mount. The returned handle's\n * `update()` method swaps content in *that* specific window only — use it\n * to replace a `converting: true` placeholder with the resolved file. */\nexport function setPdfPreview(data: PdfPreviewData): PdfPreviewHandle {\n const token = ++nextToken;\n pending = { token, data };\n return {\n update(next: PdfPreviewData) {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent(EVENT_NAME, { detail: { token, data: next } }));\n },\n };\n}\n\nexport default function Preview() {\n // One-shot drain: this instance claims whatever was staged and stores the\n // token so it can recognise later `.update()` calls aimed at it. The render\n // phase only PEEKS — under React 18 concurrent rendering a render pass can\n // be discarded and replayed (the first mount of this lazy component\n // suspends on its chunk), and a destructive read here would let the\n // discarded pass swallow the payload, leaving the committed window empty.\n // The stage is cleared in the mount effect below (commit phase) instead.\n const consumedRef = useRef<PendingStage | null | undefined>(undefined);\n if (consumedRef.current === undefined) {\n consumedRef.current = pending;\n }\n useEffect(() => {\n // Claim the stage for real once mounted. The identity check keeps a\n // payload staged *after* our render-phase peek (e.g. a second preview\n // opened in quick succession) available for the window it belongs to.\n if (consumedRef.current !== null && pending === consumedRef.current) {\n pending = null;\n }\n }, []);\n const [data, setData] = useState<PdfPreviewData | null>(consumedRef.current?.data ?? null);\n\n // Only respond to update events whose token matches our claim.\n useEffect(() => {\n const myToken = consumedRef.current?.token;\n if (myToken == null) return;\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<PendingStage>).detail;\n if (!detail || detail.token !== myToken) return;\n setData(prev => {\n if (prev?.url && prev.url !== detail.data.url && prev.url.startsWith('blob:')) {\n URL.revokeObjectURL(prev.url);\n }\n return detail.data;\n });\n };\n window.addEventListener(EVENT_NAME, handler);\n return () => window.removeEventListener(EVENT_NAME, handler);\n }, []);\n\n // Revoke blob URL on unmount.\n useEffect(() => () => {\n if (data?.url?.startsWith('blob:')) URL.revokeObjectURL(data.url);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Window title reflects whatever is loaded — same pattern Spreadsheets uses.\n const titleName = data?.filename ? truncateForTitle(data.filename) : 'Untitled';\n\n const fileRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n // Slot element for panel-portaled action buttons. Use state (not ref) so the\n // first render that mounts the slot triggers a re-render in panel children.\n const [toolbarSlotEl, setToolbarSlotEl] = useState<HTMLDivElement | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n // Drag-enter/leave fire on every child the cursor crosses, so a single\n // boolean flickers. Track depth with a counter — overlay shows on first\n // enter, clears only when the counter unwinds back to zero.\n const dragDepthRef = useRef(0);\n const handlePick = () => fileRef.current?.click();\n const resetDrag = () => {\n dragDepthRef.current = 0;\n setIsDragging(false);\n };\n // Only the frontmost (active) Preview window should accept drags. With\n // multiple Previews open this prevents the overlay flashing on every\n // window the cursor crosses, and matches the user's expectation that\n // they activate a window first by clicking it.\n const isActiveWindow = (el: HTMLElement) => {\n const myModal = el.closest('[data-modal-id]') as HTMLElement | null;\n if (!myModal) return true; // outside any modal — be permissive\n return getActiveModalId() === myModal.dataset.modalId;\n };\n // If the drag ends outside our component (e.g. dropped onto desktop trash),\n // we never receive `drop` or our outer `dragleave`. Listen on window so\n // any end of any drag clears the overlay. Also wire ESC as an escape hatch.\n useEffect(() => {\n const onWindowDragEnd = () => resetDrag();\n const onWindowDrop = () => resetDrag();\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') resetDrag();\n };\n window.addEventListener('dragend', onWindowDragEnd);\n window.addEventListener('drop', onWindowDrop);\n window.addEventListener('keydown', onKey);\n return () => {\n window.removeEventListener('dragend', onWindowDragEnd);\n window.removeEventListener('drop', onWindowDrop);\n window.removeEventListener('keydown', onKey);\n };\n }, []);\n const ingestFile = (file: File) => {\n const ext = (file.name.split('.').pop() || '').toLowerCase();\n const kind: 'pdf' | 'image' | 'dxf' | '3d' | undefined =\n ext === 'pdf' ? 'pdf'\n : ext === 'dxf' ? 'dxf'\n : ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext) ? 'image'\n : ['stp', 'step', 'stl', 'obj', 'gltf', 'glb', '3mf', 'iges', 'igs', 'ply', 'fbx'].includes(ext) ? '3d'\n : undefined;\n if (!kind) {\n if (ext === 'dwg') toast.error('DWG files need server-side conversion. Convert to PDF or DXF first.');\n else toast.error(`Unsupported file type: .${ext || 'unknown'}`);\n return;\n }\n const url = URL.createObjectURL(file);\n // Local-only update: setPdfPreview stages content for the *next* window\n // to mount — calling it from inside an open window would overwrite that\n // slot and steal the payload from whoever opens next.\n setData(prev => {\n if (prev?.url?.startsWith('blob:') && prev.url !== url) {\n URL.revokeObjectURL(prev.url);\n }\n return { url, filename: file.name, kind };\n });\n };\n const handleFile = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) ingestFile(file);\n if (fileRef.current) fileRef.current.value = '';\n };\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n resetDrag();\n const file = e.dataTransfer.files?.[0];\n if (file) ingestFile(file);\n };\n\n const Toolbar = (\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".pdf,.dxf,.jpg,.jpeg,.png,.gif,.webp,.svg,.avif,.bmp,.stp,.step,.stl,.obj,.gltf,.glb,.3mf,.iges,.igs,.ply,.fbx\"\n onChange={handleFile}\n className=\"hidden\"\n />\n <button\n onClick={handlePick}\n className=\"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors flex items-center gap-1\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776\" />\n </svg>\n Open\n </button>\n <span className=\"text-[10px] text-gray-400 ml-1\">PDF · DXF · 3D · Images</span>\n {data?.filename && (\n <>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <span className=\"text-xs font-medium text-gray-700 truncate max-w-[200px]\" title={data.filename}>{data.filename}</span>\n </>\n )}\n {/* Panel-specific actions (page nav, zoom, layers, download, …) get\n * portaled into this slot by whichever panel is active. */}\n <div ref={setToolbarSlotEl} className=\"ml-auto flex items-center gap-1 text-xs\" />\n </div>\n );\n\n let body: React.ReactNode;\n if (!data) {\n body = (\n <div className=\"flex flex-1 flex-col items-center justify-center text-gray-500 text-sm gap-3 p-8 text-center\">\n <svg className=\"h-12 w-12 text-gray-300\" 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 <p className=\"font-medium text-gray-700\">Drop a file here, or click <button onClick={handlePick} className=\"text-blue-600 hover:underline\">Open</button>.</p>\n <div className=\"text-xs text-gray-500 max-w-sm\">\n <p className=\"font-semibold uppercase tracking-wide text-[10px] text-gray-400 mb-1\">Supported formats</p>\n <ul className=\"space-y-0.5\">\n <li><span className=\"font-mono text-gray-700\">.pdf</span> — multi-page document viewer</li>\n <li><span className=\"font-mono text-gray-700\">.dxf</span> — vector CAD drawings (optional <span className=\"font-mono\">dxf-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.stp .step .stl .obj .gltf .glb .3mf .iges</span> — 3D models (optional <span className=\"font-mono\">online-3d-viewer</span> peer dep)</li>\n <li><span className=\"font-mono text-gray-700\">.jpg .jpeg .png .gif .webp .svg .avif .bmp</span> — raster images</li>\n </ul>\n <p className=\"mt-2 text-[11px] text-gray-400 italic\">DWG files need to be converted to PDF or DXF first (server-side).</p>\n </div>\n </div>\n );\n } else if (data.converting || !data.url) {\n body = <ConvertingPanel filename={data.filename} message={data.convertingMessage} />;\n } else if (data.kind === 'dxf') {\n body = <DxfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === '3d') {\n body = <StepPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else if (data.kind === 'image') {\n body = <ImagePanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n } else {\n body = <PdfPanel key={data.url} url={data.url} filename={data.filename} onDownload={data.onDownload} onEmail={data.onEmail} />;\n }\n\n return (\n <div\n className=\"relative flex flex-col h-full\"\n ref={rootRef}\n onDragEnter={(e) => {\n // Only count drags that actually carry files — ignore stray drags\n // (e.g. text selections) so we don't flash the overlay.\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n // And only the active (frontmost) Preview window responds.\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n dragDepthRef.current++;\n if (!isDragging) setIsDragging(true);\n }}\n onDragOver={(e) => {\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n if (!isActiveWindow(e.currentTarget as HTMLElement)) return;\n e.preventDefault();\n }}\n onDragLeave={() => {\n if (dragDepthRef.current > 0) dragDepthRef.current--;\n if (dragDepthRef.current === 0) setIsDragging(false);\n }}\n onDrop={(e) => {\n if (!isActiveWindow(e.currentTarget as HTMLElement)) {\n resetDrag();\n return;\n }\n handleDrop(e);\n }}\n >\n <WindowTitle title={`${titleName} - Preview`} />\n <AboutApp app=\"preview\" />\n {Toolbar}\n <ToolbarSlotContext.Provider value={toolbarSlotEl}>\n <div className=\"flex-1 min-h-0\">{body}</div>\n </ToolbarSlotContext.Provider>\n {isDragging && (\n <div className=\"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20\">\n <div className=\"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg\">\n Drop to open\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ConvertingPanel({ filename, message }: { filename: string; message?: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full bg-gray-100 gap-4 px-8\">\n <div className=\"flex flex-col items-center gap-3\">\n <svg className=\"h-12 w-12 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <div className=\"text-base font-semibold tracking-wide text-gray-700 uppercase\">{message || 'Converting file'}</div>\n <div className=\"text-xs text-gray-400 truncate max-w-md\">{filename}</div>\n </div>\n <div className=\"w-72 h-1.5 rounded-full bg-gray-200 overflow-hidden\">\n <div className=\"h-full w-1/3 bg-blue-500 rounded-full animate-pulse\" style={{ animation: 'preview-bar 1.4s ease-in-out infinite' }} />\n </div>\n <style>{`@keyframes preview-bar { 0% { transform: translateX(-110%); } 100% { transform: translateX(310%); } }`}</style>\n </div>\n );\n}\n\ninterface PdfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nconst ZOOM_PRESETS = [50, 75, 100, 125, 150, 200, 300, 400];\n\nfunction PdfPanel({ url, filename, onDownload, onEmail }: PdfPanelProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [pdf, setPdf] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [page, setPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [scale, setScale] = useState(1);\n // Fit mode is the default — scale stays auto-tracking the container width\n // until the user picks a manual zoom (− / + / dropdown). Re-armed by the\n // Fit toolbar button.\n const [fitMode, setFitMode] = useState(true);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n pdfjsLib.getDocument(url).promise.then(doc => {\n if (cancelled) return;\n setPdf(doc);\n setTotalPages(doc.numPages);\n setLoading(false);\n }).catch(() => {\n if (!cancelled) { toast.error('Failed to load PDF'); setLoading(false); }\n });\n return () => { cancelled = true; };\n }, [url]);\n\n // Auto-fit: re-compute scale from container width whenever fit mode is on,\n // the document changes, the page changes, or the container resizes. Window\n // resize and Modal drag-resize both trigger ResizeObserver. Manual zoom\n // turns this off until the user clicks Fit again.\n useEffect(() => {\n if (!pdf || !fitMode || !containerRef.current) return;\n const fit = () => {\n if (!containerRef.current) return;\n pdf.getPage(page).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n const next = Math.min(Math.max((containerW - 40) / viewport.width, 0.3), 4);\n setScale(prev => (Math.abs(prev - next) < 0.005 ? prev : next));\n });\n };\n fit();\n const ro = new ResizeObserver(fit);\n ro.observe(containerRef.current);\n return () => ro.disconnect();\n }, [pdf, page, fitMode]);\n\n useEffect(() => {\n if (!pdf || !canvasRef.current) return;\n let cancelled = false;\n let task: { cancel: () => void; promise: Promise<void> } | null = null;\n pdf.getPage(page).then(p => {\n if (cancelled || !canvasRef.current) return;\n const viewport = p.getViewport({ scale });\n const canvas = canvasRef.current;\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n // Lock the displayed (CSS) size to the viewport. pdf.js stamps inline\n // style.width/height on render and inline values stick across re-renders\n // even when canvas.width shrinks — without this, zoom changes only\n // affect resolution, not visible size.\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n const ctx = canvas.getContext('2d')!;\n task = p.render({ canvas, canvasContext: ctx, viewport });\n task.promise.catch(() => {});\n });\n return () => {\n cancelled = true;\n task?.cancel();\n };\n }, [pdf, page, scale]);\n\n const handlePrint = () => {\n if (!pdf) return;\n const win = window.open('', '_blank');\n if (!win) { toast.error('Allow popups to print'); return; }\n const promises: Promise<string>[] = [];\n for (let i = 1; i <= totalPages; i++) {\n promises.push(pdf.getPage(i).then(p => {\n const vp = p.getViewport({ scale: 2 });\n const c = document.createElement('canvas');\n c.width = vp.width; c.height = vp.height;\n return p.render({ canvas: c, canvasContext: c.getContext('2d')!, viewport: vp }).promise.then(() => c.toDataURL());\n }));\n }\n Promise.all(promises).then(images => {\n win.document.write(`<html><head><title>${filename}</title><style>@media print{body{margin:0}img{width:100%;page-break-after:always}}</style></head><body>`);\n win.document.write(images.map(src => `<img src=\"${src}\"/>`).join(''));\n win.document.write('</body></html>');\n win.document.close();\n setTimeout(() => { win.print(); win.close(); }, 300);\n });\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n // Re-arm fit mode. The auto-fit effect picks the new scale on its next\n // tick once `fitMode` flips to true.\n const fitWidth = () => setFitMode(true);\n\n // Wheel and keyboard page navigation. Only takes the wheel event when\n // the container is at the top/bottom edge — otherwise normal scroll\n // moves through a tall page first, matching native PDF readers.\n const onWheelPage = (e: React.WheelEvent<HTMLDivElement>) => {\n if (!pdf) return;\n if (e.ctrlKey || e.metaKey) return; // browser-zoom shortcut, leave alone\n const el = containerRef.current;\n if (!el) return;\n const atTop = el.scrollTop <= 0;\n const atBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 1;\n if (e.deltaY > 0 && atBottom && page < totalPages) {\n e.preventDefault();\n setPage(p => Math.min(totalPages, p + 1));\n // Land at the top of the next page so wheel-down keeps reading\n // forward. requestAnimationFrame so the canvas has a tick to\n // resize before we scroll.\n requestAnimationFrame(() => { if (containerRef.current) containerRef.current.scrollTop = 0; });\n } else if (e.deltaY < 0 && atTop && page > 1) {\n e.preventDefault();\n setPage(p => Math.max(1, p - 1));\n requestAnimationFrame(() => {\n if (containerRef.current) containerRef.current.scrollTop = containerRef.current.scrollHeight;\n });\n }\n };\n const onKeyPage = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!pdf) return;\n // Ignore keyboard nav when an input/textarea has focus.\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || (document.activeElement as HTMLElement)?.isContentEditable) return;\n if (e.key === 'PageDown' || e.key === 'ArrowRight') {\n if (page < totalPages) { e.preventDefault(); setPage(p => Math.min(totalPages, p + 1)); }\n } else if (e.key === 'PageUp' || e.key === 'ArrowLeft') {\n if (page > 1) { e.preventDefault(); setPage(p => Math.max(1, p - 1)); }\n } else if (e.key === 'Home') {\n e.preventDefault(); setPage(1);\n } else if (e.key === 'End') {\n e.preventDefault(); setPage(totalPages);\n }\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <PanelActions>\n <button onClick={() => setPage(p => Math.max(1, p - 1))} disabled={page <= 1} className=\"px-1 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" /></svg>\n </button>\n <span className=\"text-gray-600 font-medium tabular-nums\">{page} / {totalPages}</span>\n <button onClick={() => setPage(p => Math.min(totalPages, p + 1))} disabled={page >= totalPages} className=\"px-1 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n </button>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button\n onClick={() => { setFitMode(false); setScale(s => Math.max(0.3, Math.round((s - 0.25) * 100) / 100)); }}\n className={btn}\n >−</button>\n <select\n value={fitMode ? 'fit' : (ZOOM_PRESETS.includes(Math.round(scale * 100)) ? Math.round(scale * 100) : 'custom')}\n onChange={e => {\n const v = e.target.value;\n if (v === 'fit') { setFitMode(true); return; }\n if (v !== 'custom') { setFitMode(false); setScale(Number(v) / 100); }\n }}\n className=\"bg-transparent hover:bg-gray-200 rounded px-1 py-1 text-gray-600 tabular-nums cursor-pointer focus:outline-none focus:ring-1 focus:ring-blue-400\"\n title=\"Zoom\"\n >\n <option value=\"fit\">Fit</option>\n {!fitMode && !ZOOM_PRESETS.includes(Math.round(scale * 100)) && (\n <option value=\"custom\">{Math.round(scale * 100)}%</option>\n )}\n {ZOOM_PRESETS.map(p => <option key={p} value={p}>{p}%</option>)}\n </select>\n <button\n onClick={() => { setFitMode(false); setScale(s => Math.min(4, Math.round((s + 0.25) * 100) / 100)); }}\n className={btn}\n >+</button>\n <button\n onClick={fitWidth}\n className={btn + (fitMode ? ' bg-gray-200 text-gray-900' : '')}\n title=\"Fit page width — auto-tracks the window size until you zoom manually\"\n >Fit</button>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button onClick={handlePrint} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.72 13.829c-.24.03-.48.062-.72.096m.72-.096a42.415 42.415 0 0110.56 0m-10.56 0L6.34 18m10.94-4.171c.24.03.48.062.72.096m-.72-.096L17.66 18m0 0l.229 2.523a1.125 1.125 0 01-1.12 1.227H7.231c-.662 0-1.18-.568-1.12-1.227L6.34 18m11.318 0h1.091A2.25 2.25 0 0021 15.75V9.456c0-1.081-.768-2.015-1.837-2.175a48.055 48.055 0 00-1.913-.247M6.34 18H5.25A2.25 2.25 0 013 15.75V9.456c0-1.081.768-2.015 1.837-2.175a48.041 48.041 0 011.913-.247m10.5 0a48.536 48.536 0 00-10.5 0m10.5 0V3.375c0-.621-.504-1.125-1.125-1.125h-8.25c-.621 0-1.125.504-1.125 1.125v3.659M18 10.5h.008v.008H18V10.5zm-3 0h.008v.008H15V10.5z\" /></svg>\n Print\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </PanelActions>\n\n <div\n ref={containerRef}\n className=\"flex-1 overflow-auto bg-gray-100 outline-none\"\n // tabIndex makes the scroll container itself focusable so PageUp /\n // PageDown / Arrow keys are captured even when no inner element\n // has focus (e.g. right after the panel mounts). Wheel handler\n // page-flips when the user reaches the top/bottom of a long page.\n tabIndex={0}\n onWheel={onWheelPage}\n onKeyDown={onKeyPage}\n >\n {loading ? (\n <div className=\"flex items-center justify-center h-full text-gray-400 text-sm\">Loading PDF...</div>\n ) : (\n <div className=\"min-h-full flex items-center justify-center p-4\">\n <canvas ref={canvasRef} className=\"shadow-lg rounded\" />\n </div>\n )}\n </div>\n </div>\n );\n}\n\ninterface DxfPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// Default font set covering Latin + CJK glyphs, served from jsdelivr's mirror\n// of the dxf-viewer example assets. Without these, any TEXT/MTEXT entities in\n// the drawing render as empty boxes. Consumers can override by setting\n// `window.__REACT_OS_SHELL_DXF_FONTS__` to a different array of TTF/OTF URLs.\nconst DEFAULT_DXF_FONTS: string[] = [\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/Roboto-LightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NotoSansDisplay-SemiCondensedLightItalic.ttf',\n 'https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NanumGothic-Regular.ttf',\n];\n\ninterface DxfLayer {\n name: string;\n displayName?: string;\n color?: number;\n visible: boolean;\n}\n\nfunction DxfPanel({ url, filename, onDownload, onEmail }: DxfPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [layers, setLayers] = useState<DxfLayer[]>([]);\n const [showLayers, setShowLayers] = useState(false);\n const [showHint, setShowHint] = useState(true);\n\n // Measurement tool — DXF (2D) edition.\n //\n // Two modes (toggled via a Point | ⊥ pill that appears next to the\n // Measure button):\n // - Point: straight-line distance between two picks.\n // - ⊥: the first pick must snap to a line; the second pick can\n // be anywhere; we report the perpendicular distance from the\n // second pick to the first line.\n //\n // All visuals (markers, line, distance label, snap indicator) are HTML/\n // SVG overlays positioned via camera projection — fixed pixel size, so\n // they don't grow into giant orange blobs when the user zooms in.\n // Snap-to-endpoint and snap-to-nearest-on-line are computed in screen\n // space against a cached list of every line segment in the scene\n // (built once on viewer load).\n const [measureEnabled, setMeasureEnabled] = useState(false);\n const [measureMode, setMeasureMode] = useState<'point' | 'horizontal' | 'vertical'>('horizontal');\n const [measureDistance, setMeasureDistance] = useState<number | null>(null);\n /** When set in H or V mode, the second pick's X (H) or Y (V) snaps to\n * the first pick's coord + this value, sign-matched to whichever side\n * of A the user clicked on. The displayed measurement then becomes\n * the perpendicular distance (Δy in H, Δx in V) — useful for \"feature\n * is 30mm horizontal from A; how far is it vertically?\" workflows. */\n const [measureFixedDist, setMeasureFixedDist] = useState<number | null>(null);\n /** Raw text in the fixed-distance input — kept separate so partial\n * edits (e.g. just \"-\") don't clobber the parsed value with NaN. */\n const [measureFixedInput, setMeasureFixedInput] = useState('');\n // Refs that mirror the React state so the main measure effect can read\n // the current values without rebuilding when the user switches mode or\n // changes the fixed distance — picks are preserved across these\n // changes.\n const measureModeRef = useRef(measureMode);\n const measureFixedDistRef = useRef(measureFixedDist);\n useEffect(() => { measureModeRef.current = measureMode; }, [measureMode]);\n useEffect(() => { measureFixedDistRef.current = measureFixedDist; }, [measureFixedDist]);\n /** Exposed by the measure effect so other effects can ask it to redraw\n * using the current refs (e.g. after mode / fixed-distance change). */\n const measureRedrawRef = useRef<(() => void) | null>(null);\n const measureRef = useRef<{\n /** Effective scene points used for the measurement, at most two.\n * In a fixed-distance scenario, picks[1] is the *locked* position\n * (axis-snapped to A + fixed), not the raw click. */\n picks: { x: number; y: number }[];\n /** Raw second-pick click position, kept separately so we can\n * re-derive picks[1] when measureFixedDist changes without\n * forcing the user to re-pick. */\n rawSecondClick: { x: number; y: number } | null;\n /** Imperative DOM nodes — recreated on each enable. */\n overlay: HTMLDivElement | null;\n svg: SVGSVGElement | null;\n /** Main dim line (B-leg in fixed-distance mode). */\n line: SVGLineElement | null;\n /** Fixed-axis leg (A → R) shown only when measureFixedDist is set. */\n fixedLine: SVGLineElement | null;\n /** Label for the fixed-axis leg. */\n fixedLabel: HTMLDivElement | null;\n /** Dashed extension of the dim-axis through the first pick. */\n refLine: SVGLineElement | null;\n /** AutoCAD-style extension lines from each pick to the dim line. */\n extLineA: SVGLineElement | null;\n extLineB: SVGLineElement | null;\n markers: HTMLDivElement[];\n label: HTMLDivElement | null;\n snap: HTMLDivElement | null;\n /** Cached scene-space segment endpoints — built once after the dxf\n * scene is loaded; used for snap detection on pointer move. */\n segments: { ax: number; ay: number; bx: number; by: number }[];\n } | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n setLoading(true);\n setError(null);\n setLayers([]);\n\n (async () => {\n let DxfViewer: any;\n try {\n const mod = await import('dxf-viewer');\n DxfViewer = (mod as any).DxfViewer;\n } catch (e) {\n if (!cancelled) {\n setError('dxf-viewer is not installed in this app.');\n setLoading(false);\n }\n return;\n }\n if (cancelled || !containerRef.current) return;\n try {\n // dxf-viewer reads container dimensions in its constructor (with\n // autoResize:true, those become the canvas size). If the Modal is\n // still settling we may be measured as 0×0, breaking aspect math\n // and the WebGL viewport. Wait until the container has a real\n // bounding box before constructing the viewer.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n // clearColor must be a THREE.Color (Library calls .getHex()).\n let three: any = null;\n try { three = await import(/* @vite-ignore */ 'three' as any); } catch {}\n const ClearColor = three?.Color ?? null;\n const viewerOpts: any = { autoResize: true };\n if (ClearColor) viewerOpts.clearColor = new ClearColor(0xffffff);\n viewer = new DxfViewer(containerRef.current, viewerOpts);\n viewerRef.current = viewer;\n\n const fontUrls = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_DXF_FONTS__)\n || DEFAULT_DXF_FONTS;\n await viewer.Load({ url, fonts: fontUrls, workerFactory: null });\n if (cancelled) return;\n\n // Snapshot layer list — used to render the toggle panel.\n try {\n const list: any[] = viewer.GetLayers?.() ?? [];\n if (Array.isArray(list)) {\n setLayers(list.map(l => ({\n name: l.name,\n displayName: l.displayName ?? l.name,\n color: typeof l.color === 'number' ? l.color : undefined,\n visible: true,\n })));\n }\n } catch {}\n\n // Force-fit using the actual loaded bounds and refresh canvas size.\n const refit = () => {\n try {\n const rect = containerRef.current?.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n viewer.SetSize?.(Math.round(rect.width), Math.round(rect.height));\n }\n const bounds = viewer.GetBounds?.();\n const origin = viewer.GetOrigin?.();\n if (bounds && origin) {\n viewer.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n }\n viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] DXF refit failed', err);\n }\n };\n refit();\n requestAnimationFrame(refit);\n setLoading(false);\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to render DXF.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url]);\n\n // Auto-hide the usage hint after a few seconds.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n // ──────────────────────────────────────────────────────────────────────\n // Measurement tool — DXF (2D) edition.\n //\n // All visuals (markers, line, label, extension lines, snap indicator)\n // are HTML / SVG overlays positioned via camera projection — they stay\n // constant size in pixels regardless of zoom, so they never balloon\n // into giant orange blobs as the user zooms in.\n //\n // Snap-to-line / snap-to-endpoint is computed in *screen space* against\n // a cached list of every line segment in the dxf-viewer scene (built\n // once from `scene.traverse(LineSegments)`). On hover, the closest\n // endpoint or the closest point on a segment within 12 px snaps the\n // cursor — clicks then use that snapped position.\n //\n // Three modes via a Point | H | V pill that appears next to Measure:\n // - Point: straight-line (Euclidean) distance between two picks.\n // - H: distance along the X axis (|Δx|). Dim line drawn through\n // pick A horizontally, ending at pick B's projected X.\n // - V: distance along the Y axis (|Δy|). Dim line drawn through\n // pick A vertically, ending at pick B's projected Y.\n //\n // All dimensions render AutoCAD DIMLINEAR-style — arrow heads at both\n // ends, plus an extension line dropping from the second pick to the\n // dim line in H/V mode.\n //\n // H/V also accept a *fixed-distance* input. When set, the second pick's\n // X (in H) or Y (in V) snaps to the first pick's coord plus that value\n // (signed by which side of A the user clicked), and the displayed\n // measurement becomes the *perpendicular* component — i.e. \"this\n // feature is 30mm horizontally from A; how far is it vertically?\". The\n // chain dim renders both legs: a fixed-value leg from A → R, and the\n // perpendicular measurement leg from R → B.\n //\n // Switching mode or editing the fixed distance preserves the two picks\n // — the overlay just re-renders. The main setup effect therefore\n // intentionally does not depend on measureMode / measureFixedDist; a\n // smaller effect calls measureRedrawRef.current() on those changes.\n // ──────────────────────────────────────────────────────────────────────\n useEffect(() => {\n const v = viewerRef.current;\n if (loading || error || !v) return;\n\n const scene: any = v.GetScene?.();\n const camera: any = v.GetCamera?.();\n const canvas: HTMLCanvasElement | undefined = v.GetCanvas?.();\n if (!scene || !camera || !canvas || !containerRef.current) return;\n\n const teardown = () => {\n const s = measureRef.current;\n if (!s) return;\n if (s.overlay && s.overlay.parentElement) s.overlay.parentElement.removeChild(s.overlay);\n measureRef.current = null;\n };\n\n if (!measureEnabled) {\n teardown();\n setMeasureDistance(null);\n return;\n }\n\n // ── HTML overlay scaffold ──────────────────────────────────────\n const overlay = document.createElement('div');\n overlay.style.cssText = 'position:absolute;inset:0;pointer-events:none;z-index:5;';\n containerRef.current.appendChild(overlay);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('style', 'position:absolute;inset:0;width:100%;height:100%;pointer-events:none;');\n // AutoCAD-style arrowhead, applied to the dim line via marker-start /\n // marker-end. orient=\"auto-start-reverse\" makes the same marker point\n // outward at *both* ends, so one definition covers both arrows.\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker');\n marker.setAttribute('id', 'dxf-measure-arrow');\n marker.setAttribute('viewBox', '0 0 10 10');\n marker.setAttribute('refX', '9');\n marker.setAttribute('refY', '5');\n marker.setAttribute('markerWidth', '6');\n marker.setAttribute('markerHeight', '6');\n marker.setAttribute('orient', 'auto-start-reverse');\n const arrowPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n arrowPath.setAttribute('d', 'M 0 0 L 10 5 L 0 10 z');\n arrowPath.setAttribute('fill', '#ff8800');\n marker.appendChild(arrowPath);\n defs.appendChild(marker);\n svg.appendChild(defs);\n overlay.appendChild(svg);\n\n // Dashed extension of the dim-axis through the first pick. Drawn first\n // so the solid dim line renders on top.\n const refLineEl = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n refLineEl.setAttribute('stroke', '#ff8800');\n refLineEl.setAttribute('stroke-width', '1');\n refLineEl.setAttribute('stroke-dasharray', '6,4');\n refLineEl.setAttribute('opacity', '0.55');\n refLineEl.style.display = 'none';\n svg.appendChild(refLineEl);\n\n // AutoCAD-style extension lines — thin solid lines from each pick to\n // the dim line. Drawn before the dim line so the dim line + arrows\n // render on top.\n const extLineA = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n extLineA.setAttribute('stroke', '#ff8800');\n extLineA.setAttribute('stroke-width', '1');\n extLineA.setAttribute('opacity', '0.85');\n extLineA.style.display = 'none';\n svg.appendChild(extLineA);\n const extLineB = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n extLineB.setAttribute('stroke', '#ff8800');\n extLineB.setAttribute('stroke-width', '1');\n extLineB.setAttribute('opacity', '0.85');\n extLineB.style.display = 'none';\n svg.appendChild(extLineB);\n\n const lineEl = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n lineEl.setAttribute('stroke', '#ff8800');\n lineEl.setAttribute('stroke-width', '1.5');\n lineEl.setAttribute('stroke-linecap', 'round');\n lineEl.style.display = 'none';\n svg.appendChild(lineEl);\n\n // Second dim line — only used in fixed-distance mode, drawing the\n // A→R \"locked\" segment. Visually identical to lineEl so they read as\n // one continuous AutoCAD chain dim.\n const fixedLineEl = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n fixedLineEl.setAttribute('stroke', '#ff8800');\n fixedLineEl.setAttribute('stroke-width', '1.5');\n fixedLineEl.setAttribute('stroke-linecap', 'round');\n fixedLineEl.style.display = 'none';\n svg.appendChild(fixedLineEl);\n\n // AutoCAD-style snap indicator — one container, three glyphs swapped\n // by setSnapGlyph() based on what was matched: square for endpoint,\n // X for intersection, bowtie/hourglass for nearest-on-line.\n const snapEl = document.createElement('div');\n snapEl.style.cssText = `position:absolute;transform:translate(-50%,-50%);pointer-events:none;display:none;`;\n const SVGNS = 'http://www.w3.org/2000/svg';\n const snapSvg = document.createElementNS(SVGNS, 'svg');\n snapSvg.setAttribute('width', '22');\n snapSvg.setAttribute('height', '22');\n snapSvg.setAttribute('viewBox', '0 0 22 22');\n snapSvg.setAttribute('style', 'overflow:visible;display:block');\n snapEl.appendChild(snapSvg);\n const mkSnapGlyph = (build: (g: SVGGElement) => void): SVGGElement => {\n const g = document.createElementNS(SVGNS, 'g');\n build(g);\n g.style.display = 'none';\n snapSvg.appendChild(g);\n return g;\n };\n // Endpoint — hollow square (filled white, orange stroke)\n const snapGlyphEndpoint = mkSnapGlyph((g) => {\n const r = document.createElementNS(SVGNS, 'rect');\n r.setAttribute('x', '4'); r.setAttribute('y', '4');\n r.setAttribute('width', '14'); r.setAttribute('height', '14');\n r.setAttribute('fill', 'rgba(255,255,255,0.9)');\n r.setAttribute('stroke', '#ff8800');\n r.setAttribute('stroke-width', '1.8');\n g.appendChild(r);\n });\n // Intersection — X (two crossing diagonals)\n const snapGlyphIntersection = mkSnapGlyph((g) => {\n const mkLn = (x1: number, y1: number, x2: number, y2: number) => {\n const ln = document.createElementNS(SVGNS, 'line');\n ln.setAttribute('x1', String(x1)); ln.setAttribute('y1', String(y1));\n ln.setAttribute('x2', String(x2)); ln.setAttribute('y2', String(y2));\n ln.setAttribute('stroke', '#ff8800');\n ln.setAttribute('stroke-width', '2.2');\n ln.setAttribute('stroke-linecap', 'round');\n return ln;\n };\n g.appendChild(mkLn(4, 4, 18, 18));\n g.appendChild(mkLn(18, 4, 4, 18));\n });\n // Line (\"nearest\") — bowtie / hourglass\n const snapGlyphLine = mkSnapGlyph((g) => {\n const poly = document.createElementNS(SVGNS, 'polygon');\n poly.setAttribute('points', '4,4 18,4 4,18 18,18');\n poly.setAttribute('fill', 'rgba(255,255,255,0.9)');\n poly.setAttribute('stroke', '#ff8800');\n poly.setAttribute('stroke-width', '1.8');\n poly.setAttribute('stroke-linejoin', 'round');\n g.appendChild(poly);\n });\n const setSnapGlyph = (type: 'endpoint' | 'intersection' | 'line') => {\n snapGlyphEndpoint.style.display = type === 'endpoint' ? '' : 'none';\n snapGlyphIntersection.style.display = type === 'intersection' ? '' : 'none';\n snapGlyphLine.style.display = type === 'line' ? '' : 'none';\n };\n overlay.appendChild(snapEl);\n\n measureRef.current = {\n picks: [],\n rawSecondClick: null,\n overlay, svg, line: lineEl, fixedLine: fixedLineEl, fixedLabel: null, refLine: refLineEl,\n extLineA, extLineB,\n markers: [], label: null, snap: snapEl,\n segments: [],\n };\n\n // ── THREE — needed for projection math ────────────────────────\n let THREE: any = null;\n let ready = false;\n\n // Unproject canvas (CSS) px → scene coords (matches dxf-viewer's\n // private _CanvasToSceneCoord).\n const sceneFromPx = (cx: number, cy: number) => {\n if (!THREE) return null;\n const w = canvas.clientWidth, h = canvas.clientHeight;\n const v3 = new THREE.Vector3(cx * 2 / w - 1, -cy * 2 / h + 1, 1).unproject(camera);\n return { x: v3.x, y: v3.y };\n };\n // Project scene coords → canvas (CSS) px.\n const pxFromScene = (sx: number, sy: number) => {\n if (!THREE) return { x: 0, y: 0 };\n const v3 = new THREE.Vector3(sx, sy, 0).project(camera);\n const w = canvas.clientWidth, h = canvas.clientHeight;\n return { x: (v3.x + 1) / 2 * w, y: (-v3.y + 1) / 2 * h };\n };\n\n // Load THREE and build the snap-segment cache. dxf-viewer batches\n // its line entities into a small number of LineSegments objects;\n // we walk every one and collect the world-space endpoint pairs.\n (async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n THREE = await import(/* @vite-ignore */ 'three' as any);\n const segs = measureRef.current?.segments;\n if (!segs) return;\n const va = new THREE.Vector3(), vb = new THREE.Vector3();\n scene.traverse((obj: any) => {\n if (!obj?.isLineSegments) return;\n const pos = obj.geometry?.attributes?.position;\n if (!pos) return;\n const arr: ArrayLike<number> = pos.array;\n obj.updateMatrixWorld?.();\n const m = obj.matrixWorld;\n // LineSegments draws disjoint line pairs — vertices come in\n // adjacent pairs (a, b), (c, d), ...\n for (let i = 0; i < arr.length; i += 6) {\n va.set(arr[i], arr[i + 1], arr[i + 2]).applyMatrix4(m);\n vb.set(arr[i + 3], arr[i + 4], arr[i + 5]).applyMatrix4(m);\n segs.push({ ax: va.x, ay: va.y, bx: vb.x, by: vb.y });\n }\n });\n ready = true;\n } catch {}\n })();\n\n // ── Snap detection in screen space ────────────────────────────\n // Tolerance in CSS px from the cursor to a candidate snap target.\n // 18 px is wide enough to feel \"sticky\" without overlapping nearby\n // unrelated features on dense drawings.\n const SNAP_PX = 18;\n // Screen-space segment ↔ segment intersection. Operates directly on\n // the projected endpoints (which dxf-viewer's orthographic camera\n // turns into a linear scene→screen map), so the returned point is\n // already in pixel coords — no extra pxFromScene needed in the hot\n // pairwise loop. Returns the screen-space crossing AND the\n // parametric t along segment A, which we use to recover the\n // scene-space intersection by linear interp on A's scene endpoints.\n const segSegIntersectPx = (\n apx: number, apy: number, bpx: number, bpy: number,\n cpx: number, cpy: number, dpx: number, dpy: number,\n ) => {\n const d = (bpx - apx) * (dpy - cpy) - (bpy - apy) * (dpx - cpx);\n if (Math.abs(d) < 1e-9) return null;\n const t = ((cpx - apx) * (dpy - cpy) - (cpy - apy) * (dpx - cpx)) / d;\n const u = ((cpx - apx) * (bpy - apy) - (cpy - apy) * (bpx - apx)) / d;\n const eps = 1e-4;\n if (t < -eps || t > 1 + eps || u < -eps || u > 1 + eps) return null;\n return { px: apx + t * (bpx - apx), py: apy + t * (bpy - apy), t };\n };\n\n const findSnap = (cx: number, cy: number) => {\n const s = measureRef.current;\n if (!s || !ready) return null;\n let best: {\n sx: number; sy: number;\n type: 'endpoint' | 'line' | 'intersection';\n dir?: { dx: number; dy: number };\n } | null = null;\n let bestD2 = SNAP_PX * SNAP_PX;\n\n // Pass 1: endpoint + nearest-point-on-line per segment. While\n // walking, accumulate any segment whose nearest part falls inside\n // the snap-tolerance radius around the cursor — those are the\n // candidates for the pairwise intersection pass below. Storing the\n // projected endpoints (ap.x/y, bp.x/y) avoids re-running\n // pxFromScene per intersection candidate, which was the source of\n // the lag.\n //\n // The candidate radius is the snap tolerance itself (12 px), not a\n // larger value. Reasoning: if an intersection sits within SNAP_PX\n // of the cursor, both contributing segments necessarily pass\n // within SNAP_PX of the cursor too — so they will appear here.\n const candidateD2 = SNAP_PX * SNAP_PX;\n const cand: { seg: typeof s.segments[number]; apx: number; apy: number; bpx: number; bpy: number }[] = [];\n for (const seg of s.segments) {\n const ap = pxFromScene(seg.ax, seg.ay);\n const bp = pxFromScene(seg.bx, seg.by);\n const apx = ap.x, apy = ap.y, bpx = bp.x, bpy = bp.y;\n // Cheap reject: if BOTH endpoints are far outside cursor's snap\n // radius AND on the same side of the cursor along each axis,\n // the segment can't be near the cursor.\n const rejectX = (apx < cx - SNAP_PX && bpx < cx - SNAP_PX) || (apx > cx + SNAP_PX && bpx > cx + SNAP_PX);\n const rejectY = (apy < cy - SNAP_PX && bpy < cy - SNAP_PX) || (apy > cy + SNAP_PX && bpy > cy + SNAP_PX);\n if (rejectX || rejectY) continue;\n const ldx = seg.bx - seg.ax, ldy = seg.by - seg.ay;\n const llen = Math.sqrt(ldx * ldx + ldy * ldy) || 1;\n const segDir = { dx: ldx / llen, dy: ldy / llen };\n // Endpoint A\n let dx = cx - apx, dy = cy - apy;\n const dEpA2 = dx * dx + dy * dy;\n if (dEpA2 < bestD2) { best = { sx: seg.ax, sy: seg.ay, type: 'endpoint', dir: segDir }; bestD2 = dEpA2; }\n // Endpoint B\n dx = cx - bpx; dy = cy - bpy;\n const dEpB2 = dx * dx + dy * dy;\n if (dEpB2 < bestD2) { best = { sx: seg.bx, sy: seg.by, type: 'endpoint', dir: segDir }; bestD2 = dEpB2; }\n // Nearest point on segment (in screen space).\n const sdx = bpx - apx, sdy = bpy - apy;\n const len2 = sdx * sdx + sdy * sdy;\n let dLine2 = Infinity;\n if (len2 > 0) {\n const t = ((cx - apx) * sdx + (cy - apy) * sdy) / len2;\n if (t > 0 && t < 1) {\n const px = apx + t * sdx, py = apy + t * sdy;\n dx = cx - px; dy = cy - py;\n dLine2 = dx * dx + dy * dy;\n if (dLine2 < bestD2) {\n const sx = seg.ax + t * (seg.bx - seg.ax);\n const sy = seg.ay + t * (seg.by - seg.ay);\n best = { sx, sy, type: 'line', dir: segDir };\n bestD2 = dLine2;\n }\n }\n }\n if (dEpA2 < candidateD2 || dEpB2 < candidateD2 || dLine2 < candidateD2) {\n cand.push({ seg, apx, apy, bpx, bpy });\n }\n }\n\n // Pass 2: pairwise intersection among candidates. Both endpoints\n // and the intersection point are checked entirely in screen space\n // (no pxFromScene), so this is just a few multiplies and adds per\n // pair — fast even with a couple of dozen candidates.\n for (let i = 0; i < cand.length; i++) {\n const A = cand[i];\n for (let j = i + 1; j < cand.length; j++) {\n const B = cand[j];\n const ix = segSegIntersectPx(A.apx, A.apy, A.bpx, A.bpy, B.apx, B.apy, B.bpx, B.bpy);\n if (!ix) continue;\n const dx = cx - ix.px, dy = cy - ix.py;\n const d2 = dx * dx + dy * dy;\n if (d2 >= SNAP_PX * SNAP_PX) continue;\n // Override endpoint/line snaps unconditionally — intersection\n // takes priority. Among intersections, keep the closest.\n if (!best || best.type !== 'intersection' || d2 < bestD2) {\n // Recover scene-space intersection by linear interp on A's\n // scene endpoints (the projection is affine for ortho).\n const sx = A.seg.ax + ix.t * (A.seg.bx - A.seg.ax);\n const sy = A.seg.ay + ix.t * (A.seg.by - A.seg.ay);\n best = { sx, sy, type: 'intersection' };\n bestD2 = d2;\n }\n }\n }\n return best;\n };\n\n // ── Marker / label / line rendering (HTML/SVG, fixed-pixel) ──\n const makeMarker = (): HTMLDivElement => {\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;width:10px;height:10px;border-radius:50%;background:#ff8800;border:2px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,0.25);transform:translate(-50%,-50%);pointer-events:none;`;\n overlay.appendChild(el);\n return el;\n };\n const ensureLabel = () => {\n const s = measureRef.current!;\n if (s.label) return s.label;\n const el = document.createElement('div');\n // Park the label off-screen on creation so it never flashes at (0,0)\n // — callers always set left/top before showing it, but the browser\n // would otherwise lay it out at the overlay's top-left corner the\n // first frame after appendChild.\n el.style.cssText = `position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.95);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;`;\n overlay.appendChild(el);\n s.label = el;\n return el;\n };\n\n const positionMarker = (el: HTMLDivElement, x: number, y: number) => {\n const p = pxFromScene(x, y);\n el.style.left = `${p.x}px`;\n el.style.top = `${p.y}px`;\n };\n\n // Resolve picks[1] from the raw click + active fixedDist. In a\n // fixed-distance H/V scenario the X (or Y) is snapped to A's coord +\n // fixedDist, sign-matched to which side of A the user clicked, so\n // the marker visually sits at the *locked* position even though the\n // click landed elsewhere. Mutates s.picks[1] in place.\n const reconcileLockedPick = () => {\n const s = measureRef.current;\n if (!s || !s.rawSecondClick || s.picks.length < 2) return;\n const a = s.picks[0];\n const raw = s.rawSecondClick;\n const fixed = measureFixedDistRef.current;\n const mode = measureModeRef.current;\n if (fixed !== null && Number.isFinite(fixed) && (mode === 'horizontal' || mode === 'vertical')) {\n if (mode === 'horizontal') {\n const sign = raw.x >= a.x ? 1 : -1;\n s.picks[1] = { x: a.x + sign * Math.abs(fixed), y: raw.y };\n } else {\n const sign = raw.y >= a.y ? 1 : -1;\n s.picks[1] = { x: raw.x, y: a.y + sign * Math.abs(fixed) };\n }\n } else {\n s.picks[1] = { x: raw.x, y: raw.y };\n }\n };\n\n // Endpoints of the *main* dim line (always rendered when picks=2).\n // In fixed mode this is the leg from R to B (perpendicular to the\n // fixed axis). Without a fixed distance it's the regular H / V / Point\n // line.\n const computeMainDimEnds = () => {\n const s = measureRef.current!;\n const a = s.picks[0];\n const b = s.picks[1];\n const mode = measureModeRef.current;\n const fixed = measureFixedDistRef.current;\n if (fixed !== null && Number.isFinite(fixed) && mode === 'horizontal') {\n // Fixed H: main leg is vertical at b.x, from a.y to b.y.\n return { from: { x: b.x, y: a.y }, to: { x: b.x, y: b.y } };\n }\n if (fixed !== null && Number.isFinite(fixed) && mode === 'vertical') {\n // Fixed V: main leg is horizontal at b.y, from a.x to b.x.\n return { from: { x: a.x, y: b.y }, to: { x: b.x, y: b.y } };\n }\n if (mode === 'horizontal') return { from: a, to: { x: b.x, y: a.y } };\n if (mode === 'vertical') return { from: a, to: { x: a.x, y: b.y } };\n return { from: a, to: b };\n };\n\n const updateOverlay = () => {\n const s = measureRef.current;\n if (!s) return;\n reconcileLockedPick();\n const mode = measureModeRef.current;\n const fixed = measureFixedDistRef.current;\n const fixedActive = fixed !== null && Number.isFinite(fixed) && (mode === 'horizontal' || mode === 'vertical');\n // Markers\n if (s.markers[0]) positionMarker(s.markers[0], s.picks[0].x, s.picks[0].y);\n if (s.markers[1]) positionMarker(s.markers[1], s.picks[1].x, s.picks[1].y);\n // Reference-axis preview — dashed line across the canvas through\n // the first pick along the X or Y axis.\n const refDir = mode === 'horizontal'\n ? { dx: 1, dy: 0 }\n : mode === 'vertical'\n ? { dx: 0, dy: 1 }\n : null;\n if (refDir && s.picks.length >= 1 && s.refLine) {\n const a = s.picks[0];\n const w = canvas.clientWidth, h = canvas.clientHeight;\n const screenSpan = Math.hypot(w, h) * 4;\n const ap = pxFromScene(a.x, a.y);\n const probe = pxFromScene(a.x + refDir.dx, a.y + refDir.dy);\n const pxLen = Math.hypot(probe.x - ap.x, probe.y - ap.y) || 1;\n const sceneStep = screenSpan / pxLen;\n const x0 = a.x - refDir.dx * sceneStep;\n const y0 = a.y - refDir.dy * sceneStep;\n const x1 = a.x + refDir.dx * sceneStep;\n const y1 = a.y + refDir.dy * sceneStep;\n const p0 = pxFromScene(x0, y0);\n const p1 = pxFromScene(x1, y1);\n s.refLine.setAttribute('x1', String(p0.x));\n s.refLine.setAttribute('y1', String(p0.y));\n s.refLine.setAttribute('x2', String(p1.x));\n s.refLine.setAttribute('y2', String(p1.y));\n s.refLine.style.display = '';\n } else if (s.refLine) {\n s.refLine.style.display = 'none';\n }\n // Dim line + chain dim (if fixed) + extension lines + label\n if (s.picks.length === 2) {\n const a = s.picks[0], b = s.picks[1];\n const ends = computeMainDimEnds();\n const fp = pxFromScene(ends.from.x, ends.from.y);\n const tp = pxFromScene(ends.to.x, ends.to.y);\n s.line!.setAttribute('x1', String(fp.x));\n s.line!.setAttribute('y1', String(fp.y));\n s.line!.setAttribute('x2', String(tp.x));\n s.line!.setAttribute('y2', String(tp.y));\n s.line!.setAttribute('marker-start', 'url(#dxf-measure-arrow)');\n s.line!.setAttribute('marker-end', 'url(#dxf-measure-arrow)');\n // Hide the main dim line if it's degenerate (zero-length leg —\n // happens e.g. when picks are collinear in fixed-distance mode).\n const mainLen = Math.hypot(tp.x - fp.x, tp.y - fp.y);\n s.line!.style.display = mainLen > 0.5 ? '' : 'none';\n\n // Fixed-axis leg (A → R) — only in fixed mode.\n if (fixedActive && s.fixedLine) {\n const r = mode === 'horizontal' ? { x: b.x, y: a.y } : { x: a.x, y: b.y };\n const ap = pxFromScene(a.x, a.y);\n const rp = pxFromScene(r.x, r.y);\n s.fixedLine.setAttribute('x1', String(ap.x));\n s.fixedLine.setAttribute('y1', String(ap.y));\n s.fixedLine.setAttribute('x2', String(rp.x));\n s.fixedLine.setAttribute('y2', String(rp.y));\n s.fixedLine.setAttribute('marker-start', 'url(#dxf-measure-arrow)');\n s.fixedLine.setAttribute('marker-end', 'url(#dxf-measure-arrow)');\n s.fixedLine.style.display = '';\n // Fixed-leg label — show the user's entered fixed value.\n const fLabel = ensureFixedLabel();\n fLabel.textContent = formatMeasureDistance(Math.abs(fixed));\n const fcx = (ap.x + rp.x) / 2;\n const fcy = (ap.y + rp.y) / 2;\n fLabel.style.left = `${fcx}px`;\n fLabel.style.top = `${fcy}px`;\n const w = canvas.clientWidth, h = canvas.clientHeight;\n fLabel.style.display = (fcx < 0 || fcy < 0 || fcx > w || fcy > h) ? 'none' : '';\n } else {\n if (s.fixedLine) s.fixedLine.style.display = 'none';\n if (s.fixedLabel) s.fixedLabel.style.display = 'none';\n }\n\n // Extension line — drops from second pick to the dim line in\n // free H/V (non-fixed) mode. In fixed mode the chain dim already\n // visually closes the loop, so no extension is needed.\n const extA = s.extLineA!;\n const extB = s.extLineB!;\n if (!fixedActive && mode === 'horizontal' && Math.abs(b.y - a.y) > 1e-9) {\n const p = pxFromScene(b.x, a.y);\n const q = pxFromScene(b.x, b.y);\n extB.setAttribute('x1', String(p.x));\n extB.setAttribute('y1', String(p.y));\n extB.setAttribute('x2', String(q.x));\n extB.setAttribute('y2', String(q.y));\n extB.style.display = '';\n extA.style.display = 'none';\n } else if (!fixedActive && mode === 'vertical' && Math.abs(b.x - a.x) > 1e-9) {\n const p = pxFromScene(a.x, b.y);\n const q = pxFromScene(b.x, b.y);\n extB.setAttribute('x1', String(p.x));\n extB.setAttribute('y1', String(p.y));\n extB.setAttribute('x2', String(q.x));\n extB.setAttribute('y2', String(q.y));\n extB.style.display = '';\n extA.style.display = 'none';\n } else {\n extA.style.display = 'none';\n extB.style.display = 'none';\n }\n // Main-leg label — at the midpoint of the main dim line.\n if (s.label) {\n const cx = (fp.x + tp.x) / 2;\n const cy = (fp.y + tp.y) / 2;\n s.label.style.left = `${cx}px`;\n s.label.style.top = `${cy}px`;\n const w = canvas.clientWidth, h = canvas.clientHeight;\n s.label.style.display = (cx < 0 || cy < 0 || cx > w || cy > h) ? 'none' : '';\n // Hide the main label too when the leg is degenerate (no\n // perpendicular distance to display, so nothing meaningful).\n if (mainLen <= 0.5) s.label.style.display = 'none';\n }\n } else {\n s.line!.style.display = 'none';\n if (s.fixedLine) s.fixedLine.style.display = 'none';\n if (s.fixedLabel) s.fixedLabel.style.display = 'none';\n if (s.extLineA) s.extLineA.style.display = 'none';\n if (s.extLineB) s.extLineB.style.display = 'none';\n }\n };\n\n const ensureFixedLabel = () => {\n const s = measureRef.current!;\n if (s.fixedLabel) return s.fixedLabel;\n const el = document.createElement('div');\n el.style.cssText = `position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.75);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;`;\n overlay.appendChild(el);\n s.fixedLabel = el;\n return el;\n };\n\n // ── Click-vs-drag + snap on hover ─────────────────────────────\n const DRAG_TOL = 4;\n const DRAG_TIME = 350;\n let downX = 0, downY = 0, downTime = 0, downActive = false, dragging = false;\n let lastSnap: ReturnType<typeof findSnap> = null;\n\n const handlePointerDown = (ev: any) => {\n const d = ev?.detail;\n if (!d || d.domEvent?.button !== 0) return;\n downX = d.canvasCoord.x;\n downY = d.canvasCoord.y;\n downTime = performance.now();\n dragging = false;\n downActive = true;\n };\n\n const handlePointerMove = (ev: PointerEvent) => {\n const rect = canvas.getBoundingClientRect();\n const cx = ev.clientX - rect.left;\n const cy = ev.clientY - rect.top;\n // Drag detection (only matters when a button is down).\n if (downActive) {\n if ((cx - downX) ** 2 + (cy - downY) ** 2 > DRAG_TOL * DRAG_TOL) dragging = true;\n }\n // Snap indicator update — only when the user isn't actively\n // dragging (avoid flicker mid-pan).\n const s = measureRef.current;\n if (!s || !s.snap) return;\n if (downActive && dragging) {\n s.snap.style.display = 'none';\n return;\n }\n lastSnap = findSnap(cx, cy);\n if (lastSnap) {\n const p = pxFromScene(lastSnap.sx, lastSnap.sy);\n s.snap.style.left = `${p.x}px`;\n s.snap.style.top = `${p.y}px`;\n s.snap.style.display = '';\n setSnapGlyph(lastSnap.type);\n } else {\n s.snap.style.display = 'none';\n }\n };\n\n const handlePointerUp = (ev: any) => {\n if (!downActive) return;\n downActive = false;\n const elapsed = performance.now() - downTime;\n if (dragging || elapsed > DRAG_TIME) return;\n // Use the snapped position if we have one, otherwise the raw\n // pointer position from dxf-viewer's event.\n const raw = ev?.detail?.position;\n if (!raw) return;\n // Prefer the snapped position when one is available, otherwise the\n // raw pointer position from dxf-viewer's event.\n const picked = lastSnap\n ? { x: lastSnap.sx, y: lastSnap.sy }\n : { x: raw.x, y: raw.y };\n doPick(picked);\n };\n\n // Recompute the distance label from the current picks + active mode.\n // In fixed-distance mode the reported value is the *perpendicular*\n // component (Δy for H, Δx for V) — the fixed value itself shows on\n // the other dim leg's label.\n const recomputeLabel = () => {\n const s = measureRef.current;\n if (!s || s.picks.length !== 2) return;\n reconcileLockedPick();\n const a = s.picks[0], b = s.picks[1];\n const mode = measureModeRef.current;\n const fixed = measureFixedDistRef.current;\n const fixedActive = fixed !== null && Number.isFinite(fixed) && (mode === 'horizontal' || mode === 'vertical');\n let dist: number;\n let suffix = '';\n if (fixedActive && mode === 'horizontal') {\n dist = Math.abs(b.y - a.y);\n suffix = ' ↕';\n } else if (fixedActive && mode === 'vertical') {\n dist = Math.abs(b.x - a.x);\n suffix = ' ↔';\n } else if (mode === 'horizontal') {\n dist = Math.abs(b.x - a.x);\n suffix = ' ↔';\n } else if (mode === 'vertical') {\n dist = Math.abs(b.y - a.y);\n suffix = ' ↕';\n } else {\n const dx = b.x - a.x, dy = b.y - a.y;\n dist = Math.sqrt(dx * dx + dy * dy);\n }\n setMeasureDistance(dist);\n const label = ensureLabel();\n label.style.opacity = '1';\n label.textContent = `${formatMeasureDistance(dist)}${suffix}`;\n };\n\n // Expose for the mode / fixed-distance change effect — calling this\n // redraws the overlay using whatever the refs currently hold.\n measureRedrawRef.current = () => {\n recomputeLabel();\n updateOverlay();\n };\n\n const doPick = (p: { x: number; y: number }) => {\n const s = measureRef.current;\n if (!s) return;\n\n // Third click → start fresh.\n if (s.picks.length === 2) {\n for (const m of s.markers) m.parentElement?.removeChild(m);\n s.markers = [];\n s.picks = [];\n s.rawSecondClick = null;\n s.line!.style.display = 'none';\n if (s.fixedLine) s.fixedLine.style.display = 'none';\n if (s.fixedLabel) s.fixedLabel.style.display = 'none';\n if (s.refLine) s.refLine.style.display = 'none';\n if (s.extLineA) s.extLineA.style.display = 'none';\n if (s.extLineB) s.extLineB.style.display = 'none';\n if (s.label) s.label.style.opacity = '0';\n setMeasureDistance(null);\n }\n\n if (s.picks.length === 0) {\n s.picks.push({ x: p.x, y: p.y });\n s.markers.push(makeMarker());\n } else {\n // Second pick — remember the raw click so we can re-lock if the\n // user later edits the fixed-distance input; reconcileLockedPick\n // (called by recomputeLabel / updateOverlay) writes the effective\n // position into picks[1].\n s.rawSecondClick = { x: p.x, y: p.y };\n s.picks.push({ x: p.x, y: p.y });\n s.markers.push(makeMarker());\n recomputeLabel();\n }\n updateOverlay();\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') setMeasureEnabled(false);\n };\n\n // ── Wire it up ────────────────────────────────────────────────\n canvas.style.cursor = 'crosshair';\n try { v.Subscribe?.('pointerdown', handlePointerDown); } catch {}\n try { v.Subscribe?.('pointerup', handlePointerUp); } catch {}\n try { v.Subscribe?.('viewChanged', updateOverlay); } catch {}\n canvas.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('keydown', onKeyDown);\n\n return () => {\n canvas.style.cursor = '';\n try { v.Unsubscribe?.('pointerdown', handlePointerDown); } catch {}\n try { v.Unsubscribe?.('pointerup', handlePointerUp); } catch {}\n try { v.Unsubscribe?.('viewChanged', updateOverlay); } catch {}\n canvas.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('keydown', onKeyDown);\n measureRedrawRef.current = null;\n teardown();\n setMeasureDistance(null);\n };\n // NOTE: measureMode / measureFixedDist intentionally *not* in deps —\n // switching mode or editing the fixed distance preserves picks and\n // just triggers a redraw via the separate effect below.\n }, [measureEnabled, loading, error]);\n\n // Redraw the measurement overlay when mode or fixed-distance changes,\n // using the picks that are already in measureRef. The main measure\n // effect exposes `measureRedrawRef.current` for this.\n useEffect(() => {\n measureRedrawRef.current?.();\n }, [measureMode, measureFixedDist]);\n\n const toggleLayer = (name: string) => {\n setLayers(prev => prev.map(l => {\n if (l.name !== name) return l;\n const next = !l.visible;\n try { viewerRef.current?.ShowLayer?.(name, next); } catch {}\n return { ...l, visible: next };\n }));\n };\n\n const setAllLayers = (visible: boolean) => {\n setLayers(prev => prev.map(l => {\n if (l.visible === visible) return l;\n try { viewerRef.current?.ShowLayer?.(l.name, visible); } catch {}\n return { ...l, visible };\n }));\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const handleResetView = () => {\n try {\n const v = viewerRef.current;\n const bounds = v?.GetBounds?.();\n const origin = v?.GetOrigin?.();\n if (bounds && origin) {\n v.FitView(\n bounds.minX - origin.x, bounds.maxX - origin.x,\n bounds.minY - origin.y, bounds.maxY - origin.y,\n );\n } else {\n v?.FitView?.();\n }\n v?.Render?.();\n } catch {}\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n const colorHex = (n?: number) => {\n if (typeof n !== 'number') return '#999';\n return '#' + n.toString(16).padStart(6, '0');\n };\n\n return (\n <div className=\"flex flex-col h-full\">\n <PanelActions>\n <button\n onClick={() => setShowLayers(s => !s)}\n className={btn + (showLayers ? ' bg-gray-200' : '')}\n title=\"Toggle layer visibility\"\n disabled={layers.length === 0}\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.429 9.75L2.25 12l4.179 2.25m0-4.5l5.571 3 5.571-3m-11.142 0L2.25 7.5 12 2.25l9.75 5.25-4.179 2.25m0 0L21.75 12l-4.179 2.25m0 0l4.179 2.25L12 21.75 2.25 16.5l4.179-2.25m11.142 0l-5.571 3-5.571-3\" /></svg>\n Layers {layers.length > 0 && <span className=\"text-gray-400\">({layers.filter(l => l.visible).length}/{layers.length})</span>}\n </button>\n <button onClick={() => setShowHint(s => !s)} className={btn} title=\"How to navigate\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" /></svg>\n </button>\n <button\n onClick={() => setMeasureEnabled(m => !m)}\n className={btn + (measureEnabled ? ' bg-gray-200' : '')}\n title={measureEnabled ? 'Stop measuring (Esc)' : 'Measure distance — click two points on the drawing'}\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 14.25l6-6 6 6 4.5-4.5M9.75 8.25v3M12.75 11.25v3M15.75 14.25v3\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 18.75h19.5\" />\n </svg>\n Measure\n </button>\n {measureEnabled && (\n <>\n <div className=\"flex items-stretch h-7 rounded border border-gray-200 overflow-hidden text-[11px] font-semibold\">\n <button\n onClick={() => setMeasureMode('point')}\n className={`px-2 transition-colors ${measureMode === 'point' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Point — straight-line (Euclidean) distance between two picks\"\n >\n Point\n </button>\n <button\n onClick={() => setMeasureMode('horizontal')}\n className={`px-2 transition-colors ${measureMode === 'horizontal' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Horizontal — distance along the X axis between two picks (AutoCAD DIMLINEAR horizontal)\"\n >\n H\n </button>\n <button\n onClick={() => setMeasureMode('vertical')}\n className={`px-2 transition-colors ${measureMode === 'vertical' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Vertical — distance along the Y axis between two picks (AutoCAD DIMLINEAR vertical)\"\n >\n V\n </button>\n </div>\n {/* Fixed-distance input — locks the second pick's axis-aligned\n coord to (first pick's coord ± entered value). The\n displayed measurement becomes the perpendicular distance.\n Only useful in H or V mode. Sign of the offset follows\n whichever side of the first pick the user clicks on. */}\n {(measureMode === 'horizontal' || measureMode === 'vertical') && (\n <div className=\"flex items-center gap-1\">\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step=\"any\"\n value={measureFixedInput}\n placeholder={measureMode === 'horizontal' ? 'fix Δx' : 'fix Δy'}\n onChange={(e) => {\n const raw = e.target.value;\n setMeasureFixedInput(raw);\n if (raw.trim() === '') setMeasureFixedDist(null);\n else {\n const n = parseFloat(raw);\n setMeasureFixedDist(Number.isFinite(n) && n !== 0 ? n : null);\n }\n }}\n className=\"h-7 w-20 px-1.5 text-[11px] font-mono rounded border border-gray-200 bg-white text-gray-700 focus:outline-none focus:border-orange-400\"\n title=\"Lock the second pick's axis coord to first pick + this value (mm). The reported measurement becomes the perpendicular distance.\"\n />\n {measureFixedDist !== null && (\n <button\n onClick={() => { setMeasureFixedDist(null); setMeasureFixedInput(''); }}\n className=\"text-gray-400 hover:text-gray-600 text-[11px] px-1\"\n title=\"Clear fixed distance\"\n >\n ×\n </button>\n )}\n </div>\n )}\n </>\n )}\n {measureEnabled && measureDistance !== null && (\n <div\n className=\"px-2 py-1 text-[11px] font-mono font-semibold text-orange-600 bg-orange-50 border border-orange-200 rounded whitespace-nowrap\"\n title={\n measureMode === 'horizontal' ? 'Horizontal distance (Δx) between the two picked points'\n : measureMode === 'vertical' ? 'Vertical distance (Δy) between the two picked points'\n : 'Straight-line distance between the two picked points'\n }\n >\n {formatMeasureDistance(measureDistance)}\n {measureMode === 'horizontal' ? ' ↔'\n : measureMode === 'vertical' ? ' ↕'\n : ''}\n </div>\n )}\n <button onClick={handleResetView} className={btn} title=\"Fit drawing to view\">Fit</button>\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </PanelActions>\n <div className=\"relative flex-1 bg-white min-h-0\">\n {/* dxf-viewer overrides container's `position` to `relative` in its\n * constructor, which kills any `inset: 0` sizing. Use explicit\n * width/height: 100% so the container always fills its flex parent. */}\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {showLayers && layers.length > 0 && (\n <div className=\"absolute top-2 right-2 w-64 max-h-[70%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Layers</span>\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setAllLayers(true)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">All</button>\n <button onClick={() => setAllLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\">None</button>\n <button onClick={() => setShowLayers(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n </div>\n <div className=\"overflow-y-auto py-1\">\n {layers.map(l => (\n <label key={l.name} className=\"flex items-center gap-2 px-2 py-1 hover:bg-gray-100 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={l.visible}\n onChange={() => toggleLayer(l.name)}\n className=\"h-3.5 w-3.5\"\n />\n <span\n className=\"inline-block h-3 w-3 rounded-sm border border-gray-300 shrink-0\"\n style={{ background: colorHex(l.color) }}\n />\n <span className=\"truncate text-gray-700\" title={l.displayName}>{l.displayName || l.name}</span>\n </label>\n ))}\n </div>\n </div>\n )}\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122\" /></svg>\n Drag to pan\n </span>\n <span className=\"text-white/40\">•</span>\n <span className=\"flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6\" /></svg>\n Scroll to zoom\n </span>\n <span className=\"text-white/40\">•</span>\n <span>Fit to reset</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/80 text-sm text-gray-500\">Loading drawing…</div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center\">{error}</div>\n )}\n </div>\n </div>\n );\n}\n\ninterface StepPanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\n// online-3d-viewer expects an \"external libs\" base URL where it can find the\n// occt-import-js WASM (for STEP/IGES) plus draco/rhino3dm/web-ifc decoders.\n// jsdelivr mirrors the npm package at this path; consumers can override via\n// `window.__REACT_OS_SHELL_O3DV_LIBS__` to self-host (e.g. air-gapped).\nconst DEFAULT_O3DV_LIBS = 'https://cdn.jsdelivr.net/npm/online-3d-viewer@0.18.0/libs/';\n\ninterface TreeNode {\n id: number;\n name: string;\n isMeshNode: boolean;\n meshIndices: number[];\n children: TreeNode[];\n}\n\nfunction buildTree(node: any, depth = 0): TreeNode {\n return {\n id: node.GetId?.() ?? 0,\n name: node.GetName?.() || (depth === 0 ? 'Root' : 'Node'),\n isMeshNode: !!node.IsMeshNode?.(),\n meshIndices: node.GetMeshIndices?.() ?? [],\n children: (node.GetChildNodes?.() ?? []).map((c: any) => buildTree(c, depth + 1)),\n };\n}\n\n// Collect every nodeId in the subtree rooted at `node` (inclusive).\nfunction collectNodeIds(node: TreeNode, out: Set<number>) {\n out.add(node.id);\n for (const c of node.children) collectNodeIds(c, out);\n}\n\n// Hex string (\"#rrggbb\") → RGBColor instance.\nfunction hexToRgb(OV: any, hex: string) {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex);\n const n = m ? parseInt(m[1], 16) : 0;\n return new OV.RGBColor((n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff);\n}\nfunction rgbToHex(c: { r?: number; g?: number; b?: number }) {\n const r = (c.r ?? 0) | 0, g = (c.g ?? 0) | 0, b = (c.b ?? 0) | 0;\n return '#' + [r, g, b].map(v => v.toString(16).padStart(2, '0')).join('');\n}\n\n/** Format a 3D-space distance for the measurement label. STEP files are\n * conventionally in millimetres, so we surface mm with a sensible\n * precision and switch to metres for >= 1000 mm. */\nfunction formatMeasureDistance(mm: number): string {\n if (mm >= 1000) return `${(mm / 1000).toFixed(2)} m`;\n if (mm >= 10) return `${mm.toFixed(1)} mm`;\n return `${mm.toFixed(2)} mm`;\n}\n\nfunction StepPanel({ url, filename, onDownload, onEmail }: StepPanelProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<any>(null);\n const ovRef = useRef<any>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [showHint, setShowHint] = useState(true);\n\n // Mesh tree + per-node visibility (true = visible).\n const [tree, setTree] = useState<TreeNode | null>(null);\n const [expanded, setExpanded] = useState<Record<number, boolean>>({});\n const [hidden, setHidden] = useState<Set<number>>(new Set());\n\n // Right-panel display settings.\n const [bgColor, setBgColor] = useState('#f5f6f8');\n const [showEdges, setShowEdges] = useState(true);\n const [edgeColor, setEdgeColor] = useState('#000000');\n const [edgeThreshold, setEdgeThreshold] = useState(1);\n\n // Floating panel visibility — default closed so the viewport is unobstructed.\n const [showMeshes, setShowMeshes] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n // Camera projection — orthographic by default. CAD users expect ortho\n // when first opening a STEP file; perspective is one click away via\n // the toolbar toggle.\n const [perspective, setPerspective] = useState(false);\n\n // Section view (capped clipping plane).\n const [sectionEnabled, setSectionEnabled] = useState(false);\n const [sectionAxis, setSectionAxis] = useState<'x' | 'y' | 'z'>('x');\n const [sectionFlip, setSectionFlip] = useState(false);\n const [sectionPosition, setSectionPosition] = useState(0.5); // 0–1 within bbox\n const [sectionAngle, setSectionAngle] = useState(0); // degrees, 0–180 — rotates the cut plane around a perpendicular axis\n\n // Measurement tool — point picker. Two modes:\n // - 'point': click two points on the model → straight-line distance.\n // - 'perp': click two surfaces → perpendicular gap between the two\n // face planes (the typical CAD \"wall thickness\" measurement).\n // Clicked points + visual artefacts (markers, line, label) live in the\n // ref so the user can orbit the camera between picks without losing\n // anything.\n const [measureEnabled, setMeasureEnabled] = useState(false);\n const [measureMode, setMeasureMode] = useState<'point' | 'perp'>('point');\n const [measureDistance, setMeasureDistance] = useState<number | null>(null);\n const measureRef = useRef<{\n points: any[]; // THREE.Vector3[] — at most 2\n normals: ({ x: number; y: number; z: number } | null)[]; // surface normal at each pick (null if pick missed a face)\n markers: any[]; // small spheres at each point\n line: any | null; // line connecting them\n label: HTMLDivElement | null;\n rafId: number | null; // requestAnimationFrame for label-follows-camera\n } | null>(null);\n\n // Persistent section state — stencil helpers, cap mesh, original material\n // settings — held in a ref so we can mutate the plane in place on slider\n // tick instead of rebuilding every helper mesh.\n const sectionRef = useRef<{\n plane: any;\n capMesh: any;\n helpers: any[];\n materialState: Map<any, { clippingPlanes: any; clipShadows: any }>;\n bbox: any;\n } | null>(null);\n\n // Load model.\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n let resizeObserver: ResizeObserver | null = null;\n setLoading(true);\n setError(null);\n setTree(null);\n setExpanded({});\n setHidden(new Set());\n\n (async () => {\n let OV: any;\n try {\n OV = await import('online-3d-viewer');\n } catch {\n if (!cancelled) {\n setError('online-3d-viewer is not installed in this app. Add it to enable 3D file viewing.');\n setLoading(false);\n }\n return;\n }\n ovRef.current = OV;\n if (cancelled || !containerRef.current) return;\n\n // Wait for container to have a real layout before constructing the\n // viewer — same dance as the DXF panel.\n await new Promise<void>(resolve => {\n const tryStart = () => {\n const r = containerRef.current?.getBoundingClientRect();\n if (r && r.width > 4 && r.height > 4) resolve();\n else requestAnimationFrame(tryStart);\n };\n tryStart();\n });\n if (cancelled || !containerRef.current) return;\n\n try {\n const libsBase = (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_O3DV_LIBS__)\n || DEFAULT_O3DV_LIBS;\n OV.SetExternalLibLocation?.(libsBase);\n\n // Must run before EmbeddedViewer creates its canvas so the WebGL\n // context is granted a stencil buffer (needed by the section\n // view's capping technique).\n ensureStencilContextAttribute();\n\n viewer = new OV.EmbeddedViewer(containerRef.current, {\n backgroundColor: new OV.RGBAColor(245, 246, 248, 255),\n defaultColor: new OV.RGBColor(180, 188, 200),\n edgeSettings: new OV.EdgeSettings(true, new OV.RGBColor(0, 0, 0), 1),\n onModelLoaded: () => {\n if (cancelled) return;\n try {\n const model = viewer.GetModel?.();\n const root = model?.GetRootNode?.();\n if (root) {\n const t = buildTree(root);\n setTree(t);\n // Expand top two levels by default.\n const expandIds: Record<number, boolean> = { [t.id]: true };\n for (const c of t.children) expandIds[c.id] = true;\n setExpanded(expandIds);\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] mesh tree extraction failed', err);\n }\n setLoading(false);\n },\n onModelLoadFailed: () => {\n if (!cancelled) {\n setError('Failed to load 3D model.');\n setLoading(false);\n }\n },\n });\n viewerRef.current = viewer;\n\n const inputFile = new OV.InputFile(filename, OV.FileSource.Url, url);\n viewer.LoadModelFromInputFiles([inputFile]);\n\n // Re-size the WebGL canvas whenever the container's box changes —\n // window resize, Modal drag-resize, taskbar repositioning, etc.\n // The OV EmbeddedViewer ships its own `Resize()` that auto-detects\n // the container size; we feature-detect the underlying inner\n // viewer too in case OV's wrapper API changes.\n if (containerRef.current && typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => {\n try {\n const v = viewerRef.current as any;\n if (v?.Resize) v.Resize();\n else if (v?.viewer?.Resize) v.viewer.Resize();\n v?.viewer?.Render?.();\n } catch {}\n });\n resizeObserver.observe(containerRef.current);\n }\n } catch (e: any) {\n if (!cancelled) {\n setError(e?.message || 'Failed to load 3D model.');\n setLoading(false);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n try { resizeObserver?.disconnect(); } catch {}\n try { viewer?.Destroy?.(); } catch {}\n viewerRef.current = null;\n };\n }, [url, filename]);\n\n // Apply per-node visibility by walking the THREE scene's mesh userData. The\n // engine's public `SetMeshesVisibility` is global-only, so we go one level\n // deeper to flip individual `mesh.visible` flags.\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer) return;\n try {\n const visit = (mesh: any) => {\n if (mesh.userData?.__sectionHelper) return;\n const ud = mesh.userData?.originalMeshInstance ?? mesh.userData;\n const nodeId: number | undefined = ud?.id?.nodeId ?? ud?.nodeId;\n if (typeof nodeId === 'number') {\n mesh.visible = !hidden.has(nodeId);\n }\n };\n v.viewer.mainModel?.EnumerateMeshesAndLines?.(visit);\n v.viewer.mainModel?.EnumerateEdges?.(visit);\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] visibility update failed', err);\n }\n }, [hidden, tree]);\n\n // Apply edge settings.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n v.viewer.SetEdgeSettings(new OV.EdgeSettings(showEdges, hexToRgb(OV, edgeColor), edgeThreshold));\n\n // OV's GenerateEdgeModel walks every mesh in mainModel — including\n // the stencil helpers we add as children of the originals when\n // section view is on. That produces duplicate edge LineSegments\n // (one per helper, on top of the originals) and the new\n // LineBasicMaterials don't carry our clipping plane, so the edges\n // render past the cut. Strip the helper-derived edges and reapply\n // clipping to what's left.\n const s = sectionRef.current;\n if (s) {\n const helperEdges: any[] = [];\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n if (edge.userData?.__sectionHelper) helperEdges.push(edge);\n });\n for (const e of helperEdges) {\n e.parent?.remove(e);\n e.geometry?.dispose?.();\n e.material?.dispose?.();\n }\n const plane = s.plane;\n const applyMatClip = (mat: any) => {\n if (!mat || s.materialState.has(mat)) return;\n s.materialState.set(mat, { clippingPlanes: mat.clippingPlanes, clipShadows: mat.clipShadows });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n const mat = edge.material;\n if (Array.isArray(mat)) for (const m of mat) applyMatClip(m);\n else applyMatClip(mat);\n });\n }\n\n v.viewer.Render?.();\n } catch {}\n }, [showEdges, edgeColor, edgeThreshold]);\n\n // Apply background color.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const c = hexToRgb(OV, bgColor);\n v.viewer.SetBackgroundColor(new OV.RGBAColor(c.r, c.g, c.b, 255));\n v.viewer.Render?.();\n } catch {}\n }, [bgColor]);\n\n // Section view — set / tear down on enable.\n //\n // Capped clipping using the standard three.js stencil technique. The\n // tricky bit is that we can't `import('three')` — it resolves to a\n // different three instance than the one online-3d-viewer bundles\n // (transitive duplicate), which breaks instanceof checks against the\n // renderer's THREE. Workaround: pluck constructors (Mesh, BufferGeometry,\n // BufferAttribute, MeshPhongMaterial) from a sample mesh in the loaded\n // scene — those are guaranteed to be from the renderer's THREE. The\n // stencil/side constants are universal numeric values, so we hardcode\n // them. The plane itself stays duck-typed — three's WebGLClipping just\n // calls `.copy()` on it (reads .normal.x/y/z and .constant).\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading) return;\n\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n if (!renderer || !scene) return;\n\n // Tear down any previous state.\n if (sectionRef.current) {\n const s = sectionRef.current;\n for (const [mat, prev] of s.materialState.entries()) {\n mat.clippingPlanes = prev.clippingPlanes;\n mat.clipShadows = prev.clipShadows;\n mat.needsUpdate = true;\n }\n for (const helper of s.helpers) {\n helper.parent?.remove(helper);\n // Don't dispose helper.geometry — it's shared with the original mesh.\n helper.material?.dispose?.();\n }\n if (s.capMesh) {\n scene.remove(s.capMesh);\n s.capMesh.geometry?.dispose?.();\n s.capMesh.material?.dispose?.();\n }\n sectionRef.current = null;\n }\n\n if (!sectionEnabled) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n const bbox = v.viewer.GetBoundingBox?.(() => true);\n if (!bbox) return;\n\n // Snapshot the mesh list — never traverse-and-mutate.\n const targets: any[] = [];\n v.viewer.mainModel?.EnumerateMeshes?.((mesh: any) => {\n if (!mesh.userData?.__sectionHelper) targets.push(mesh);\n });\n if (!targets.length) {\n renderer.localClippingEnabled = false;\n v.viewer.Render?.();\n return;\n }\n\n // Pluck THREE constructors from a sample mesh (these come from the\n // renderer's THREE, so the renderer recognizes the resulting objects).\n const sample = targets[0];\n const Mesh = sample.constructor;\n const Material = sample.material?.constructor; // MeshPhongMaterial\n const Geometry = sample.geometry?.constructor;\n const BufferAttr = sample.geometry?.attributes?.position?.constructor;\n if (!Mesh || !Material || !Geometry || !BufferAttr) {\n // Fallback to plain clipping if we can't pluck constructors.\n // eslint-disable-next-line no-console\n console.warn('[Preview] section: missing THREE constructors, falling back to no cap');\n }\n\n // Universal three.js / WebGL constants.\n const FrontSide = 0, BackSide = 1, DoubleSide = 2;\n const AlwaysStencilFunc = 519, NotEqualStencilFunc = 517;\n const IncrementWrapStencilOp = 7682, DecrementWrapStencilOp = 7683;\n const ReplaceStencilOp = 7681;\n\n // Verify the WebGL context actually has a stencil buffer — without one\n // every stencil op is a no-op, the cap stays at ref 0 forever, and the\n // cut reads as a hollow shell. If we can't get one, log and skip the\n // cap (clipping still works, just without fill).\n let hasStencil = true;\n try {\n const gl = renderer.getContext?.();\n const attrs = gl?.getContextAttributes?.();\n hasStencil = attrs?.stencil !== false;\n // Force the renderer to clear stencil between frames; without this\n // the helper writes accumulate (or never start at 0) and the cap\n // mask drifts.\n renderer.autoClearStencil = true;\n // eslint-disable-next-line no-console\n console.info('[Preview] section: stencil buffer =', hasStencil, 'targets =', targets.length);\n } catch {}\n\n // Enable local clipping BEFORE we modify material clippingPlanes so the\n // shaders pick up the clipping path on first compile. Setting this\n // afterwards still works (with material.needsUpdate), but doing it\n // early avoids one wasted recompile and is closer to three.js's\n // documented usage pattern.\n renderer.localClippingEnabled = true;\n\n // Duck-typed plane. three.js's WebGLClipping calls `_plane.copy(this)`\n // — that just reads `.normal.x/y/z` and `.constant`, so a plain object\n // works. BUT `Material.copy()` deep-clones a source material's\n // clippingPlanes via `srcPlanes[i].clone()`, so our plane needs a\n // `.clone()` method or material cloning crashes with\n // `t[s].clone is not a function`. The clone returned here is a fresh\n // object with the same shape (so a clone-of-the-clone also works);\n // we always overwrite the cloned material's clippingPlanes back to\n // the shared plane reference afterwards, so this isn't load-bearing\n // for the actual rendering — it just has to not throw.\n const plane: any = {\n normal: { x: 0, y: 0, z: -1 },\n constant: 0,\n };\n plane.clone = function planeClone(this: any) {\n const c: any = {\n normal: { x: this.normal.x, y: this.normal.y, z: this.normal.z },\n constant: this.constant,\n };\n c.clone = planeClone;\n return c;\n };\n const helpers: any[] = [];\n const materialState = new Map<any, { clippingPlanes: any; clipShadows: any }>();\n\n const applyToMaterial = (mat: any) => {\n if (!mat || materialState.has(mat)) return;\n materialState.set(mat, { clippingPlanes: mat.clippingPlanes, clipShadows: mat.clipShadows });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n\n for (const mesh of targets) {\n const mat = mesh.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n\n // Stencil-only helpers per mesh: back-faces increment the stencil,\n // front-faces decrement. Where the running count is non-zero on the\n // cap plane, we're inside the solid → cap renders.\n //\n // We clone the source material rather than `new Material()` so the\n // shader compiles with the same uniform/attribute setup as the\n // existing scene (avoids subtle \"shader fails silently\" cases).\n const sourceMat = Array.isArray(mat) ? mat[0] : mat;\n if (Mesh && hasStencil && sourceMat?.clone) {\n const makeStencil = (side: number, op: number) => {\n const m: any = sourceMat.clone();\n m.depthWrite = false;\n m.depthTest = false;\n m.colorWrite = false;\n m.stencilWrite = true;\n m.stencilFunc = AlwaysStencilFunc;\n m.stencilFail = op;\n m.stencilZFail = op;\n m.stencilZPass = op;\n m.side = side;\n m.transparent = false;\n m.clippingPlanes = [plane];\n m.clipShadows = true;\n m.needsUpdate = true;\n const helper = new Mesh(mesh.geometry, m);\n helper.matrixAutoUpdate = false;\n helper.renderOrder = 1;\n helper.userData.__sectionHelper = true;\n mesh.add(helper);\n helpers.push(helper);\n };\n makeStencil(BackSide, IncrementWrapStencilOp);\n makeStencil(FrontSide, DecrementWrapStencilOp);\n }\n }\n\n // Edges — clip them too so the cut isn't framed by a stale outline.\n v.viewer.mainModel?.EnumerateEdges?.((edge: any) => {\n const mat = edge.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n });\n\n // Cap quad — sized to the bbox diagonal × 2 so it always covers the cut,\n // built as a manual BufferGeometry quad (4 verts, 2 tris). We clone\n // the source material (same shader as the rest of the scene) instead\n // of `new Material()` so the cap actually receives lighting consistent\n // with the model.\n let capMesh: any = null;\n const sourceMat = (targets[0]?.material && (Array.isArray(targets[0].material) ? targets[0].material[0] : targets[0].material)) as any;\n if (hasStencil && Mesh && Geometry && BufferAttr && sourceMat?.clone) {\n const dx = bbox.max.x - bbox.min.x;\n const dy = bbox.max.y - bbox.min.y;\n const dz = bbox.max.z - bbox.min.z;\n const capSize = Math.max(dx, dy, dz, 1) * 2;\n const half = capSize / 2;\n\n const capGeom: any = new Geometry();\n const positions = new Float32Array([\n -half, -half, 0,\n half, -half, 0,\n half, half, 0,\n -half, half, 0,\n ]);\n const normals = new Float32Array([\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,\n ]);\n capGeom.setAttribute('position', new BufferAttr(positions, 3));\n capGeom.setAttribute('normal', new BufferAttr(normals, 3));\n capGeom.setIndex([0, 1, 2, 0, 2, 3]);\n\n const capMat: any = sourceMat.clone();\n // Match the body's main color — the cap should look like a slice of\n // the same material, not a contrasting fill. The cloned material\n // already carries the source color; we just keep it. Add a low-\n // intensity emissive of the same color so the cap is still visible\n // even on faces facing away from any scene light, without changing\n // its hue.\n const sourceColorHex = (sourceMat.color?.getHex?.() ?? 0xb4bcc8) as number;\n capMat.emissive?.setHex?.(sourceColorHex);\n if ('emissiveIntensity' in capMat) capMat.emissiveIntensity = 0.25;\n capMat.side = DoubleSide;\n capMat.transparent = false;\n capMat.opacity = 1;\n capMat.stencilWrite = true;\n capMat.stencilRef = 0;\n capMat.stencilFunc = NotEqualStencilFunc;\n capMat.stencilFail = ReplaceStencilOp;\n capMat.stencilZFail = ReplaceStencilOp;\n capMat.stencilZPass = ReplaceStencilOp;\n // Don't clip the cap itself by the same plane.\n capMat.clippingPlanes = [];\n // Push the cap a hair toward the camera so it wins z-fights with\n // any model fragments that happen to sit exactly at the plane.\n capMat.polygonOffset = true;\n capMat.polygonOffsetFactor = -1;\n capMat.polygonOffsetUnits = -1;\n capMat.needsUpdate = true;\n\n capMesh = new Mesh(capGeom, capMat);\n capMesh.renderOrder = 2;\n capMesh.userData.__sectionHelper = true;\n scene.add(capMesh);\n }\n\n sectionRef.current = { plane, capMesh, helpers, materialState, bbox };\n // eslint-disable-next-line no-console\n console.info('[Preview] section: helpers =', helpers.length, 'cap =', !!capMesh);\n v.viewer.Render?.();\n }, [sectionEnabled, loading, tree]);\n\n // Section view — update plane orientation/position on axis/flip/angle/slider change.\n useEffect(() => {\n const v = viewerRef.current;\n const s = sectionRef.current;\n if (!v?.viewer || !s || !sectionEnabled) return;\n try {\n const bbox = s.bbox;\n const axisIdx = sectionAxis === 'x' ? 0 : sectionAxis === 'y' ? 1 : 2;\n const min = [bbox.min.x, bbox.min.y, bbox.min.z][axisIdx];\n const max = [bbox.max.x, bbox.max.y, bbox.max.z][axisIdx];\n const t = min + (max - min) * sectionPosition;\n\n // Cut-plane normal = chosen axis rotated through `sectionAngle` around a\n // perpendicular reference axis. At θ=0 every axis matches the original\n // axis-aligned behaviour; sweeping 0 → 360 spins the plane once around\n // the model. `sectionFlip` continues to negate the whole normal.\n const θ = (sectionAngle * Math.PI) / 180;\n const cosθ = Math.cos(θ), sinθ = Math.sin(θ);\n const sign = sectionFlip ? -1 : 1;\n let nx = 0, ny = 0, nz = 0;\n // Each axis rotates around the NEXT axis cyclically (X→Y, Y→Z, Z→X)\n // so all three options sweep in genuinely different planes:\n // X → rotates around Y, sweeping in the X-Z plane\n // Y → rotates around Z, sweeping in the Y-X plane\n // Z → rotates around X, sweeping in the Z-Y plane\n // Earlier attempts kept two axes in the same Y-Z plane (just swapped\n // sin/cos), which collapsed two of the three options to a 90° offset\n // of each other.\n if (sectionAxis === 'x') { nx = sign * cosθ; nz = sign * sinθ; }\n else if (sectionAxis === 'y') { ny = sign * cosθ; nx = sign * sinθ; }\n else { nz = sign * cosθ; ny = sign * sinθ; }\n\n // The plane passes through point P on the chosen-axis line at\n // `sectionPosition` of the bbox extent; the other two coordinates use\n // the bbox centre so the plane stays anchored within the model when it\n // rotates.\n const center = {\n x: (bbox.min.x + bbox.max.x) / 2,\n y: (bbox.min.y + bbox.max.y) / 2,\n z: (bbox.min.z + bbox.max.z) / 2,\n };\n const Px = sectionAxis === 'x' ? t : center.x;\n const Py = sectionAxis === 'y' ? t : center.y;\n const Pz = sectionAxis === 'z' ? t : center.z;\n\n s.plane.normal.x = nx;\n s.plane.normal.y = ny;\n s.plane.normal.z = nz;\n // three.js clips fragments where (normal · p) + constant < 0; the plane\n // equation we want is normal · p = normal · P, so constant = -(normal·P).\n s.plane.constant = -(nx * Px + ny * Py + nz * Pz);\n\n // Re-position the cap mesh on the plane and orient it so its visible\n // face points along the plane normal.\n if (s.capMesh) {\n const cx = center.x, cy = center.y, cz = center.z;\n // Distance from bbox center to plane along the normal.\n const dist = nx * cx + ny * cy + nz * cz + s.plane.constant;\n const px = cx - nx * dist;\n const py = cy - ny * dist;\n const pz = cz - nz * dist;\n s.capMesh.position.set(px, py, pz);\n s.capMesh.lookAt?.(px + nx, py + ny, pz + nz);\n }\n\n v.viewer.Render?.();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[Preview] section update failed', err);\n }\n }, [sectionEnabled, sectionAxis, sectionFlip, sectionPosition, sectionAngle]);\n\n // ──────────────────────────────────────────────────────────────────────\n // Measurement tool\n //\n // Click two points on the model; we raycast from the camera, drop a small\n // sphere marker at each hit, draw a line between them, and overlay an\n // HTML distance label that re-projects every animation frame so it\n // tracks as the user orbits the camera. A third click clears and starts\n // a fresh measurement. ESC or toggling the toolbar button off cleans up\n // all visuals.\n //\n // THREE constructors are plucked from a sample mesh in the loaded scene\n // (same trick the section view uses) so we share the renderer's THREE\n // instance. For raycasting we go through OV's own\n // `viewer.GetMeshIntersectionUnderMouse` rather than constructing our\n // own `THREE.Raycaster` from `import('three')` — the top-level `three`\n // hoisted in node_modules is a different version than the one OV\n // bundles, and a Raycaster from one bundle silently fails to intersect\n // meshes from the other.\n // ──────────────────────────────────────────────────────────────────────\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading || !containerRef.current) return;\n\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n // NB: don't cache `v.viewer.camera` here. SetProjectionMode (orthographic\n // toggle, called from the projection-default effect right after load)\n // rebuilds the THREE camera and replaces v.viewer.camera with a fresh\n // instance. A captured reference goes stale and the raycaster picks\n // ghost positions. We re-read v.viewer.camera inside doMeasurePick.\n const canvas: HTMLCanvasElement | undefined = renderer?.domElement;\n if (!renderer || !scene || !canvas) return;\n\n // Snapshot a sample mesh to pluck THREE constructors that share the\n // renderer's THREE instance.\n let sampleMesh: any = null;\n v.viewer.mainModel?.EnumerateMeshes?.((m: any) => {\n if (!sampleMesh && !m.userData?.__sectionHelper && !m.userData?.__measureHelper) sampleMesh = m;\n });\n if (!sampleMesh) return;\n\n const Vector3Ctor = sampleMesh.position.constructor;\n const MeshCtor = sampleMesh.constructor;\n const MaterialCtor = (Array.isArray(sampleMesh.material) ? sampleMesh.material[0] : sampleMesh.material)?.constructor;\n const GeometryCtor = sampleMesh.geometry.constructor;\n const BufferAttrCtor = sampleMesh.geometry.attributes?.position?.constructor;\n if (!Vector3Ctor || !MeshCtor || !MaterialCtor || !GeometryCtor || !BufferAttrCtor) return;\n\n // OV renders edges as THREE.LineSegments; pluck its constructor + a\n // line material from the scene so our measurement line uses the same\n // bundled THREE that built the rest of the scene.\n let LineSegmentsCtor: any = null;\n let LineBasicMaterialCtor: any = null;\n scene.traverse((obj: any) => {\n if (LineSegmentsCtor && LineBasicMaterialCtor) return;\n if (!obj?.isLineSegments) return;\n LineSegmentsCtor = obj.constructor;\n const mat = Array.isArray(obj.material) ? obj.material[0] : obj.material;\n if (mat?.constructor) LineBasicMaterialCtor = mat.constructor;\n });\n\n // Tear-down helper, used both on toggle-off and on next-mount cleanup.\n const teardown = () => {\n const s = measureRef.current;\n if (!s) return;\n if (s.rafId !== null) cancelAnimationFrame(s.rafId);\n for (const m of s.markers) {\n scene.remove(m);\n m.geometry?.dispose?.();\n m.material?.dispose?.();\n }\n if (s.line) {\n scene.remove(s.line);\n s.line.geometry?.dispose?.();\n s.line.material?.dispose?.();\n }\n if (s.label && s.label.parentElement) s.label.parentElement.removeChild(s.label);\n measureRef.current = null;\n v.viewer.Render?.();\n };\n\n if (!measureEnabled) {\n teardown();\n setMeasureDistance(null);\n return;\n }\n\n // Initial state for this session.\n measureRef.current = { points: [], normals: [], markers: [], line: null, label: null, rafId: null };\n\n // OV exposes `IntersectionMode.MeshOnly` and a viewer-level\n // `GetMeshIntersectionUnderMouse(mode, {x,y})` that runs the raycast\n // through its bundled THREE — which is what we want, since the loaded\n // model meshes were instantiated from that same bundle.\n const OV = ovRef.current;\n const intersectionMode = OV?.IntersectionMode?.MeshOnly ?? 1;\n\n // Modest sphere size — scales with the model's bbox so it stays\n // visible on tiny and huge models alike.\n const bbox = v.viewer.GetBoundingBox?.(() => true);\n const diag = bbox\n ? Math.sqrt(\n (bbox.max.x - bbox.min.x) ** 2 +\n (bbox.max.y - bbox.min.y) ** 2 +\n (bbox.max.z - bbox.min.z) ** 2,\n )\n : 100;\n const markerRadius = Math.max(diag * 0.005, 0.2);\n\n const makeMarker = (point: any) => {\n // Build a tiny sphere from a 12×8 lat-long mesh — cheap, no helper geom.\n const widthSegs = 16, heightSegs = 12;\n const positions: number[] = [];\n const indices: number[] = [];\n for (let iy = 0; iy <= heightSegs; iy++) {\n const v = iy / heightSegs;\n const phi = v * Math.PI;\n for (let ix = 0; ix <= widthSegs; ix++) {\n const u = ix / widthSegs;\n const theta = u * Math.PI * 2;\n positions.push(\n markerRadius * Math.sin(phi) * Math.cos(theta),\n markerRadius * Math.cos(phi),\n markerRadius * Math.sin(phi) * Math.sin(theta),\n );\n }\n }\n for (let iy = 0; iy < heightSegs; iy++) {\n for (let ix = 0; ix < widthSegs; ix++) {\n const a = iy * (widthSegs + 1) + ix;\n const b = a + widthSegs + 1;\n indices.push(a, b, a + 1, b, b + 1, a + 1);\n }\n }\n const geom = new GeometryCtor();\n geom.setAttribute('position', new BufferAttrCtor(new Float32Array(positions), 3));\n geom.setIndex(indices);\n geom.computeVertexNormals?.();\n const mat: any = new MaterialCtor();\n mat.color?.setHex?.(0xff8800);\n mat.depthTest = false;\n mat.depthWrite = false;\n mat.transparent = true;\n mat.opacity = 0.95;\n const mesh: any = new MeshCtor(geom, mat);\n mesh.position.copy(point);\n mesh.renderOrder = 9999;\n mesh.userData.__measureHelper = true;\n scene.add(mesh);\n return mesh;\n };\n\n // Build a translucent overlay covering every triangle in the picked\n // mesh that's coplanar with the picked face — i.e. the entire flat\n // surface the user clicked. Used in ⊥ mode so the user sees which\n // surface they selected rather than a single point.\n //\n // Two triangles count as part of the same face when:\n // 1. their normals point the same way within ~1.8°, AND\n // 2. their centroids lie within a small band of the picked plane.\n //\n // Returns null for curved surfaces or mis-fitted picks; the caller\n // falls back to the sphere marker so the user always gets *some*\n // visual feedback.\n const buildFaceHighlight = (mesh: any, hit: any): any | null => {\n const geom = mesh?.geometry;\n const posAttr = geom?.attributes?.position;\n if (!geom || !posAttr || !hit?.face?.normal) return null;\n const positions: ArrayLike<number> = posAttr.array;\n const indices: ArrayLike<number> | null = geom.index ? geom.index.array : null;\n\n // Local-space hit data.\n const localPoint = new Vector3Ctor(hit.point.x, hit.point.y, hit.point.z);\n mesh.worldToLocal?.(localPoint);\n const ln = hit.face.normal;\n // Plane equation in local space: ln · X + planeC = 0 (passes through localPoint).\n const planeC = -(ln.x * localPoint.x + ln.y * localPoint.y + ln.z * localPoint.z);\n\n // Tolerance scales with the bbox so tiny parts and huge parts both\n // pick up the same face cleanly.\n geom.computeBoundingBox?.();\n const bb = geom.boundingBox;\n const diag = bb\n ? Math.sqrt((bb.max.x - bb.min.x) ** 2 + (bb.max.y - bb.min.y) ** 2 + (bb.max.z - bb.min.z) ** 2)\n : 100;\n const PLANE_TOL = Math.max(diag * 0.001, 0.005);\n const NORMAL_TOL = 0.9995; // ~1.8°\n\n const triCount = indices ? indices.length / 3 : posAttr.count / 3;\n const matched: number[] = [];\n\n // Bake the world transform into the highlight geometry so we can\n // attach it to the scene directly with no parent-tracking — it\n // stays in place even if the source mesh is later transformed.\n const tmpV = new Vector3Ctor();\n\n for (let t = 0; t < triCount; t++) {\n const ia = indices ? indices[t * 3] : t * 3;\n const ib = indices ? indices[t * 3 + 1] : t * 3 + 1;\n const ic = indices ? indices[t * 3 + 2] : t * 3 + 2;\n const ax = positions[ia * 3], ay = positions[ia * 3 + 1], az = positions[ia * 3 + 2];\n const bx = positions[ib * 3], by = positions[ib * 3 + 1], bz = positions[ib * 3 + 2];\n const cx = positions[ic * 3], cy = positions[ic * 3 + 1], cz = positions[ic * 3 + 2];\n\n const ux = bx - ax, uy = by - ay, uz = bz - az;\n const vx = cx - ax, vy = cy - ay, vz = cz - az;\n let nx = uy * vz - uz * vy;\n let ny = uz * vx - ux * vz;\n let nz = ux * vy - uy * vx;\n const nlen = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (nlen === 0) continue;\n nx /= nlen; ny /= nlen; nz /= nlen;\n\n // Triangle's normal must align with the picked face normal (front side).\n const ndot = nx * ln.x + ny * ln.y + nz * ln.z;\n if (ndot < NORMAL_TOL) continue;\n\n // Triangle centroid must lie on the picked plane.\n const ccx = (ax + bx + cx) / 3, ccy = (ay + by + cy) / 3, ccz = (az + bz + cz) / 3;\n const dist = Math.abs(ln.x * ccx + ln.y * ccy + ln.z * ccz + planeC);\n if (dist > PLANE_TOL) continue;\n\n // Push all three vertices in world space.\n for (const [vx_, vy_, vz_] of [[ax, ay, az], [bx, by, bz], [cx, cy, cz]]) {\n tmpV.set?.(vx_, vy_, vz_);\n mesh.localToWorld?.(tmpV);\n matched.push(tmpV.x, tmpV.y, tmpV.z);\n }\n }\n\n if (matched.length === 0) return null;\n\n const hgeom = new GeometryCtor();\n hgeom.setAttribute('position', new BufferAttrCtor(new Float32Array(matched), 3));\n hgeom.computeVertexNormals?.();\n\n const hmat: any = new MaterialCtor();\n hmat.color?.setHex?.(0xff8800);\n hmat.transparent = true;\n hmat.opacity = 0.45;\n hmat.depthWrite = false;\n // Pull the overlay slightly toward the camera so it doesn't z-fight\n // with the source surface. Negative offset = closer to viewer in\n // depth.\n hmat.polygonOffset = true;\n hmat.polygonOffsetFactor = -2;\n hmat.polygonOffsetUnits = -2;\n // Render after the model so the see-through colour blends on top.\n const highlight: any = new MeshCtor(hgeom, hmat);\n highlight.renderOrder = 9998;\n highlight.userData.__measureHelper = true;\n scene.add(highlight);\n return highlight;\n };\n\n const drawLine = (a: any, b: any) => {\n const geom = new GeometryCtor();\n geom.setAttribute('position', new BufferAttrCtor(new Float32Array([a.x, a.y, a.z, b.x, b.y, b.z]), 3));\n // LineSegments draws one segment per pair of vertices — with two\n // points that's exactly the line we want. Falls back to the mesh\n // constructor if no edge meshes happened to be in the scene\n // (extremely unlikely for STEP files, which always have edges).\n const LineCtor = LineSegmentsCtor ?? MeshCtor;\n const LineMatCtor = LineBasicMaterialCtor ?? MaterialCtor;\n const mat: any = new LineMatCtor({ color: 0xff8800, depthTest: false, depthWrite: false, transparent: true, opacity: 0.95 });\n const line: any = new LineCtor(geom, mat);\n line.renderOrder = 9998;\n line.userData.__measureHelper = true;\n scene.add(line);\n return line;\n };\n\n const ensureLabel = () => {\n const s = measureRef.current!;\n if (s.label) return s.label;\n const el = document.createElement('div');\n el.style.position = 'absolute';\n // Park off-screen on creation so the label never flashes at (0,0)\n // before updateLabel() positions it.\n el.style.left = '-9999px';\n el.style.top = '-9999px';\n el.style.transform = 'translate(-50%, -50%)';\n el.style.padding = '2px 6px';\n el.style.fontSize = '11px';\n el.style.fontWeight = '600';\n el.style.fontFamily = 'system-ui, -apple-system, sans-serif';\n el.style.background = 'rgba(255, 136, 0, 0.95)';\n el.style.color = '#fff';\n el.style.borderRadius = '4px';\n el.style.pointerEvents = 'none';\n el.style.whiteSpace = 'nowrap';\n el.style.boxShadow = '0 1px 4px rgba(0,0,0,0.25)';\n el.style.zIndex = '5';\n containerRef.current!.appendChild(el);\n s.label = el;\n return el;\n };\n\n const updateLabel = () => {\n const s = measureRef.current;\n if (!s || s.points.length < 2 || !s.label) return;\n // Read camera fresh — see comment in doMeasurePick.\n const camera = v.viewer.camera;\n if (!camera) return;\n const a = s.points[0], b = s.points[1];\n const mid = new Vector3Ctor((a.x + b.x) / 2, (a.y + b.y) / 2, (a.z + b.z) / 2);\n // Project midpoint to screen.\n const projected = mid.clone();\n projected.project?.(camera);\n const rect = canvas.getBoundingClientRect();\n const x = ((projected.x + 1) / 2) * rect.width;\n const y = ((-projected.y + 1) / 2) * rect.height;\n s.label.style.left = `${x}px`;\n s.label.style.top = `${y}px`;\n // Hide if behind the camera (z > 1) OR if the midpoint projects\n // outside the canvas — otherwise transform:translate(-50%,-50%)\n // leaves the label's right edge stuck at the top-left corner\n // showing \"…mm\" after the user orbits the measurement off-screen.\n const offScreen = x < 0 || y < 0 || x > rect.width || y > rect.height;\n s.label.style.opacity = (projected.z > 1 || offScreen) ? '0' : '1';\n };\n\n // Continuous re-projection so the label tracks orbit/pan/zoom — RAF is\n // cheap when the only work is one Vector3.project() and two style\n // assignments.\n const tick = () => {\n const s = measureRef.current;\n if (!s) return;\n updateLabel();\n s.rafId = requestAnimationFrame(tick);\n };\n measureRef.current.rafId = requestAnimationFrame(tick);\n\n // ── Click-vs-drag gating ──\n // We can't simply `stopPropagation()` on pointerdown — that would\n // block OV's orbit controls and pin the camera. Instead, we track\n // each pointer gesture: only treat it as a measurement pick when\n // the pointer barely moved (≤ DRAG_TOL px) between down and up\n // *and* the press was short. Anything longer is a camera drag and\n // we hand it off to OV unmodified.\n const DRAG_TOL = 4; // px of cumulative movement that still counts as a click\n const DRAG_TIME = 350; // ms; longer presses count as a drag even if pointer stayed still\n let downX = 0, downY = 0, downTime = 0, dragging = false, downActive = false;\n\n // Compute the world-space normal at the picked surface. Useful for\n // surface-to-surface distance: if the user picks two roughly-parallel\n // faces, we report the perpendicular distance instead of the raw\n // point-to-point distance.\n const worldNormalFromHit = (hit: any): { x: number; y: number; z: number } | null => {\n const fn = hit?.face?.normal;\n const obj = hit?.object;\n if (!fn || !obj) return null;\n try {\n const local = new Vector3Ctor(fn.x, fn.y, fn.z);\n // `transformDirection` is on three's Vector3 — applies the\n // upper-3x3 of `matrixWorld` and re-normalises.\n local.transformDirection?.(obj.matrixWorld);\n return { x: local.x, y: local.y, z: local.z };\n } catch {\n return { x: fn.x, y: fn.y, z: fn.z };\n }\n };\n\n const doMeasurePick = (ev: PointerEvent) => {\n // Read camera fresh — SetProjectionMode rebuilds it under the hood,\n // see the comment near the start of this effect.\n if (!v.viewer.camera) return;\n const rect = canvas.getBoundingClientRect();\n const mouseCoords = {\n x: ev.clientX - rect.left,\n y: ev.clientY - rect.top,\n };\n const hit = v.viewer.GetMeshIntersectionUnderMouse?.(intersectionMode, mouseCoords);\n if (!hit) return;\n\n const s = measureRef.current!;\n const point = new Vector3Ctor(hit.point.x, hit.point.y, hit.point.z);\n const normal = worldNormalFromHit(hit);\n\n // Third click → start over.\n if (s.points.length === 2) {\n for (const m of s.markers) {\n scene.remove(m);\n m.geometry?.dispose?.();\n m.material?.dispose?.();\n }\n if (s.line) {\n scene.remove(s.line);\n s.line.geometry?.dispose?.();\n s.line.material?.dispose?.();\n }\n if (s.label) s.label.style.opacity = '0';\n s.points = []; s.markers = []; s.line = null;\n s.normals = [];\n setMeasureDistance(null);\n }\n\n s.points.push(point);\n s.normals.push(normal);\n // In ⊥ mode the user is selecting a *surface*, so paint a\n // translucent overlay on the entire coplanar face instead of the\n // single-point sphere marker. Falls back to the sphere if face\n // detection fails (e.g. the user picked a curved surface where no\n // coplanar triangles exist).\n if (measureMode === 'perp') {\n const highlight = buildFaceHighlight(hit.object, hit);\n s.markers.push(highlight ?? makeMarker(point));\n } else {\n s.markers.push(makeMarker(point));\n }\n\n if (s.points.length === 2) {\n const a = s.points[0];\n let b = s.points[1];\n\n let dist: number;\n let suffix = '';\n\n if (measureMode === 'perp') {\n // Perpendicular mode: draw the line *along the surface normal*\n // (i.e. at 90° to surface A), ending on the plane parallel to\n // A passing through B's click point. The endpoint may land\n // inside or outside face B's highlight depending on where the\n // user clicked, but the line itself is unambiguously the\n // perpendicular gap — never the diagonal between two arbitrary\n // click points. Falls back to point-to-point if the first pick\n // missed a face.\n const refN = s.normals[0] ?? s.normals[1];\n if (refN) {\n const len = Math.sqrt(refN.x * refN.x + refN.y * refN.y + refN.z * refN.z) || 1;\n const nx = refN.x / len, ny = refN.y / len, nz = refN.z / len;\n const dx = b.x - a.x, dy = b.y - a.y, dz = b.z - a.z;\n // Signed projection of (b − a) onto n. Sign keeps the\n // perpendicular endpoint on the same side as the second\n // click, so the line visually crosses the gap rather than\n // drawing into the source body.\n const proj = dx * nx + dy * ny + dz * nz;\n const projectedB = new Vector3Ctor(a.x + nx * proj, a.y + ny * proj, a.z + nz * proj);\n // Re-anchor the second endpoint to the perpendicular foot —\n // both the rendered line and the label midpoint follow.\n s.points[1] = projectedB;\n b = projectedB;\n dist = Math.abs(proj);\n suffix = ' ⊥';\n } else {\n const dx = b.x - a.x, dy = b.y - a.y, dz = b.z - a.z;\n dist = Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n } else {\n const dx = b.x - a.x, dy = b.y - a.y, dz = b.z - a.z;\n dist = Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n s.line = drawLine(a, b);\n setMeasureDistance(dist);\n const label = ensureLabel();\n label.textContent = `${formatMeasureDistance(dist)}${suffix}`;\n }\n\n v.viewer.Render?.();\n };\n\n const onPointerDown = (ev: PointerEvent) => {\n // Left-button only. Right-click and middle-click are camera-pan/orbit\n // gestures we don't want to interfere with.\n if (ev.button !== 0) return;\n downX = ev.clientX;\n downY = ev.clientY;\n downTime = performance.now();\n dragging = false;\n downActive = true;\n // *No* stopPropagation here — OV needs the event for orbit drag.\n };\n const onPointerMove = (ev: PointerEvent) => {\n if (!downActive) return;\n const dx = ev.clientX - downX, dy = ev.clientY - downY;\n if (dx * dx + dy * dy > DRAG_TOL * DRAG_TOL) dragging = true;\n };\n const onPointerUp = (ev: PointerEvent) => {\n if (ev.button !== 0 || !downActive) return;\n const elapsed = performance.now() - downTime;\n const wasClick = !dragging && elapsed < DRAG_TIME;\n downActive = false;\n if (!wasClick) return; // it was a camera gesture, hand off\n doMeasurePick(ev);\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') setMeasureEnabled(false);\n };\n\n canvas.style.cursor = 'crosshair';\n // Bubble phase — OV's orbit-control listeners are also bubble; we\n // don't preempt them since we never call stopPropagation.\n canvas.addEventListener('pointerdown', onPointerDown);\n canvas.addEventListener('pointermove', onPointerMove);\n canvas.addEventListener('pointerup', onPointerUp);\n canvas.addEventListener('pointercancel', onPointerUp);\n window.addEventListener('keydown', onKeyDown);\n\n return () => {\n canvas.style.cursor = '';\n canvas.removeEventListener('pointerdown', onPointerDown);\n canvas.removeEventListener('pointermove', onPointerMove);\n canvas.removeEventListener('pointerup', onPointerUp);\n canvas.removeEventListener('pointercancel', onPointerUp);\n window.removeEventListener('keydown', onKeyDown);\n teardown();\n setMeasureDistance(null);\n };\n }, [measureEnabled, measureMode, loading, tree]);\n\n // Hint timer.\n useEffect(() => {\n if (!showHint || loading) return;\n const t = setTimeout(() => setShowHint(false), 5000);\n return () => clearTimeout(t);\n }, [showHint, loading]);\n\n const toggleNodeVisible = (node: TreeNode) => {\n const ids = new Set<number>();\n collectNodeIds(node, ids);\n setHidden(prev => {\n const next = new Set(prev);\n // If any descendant is currently visible, hide them all; else reveal.\n const anyVisible = [...ids].some(id => !next.has(id));\n for (const id of ids) {\n if (anyVisible) next.add(id);\n else next.delete(id);\n }\n return next;\n });\n };\n\n const toggleExpanded = (id: number) => {\n setExpanded(prev => ({ ...prev, [id]: !prev[id] }));\n };\n\n const fitNode = (node: TreeNode) => {\n // Fit the whole model — fitting to a specific subtree would need its\n // bounds via a custom enumerator; defer that for now.\n handleFit();\n // Future: filter visibility-by-subtree to focus.\n void node;\n };\n\n const handleFit = () => {\n try {\n const v = viewerRef.current;\n const sphere = v?.viewer?.GetBoundingSphere?.(() => true);\n if (sphere) v.viewer.FitSphereToWindow(sphere, true);\n v?.viewer?.Render?.();\n } catch {}\n };\n\n // Switch between perspective and orthographic projection. The viewer keeps\n // the current camera position; just rebuilds the THREE camera under the hood.\n useEffect(() => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer || loading) return;\n try {\n v.viewer.SetProjectionMode(perspective ? OV.ProjectionMode.Perspective : OV.ProjectionMode.Orthographic);\n } catch {}\n }, [perspective, loading]);\n\n // Camera presets — eye/center/up around the model's bounding sphere.\n const setCameraPreset = (preset: 'top' | 'front' | 'side' | 'iso') => {\n const OV = ovRef.current;\n const v = viewerRef.current;\n if (!OV || !v?.viewer) return;\n try {\n const sphere = v.viewer.GetBoundingSphere?.(() => true);\n if (!sphere) return;\n const c = sphere.center;\n const r = sphere.radius || 1;\n const dist = r * 3;\n const cx = c.x ?? 0, cy = c.y ?? 0, cz = c.z ?? 0;\n let eye: any, up: any;\n switch (preset) {\n case 'top': eye = new OV.Coord3D(cx, cy, cz + dist); up = new OV.Coord3D(0, 1, 0); break;\n case 'front': eye = new OV.Coord3D(cx, cy - dist, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'side': eye = new OV.Coord3D(cx + dist, cy, cz); up = new OV.Coord3D(0, 0, 1); break;\n case 'iso':\n default: {\n const k = dist / Math.sqrt(3);\n eye = new OV.Coord3D(cx + k, cy - k, cz + k);\n up = new OV.Coord3D(0, 0, 1);\n break;\n }\n }\n const center = new OV.Coord3D(cx, cy, cz);\n const cam = new OV.Camera(eye, center, up, 45);\n v.viewer.SetCamera(cam);\n v.viewer.AdjustClippingPlanesToSphere?.(sphere);\n v.viewer.Render?.();\n } catch {}\n };\n\n const handleSnapshot = () => {\n try {\n const v = viewerRef.current;\n const size = v?.viewer?.GetCanvasSize?.() ?? { width: 1280, height: 720 };\n const dataUrl = v?.viewer?.GetImageAsDataUrl?.(size.width, size.height, false);\n if (!dataUrl) return;\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = `${filename.replace(/\\.[^.]+$/, '')}-snapshot.png`;\n a.click();\n } catch {}\n };\n\n const handleResetDisplay = () => {\n setBgColor('#f5f6f8');\n setShowEdges(true);\n setEdgeColor('#000000');\n setEdgeThreshold(1);\n setSectionEnabled(false);\n setSectionAxis('x'); // matches the new default\n setSectionFlip(false);\n setSectionPosition(0.5);\n setSectionAngle(0);\n };\n\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n };\n\n const ext = (filename.split('.').pop() || '').toUpperCase();\n\n // ── render helpers ───────────────────────────────────────────────────────\n const renderTreeNode = (node: TreeNode, depth = 0): React.ReactNode => {\n const hasChildren = node.children.length > 0;\n const isExpanded = expanded[node.id] !== false; // default expanded for first two levels\n const isVisible = !hidden.has(node.id);\n return (\n <div key={node.id}>\n <div\n className=\"group flex items-center gap-1 px-1.5 py-1 hover:bg-gray-100 cursor-default text-[12px] text-gray-700\"\n style={{ paddingLeft: `${depth * 12 + 6}px` }}\n >\n {hasChildren ? (\n <button\n onClick={() => toggleExpanded(node.id)}\n className=\"h-4 w-4 shrink-0 flex items-center justify-center text-gray-500 hover:text-gray-900\"\n title={isExpanded ? 'Collapse' : 'Expand'}\n >\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={isExpanded ? 'M19.5 8.25l-7.5 7.5-7.5-7.5' : 'M8.25 4.5l7.5 7.5-7.5 7.5'} />\n </svg>\n </button>\n ) : (\n <span className=\"h-4 w-4 shrink-0 flex items-center justify-center\">\n <span className=\"h-1 w-1 rounded-full bg-gray-400\" />\n </span>\n )}\n <span className={`flex-1 truncate ${isVisible ? '' : 'opacity-40'}`} title={node.name}>{node.name}</span>\n <button\n onClick={() => fitNode(node)}\n className=\"h-4 w-4 shrink-0 text-gray-400 hover:text-gray-900 opacity-0 group-hover:opacity-100 transition-opacity\"\n title=\"Fit to view\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <button\n onClick={() => toggleNodeVisible(node)}\n className=\"h-4 w-4 shrink-0 text-gray-500 hover:text-gray-900\"\n title={isVisible ? 'Hide' : 'Show'}\n >\n {isVisible ? (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n ) : (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88\" />\n </svg>\n )}\n </button>\n </div>\n {isExpanded && hasChildren && (\n <div>{node.children.map(c => renderTreeNode(c, depth + 1))}</div>\n )}\n </div>\n );\n };\n\n const tBtn = 'h-8 w-8 shrink-0 flex items-center justify-center rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors';\n const tBtnActive = 'h-8 w-8 shrink-0 flex items-center justify-center rounded bg-gray-200 text-gray-900';\n // Wide variant — used for text-labelled buttons (e.g. Perspective /\n // Orthographic) so the label has room to render without being clipped\n // by the fixed 32 px square of `tBtn`.\n const tBtnWide = 'h-8 shrink-0 flex items-center justify-center px-2 rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors';\n const tBtnWideActive = 'h-8 shrink-0 flex items-center justify-center px-2 rounded bg-gray-200 text-gray-900';\n const tBtnSep = 'h-5 w-px bg-gray-300 mx-1';\n\n return (\n <div className=\"flex flex-col h-full bg-white\">\n <PanelActions>\n <button onClick={handleFit} className={tBtn} title=\"Fit to view\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" />\n </svg>\n </button>\n <div className={tBtnSep} />\n <button onClick={() => setCameraPreset('iso')} className={tBtn} title=\"Isometric view\">\n <span className=\"text-[10px] font-semibold\">ISO</span>\n </button>\n <button onClick={() => setCameraPreset('top')} className={tBtn} title=\"Top view\">\n <span className=\"text-[10px] font-semibold\">TOP</span>\n </button>\n <button onClick={() => setCameraPreset('front')} className={tBtn} title=\"Front view\">\n <span className=\"text-[10px] font-semibold\">FRT</span>\n </button>\n <button onClick={() => setCameraPreset('side')} className={tBtn} title=\"Side view\">\n <span className=\"text-[10px] font-semibold\">SDE</span>\n </button>\n <button\n onClick={() => setPerspective(p => !p)}\n className={perspective ? tBtnWideActive : tBtnWide}\n title={perspective ? 'Switch to orthographic view' : 'Switch to perspective view'}\n >\n <span className=\"text-[11px] font-semibold whitespace-nowrap\">{perspective ? 'Perspective' : 'Orthographic'}</span>\n </button>\n <div className={tBtnSep} />\n <button onClick={handleSnapshot} className={tBtn} title=\"Save snapshot as PNG\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z\" />\n </svg>\n </button>\n <button onClick={() => setShowHint(s => !s)} className={tBtn} title=\"How to navigate\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\" />\n </svg>\n </button>\n <button\n onClick={() => setMeasureEnabled(m => !m)}\n className={measureEnabled ? tBtnActive : tBtn}\n title={measureEnabled ? 'Stop measuring (Esc)' : 'Measure distance — click two points on the model'}\n >\n {/* Ruler icon */}\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 14.25l6-6 6 6 4.5-4.5M9.75 8.25v3M12.75 11.25v3M15.75 14.25v3\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 18.75h19.5\" />\n </svg>\n </button>\n {measureEnabled && (\n <div className=\"flex items-stretch h-8 rounded border border-gray-200 overflow-hidden\">\n <button\n onClick={() => setMeasureMode('point')}\n className={`px-2 text-[11px] font-semibold transition-colors ${measureMode === 'point' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Point — measure straight-line distance between two picked points\"\n >\n Point\n </button>\n <button\n onClick={() => setMeasureMode('perp')}\n className={`px-2 text-[12px] font-semibold transition-colors ${measureMode === 'perp' ? 'bg-orange-500 text-white' : 'bg-white text-gray-600 hover:bg-gray-50'}`}\n title=\"Perpendicular — pick two surfaces and measure the perpendicular gap between them\"\n >\n ⊥\n </button>\n </div>\n )}\n {measureEnabled && measureDistance !== null && (\n <div className=\"px-2 py-1 text-[11px] font-mono font-semibold text-orange-600 bg-orange-50 border border-orange-200 rounded whitespace-nowrap\" title={measureMode === 'perp' ? 'Perpendicular distance between the two picked surfaces' : 'Straight-line distance between the two picked points'}>\n {formatMeasureDistance(measureDistance)}{measureMode === 'perp' ? ' ⊥' : ''}\n </div>\n )}\n <div className={tBtnSep} />\n <button onClick={() => setShowMeshes(s => !s)} className={showMeshes ? tBtnActive : tBtn} title=\"Toggle meshes panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\" />\n </svg>\n </button>\n <button onClick={() => setShowSettings(s => !s)} className={showSettings ? tBtnActive : tBtn} title=\"Toggle display panel\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n <button onClick={onDownload ?? handleDefaultDownload} className={tBtn} title=\"Download original file\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n </svg>\n </button>\n {onEmail && (\n <button onClick={onEmail} className={tBtn} title=\"Email\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" />\n </svg>\n </button>\n )}\n </PanelActions>\n\n {/* Body: viewport with floating Meshes / Model Display panels overlaid */}\n <div className=\"flex-1 flex min-h-0\">\n <div className=\"relative flex-1 min-w-0\" style={{ background: bgColor }}>\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\n\n {/* Floating Meshes panel — anchored top-left, mirrors DXF Layers panel */}\n {showMeshes && (\n <div className=\"absolute top-2 left-2 w-64 max-h-[80%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Meshes</span>\n <button onClick={() => setShowMeshes(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n <div className=\"flex-1 overflow-y-auto py-1\">\n {tree ? renderTreeNode(tree) : (\n <div className=\"px-3 py-3 text-[11px] text-gray-500 italic\">{loading ? 'Reading model…' : 'No structure available'}</div>\n )}\n </div>\n {tree && (\n <div className=\"px-3 py-1.5 text-[10px] text-gray-500 border-t border-gray-200\">\n {hidden.size === 0 ? 'All visible' : `${hidden.size} hidden`}\n </div>\n )}\n </div>\n )}\n\n {showHint && !loading && !error && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none\">\n <span>Drag to rotate</span>\n <span className=\"text-white/40\">•</span>\n <span>Right-click drag to pan</span>\n <span className=\"text-white/40\">•</span>\n <span>Scroll to zoom</span>\n </div>\n )}\n\n {loading && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-white/85 text-sm text-gray-600 gap-2\">\n <svg className=\"h-6 w-6 text-blue-500 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.2\" />\n <path d=\"M22 12a10 10 0 0 1-10 10\" strokeLinecap=\"round\" />\n </svg>\n <span>Loading 3D model…</span>\n {ext === 'STP' || ext === 'STEP' ? <span className=\"text-[10px] text-gray-400\">STEP files load OpenCascade WASM (~5 MB) on first use.</span> : null}\n </div>\n )}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center bg-white/85\">{error}</div>\n )}\n\n {/* Floating Model Display panel — anchored top-right */}\n {showSettings && (\n <div className=\"absolute top-2 right-2 w-64 max-h-[80%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs\">\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50\">\n <span className=\"font-medium text-gray-700\">Model Display</span>\n <button onClick={() => setShowSettings(false)} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600\" title=\"Close\">×</button>\n </div>\n <div className=\"flex-1 overflow-y-auto px-3 py-3 space-y-3 text-[12px] text-gray-700\">\n <label className=\"flex items-center justify-between gap-2\">\n <span>Background Color</span>\n <input type=\"color\" value={bgColor} onChange={(e) => setBgColor(e.target.value)} className=\"h-6 w-10 rounded border border-gray-300 bg-white\" />\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span>Show Edges</span>\n <button\n onClick={() => setShowEdges(s => !s)}\n role=\"switch\"\n aria-checked={showEdges}\n className={`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors ${showEdges ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${showEdges ? 'translate-x-[18px]' : 'translate-x-0.5'}`} />\n </button>\n </label>\n <label className=\"flex items-center justify-between gap-2\">\n <span className={showEdges ? '' : 'opacity-40'}>Edge Color</span>\n <input\n type=\"color\"\n value={edgeColor}\n onChange={(e) => setEdgeColor(e.target.value)}\n disabled={!showEdges}\n className=\"h-6 w-10 rounded border border-gray-300 bg-white disabled:opacity-40\"\n />\n </label>\n <div className={showEdges ? '' : 'opacity-40 pointer-events-none'}>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Edge Threshold</span>\n <span className=\"text-gray-500 tabular-nums\">{edgeThreshold}°</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={45}\n step={1}\n value={edgeThreshold}\n onChange={(e) => setEdgeThreshold(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <div className=\"border-t border-gray-200 -mx-3 px-3 pt-3 mt-1\">\n <label className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium\">Section View</span>\n <button\n onClick={() => setSectionEnabled(s => !s)}\n role=\"switch\"\n aria-checked={sectionEnabled}\n className={`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors ${sectionEnabled ? 'bg-blue-500' : 'bg-gray-300'}`}\n >\n <span className={`inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${sectionEnabled ? 'translate-x-[18px]' : 'translate-x-0.5'}`} />\n </button>\n </label>\n\n <div className={sectionEnabled ? 'mt-2 space-y-2' : 'mt-2 space-y-2 opacity-40 pointer-events-none'}>\n {/* Angle — rotates the cut plane around a perpendicular\n reference axis (full 0–360° sweep). Sits above\n Axis + Position because changing it visibly affects\n both, so users find it first. */}\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Angle</span>\n <span className=\"text-gray-500 tabular-nums\">{sectionAngle}°</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={180}\n step={1}\n value={sectionAngle}\n onChange={(e) => setSectionAngle(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Axis</span>\n <button\n onClick={() => setSectionFlip(f => !f)}\n className=\"text-[10px] text-gray-600 hover:text-gray-900 px-1.5 py-0.5 rounded bg-gray-100 hover:bg-gray-200\"\n title=\"Flip section direction\"\n >\n {sectionFlip ? '← flipped' : 'flip →'}\n </button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {(['x', 'y', 'z'] as const).map(ax => (\n <button\n key={ax}\n onClick={() => setSectionAxis(ax)}\n className={`py-1 rounded text-[11px] font-semibold ${sectionAxis === ax ? 'bg-blue-500 text-white' : 'bg-gray-100 text-gray-700 hover:bg-gray-200'}`}\n >\n {ax.toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <span>Position</span>\n <span className=\"text-gray-500 tabular-nums\">{Math.round(sectionPosition * 100)}%</span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={sectionPosition}\n onChange={(e) => setSectionPosition(Number(e.target.value))}\n className=\"w-full accent-blue-500\"\n />\n </div>\n\n </div>\n </div>\n </div>\n <div className=\"px-3 py-2 border-t border-gray-200\">\n <button\n onClick={handleResetDisplay}\n className=\"w-full text-[11px] text-gray-700 bg-gray-100 hover:bg-gray-200 rounded py-1.5 transition-colors\"\n >\n Reset to Default\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface ImagePanelProps {\n url: string;\n filename: string;\n onDownload?: () => void;\n onEmail?: () => void;\n}\n\nfunction ImagePanel({ url, filename, onDownload, onEmail }: ImagePanelProps) {\n const [zoom, setZoom] = useState(1);\n const [error, setError] = useState(false);\n const [annotating, setAnnotating] = useState(false);\n const annotatorRef = useRef<ImageAnnotatorHandle>(null);\n\n // Fetch into a blob URL before triggering the anchor download.\n // The bare-anchor approach (`a.href = url; a.download = …; a.click()`)\n // can fall through to navigation when the server's response headers\n // don't cleanly opt into the download — the browser then loads the\n // image URL into the SPA frame, which clears the Preview state and\n // leaves the user with the empty \"Drop a file here…\" placeholder.\n // Going through fetch → Blob → object URL means the anchor target\n // is always a controlled blob: URL the browser will always save.\n const handleDefaultDownload = async () => {\n // For same-document blob: URLs we can skip the round-trip entirely.\n if (url.startsWith('blob:') || url.startsWith('data:')) {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n return;\n }\n const tryFetch = async (init: RequestInit) => {\n const res = await fetch(url, init);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.blob();\n };\n try {\n let blob: Blob;\n try {\n blob = await tryFetch({ credentials: 'include' });\n } catch {\n // Some media servers reject credentialed requests with an opaque\n // network failure — retry once without cookies before giving up.\n blob = await tryFetch({ credentials: 'omit' });\n }\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl;\n a.download = filename;\n a.click();\n // Defer revoke so the browser has a tick to start the download.\n setTimeout(() => URL.revokeObjectURL(blobUrl), 1000);\n } catch {\n toast.error(\"Download failed — couldn't reach the file.\");\n }\n };\n\n const btn = 'px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1';\n\n return (\n <div className=\"flex flex-col h-full\">\n <PanelActions>\n {!annotating && (\n <>\n <button onClick={() => setZoom(z => Math.max(0.1, Math.round((z - 0.25) * 100) / 100))} className={btn}>−</button>\n <span className=\"text-gray-500 w-12 text-center tabular-nums\">{Math.round(zoom * 100)}%</span>\n <button onClick={() => setZoom(z => Math.min(8, Math.round((z + 0.25) * 100) / 100))} className={btn}>+</button>\n <button onClick={() => setZoom(1)} className={btn}>1:1</button>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button onClick={() => setAnnotating(true)} className={btn} title=\"Annotate this image\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><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\" /></svg>\n Annotate\n </button>\n </>\n )}\n {annotating && (\n <>\n <button onClick={() => setAnnotating(false)} className={btn} title=\"Back to viewer\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" /></svg>\n View\n </button>\n <button onClick={() => annotatorRef.current?.copy()} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.75\" /></svg>\n Copy\n </button>\n <button onClick={() => annotatorRef.current?.save()} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Save\n </button>\n </>\n )}\n <button onClick={onDownload ?? handleDefaultDownload} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /></svg>\n Download\n </button>\n {onEmail && (\n <button onClick={onEmail} className={btn}>\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /></svg>\n Email\n </button>\n )}\n </PanelActions>\n {annotating ? (\n <ImageAnnotator ref={annotatorRef} src={url} filename={filename} />\n ) : (\n <div className=\"flex-1 overflow-auto bg-gray-100 flex items-center justify-center p-4\">\n {error ? (\n <div className=\"text-sm text-red-600\">Failed to load image.</div>\n ) : (\n <img\n src={url}\n alt={filename}\n onError={() => setError(true)}\n style={{ transform: `scale(${zoom})`, transformOrigin: 'center center', transition: 'transform 120ms ease' }}\n className=\"max-w-full max-h-full shadow-lg rounded bg-white\"\n />\n )}\n </div>\n )}\n </div>\n );\n}\n"]}
|