react-os-shell 0.1.31 → 0.1.32
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/Preview-X2TQ32VM.js +6 -0
- package/dist/{Preview-DO7KHVKG.js.map → Preview-X2TQ32VM.js.map} +1 -1
- package/dist/apps/index.js +2 -2
- package/dist/{chunk-RGYSM6P5.js → chunk-CZKAKVP6.js} +10 -3
- package/dist/chunk-CZKAKVP6.js.map +1 -0
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/Preview-DO7KHVKG.js +0 -6
- package/dist/chunk-RGYSM6P5.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-X2TQ32VM.js"}
|
package/dist/apps/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { setPdfPreview } from '../chunk-
|
|
1
|
+
export { setPdfPreview } from '../chunk-CZKAKVP6.js';
|
|
2
2
|
import '../chunk-WIJ45SYD.js';
|
|
3
3
|
import '../chunk-AKZTZLKP.js';
|
|
4
4
|
import '../chunk-RFTLYCSF.js';
|
|
@@ -19,7 +19,7 @@ var Minesweeper = lazy(() => import('../Minesweeper-KAOD327F.js'));
|
|
|
19
19
|
var Email = lazy(() => import('../Email-UCNJ53MV.js'));
|
|
20
20
|
var GeminiChat = lazy(() => import('../GeminiChat-BXLBJFT4.js'));
|
|
21
21
|
var Calendar = lazy(() => import('../Calendar-RQVSPJAJ.js'));
|
|
22
|
-
var Preview = lazy(() => import('../Preview-
|
|
22
|
+
var Preview = lazy(() => import('../Preview-X2TQ32VM.js'));
|
|
23
23
|
var Documents = lazy(() => import('../Documents-3P6JKOLE.js'));
|
|
24
24
|
var utilityApps = {
|
|
25
25
|
"/calculator": { component: Calculator, label: "Calculator", size: "sm", allowPinOnTop: true, utility: true, widget: true, autoHeight: true, dimensions: [280, 420] },
|
|
@@ -691,6 +691,7 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
|
|
|
691
691
|
if (!v?.viewer) return;
|
|
692
692
|
try {
|
|
693
693
|
const visit = (mesh) => {
|
|
694
|
+
if (mesh.userData?.__sectionHelper) return;
|
|
694
695
|
const ud = mesh.userData?.originalMeshInstance ?? mesh.userData;
|
|
695
696
|
const nodeId = ud?.id?.nodeId ?? ud?.nodeId;
|
|
696
697
|
if (typeof nodeId === "number") {
|
|
@@ -775,7 +776,12 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
|
|
|
775
776
|
mat.clipShadows = true;
|
|
776
777
|
mat.needsUpdate = true;
|
|
777
778
|
};
|
|
779
|
+
const targets = [];
|
|
778
780
|
v.viewer.mainModel?.EnumerateMeshes?.((mesh) => {
|
|
781
|
+
if (mesh.userData?.__sectionHelper) return;
|
|
782
|
+
targets.push(mesh);
|
|
783
|
+
});
|
|
784
|
+
for (const mesh of targets) {
|
|
779
785
|
const mat = mesh.material;
|
|
780
786
|
if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);
|
|
781
787
|
else applyToMaterial(mat);
|
|
@@ -801,7 +807,7 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
|
|
|
801
807
|
};
|
|
802
808
|
makeStencil(THREE.BackSide, THREE.IncrementWrapStencilOp);
|
|
803
809
|
makeStencil(THREE.FrontSide, THREE.DecrementWrapStencilOp);
|
|
804
|
-
}
|
|
810
|
+
}
|
|
805
811
|
const dx = bbox.max.x - bbox.min.x;
|
|
806
812
|
const dy = bbox.max.y - bbox.min.y;
|
|
807
813
|
const dz = bbox.max.z - bbox.min.z;
|
|
@@ -819,6 +825,7 @@ function StepPanel({ url, filename, onDownload, onEmail }) {
|
|
|
819
825
|
});
|
|
820
826
|
const capMesh = new THREE.Mesh(capGeom, capMat);
|
|
821
827
|
capMesh.renderOrder = 2;
|
|
828
|
+
capMesh.userData.__sectionHelper = true;
|
|
822
829
|
scene.add(capMesh);
|
|
823
830
|
renderer.localClippingEnabled = true;
|
|
824
831
|
sectionRef.current = { plane, capMesh, helpers, materialState, bbox };
|
|
@@ -1260,5 +1267,5 @@ function ImagePanel({ url, filename, onDownload, onEmail }) {
|
|
|
1260
1267
|
}
|
|
1261
1268
|
|
|
1262
1269
|
export { Preview, setPdfPreview };
|
|
1263
|
-
//# sourceMappingURL=chunk-
|
|
1264
|
-
//# sourceMappingURL=chunk-
|
|
1270
|
+
//# sourceMappingURL=chunk-CZKAKVP6.js.map
|
|
1271
|
+
//# sourceMappingURL=chunk-CZKAKVP6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apps/Preview.tsx"],"names":[],"mappings":"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","file":"chunk-CZKAKVP6.js","sourcesContent":["/**\n * Preview — windowed PDF viewer app.\n *\n * Consumers stage a PDF via `setPdfPreview({ url, filename, ... })` and then\n * call `openPage('/preview')`. If the window is already open, it swaps to the\n * new PDF in-place via a custom event.\n */\nimport { useState, useEffect, useRef } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport toast from '../shell/toast';\nimport { WindowTitle } from '../shell/Modal';\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 `setPdfPreview` again\n * with the resolved URL 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';\n\nlet pendingData: PdfPreviewData | null = null;\n\n/** Stage a PDF for the next Preview window mount, or swap into an open one. */\nexport function setPdfPreview(data: PdfPreviewData) {\n pendingData = data;\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(EVENT_NAME, { detail: data }));\n }\n}\n\nexport default function Preview() {\n const [data, setData] = useState<PdfPreviewData | null>(() => {\n const d = pendingData;\n pendingData = null;\n return d;\n });\n\n // Swap to a new PDF if `setPdfPreview` is called while the window is open.\n useEffect(() => {\n const handler = (e: Event) => {\n const next = (e as CustomEvent<PdfPreviewData>).detail;\n setData(prev => {\n if (prev?.url && prev.url !== next.url && prev.url.startsWith('blob:')) {\n URL.revokeObjectURL(prev.url);\n }\n return next;\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 [isDragging, setIsDragging] = useState(false);\n const handlePick = () => fileRef.current?.click();\n const ingestFile = (file: File) => {\n const url = URL.createObjectURL(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 URL.revokeObjectURL(url);\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 setPdfPreview({ url, filename: file.name, kind });\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 setIsDragging(false);\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 </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 onDragOver={(e) => { e.preventDefault(); if (!isDragging) setIsDragging(true); }}\n onDragLeave={(e) => {\n // Only clear when leaving the outer container, not transitioning between children.\n if (e.currentTarget === e.target) setIsDragging(false);\n }}\n onDrop={handleDrop}\n >\n <WindowTitle title={`${titleName} - Preview`} />\n {Toolbar}\n <div className=\"flex-1 min-h-0\">{body}</div>\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\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.5);\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 useEffect(() => {\n if (!pdf || !containerRef.current) return;\n pdf.getPage(1).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n const fitScale = (containerW - 40) / viewport.width;\n setScale(Math.min(Math.max(fitScale, 0.5), 3));\n });\n }, [pdf]);\n\n useEffect(() => {\n if (!pdf || !canvasRef.current) return;\n let cancelled = false;\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 const ctx = canvas.getContext('2d')!;\n p.render({ canvas, canvasContext: ctx, viewport }).promise.catch(() => {});\n });\n return () => { cancelled = true; };\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 const fitWidth = () => {\n if (!pdf || !containerRef.current) return;\n pdf.getPage(page).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n setScale(Math.min(Math.max((containerW - 40) / viewport.width, 0.5), 3));\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 <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setPage(p => Math.max(1, p - 1))} disabled={page <= 1} className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30\">\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-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30\">\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>\n\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setScale(s => Math.max(0.3, Math.round((s - 0.25) * 100) / 100))} className={btn}>−</button>\n <span className=\"text-gray-500 w-12 text-center tabular-nums\">{Math.round(scale * 100)}%</span>\n <button onClick={() => setScale(s => Math.min(4, Math.round((s + 0.25) * 100) / 100))} className={btn}>+</button>\n <button onClick={fitWidth} className={btn}>Fit</button>\n </div>\n\n <div className=\"flex items-center gap-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 </div>\n </div>\n\n <div ref={containerRef} className=\"flex-1 overflow-auto bg-gray-100 flex justify-center p-4\">\n {loading ? (\n <div className=\"flex items-center justify-center py-20 text-gray-400 text-sm\">Loading PDF...</div>\n ) : (\n <canvas ref={canvasRef} className=\"shadow-lg rounded\" />\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 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 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 <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-gray-600\">DXF</span>\n <span className=\"text-gray-400 truncate max-w-xs\">{filename}</span>\n </div>\n <div className=\"flex items-center gap-1 relative\">\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 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 </div>\n </div>\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\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 // Sidebar visibility.\n const [showMeshes, setShowMeshes] = useState(true);\n const [showSettings, setShowSettings] = useState(true);\n\n // Section view (capped clipping plane).\n const [sectionEnabled, setSectionEnabled] = useState(false);\n const [sectionAxis, setSectionAxis] = useState<'x' | 'y' | 'z'>('z');\n const [sectionFlip, setSectionFlip] = useState(false);\n const [sectionPosition, setSectionPosition] = useState(0.5); // 0–1 within bbox\n const [sectionCapColor, setSectionCapColor] = useState('#9aa6b3');\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 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 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 } 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 { 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 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 up / tear down on enable.\n // Uses the standard three.js stencil-cap technique: every mesh gets a\n // clippingPlane + two stencil-only \"helper\" children that count interior\n // intersections with the plane, and a single cap quad in the scene draws\n // the cut surface where the stencil count is non-zero.\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading) return;\n\n let cancelled = false;\n let teardown: (() => void) | null = null;\n\n (async () => {\n const THREE: any = await import('three' as any);\n if (cancelled) return;\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n if (!renderer || !scene) return;\n\n // Tear down any previous section 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 helper.geometry?.dispose?.();\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 const plane = new THREE.Plane(new THREE.Vector3(0, 0, -1), 0);\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, {\n clippingPlanes: mat.clippingPlanes,\n clipShadows: mat.clipShadows,\n });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n\n // Snapshot the mesh list FIRST. EnumerateMeshes is a live scene\n // traversal — if we add helper meshes to each visited mesh inside the\n // callback, the traversal then visits those helpers (which are also\n // THREE.Mesh instances) and recursively adds more helpers to them,\n // exploding into a stack overflow.\n const targets: any[] = [];\n v.viewer.mainModel?.EnumerateMeshes?.((mesh: any) => {\n if (mesh.userData?.__sectionHelper) return;\n targets.push(mesh);\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 // Two stencil-only helpers: back faces increment, front faces decrement.\n // Where the result is non-zero on the cap plane, we are inside the solid.\n const makeStencil = (side: number, op: number) => {\n const m = new THREE.MeshBasicMaterial({\n depthWrite: false,\n depthTest: false,\n colorWrite: false,\n stencilWrite: true,\n stencilFunc: THREE.AlwaysStencilFunc,\n stencilFail: op,\n stencilZFail: op,\n stencilZPass: op,\n side,\n clippingPlanes: [plane],\n });\n const helper = new THREE.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(THREE.BackSide, THREE.IncrementWrapStencilOp);\n makeStencil(THREE.FrontSide, THREE.DecrementWrapStencilOp);\n }\n\n // Cap quad — sized to the bounding box diagonal so it always covers the cut.\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) * 2 || 1;\n const capGeom = new THREE.PlaneGeometry(capSize, capSize);\n const capMat = new THREE.MeshPhongMaterial({\n color: 0x9aa6b3,\n side: THREE.DoubleSide,\n stencilWrite: true,\n stencilRef: 0,\n stencilFunc: THREE.NotEqualStencilFunc,\n stencilFail: THREE.ReplaceStencilOp,\n stencilZFail: THREE.ReplaceStencilOp,\n stencilZPass: THREE.ReplaceStencilOp,\n });\n const capMesh = new THREE.Mesh(capGeom, capMat);\n capMesh.renderOrder = 2;\n capMesh.userData.__sectionHelper = true;\n scene.add(capMesh);\n\n renderer.localClippingEnabled = true;\n sectionRef.current = { plane, capMesh, helpers, materialState, bbox };\n v.viewer.Render?.();\n\n teardown = () => {\n // No-op here — handled at the start of the effect on next run.\n };\n })();\n\n return () => {\n cancelled = true;\n if (teardown) teardown();\n };\n }, [sectionEnabled, loading, tree]);\n\n // Section view — update plane orientation/position on axis/flip/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 value = min + (max - min) * sectionPosition;\n\n // Three.js clips fragments where (normal · p) + constant < 0.\n // Default direction (not flipped): keep \"axis < value\", clip \"axis > value\".\n const dir = sectionFlip ? 1 : -1;\n const nx = sectionAxis === 'x' ? dir : 0;\n const ny = sectionAxis === 'y' ? dir : 0;\n const nz = sectionAxis === 'z' ? dir : 0;\n s.plane.normal.set(nx, ny, nz);\n s.plane.constant = -dir * value;\n\n // Cap mesh: position at the plane, oriented so its visible face points\n // toward the kept side (i.e. opposite the plane normal direction we\n // clip against — same as plane.normal for our convention).\n const cx = (bbox.min.x + bbox.max.x) / 2;\n const cy = (bbox.min.y + bbox.max.y) / 2;\n const cz = (bbox.min.z + bbox.max.z) / 2;\n const center: any = { x: cx, y: cy, z: cz };\n // Plane equation: n.p + c = 0 → distance from center = n·c + c_const.\n const dist = nx * center.x + ny * center.y + nz * center.z + s.plane.constant;\n const px = center.x - nx * dist;\n const py = center.y - ny * dist;\n const pz = center.z - nz * dist;\n s.capMesh.position.set(px, py, pz);\n s.capMesh.lookAt(px + nx, py + ny, pz + nz);\n\n // Cap color\n try {\n const m = /^#?([0-9a-f]{6})$/i.exec(sectionCapColor);\n const n = m ? parseInt(m[1], 16) : 0x9aa6b3;\n s.capMesh.material.color.setHex(n);\n } catch {}\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, sectionCapColor]);\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?.GetBoundingSphere?.(() => true);\n if (sphere) v.viewer.FitSphereToWindow(sphere, true);\n v?.viewer?.Render?.();\n } catch {}\n };\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.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('z');\n setSectionFlip(false);\n setSectionPosition(0.5);\n setSectionCapColor('#9aa6b3');\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-slate-700/50 cursor-default text-[12px] text-slate-200\"\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-slate-400 hover:text-slate-100\"\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-slate-500\" />\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-slate-500 hover:text-slate-100 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-slate-400 hover:text-slate-100\"\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-slate-300 hover:bg-slate-700 hover:text-white transition-colors';\n const tBtnActive = 'h-8 w-8 shrink-0 flex items-center justify-center rounded bg-slate-700 text-white';\n const tBtnSep = 'h-5 w-px bg-slate-700 mx-1';\n\n return (\n <div className=\"flex flex-col h-full bg-slate-900\">\n {/* Top toolbar */}\n <div className=\"flex items-center gap-1 px-2 py-1.5 bg-slate-800 border-b border-slate-700 shrink-0\">\n <span className=\"text-[11px] font-semibold tracking-wide text-slate-300 px-2 truncate max-w-xs\" title={filename}>{filename}</span>\n <div className={tBtnSep} />\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 <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 <div className=\"flex-1\" />\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 </div>\n\n {/* Body: meshes | viewport | settings */}\n <div className=\"flex-1 flex min-h-0\">\n {showMeshes && (\n <div className=\"w-60 shrink-0 bg-slate-800 border-r border-slate-700 flex flex-col\">\n <div className=\"px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-slate-400 border-b border-slate-700\">Meshes</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-slate-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-slate-500 border-t border-slate-700\">\n {hidden.size === 0 ? 'All visible' : `${hidden.size} hidden`}\n </div>\n )}\n </div>\n )}\n\n <div className=\"relative flex-1 min-w-0\" style={{ background: bgColor }}>\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\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 </div>\n\n {showSettings && (\n <div className=\"w-60 shrink-0 bg-slate-800 border-l border-slate-700 flex flex-col\">\n <div className=\"px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-slate-400 border-b border-slate-700\">Model Display</div>\n <div className=\"flex-1 overflow-y-auto px-3 py-3 space-y-3 text-[12px] text-slate-200\">\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-slate-600 bg-transparent\" />\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 className={`relative h-5 w-9 rounded-full transition-colors ${showEdges ? 'bg-blue-500' : 'bg-slate-600'}`}\n >\n <span className={`absolute top-0.5 h-4 w-4 rounded-full bg-white transition-transform ${showEdges ? 'translate-x-4' : '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-slate-600 bg-transparent 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-slate-400 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-slate-700 -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 className={`relative h-5 w-9 rounded-full transition-colors ${sectionEnabled ? 'bg-blue-500' : 'bg-slate-600'}`}\n >\n <span className={`absolute top-0.5 h-4 w-4 rounded-full bg-white transition-transform ${sectionEnabled ? 'translate-x-4' : '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 <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-slate-300 hover:text-white px-1.5 py-0.5 rounded bg-slate-700 hover:bg-slate-600\"\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-slate-700 text-slate-300 hover:bg-slate-600'}`}\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-slate-400 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 <label className=\"flex items-center justify-between gap-2\">\n <span>Cap Color</span>\n <input\n type=\"color\"\n value={sectionCapColor}\n onChange={(e) => setSectionCapColor(e.target.value)}\n className=\"h-6 w-10 rounded border border-slate-600 bg-transparent\"\n />\n </label>\n </div>\n </div>\n </div>\n <div className=\"px-3 py-2 border-t border-slate-700\">\n <button\n onClick={handleResetDisplay}\n className=\"w-full text-[11px] text-slate-300 bg-slate-700 hover:bg-slate-600 rounded py-1.5 transition-colors\"\n >\n Reset to Default\n </button>\n </div>\n </div>\n )}\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\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\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 <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-gray-600\">Image</span>\n <span className=\"text-gray-400 truncate max-w-xs\">{filename}</span>\n </div>\n <div className=\"flex items-center gap-1\">\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>\n <div className=\"flex items-center gap-1\">\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 </div>\n </div>\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 </div>\n );\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { formatDate } from './chunk-NSU7OHPC.js';
|
|
|
3
3
|
export { formatDate } from './chunk-NSU7OHPC.js';
|
|
4
4
|
import { useGoogleAuth } from './chunk-5O2KEISQ.js';
|
|
5
5
|
import { playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, playLogout, setSoundForType, previewSound, setAllSounds } from './chunk-D7PYW2QS.js';
|
|
6
|
-
import { setPdfPreview } from './chunk-
|
|
6
|
+
import { setPdfPreview } from './chunk-CZKAKVP6.js';
|
|
7
7
|
import { toast_default } from './chunk-WIJ45SYD.js';
|
|
8
8
|
export { toast_default as toast } from './chunk-WIJ45SYD.js';
|
|
9
9
|
import { useShellPrefs } from './chunk-36VM54SC.js';
|
|
@@ -651,7 +651,7 @@ function StatusBadge({ status }) {
|
|
|
651
651
|
}
|
|
652
652
|
|
|
653
653
|
// src/version.ts
|
|
654
|
-
var VERSION = "0.1.
|
|
654
|
+
var VERSION = "0.1.32" ;
|
|
655
655
|
var APP_VERSION = VERSION;
|
|
656
656
|
|
|
657
657
|
// src/changelog.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-os-shell",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.32",
|
|
4
4
|
"description": "Desktop-style React UI shell — windows, taskbar, start menu, sticky notes, frosted glass theming, and 17 bundled apps including a PDF Preview viewer.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Victor Y. Mau",
|
package/dist/Preview-DO7KHVKG.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/Preview.tsx"],"names":[],"mappings":"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","file":"chunk-RGYSM6P5.js","sourcesContent":["/**\n * Preview — windowed PDF viewer app.\n *\n * Consumers stage a PDF via `setPdfPreview({ url, filename, ... })` and then\n * call `openPage('/preview')`. If the window is already open, it swaps to the\n * new PDF in-place via a custom event.\n */\nimport { useState, useEffect, useRef } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport toast from '../shell/toast';\nimport { WindowTitle } from '../shell/Modal';\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 `setPdfPreview` again\n * with the resolved URL 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';\n\nlet pendingData: PdfPreviewData | null = null;\n\n/** Stage a PDF for the next Preview window mount, or swap into an open one. */\nexport function setPdfPreview(data: PdfPreviewData) {\n pendingData = data;\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(EVENT_NAME, { detail: data }));\n }\n}\n\nexport default function Preview() {\n const [data, setData] = useState<PdfPreviewData | null>(() => {\n const d = pendingData;\n pendingData = null;\n return d;\n });\n\n // Swap to a new PDF if `setPdfPreview` is called while the window is open.\n useEffect(() => {\n const handler = (e: Event) => {\n const next = (e as CustomEvent<PdfPreviewData>).detail;\n setData(prev => {\n if (prev?.url && prev.url !== next.url && prev.url.startsWith('blob:')) {\n URL.revokeObjectURL(prev.url);\n }\n return next;\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 [isDragging, setIsDragging] = useState(false);\n const handlePick = () => fileRef.current?.click();\n const ingestFile = (file: File) => {\n const url = URL.createObjectURL(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 URL.revokeObjectURL(url);\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 setPdfPreview({ url, filename: file.name, kind });\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 setIsDragging(false);\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 </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 onDragOver={(e) => { e.preventDefault(); if (!isDragging) setIsDragging(true); }}\n onDragLeave={(e) => {\n // Only clear when leaving the outer container, not transitioning between children.\n if (e.currentTarget === e.target) setIsDragging(false);\n }}\n onDrop={handleDrop}\n >\n <WindowTitle title={`${titleName} - Preview`} />\n {Toolbar}\n <div className=\"flex-1 min-h-0\">{body}</div>\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\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.5);\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 useEffect(() => {\n if (!pdf || !containerRef.current) return;\n pdf.getPage(1).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n const fitScale = (containerW - 40) / viewport.width;\n setScale(Math.min(Math.max(fitScale, 0.5), 3));\n });\n }, [pdf]);\n\n useEffect(() => {\n if (!pdf || !canvasRef.current) return;\n let cancelled = false;\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 const ctx = canvas.getContext('2d')!;\n p.render({ canvas, canvasContext: ctx, viewport }).promise.catch(() => {});\n });\n return () => { cancelled = true; };\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 const fitWidth = () => {\n if (!pdf || !containerRef.current) return;\n pdf.getPage(page).then(p => {\n const containerW = containerRef.current?.clientWidth || 800;\n const viewport = p.getViewport({ scale: 1 });\n setScale(Math.min(Math.max((containerW - 40) / viewport.width, 0.5), 3));\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 <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setPage(p => Math.max(1, p - 1))} disabled={page <= 1} className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30\">\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-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30\">\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>\n\n <div className=\"flex items-center gap-1\">\n <button onClick={() => setScale(s => Math.max(0.3, Math.round((s - 0.25) * 100) / 100))} className={btn}>−</button>\n <span className=\"text-gray-500 w-12 text-center tabular-nums\">{Math.round(scale * 100)}%</span>\n <button onClick={() => setScale(s => Math.min(4, Math.round((s + 0.25) * 100) / 100))} className={btn}>+</button>\n <button onClick={fitWidth} className={btn}>Fit</button>\n </div>\n\n <div className=\"flex items-center gap-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 </div>\n </div>\n\n <div ref={containerRef} className=\"flex-1 overflow-auto bg-gray-100 flex justify-center p-4\">\n {loading ? (\n <div className=\"flex items-center justify-center py-20 text-gray-400 text-sm\">Loading PDF...</div>\n ) : (\n <canvas ref={canvasRef} className=\"shadow-lg rounded\" />\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 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 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 <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-gray-600\">DXF</span>\n <span className=\"text-gray-400 truncate max-w-xs\">{filename}</span>\n </div>\n <div className=\"flex items-center gap-1 relative\">\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 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 </div>\n </div>\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\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 // Sidebar visibility.\n const [showMeshes, setShowMeshes] = useState(true);\n const [showSettings, setShowSettings] = useState(true);\n\n // Section view (capped clipping plane).\n const [sectionEnabled, setSectionEnabled] = useState(false);\n const [sectionAxis, setSectionAxis] = useState<'x' | 'y' | 'z'>('z');\n const [sectionFlip, setSectionFlip] = useState(false);\n const [sectionPosition, setSectionPosition] = useState(0.5); // 0–1 within bbox\n const [sectionCapColor, setSectionCapColor] = useState('#9aa6b3');\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 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 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 } 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 { 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 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 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 up / tear down on enable.\n // Uses the standard three.js stencil-cap technique: every mesh gets a\n // clippingPlane + two stencil-only \"helper\" children that count interior\n // intersections with the plane, and a single cap quad in the scene draws\n // the cut surface where the stencil count is non-zero.\n useEffect(() => {\n const v = viewerRef.current;\n if (!v?.viewer || loading) return;\n\n let cancelled = false;\n let teardown: (() => void) | null = null;\n\n (async () => {\n const THREE: any = await import('three' as any);\n if (cancelled) return;\n const renderer = v.viewer.renderer;\n const scene = v.viewer.scene;\n if (!renderer || !scene) return;\n\n // Tear down any previous section 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 helper.geometry?.dispose?.();\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 const plane = new THREE.Plane(new THREE.Vector3(0, 0, -1), 0);\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, {\n clippingPlanes: mat.clippingPlanes,\n clipShadows: mat.clipShadows,\n });\n mat.clippingPlanes = [plane];\n mat.clipShadows = true;\n mat.needsUpdate = true;\n };\n\n v.viewer.mainModel?.EnumerateMeshes?.((mesh: any) => {\n const mat = mesh.material;\n if (Array.isArray(mat)) for (const m of mat) applyToMaterial(m);\n else applyToMaterial(mat);\n\n // Two stencil-only helpers: back faces increment, front faces decrement.\n // Where the result is non-zero on the cap plane, we are inside the solid.\n const makeStencil = (side: number, op: number) => {\n const m = new THREE.MeshBasicMaterial({\n depthWrite: false,\n depthTest: false,\n colorWrite: false,\n stencilWrite: true,\n stencilFunc: THREE.AlwaysStencilFunc,\n stencilFail: op,\n stencilZFail: op,\n stencilZPass: op,\n side,\n clippingPlanes: [plane],\n });\n const helper = new THREE.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(THREE.BackSide, THREE.IncrementWrapStencilOp);\n makeStencil(THREE.FrontSide, THREE.DecrementWrapStencilOp);\n });\n\n // Cap quad — sized to the bounding box diagonal so it always covers the cut.\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) * 2 || 1;\n const capGeom = new THREE.PlaneGeometry(capSize, capSize);\n const capMat = new THREE.MeshPhongMaterial({\n color: 0x9aa6b3,\n side: THREE.DoubleSide,\n stencilWrite: true,\n stencilRef: 0,\n stencilFunc: THREE.NotEqualStencilFunc,\n stencilFail: THREE.ReplaceStencilOp,\n stencilZFail: THREE.ReplaceStencilOp,\n stencilZPass: THREE.ReplaceStencilOp,\n });\n const capMesh = new THREE.Mesh(capGeom, capMat);\n capMesh.renderOrder = 2;\n scene.add(capMesh);\n\n renderer.localClippingEnabled = true;\n sectionRef.current = { plane, capMesh, helpers, materialState, bbox };\n v.viewer.Render?.();\n\n teardown = () => {\n // No-op here — handled at the start of the effect on next run.\n };\n })();\n\n return () => {\n cancelled = true;\n if (teardown) teardown();\n };\n }, [sectionEnabled, loading, tree]);\n\n // Section view — update plane orientation/position on axis/flip/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 value = min + (max - min) * sectionPosition;\n\n // Three.js clips fragments where (normal · p) + constant < 0.\n // Default direction (not flipped): keep \"axis < value\", clip \"axis > value\".\n const dir = sectionFlip ? 1 : -1;\n const nx = sectionAxis === 'x' ? dir : 0;\n const ny = sectionAxis === 'y' ? dir : 0;\n const nz = sectionAxis === 'z' ? dir : 0;\n s.plane.normal.set(nx, ny, nz);\n s.plane.constant = -dir * value;\n\n // Cap mesh: position at the plane, oriented so its visible face points\n // toward the kept side (i.e. opposite the plane normal direction we\n // clip against — same as plane.normal for our convention).\n const cx = (bbox.min.x + bbox.max.x) / 2;\n const cy = (bbox.min.y + bbox.max.y) / 2;\n const cz = (bbox.min.z + bbox.max.z) / 2;\n const center: any = { x: cx, y: cy, z: cz };\n // Plane equation: n.p + c = 0 → distance from center = n·c + c_const.\n const dist = nx * center.x + ny * center.y + nz * center.z + s.plane.constant;\n const px = center.x - nx * dist;\n const py = center.y - ny * dist;\n const pz = center.z - nz * dist;\n s.capMesh.position.set(px, py, pz);\n s.capMesh.lookAt(px + nx, py + ny, pz + nz);\n\n // Cap color\n try {\n const m = /^#?([0-9a-f]{6})$/i.exec(sectionCapColor);\n const n = m ? parseInt(m[1], 16) : 0x9aa6b3;\n s.capMesh.material.color.setHex(n);\n } catch {}\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, sectionCapColor]);\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?.GetBoundingSphere?.(() => true);\n if (sphere) v.viewer.FitSphereToWindow(sphere, true);\n v?.viewer?.Render?.();\n } catch {}\n };\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.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('z');\n setSectionFlip(false);\n setSectionPosition(0.5);\n setSectionCapColor('#9aa6b3');\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-slate-700/50 cursor-default text-[12px] text-slate-200\"\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-slate-400 hover:text-slate-100\"\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-slate-500\" />\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-slate-500 hover:text-slate-100 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-slate-400 hover:text-slate-100\"\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-slate-300 hover:bg-slate-700 hover:text-white transition-colors';\n const tBtnActive = 'h-8 w-8 shrink-0 flex items-center justify-center rounded bg-slate-700 text-white';\n const tBtnSep = 'h-5 w-px bg-slate-700 mx-1';\n\n return (\n <div className=\"flex flex-col h-full bg-slate-900\">\n {/* Top toolbar */}\n <div className=\"flex items-center gap-1 px-2 py-1.5 bg-slate-800 border-b border-slate-700 shrink-0\">\n <span className=\"text-[11px] font-semibold tracking-wide text-slate-300 px-2 truncate max-w-xs\" title={filename}>{filename}</span>\n <div className={tBtnSep} />\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 <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 <div className=\"flex-1\" />\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 </div>\n\n {/* Body: meshes | viewport | settings */}\n <div className=\"flex-1 flex min-h-0\">\n {showMeshes && (\n <div className=\"w-60 shrink-0 bg-slate-800 border-r border-slate-700 flex flex-col\">\n <div className=\"px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-slate-400 border-b border-slate-700\">Meshes</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-slate-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-slate-500 border-t border-slate-700\">\n {hidden.size === 0 ? 'All visible' : `${hidden.size} hidden`}\n </div>\n )}\n </div>\n )}\n\n <div className=\"relative flex-1 min-w-0\" style={{ background: bgColor }}>\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\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 </div>\n\n {showSettings && (\n <div className=\"w-60 shrink-0 bg-slate-800 border-l border-slate-700 flex flex-col\">\n <div className=\"px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-slate-400 border-b border-slate-700\">Model Display</div>\n <div className=\"flex-1 overflow-y-auto px-3 py-3 space-y-3 text-[12px] text-slate-200\">\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-slate-600 bg-transparent\" />\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 className={`relative h-5 w-9 rounded-full transition-colors ${showEdges ? 'bg-blue-500' : 'bg-slate-600'}`}\n >\n <span className={`absolute top-0.5 h-4 w-4 rounded-full bg-white transition-transform ${showEdges ? 'translate-x-4' : '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-slate-600 bg-transparent 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-slate-400 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-slate-700 -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 className={`relative h-5 w-9 rounded-full transition-colors ${sectionEnabled ? 'bg-blue-500' : 'bg-slate-600'}`}\n >\n <span className={`absolute top-0.5 h-4 w-4 rounded-full bg-white transition-transform ${sectionEnabled ? 'translate-x-4' : '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 <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-slate-300 hover:text-white px-1.5 py-0.5 rounded bg-slate-700 hover:bg-slate-600\"\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-slate-700 text-slate-300 hover:bg-slate-600'}`}\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-slate-400 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 <label className=\"flex items-center justify-between gap-2\">\n <span>Cap Color</span>\n <input\n type=\"color\"\n value={sectionCapColor}\n onChange={(e) => setSectionCapColor(e.target.value)}\n className=\"h-6 w-10 rounded border border-slate-600 bg-transparent\"\n />\n </label>\n </div>\n </div>\n </div>\n <div className=\"px-3 py-2 border-t border-slate-700\">\n <button\n onClick={handleResetDisplay}\n className=\"w-full text-[11px] text-slate-300 bg-slate-700 hover:bg-slate-600 rounded py-1.5 transition-colors\"\n >\n Reset to Default\n </button>\n </div>\n </div>\n )}\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\n const handleDefaultDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\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 <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-gray-600\">Image</span>\n <span className=\"text-gray-400 truncate max-w-xs\">{filename}</span>\n </div>\n <div className=\"flex items-center gap-1\">\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>\n <div className=\"flex items-center gap-1\">\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 </div>\n </div>\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 </div>\n );\n}\n"]}
|