react-os-shell 0.1.24 → 0.1.25
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-VN62PK7J.js +6 -0
- package/dist/{Preview-GDDP36DK.js.map → Preview-VN62PK7J.js.map} +1 -1
- package/dist/apps/index.js +2 -2
- package/dist/{chunk-H2Y6CB42.js → chunk-ABPU2PUV.js} +15 -2
- package/dist/chunk-ABPU2PUV.js.map +1 -0
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/Preview-GDDP36DK.js +0 -6
- package/dist/chunk-H2Y6CB42.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-VN62PK7J.js"}
|
package/dist/apps/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { setPdfPreview } from '../chunk-
|
|
1
|
+
export { setPdfPreview } from '../chunk-ABPU2PUV.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-VN62PK7J.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] },
|
|
@@ -345,6 +345,19 @@ function DxfPanel({ url, filename, onDownload, onEmail }) {
|
|
|
345
345
|
viewerRef.current = viewer;
|
|
346
346
|
await viewer.Load({ url, fonts: [], workerFactory: null });
|
|
347
347
|
if (cancelled) return;
|
|
348
|
+
try {
|
|
349
|
+
viewer.FitView?.();
|
|
350
|
+
} catch {
|
|
351
|
+
}
|
|
352
|
+
try {
|
|
353
|
+
const rect = containerRef.current.getBoundingClientRect();
|
|
354
|
+
viewer.SetSize?.(Math.round(rect.width), Math.round(rect.height));
|
|
355
|
+
} catch {
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
viewer.FitView?.();
|
|
359
|
+
} catch {
|
|
360
|
+
}
|
|
348
361
|
setLoading(false);
|
|
349
362
|
} catch (e) {
|
|
350
363
|
if (!cancelled) {
|
|
@@ -450,5 +463,5 @@ function ImagePanel({ url, filename, onDownload, onEmail }) {
|
|
|
450
463
|
}
|
|
451
464
|
|
|
452
465
|
export { Preview, setPdfPreview };
|
|
453
|
-
//# sourceMappingURL=chunk-
|
|
454
|
-
//# sourceMappingURL=chunk-
|
|
466
|
+
//# sourceMappingURL=chunk-ABPU2PUV.js.map
|
|
467
|
+
//# sourceMappingURL=chunk-ABPU2PUV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apps/Preview.tsx"],"names":[],"mappings":"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","file":"chunk-ABPU2PUV.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. */\n kind?: 'pdf' | 'dxf' | 'image';\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' | undefined =\n ext === 'pdf' ? 'pdf'\n : ext === 'dxf' ? 'dxf'\n : ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext) ? 'image'\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\"\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 · 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 (requires the optional <span className=\"font-mono\">dxf-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 === '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\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\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n setLoading(true);\n setError(null);\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 expects clearColor to be a THREE.Color instance (it\n // calls .getHex() on it). dxf-viewer re-exports three internally,\n // so reuse whichever copy ships with the consumer's bundle.\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 = {\n autoResize: true,\n colorCorrection: true,\n };\n if (ClearColor) viewerOpts.clearColor = new ClearColor(0xffffff);\n viewer = new DxfViewer(containerRef.current, viewerOpts);\n viewerRef.current = viewer;\n await viewer.Load({ url, fonts: [], workerFactory: null });\n if (cancelled) return;\n // The drawing loaded but the camera is at its default position;\n // without an explicit fit the geometry usually sits off-screen\n // and the canvas reads as fully white. FitView frames it.\n try { viewer.FitView?.(); } catch {}\n // dxf-viewer with autoResize:true subscribes to size changes via\n // ResizeObserver, but the canvas can be measured before the\n // window's flex layout has settled (initial size 0). Force a\n // resize once we know the container has a real size.\n try {\n const rect = containerRef.current.getBoundingClientRect();\n viewer.SetSize?.(Math.round(rect.width), Math.round(rect.height));\n } catch {}\n try { viewer.FitView?.(); } catch {}\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 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 { viewerRef.current?.FitView?.(); } 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\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\">\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\">\n <div ref={containerRef} className=\"absolute inset-0\" />\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 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-ABPU2PUV.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.25" ;
|
|
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.25",
|
|
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-GDDP36DK.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/Preview.tsx"],"names":[],"mappings":"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","file":"chunk-H2Y6CB42.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. */\n kind?: 'pdf' | 'dxf' | 'image';\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' | undefined =\n ext === 'pdf' ? 'pdf'\n : ext === 'dxf' ? 'dxf'\n : ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext) ? 'image'\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\"\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 · 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 (requires the optional <span className=\"font-mono\">dxf-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 === '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\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\n useEffect(() => {\n let cancelled = false;\n let viewer: any = null;\n setLoading(true);\n setError(null);\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 expects clearColor to be a THREE.Color instance (it\n // calls .getHex() on it). dxf-viewer re-exports three internally,\n // so reuse whichever copy ships with the consumer's bundle.\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 = {\n autoResize: true,\n colorCorrection: true,\n };\n if (ClearColor) viewerOpts.clearColor = new ClearColor(0xffffff);\n viewer = new DxfViewer(containerRef.current, viewerOpts);\n viewerRef.current = viewer;\n await viewer.Load({ url, fonts: [], workerFactory: null });\n if (cancelled) return;\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 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 { viewerRef.current?.FitView?.(); } 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\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\">\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\">\n <div ref={containerRef} className=\"absolute inset-0\" />\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 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"]}
|