@zerohive/hive-viewer 1.0.0 → 1.0.1

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/components/DocumentViewer.tsx","../src/editors/RichTextEditor.tsx","../src/utils/sanitize.ts","../src/editors/SpreadsheetEditor.tsx","../src/renderers/ImageRenderer.tsx","../src/renderers/PdfRenderer.tsx","../src/renderers/PptxRenderer.tsx","../src/utils/fileSource.ts","../src/components/ThumbnailsSidebar.tsx","../src/components/Toolbar.tsx","../src/components/SignaturePanel.tsx"],"sourcesContent":["export { DocumentViewer } from './components/DocumentViewer';\nexport type { DocumentViewerProps, DocumentMode, PageLayout, Signature, SupportedFileType, DocumentViewerSaveMeta } from './types';\n","\"use client\";\r\n\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { RichTextEditor } from \"../editors/RichTextEditor\";\r\nimport { SpreadsheetEditor } from \"../editors/SpreadsheetEditor\";\r\nimport { ImageRenderer } from \"../renderers/ImageRenderer\";\r\nimport { PdfRenderer } from \"../renderers/PdfRenderer\";\r\nimport { PptxRenderer } from \"../renderers/PptxRenderer\";\r\nimport type {\r\n DocumentMode,\r\n DocumentViewerProps,\r\n SupportedFileType,\r\n Signature, // Import Signature from here\r\n} from \"../types\";\r\nimport { resolveSource } from \"../utils/fileSource\";\r\n\r\n// Components\r\nimport { ThumbnailsSidebar } from \"./ThumbnailsSidebar\";\r\nimport { Toolbar } from \"./Toolbar\";\r\nimport { SignaturePanel } from \"./SignaturePanel\";\r\n\r\nexport function DocumentViewer(props: DocumentViewerProps) {\r\n // --- State & Config ---\r\n const mode: DocumentMode = props.mode ?? \"view\";\r\n const theme = props.theme ?? \"light\";\r\n\r\n // Layout State\r\n const [layout, setLayout] = useState<\"single\" | \"side-by-side\">(\r\n props.defaultLayout ?? \"single\",\r\n );\r\n const [showThumbnails, setShowThumbnails] = useState(true);\r\n const [showSignatures, setShowSignatures] = useState(false); // [2] New State for Right Sidebar\r\n\r\n // Data Loading State\r\n const [resolved, setResolved] = useState<{\r\n fileType: SupportedFileType;\r\n fileName: string;\r\n url?: string;\r\n arrayBuffer?: ArrayBuffer;\r\n } | null>(null);\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string>(\"\");\r\n\r\n // Viewer Context (Page Counts, etc)\r\n const [pageCount, setPageCount] = useState(1);\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [thumbnails, setThumbnails] = useState<string[]>([]);\r\n\r\n // --- Effects ---\r\n\r\n // 1. Resolve File Source\r\n useEffect(() => {\r\n let active = true;\r\n\r\n const loadFile = async () => {\r\n setLoading(true);\r\n setError(\"\");\r\n setResolved(null);\r\n\r\n try {\r\n if (mode === \"create\") {\r\n // Handle creation mode\r\n setResolved({\r\n fileType: (props.fileType ?? \"docx\") as SupportedFileType,\r\n fileName: props.fileName ?? \"Untitled\",\r\n });\r\n } else {\r\n // Handle view/edit mode\r\n const res = await resolveSource({\r\n fileUrl: props.fileUrl,\r\n base64: props.base64,\r\n blob: props.blob,\r\n fileName: props.fileName,\r\n fileType: props.fileType,\r\n });\r\n if (active) setResolved(res);\r\n }\r\n } catch (err: any) {\r\n if (active) setError(err.message || \"Failed to load document\");\r\n } finally {\r\n if (active) setLoading(false);\r\n }\r\n };\r\n\r\n loadFile();\r\n return () => {\r\n active = false;\r\n };\r\n }, [props.fileUrl, props.base64, props.blob, mode]);\r\n\r\n // --- Signature Handler [3] ---\r\n const handleSignatureSelect = (sig: Signature) => {\r\n // Return value to user via prop if available\r\n if (props.onSign) {\r\n props.onSign(sig);\r\n }\r\n\r\n // Logic to place signature on document would go here\r\n console.log(\"Signature selected:\", sig);\r\n\r\n // Optional: Auto-close sidebar after selection\r\n // setShowSignatures(false);\r\n };\r\n\r\n // --- Render Helpers ---\r\n\r\n const renderContent = () => {\r\n if (error) {\r\n return (\r\n <div className=\"hv-error-banner\">\r\n <strong>Error loading document</strong>\r\n <p>{error}</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (loading || !resolved) {\r\n return (\r\n <div className=\"hv-loader\">\r\n <div className=\"hv-spinner\" />\r\n <span>Loading Document...</span>\r\n </div>\r\n );\r\n }\r\n\r\n const commonProps = {\r\n arrayBuffer: resolved.arrayBuffer,\r\n fileName: resolved.fileName,\r\n fileType: resolved.fileType,\r\n layout,\r\n currentPage,\r\n onPageCount: setPageCount,\r\n onCurrentPageChange: setCurrentPage,\r\n onThumbs: setThumbnails,\r\n };\r\n\r\n switch (resolved.fileType) {\r\n case \"pdf\":\r\n return <PdfRenderer url={resolved.url} {...commonProps} />;\r\n\r\n case \"docx\":\r\n case \"doc\":\r\n case \"rtf\":\r\n case \"txt\":\r\n case \"md\":\r\n return <RichTextEditor mode={mode} {...commonProps} />;\r\n\r\n case \"xlsx\":\r\n case \"csv\":\r\n case \"xls\":\r\n return <SpreadsheetEditor mode={mode} {...commonProps} />;\r\n\r\n case \"pptx\":\r\n case \"ppt\":\r\n return <PptxRenderer {...commonProps} />;\r\n\r\n case \"jpg\":\r\n case \"jpeg\":\r\n case \"png\":\r\n case \"gif\":\r\n case \"bmp\":\r\n case \"svg\":\r\n return <ImageRenderer {...commonProps} fileType={resolved.fileType} />;\r\n\r\n default:\r\n return (\r\n <div className=\"hv-error-banner\">\r\n Unsupported file type: {resolved.fileType}\r\n </div>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"hv-root\" data-hv-theme={theme}>\r\n {/* 1. Toolbar */}\r\n <Toolbar\r\n fileName={resolved?.fileName}\r\n pageCount={pageCount}\r\n currentPage={currentPage}\r\n onPageChange={setCurrentPage}\r\n layout={layout}\r\n onLayoutChange={setLayout}\r\n // Left Sidebar (Thumbnails)\r\n showThumbnails={showThumbnails}\r\n onToggleThumbnails={() => setShowThumbnails(!showThumbnails)}\r\n // Right Sidebar (Signatures) - [4] Replaced Download with Signature Toggle\r\n showSignatures={showSignatures}\r\n onToggleSignatures={() => setShowSignatures(!showSignatures)}\r\n />\r\n\r\n <div className=\"hv-shell\">\r\n {/* 2. Left Sidebar (Thumbnails) */}\r\n <ThumbnailsSidebar\r\n isOpen={showThumbnails}\r\n thumbnails={thumbnails}\r\n currentPage={currentPage}\r\n onSelectPage={setCurrentPage}\r\n />\r\n\r\n {/* 3. Main Stage */}\r\n <main className=\"hv-main\">{renderContent()}</main>\r\n\r\n {/* 4. Right Sidebar (Signatures) - [5] Added Component */}\r\n <SignaturePanel\r\n isOpen={showSignatures}\r\n onClose={() => setShowSignatures(false)}\r\n onSelectSignature={handleSignatureSelect}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport mammoth from \"mammoth\";\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport MarkdownIt from \"markdown-it\";\r\nimport type { DocumentMode, SupportedFileType } from \"../types\";\r\nimport { sanitizeHtml } from \"../utils/sanitize\";\r\n\r\ninterface RichTextEditorProps {\r\n mode: DocumentMode;\r\n arrayBuffer?: ArrayBuffer;\r\n fileName: string;\r\n // We need fileType to know how to parse (md vs docx)\r\n fileType?: SupportedFileType;\r\n layout: \"single\" | \"side-by-side\";\r\n currentPage: number;\r\n onPageCount: (n: number) => void;\r\n onCurrentPageChange: (p: number) => void;\r\n onThumbs: (thumbs: string[]) => void;\r\n}\r\n\r\nexport function RichTextEditor(props: RichTextEditorProps) {\r\n const editorRef = useRef<HTMLDivElement>(null);\r\n const [contentHtml, setContentHtml] = useState<string>(\"\");\r\n const [loading, setLoading] = useState(false);\r\n\r\n // Initialize Markdown parser once\r\n const mdParser = useRef(new MarkdownIt({ html: true, linkify: true }));\r\n\r\n useEffect(() => {\r\n const loadDoc = async () => {\r\n if (!props.arrayBuffer) return;\r\n setLoading(true);\r\n\r\n try {\r\n // 1. Handle DOCX\r\n if (props.fileName.endsWith(\".docx\") || props.fileType === \"docx\") {\r\n const result = await mammoth.convertToHtml({\r\n arrayBuffer: props.arrayBuffer,\r\n });\r\n setContentHtml(sanitizeHtml(result.value));\r\n }\r\n // 2. Handle Markdown / Text\r\n else {\r\n // Decode the buffer to string\r\n const decoder = new TextDecoder(\"utf-8\");\r\n const text = decoder.decode(props.arrayBuffer);\r\n\r\n if (props.fileName.endsWith(\".md\") || props.fileType === \"md\") {\r\n // Render Markdown to HTML\r\n const html = mdParser.current.render(text);\r\n setContentHtml(sanitizeHtml(html));\r\n } else {\r\n // Plain text: wrap in pre/p\r\n setContentHtml(\r\n `<pre style=\"white-space: pre-wrap; font-family: monospace;\">${text}</pre>`,\r\n );\r\n }\r\n }\r\n\r\n props.onPageCount(1);\r\n } catch (err) {\r\n console.error(\"Doc Conversion failed\", err);\r\n setContentHtml(\"<p style='color:red'>Error parsing document.</p>\");\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n loadDoc();\r\n }, [props.arrayBuffer, props.fileName, props.fileType]);\r\n\r\n return (\r\n <div className=\"hv-view-single\">\r\n <div className=\"hv-page-container\">\r\n {loading ? (\r\n <div className=\"p-12 text-center text-gray-400\">\r\n Processing text...\r\n </div>\r\n ) : (\r\n <div\r\n ref={editorRef}\r\n className=\"hv-docx-content\"\r\n contentEditable={props.mode === \"edit\" || props.mode === \"create\"}\r\n dangerouslySetInnerHTML={{ __html: contentHtml }}\r\n suppressContentEditableWarning\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import DOMPurify from 'dompurify';\n\n/**\n * Sanitize HTML using DOMPurify for safe rendering.\n * @param html - The HTML string to sanitize\n * @returns Safe HTML string\n */\nexport function sanitizeHtml(html: string): string {\n // DOMPurify is safe to call in the browser. For SSR, callers should only run after mount.\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: ['target', 'rel'],\n });\n}\n","\"use client\";\n\nimport React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from \"react\";\nimport * as XLSX from \"xlsx\";\nimport type { DocumentMode, SupportedFileType } from \"../types\";\n\nexport interface SpreadsheetEditorHandle {\n save: (exportPdf?: boolean) => Promise<void>;\n}\n\ninterface SpreadsheetEditorProps {\n mode: DocumentMode;\n fileName: string;\n arrayBuffer?: ArrayBuffer;\n layout?: \"single\" | \"side-by-side\";\n onSave?: (base64: string, meta: any) => void;\n}\n\nexport const SpreadsheetEditor = forwardRef<\n SpreadsheetEditorHandle,\n SpreadsheetEditorProps\n>(function SpreadsheetEditor(props, ref) {\n const readonly = props.mode === \"view\";\n const [data, setData] = useState<string[][]>([]);\n const [cols, setCols] = useState<string[]>([]);\n\n useEffect(() => {\n if (!props.arrayBuffer) return;\n\n try {\n const wb = XLSX.read(props.arrayBuffer, { type: \"array\" });\n const wsName = wb.SheetNames[0];\n const ws = wb.Sheets[wsName];\n\n const jsonData = XLSX.utils.sheet_to_json(ws, {\n header: 1,\n defval: \"\",\n }) as string[][];\n\n const minRows = 40;\n const minCols = 15;\n\n const rows = Math.max(minRows, jsonData.length);\n const colCount = Math.max(minCols, jsonData[0]?.length || 0);\n\n const normalized = Array.from({ length: rows }, (_, r) => {\n const row = jsonData[r] || [];\n return Array.from({ length: colCount }, (_, c) =>\n row[c] !== undefined && row[c] !== null ? String(row[c]) : \"\",\n );\n });\n\n setData(normalized);\n\n const headers = Array.from({ length: colCount }, (_, i) => {\n let letter = \"\";\n let temp = i;\n while (temp >= 0) {\n letter = String.fromCharCode((temp % 26) + 65) + letter;\n temp = Math.floor(temp / 26) - 1;\n }\n return letter;\n });\n setCols(headers);\n } catch (e) {\n console.error(\"Spreadsheet load error:\", e);\n }\n }, [props.arrayBuffer]);\n\n async function save(exportPdf?: boolean) {\n if (!props.onSave) return;\n const ws = XLSX.utils.aoa_to_sheet(data);\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws, \"Sheet1\");\n const out = XLSX.write(wb, { type: \"array\", bookType: \"xlsx\" });\n\n const bytes = new Uint8Array(out);\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n props.onSave(btoa(binary), {\n fileName: props.fileName,\n fileType: \"xlsx\",\n exportedAsPdf: !!exportPdf,\n });\n }\n\n useImperativeHandle(ref, () => ({ save }));\n\n return (\n <div className=\"hv-view-single\">\n <div\n className=\"hv-page-container\"\n style={{\n width: \"auto\",\n maxWidth: \"95vw\",\n minWidth: \"800px\",\n padding: 0,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* Toolbar / Formula Bar */}\n <div\n style={{\n background: \"#f8f9fa\",\n borderBottom: \"1px solid #e2e8f0\",\n padding: \"8px 16px\",\n fontSize: \"12px\",\n color: \"#64748b\",\n display: \"flex\",\n gap: \"12px\",\n flexShrink: 0,\n }}\n >\n <span>fx</span>\n <div\n style={{\n background: \"white\",\n border: \"1px solid #cbd5e1\",\n flex: 1,\n height: \"18px\",\n borderRadius: \"2px\",\n }}\n />\n </div>\n\n {/* Main Grid Container */}\n <div\n style={{\n overflow: \"auto\",\n // FIX: Dynamic height ensures bottom isn't cut off on small screens\n maxHeight: \"calc(100vh - 140px)\",\n minHeight: \"400px\",\n position: \"relative\",\n // FIX: Padding prevents border clipping (first row/col edges)\n padding: \"1px\",\n }}\n >\n <table\n style={{\n borderCollapse: \"collapse\",\n minWidth: \"100%\",\n tableLayout: \"fixed\",\n }}\n >\n <thead>\n <tr>\n {/* Corner Cell */}\n <th\n style={{\n width: \"40px\",\n background: \"#f1f5f9\",\n border: \"1px solid #cbd5e1\",\n position: \"sticky\",\n top: 0,\n left: 0,\n zIndex: 30, // Increased zIndex\n }}\n />\n\n {/* Column Headers */}\n {cols.map((col, i) => (\n <th\n key={i}\n style={{\n minWidth: \"100px\",\n background: \"#f1f5f9\",\n border: \"1px solid #cbd5e1\",\n color: \"#475569\",\n fontSize: \"11px\",\n fontWeight: 600,\n padding: \"4px\",\n position: \"sticky\",\n top: 0,\n zIndex: 20, // Increased zIndex\n }}\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row, r) => (\n <tr key={r}>\n {/* Row Header (1, 2, 3...) */}\n <td\n style={{\n background: \"#f1f5f9\",\n border: \"1px solid #cbd5e1\",\n textAlign: \"center\",\n fontSize: \"11px\",\n color: \"#64748b\",\n position: \"sticky\",\n left: 0,\n zIndex: 20, // Increased zIndex to stay above cells\n }}\n >\n {r + 1}\n </td>\n\n {/* Cells */}\n {row.map((cell, c) => (\n <td\n key={c}\n contentEditable={!readonly}\n suppressContentEditableWarning\n onBlur={(e) => {\n const val = e.currentTarget.innerText;\n setData((prev) => {\n const next = [...prev];\n next[r] = [...next[r]];\n next[r][c] = val;\n return next;\n });\n }}\n style={{\n border: \"1px solid #e2e8f0\",\n padding: \"4px 8px\",\n fontSize: \"13px\",\n color: \"#1e293b\",\n minWidth: \"100px\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n outline: \"none\",\n zIndex: 1,\n }}\n >\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n );\n});\n","\"use client\";\r\n\r\nimport React, { useEffect, useMemo, useState } from \"react\";\r\nimport type { SupportedFileType } from \"../types\";\r\n\r\n/**\r\n * Image renderer for DocumentViewer.\r\n * Supports PNG, JPG, SVG, etc. with zoom controls.\r\n */\r\nexport function ImageRenderer({\r\n arrayBuffer,\r\n fileType,\r\n fileName,\r\n}: {\r\n /** Image file as ArrayBuffer (optional) */\r\n arrayBuffer?: ArrayBuffer;\r\n /** File type (e.g. 'png', 'jpg', 'svg') */\r\n fileType: SupportedFileType;\r\n /** File name for display */\r\n fileName: string;\r\n}) {\r\n const [zoom, setZoom] = useState(1);\r\n const url = useMemo(() => {\r\n if (!arrayBuffer) {\r\n return undefined;\r\n }\r\n const mime =\r\n fileType === \"svg\"\r\n ? \"image/svg+xml\"\r\n : fileType === \"png\"\r\n ? \"image/png\"\r\n : \"image/jpeg\";\r\n return URL.createObjectURL(new Blob([arrayBuffer], { type: mime }));\r\n }, [arrayBuffer, fileType]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (url) {\r\n URL.revokeObjectURL(url);\r\n }\r\n };\r\n }, [url]);\r\n\r\n return (\r\n <div className=\"flex flex-col h-full bg-gray-50\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-6 py-4 bg-white border-b border-gray-200\">\r\n <h2 className=\"text-sm font-medium text-gray-700 truncate max-w-md\">\r\n {fileName}\r\n </h2>\r\n\r\n {/* Zoom Controls */}\r\n <div className=\"flex items-center gap-3 bg-gray-100 rounded-lg p-1\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setZoom((z) => Math.max(0.25, z - 0.25))}\r\n className=\"w-9 h-9 flex items-center justify-center rounded-md bg-white hover:bg-gray-50 text-gray-700 transition-all shadow-sm hover:shadow\"\r\n aria-label=\"Zoom out\"\r\n >\r\n <svg\r\n className=\"w-4 h-4\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M20 12H4\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <span className=\"text-sm font-semibold text-gray-700 min-w-[3.5rem] text-center px-2\">\r\n {Math.round(zoom * 100)}%\r\n </span>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setZoom((z) => Math.min(4, z + 0.25))}\r\n className=\"w-9 h-9 flex items-center justify-center rounded-md bg-white hover:bg-gray-50 text-gray-700 transition-all shadow-sm hover:shadow\"\r\n aria-label=\"Zoom in\"\r\n >\r\n <svg\r\n className=\"w-4 h-4\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M12 4v16m8-8H4\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Image Container */}\r\n <div className=\"flex-1 overflow-auto flex items-center justify-center p-8\">\r\n {!arrayBuffer && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto mb-3 rounded-full bg-gray-200 flex items-center justify-center\">\r\n <svg\r\n className=\"w-8 h-8 text-gray-400\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n </div>\r\n <p className=\"text-sm text-gray-500\">No image data provided</p>\r\n </div>\r\n )}\r\n\r\n {arrayBuffer && !url && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto mb-3 rounded-full bg-red-100 flex items-center justify-center\">\r\n <svg\r\n className=\"w-8 h-8 text-red-500\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\r\n />\r\n </svg>\r\n </div>\r\n <p className=\"text-sm text-gray-600\">Failed to load image</p>\r\n </div>\r\n )}\r\n\r\n {url && (\r\n <div\r\n style={{ transform: `scale(${zoom})` }}\r\n className=\"transition-transform duration-200 origin-center\"\r\n >\r\n <img\r\n src={url}\r\n alt={fileName}\r\n style={{ transform: `scale(${zoom})` }}\r\n className=\"max-w-full h-auto rounded-lg shadow-lg transition-transform duration-200\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n getDocument,\r\n GlobalWorkerOptions,\r\n type PDFDocumentProxy,\r\n} from \"pdfjs-dist\";\r\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport type { PageLayout } from \"../types\";\r\n\r\n// FIX 1: Updated version to match the error message (4.10.38)\r\nconst PDF_WORKER_URL =\r\n \"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.10.38/pdf.worker.min.mjs\";\r\n\r\ninterface PdfRendererProps {\r\n url?: string;\r\n arrayBuffer?: ArrayBuffer;\r\n layout: PageLayout;\r\n currentPage: number;\r\n onPageCount: (n: number) => void;\r\n onCurrentPageChange: (p: number) => void;\r\n onThumbs: (thumbs: string[]) => void;\r\n}\r\n\r\nexport function PdfRenderer(props: PdfRendererProps) {\r\n const { url, arrayBuffer, layout, currentPage } = props;\r\n const [doc, setDoc] = useState<PDFDocumentProxy | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n // Ensure worker is set up\r\n if (!GlobalWorkerOptions.workerSrc) {\r\n GlobalWorkerOptions.workerSrc = PDF_WORKER_URL;\r\n }\r\n\r\n let active = true;\r\n\r\n const loadPdf = async () => {\r\n // If no source, do nothing\r\n if (!url && !arrayBuffer) return;\r\n\r\n setError(null);\r\n\r\n try {\r\n // FIX 2: Clone the ArrayBuffer!\r\n // PDF.js transfers the buffer to the worker, which \"detaches\" (empties) the original.\r\n // We pass a slice (copy) so the original data in DocumentViewer remains valid.\r\n const dataSource = arrayBuffer\r\n ? { data: arrayBuffer.slice(0) }\r\n : { url: url! };\r\n\r\n const loadingTask = getDocument(dataSource);\r\n\r\n const pdf = await loadingTask.promise;\r\n\r\n if (active) {\r\n setDoc(pdf);\r\n props.onPageCount(pdf.numPages);\r\n generateThumbnails(pdf);\r\n }\r\n } catch (err: any) {\r\n // Quietly handle errors (e.g. password protected files)\r\n console.error(\"PDF Load Error:\", err);\r\n if (active) setError(err.message || \"Failed to load PDF\");\r\n }\r\n };\r\n\r\n loadPdf();\r\n return () => {\r\n active = false;\r\n };\r\n }, [url, arrayBuffer]); // Re-run if file changes\r\n\r\n const generateThumbnails = async (pdf: PDFDocumentProxy) => {\r\n try {\r\n const thumbs: string[] = [];\r\n const num = Math.min(pdf.numPages, 5);\r\n for (let i = 1; i <= num; i++) {\r\n const page = await pdf.getPage(i);\r\n const viewport = page.getViewport({ scale: 0.2 });\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = viewport.width;\r\n canvas.height = viewport.height;\r\n\r\n const ctx = canvas.getContext(\"2d\");\r\n if (ctx) {\r\n await page.render({ canvasContext: ctx, viewport }).promise;\r\n thumbs.push(canvas.toDataURL());\r\n }\r\n }\r\n props.onThumbs(thumbs);\r\n } catch (e) {\r\n /* ignore */\r\n }\r\n };\r\n\r\n const pagesToRender = useMemo(() => {\r\n if (!doc) return [];\r\n const p = Math.max(1, Math.min(currentPage, doc.numPages));\r\n if (layout === \"side-by-side\" && doc.numPages > 1) {\r\n if (p === 1) return [1];\r\n const left = p % 2 === 0 ? p : p - 1;\r\n return left + 1 <= doc.numPages ? [left, left + 1] : [left];\r\n }\r\n return [p];\r\n }, [doc, currentPage, layout]);\r\n\r\n if (error) {\r\n return (\r\n <div\r\n className=\"hv-page-container\"\r\n style={{ padding: \"32px\", textAlign: \"center\", color: \"#dc2626\" }}\r\n >\r\n <strong>Error loading PDF</strong>\r\n <p className=\"text-sm mt-2\">{error}</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={`hv-doc-scroll ${layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"}`}\r\n >\r\n {pagesToRender.map((page) => (\r\n <PdfPage key={page} doc={doc} pageNum={page} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction PdfPage({\r\n doc,\r\n pageNum,\r\n}: {\r\n doc: PDFDocumentProxy | null;\r\n pageNum: number;\r\n}) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n\r\n useEffect(() => {\r\n if (!doc || !canvasRef.current) return;\r\n let active = true;\r\n\r\n const render = async () => {\r\n try {\r\n const page = await doc.getPage(pageNum);\r\n if (!active) return;\r\n\r\n const scale = 1.5; // High fidelity\r\n const viewport = page.getViewport({ scale });\r\n const canvas = canvasRef.current!;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n canvas.width = viewport.width;\r\n canvas.height = viewport.height;\r\n\r\n canvas.style.width = `${viewport.width / scale}px`;\r\n canvas.style.height = `${viewport.height / scale}px`;\r\n\r\n await page.render({ canvasContext: ctx, viewport }).promise;\r\n } catch (e) {\r\n console.error(\"Page render error:\", e);\r\n }\r\n };\r\n render();\r\n return () => {\r\n active = false;\r\n };\r\n }, [doc, pageNum]);\r\n\r\n return (\r\n <div\r\n className=\"hv-page-container\"\r\n style={{\r\n minHeight: \"600px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n <canvas ref={canvasRef} className=\"hv-pdf-canvas\" />\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useMemo, useState } from \"react\";\r\nimport JSZip from \"jszip\";\r\nimport type { PageLayout } from \"../types\";\r\n\r\n// --- XML Parsing Helpers (Preserved from your original code) ---\r\nconst NS_P = \"http://schemas.openxmlformats.org/presentationml/2006/main\";\r\nconst NS_A = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\r\n\r\nfunction parseColor(solidFill: Element | null): string | undefined {\r\n if (!solidFill) return undefined;\r\n const srgbClr = solidFill.getElementsByTagNameNS(NS_A, \"srgbClr\")[0];\r\n if (srgbClr) {\r\n const val = srgbClr.getAttribute(\"val\");\r\n return val ? `#${val}` : undefined;\r\n }\r\n const schemeClr = solidFill.getElementsByTagNameNS(NS_A, \"schemeClr\")[0];\r\n if (schemeClr) {\r\n const val = schemeClr.getAttribute(\"val\");\r\n const colorMap: Record<string, string> = {\r\n tx1: \"#000000\",\r\n bg1: \"#FFFFFF\",\r\n tx2: \"#1F1F1F\",\r\n accent1: \"#4472C4\",\r\n accent2: \"#ED7D31\",\r\n accent3: \"#A5A5A5\",\r\n accent4: \"#FFC000\",\r\n accent5: \"#5B9BD5\",\r\n accent6: \"#70AD47\",\r\n };\r\n return colorMap[val || \"\"] || \"#000000\";\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction parseSlideXml(xml: string) {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(xml, \"application/xml\");\r\n\r\n let title: string | undefined;\r\n let titleColor: string | undefined;\r\n let bgColor: string | undefined;\r\n\r\n const body: Array<{\r\n text: string;\r\n color?: string;\r\n isBold?: boolean;\r\n isItalic?: boolean;\r\n }> = [];\r\n\r\n // Background\r\n const bgElements = doc.getElementsByTagNameNS(NS_P, \"bg\");\r\n if (bgElements.length > 0) {\r\n const bgPr = bgElements[0].getElementsByTagNameNS(NS_P, \"bgPr\")[0];\r\n if (bgPr) {\r\n const solidFill = bgPr.getElementsByTagNameNS(NS_A, \"solidFill\")[0];\r\n bgColor = parseColor(solidFill);\r\n }\r\n }\r\n\r\n // Shapes & Text\r\n const shapes = Array.from(doc.getElementsByTagNameNS(NS_P, \"sp\"));\r\n shapes.forEach((shape) => {\r\n const nvSpPr = shape.getElementsByTagNameNS(NS_P, \"nvSpPr\")[0];\r\n const cNvPr = nvSpPr?.getElementsByTagNameNS(NS_P, \"cNvPr\")[0];\r\n const name = cNvPr?.getAttribute(\"name\")?.toLowerCase() || \"\";\r\n\r\n const isTitle = name.includes(\"title\") || name.includes(\"header\");\r\n\r\n const txBody = shape.getElementsByTagNameNS(NS_P, \"txBody\")[0];\r\n if (!txBody) return;\r\n\r\n const paragraphs = Array.from(txBody.getElementsByTagNameNS(NS_A, \"p\"));\r\n paragraphs.forEach((p) => {\r\n const runs = Array.from(p.getElementsByTagNameNS(NS_A, \"r\"));\r\n runs.forEach((run) => {\r\n const textEl = run.getElementsByTagNameNS(NS_A, \"t\")[0];\r\n const text = textEl?.textContent?.trim() || \"\";\r\n if (!text) return;\r\n\r\n const rPr = run.getElementsByTagNameNS(NS_A, \"rPr\")[0];\r\n let color: string | undefined;\r\n let isBold = false;\r\n let isItalic = false;\r\n\r\n if (rPr) {\r\n isBold = rPr.getAttribute(\"b\") === \"1\";\r\n isItalic = rPr.getAttribute(\"i\") === \"1\";\r\n color = parseColor(rPr.getElementsByTagNameNS(NS_A, \"solidFill\")[0]);\r\n }\r\n\r\n if (isTitle && !title) {\r\n title = text;\r\n titleColor = color;\r\n } else {\r\n body.push({ text, color, isBold, isItalic });\r\n }\r\n });\r\n });\r\n });\r\n\r\n return { title, titleColor, body, bgColor };\r\n}\r\n\r\n// --- Main Component ---\r\ninterface PptxRendererProps {\r\n arrayBuffer?: ArrayBuffer;\r\n fileName?: string;\r\n layout: PageLayout;\r\n currentPage: number;\r\n onCurrentPageChange: (p: number) => void;\r\n onPageCount: (n: number) => void;\r\n onThumbs: (thumbs: string[]) => void;\r\n}\r\n\r\nexport function PptxRenderer(props: PptxRendererProps) {\r\n const [slides, setSlides] = useState<any[]>([]);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!props.arrayBuffer) return;\r\n\r\n const loadPptx = async () => {\r\n try {\r\n const zip = await JSZip.loadAsync(props.arrayBuffer!);\r\n const slidePaths = Object.keys(zip.files)\r\n .filter((p) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(p))\r\n .sort((a, b) => {\r\n // Natural sort (slide1, slide2, slide10)\r\n const numA = parseInt(a.match(/\\d+/)![0]);\r\n const numB = parseInt(b.match(/\\d+/)![0]);\r\n return numA - numB;\r\n });\r\n\r\n const parsedSlides = [];\r\n for (const path of slidePaths) {\r\n const xml = await zip.files[path].async(\"string\");\r\n parsedSlides.push(parseSlideXml(xml));\r\n }\r\n\r\n setSlides(parsedSlides);\r\n props.onPageCount(parsedSlides.length);\r\n\r\n // Generate SVG Thumbs\r\n const thumbs = parsedSlides.map(\r\n (_, i) =>\r\n `data:image/svg+xml;charset=utf-8,${encodeURIComponent(\r\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"56\"><rect width=\"100%\" height=\"100%\" fill=\"#4f46e5\"/><text x=\"50%\" y=\"50%\" fill=\"white\" font-size=\"20\" text-anchor=\"middle\" dy=\".3em\">${i + 1}</text></svg>`,\r\n )}`,\r\n );\r\n props.onThumbs(thumbs);\r\n } catch (err: any) {\r\n setError(err.message || \"Failed to parse PPTX\");\r\n }\r\n };\r\n\r\n loadPptx();\r\n }, [props.arrayBuffer]);\r\n\r\n const pagesToShow = useMemo(() => {\r\n if (slides.length === 0) return [];\r\n const validPage = Math.max(1, Math.min(props.currentPage, slides.length));\r\n\r\n if (props.layout === \"side-by-side\" && slides.length > 1) {\r\n if (validPage === 1) return [1];\r\n const left = validPage % 2 === 0 ? validPage : validPage - 1;\r\n return [left, left + 1].filter((p) => p <= slides.length);\r\n }\r\n return [validPage];\r\n }, [slides.length, props.currentPage, props.layout]);\r\n\r\n if (error) return <div className=\"text-red-500 p-8 text-center\">{error}</div>;\r\n\r\n return (\r\n <div\r\n className={\r\n props.layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"\r\n }\r\n >\r\n {pagesToShow.map((p) => {\r\n const slide = slides[p - 1];\r\n if (!slide) return null;\r\n\r\n return (\r\n <div\r\n key={p}\r\n className=\"hv-page-container\"\r\n style={{\r\n width: \"960px\", // Standard HD slide width\r\n aspectRatio: \"16/9\",\r\n padding: \"48px\",\r\n backgroundColor: slide.bgColor || \"#ffffff\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\",\r\n position: \"relative\", // For absolute positioning if we added it later\r\n }}\r\n >\r\n {/* Slide Title */}\r\n {slide.title && (\r\n <h1\r\n style={{\r\n fontSize: \"42px\",\r\n marginBottom: \"32px\",\r\n fontWeight: \"bold\",\r\n color: slide.titleColor || \"#1a202c\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n {slide.title}\r\n </h1>\r\n )}\r\n\r\n {/* Slide Body */}\r\n <div\r\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"16px\" }}\r\n >\r\n {slide.body.map((item: any, i: number) => (\r\n <div\r\n key={i}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: \"12px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"8px\",\r\n height: \"8px\",\r\n background: item.color || \"#cbd5e1\",\r\n borderRadius: \"50%\",\r\n marginTop: \"12px\",\r\n flexShrink: 0,\r\n }}\r\n />\r\n <p\r\n style={{\r\n fontSize: \"24px\",\r\n color: item.color || \"#4a5568\",\r\n fontWeight: item.isBold ? \"bold\" : \"normal\",\r\n fontStyle: item.isItalic ? \"italic\" : \"normal\",\r\n margin: 0,\r\n }}\r\n >\r\n {item.text}\r\n </p>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Slide Footer Number */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"20px\",\r\n right: \"30px\",\r\n color: \"#cbd5e1\",\r\n fontWeight: \"bold\",\r\n }}\r\n >\r\n {p}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import type { SupportedFileType } from '../types';\n\n/**\n * Guess the file type from a file name or explicit type.\n * @param name - The file name (optional)\n * @param explicit - Explicit file type (optional)\n * @returns SupportedFileType\n */\nexport function guessFileType(\n name?: string,\n explicit?: SupportedFileType,\n): SupportedFileType {\n if (explicit) { return explicit; }\n const ext = (name?.split('.').pop() || '').toLowerCase();\n const allowed: SupportedFileType[] = [\n 'pdf',\n 'md',\n 'docx',\n 'xlsx',\n 'pptx',\n 'txt',\n 'png',\n 'jpg',\n 'svg',\n ];\n return (allowed as string[]).includes(ext)\n ? (ext as SupportedFileType)\n : 'txt';\n}\n\n/**\n * Convert an ArrayBuffer to a base64 string.\n * @param buf - The ArrayBuffer to convert\n * @returns base64-encoded string\n */\nexport function arrayBufferToBase64(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n let binary = '';\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunk));\n }\n return btoa(binary);\n}\n\n/**\n * Convert a base64 string to an ArrayBuffer.\n * @param b64 - The base64 string\n * @returns Promise<ArrayBuffer>\n */\nexport async function base64ToArrayBuffer(b64: string): Promise<ArrayBuffer> {\n const bin = atob(b64);\n const len = bin.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) { bytes[i] = bin.charCodeAt(i); }\n return bytes.buffer;\n}\n\n/**\n * Resolve a file source from a URL, base64, or Blob, with progress callback.\n * @param args - fileUrl, base64, or Blob, plus optional fileName, fileType, and onProgress\n * @returns Promise<{ fileType, fileName, arrayBuffer, url? }>\n */\nexport async function resolveSource(args: {\n fileUrl?: string;\n base64?: string;\n blob?: Blob;\n fileName?: string;\n fileType?: SupportedFileType;\n onProgress?: (loaded: number, total?: number) => void;\n}): Promise<{\n fileType: SupportedFileType;\n fileName: string;\n arrayBuffer: ArrayBuffer;\n url?: string;\n}> {\n const fileType = guessFileType(args.fileName, args.fileType);\n const fileName = args.fileName ?? `document.${fileType}`;\n\n if (args.blob) {\n const ab = await args.blob.arrayBuffer();\n const url = URL.createObjectURL(args.blob);\n return { fileType, fileName, arrayBuffer: ab, url };\n }\n\n if (args.base64) {\n const ab = await base64ToArrayBuffer(args.base64);\n return { fileType, fileName, arrayBuffer: ab };\n }\n\n if (!args.fileUrl) {\n throw new Error('No file source provided. Use fileUrl, blob, or base64.');\n }\n\n const res = await fetch(args.fileUrl);\n if (!res.ok) { throw new Error(`Failed to fetch file (${res.status})`); }\n\n const total = Number(res.headers.get('content-length') || '') || undefined;\n if (!res.body) {\n const ab = await res.arrayBuffer();\n args.onProgress?.(ab.byteLength, total);\n return { fileType, fileName, arrayBuffer: ab, url: args.fileUrl };\n }\n\n const reader = res.body.getReader();\n const chunks: Uint8Array[] = [];\n let loaded = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) { break; }\n if (value) {\n chunks.push(value);\n loaded += value.length;\n args.onProgress?.(loaded, total);\n }\n }\n const out = new Uint8Array(loaded);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.length;\n }\n return { fileType, fileName, arrayBuffer: out.buffer, url: args.fileUrl };\n}\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef } from \"react\";\r\n\r\ninterface ThumbnailsSidebarProps {\r\n isOpen: boolean;\r\n thumbnails: Array<string | undefined>; // Base64 strings\r\n currentPage: number;\r\n onSelectPage: (page: number) => void;\r\n}\r\n\r\nexport function ThumbnailsSidebar(props: ThumbnailsSidebarProps) {\r\n const { isOpen, thumbnails, currentPage, onSelectPage } = props;\r\n const activeRef = useRef<HTMLDivElement>(null);\r\n\r\n // Auto-scroll the sidebar to keep the current page thumbnail in view\r\n useEffect(() => {\r\n if (activeRef.current) {\r\n activeRef.current.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"nearest\",\r\n });\r\n }\r\n }, [currentPage, isOpen]);\r\n\r\n return (\r\n <div className={`hv-sidebar ${!isOpen ? \"collapsed\" : \"\"}`}>\r\n <div className=\"hv-thumb-list\">\r\n {thumbnails.map((src, index) => {\r\n const pageNum = index + 1;\r\n const isActive = pageNum === currentPage;\r\n\r\n return (\r\n <div\r\n key={pageNum}\r\n ref={isActive ? activeRef : null}\r\n className={`hv-thumb-item ${isActive ? \"active\" : \"\"}`}\r\n onClick={() => onSelectPage(pageNum)}\r\n >\r\n <div className=\"hv-thumb-preview\">\r\n {src ? (\r\n <img\r\n src={src}\r\n alt={`Page ${pageNum}`}\r\n className=\"hv-thumb-img\"\r\n />\r\n ) : (\r\n // Skeleton loader state for thumbnail\r\n <div className=\"w-full h-full bg-gray-100 animate-pulse flex items-center justify-center\">\r\n <span className=\"text-xs text-gray-300\">...</span>\r\n </div>\r\n )}\r\n </div>\r\n <span className=\"hv-thumb-label\">Page {pageNum}</span>\r\n </div>\r\n );\r\n })}\r\n\r\n {thumbnails.length === 0 && (\r\n <div className=\"text-center p-4 text-xs text-gray-400\">\r\n No previews available\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n ChevronLeft,\r\n ChevronRight,\r\n Grid2X2,\r\n LayoutTemplate,\r\n PanelLeftClose,\r\n PanelLeftOpen,\r\n PenLine, // Changed from Download\r\n PanelRightClose,\r\n PanelRightOpen,\r\n ZoomIn,\r\n ZoomOut,\r\n} from \"lucide-react\";\r\nimport React from \"react\";\r\n\r\ninterface ToolbarProps {\r\n fileName?: string;\r\n pageCount: number;\r\n currentPage: number;\r\n onPageChange: (page: number) => void;\r\n layout: \"single\" | \"side-by-side\";\r\n onLayoutChange: (layout: \"single\" | \"side-by-side\") => void;\r\n\r\n // Left Sidebar (Thumbnails)\r\n showThumbnails: boolean;\r\n onToggleThumbnails: () => void;\r\n\r\n // Right Sidebar (Signatures)\r\n showSignatures: boolean;\r\n onToggleSignatures: () => void;\r\n}\r\n\r\nexport function Toolbar(props: ToolbarProps) {\r\n const {\r\n fileName,\r\n pageCount,\r\n currentPage,\r\n onPageChange,\r\n layout,\r\n onLayoutChange,\r\n } = props;\r\n\r\n const handlePrev = () => {\r\n if (currentPage > 1) onPageChange(currentPage - 1);\r\n };\r\n\r\n const handleNext = () => {\r\n if (currentPage < pageCount) onPageChange(currentPage + 1);\r\n };\r\n\r\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val = parseInt(e.target.value);\r\n if (!isNaN(val) && val >= 1 && val <= pageCount) {\r\n onPageChange(val);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"hv-toolbar\">\r\n {/* Left Group: Thumbnails & Title */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className={`hv-btn ${props.showThumbnails ? \"hv-btn-active\" : \"\"}`}\r\n onClick={props.onToggleThumbnails}\r\n title=\"Toggle Thumbnails\"\r\n >\r\n {props.showThumbnails ? (\r\n <PanelLeftClose size={20} />\r\n ) : (\r\n <PanelLeftOpen size={20} />\r\n )}\r\n </button>\r\n <div\r\n className=\"hv-sep\"\r\n style={{\r\n width: 1,\r\n height: 24,\r\n background: \"var(--hv-border)\",\r\n margin: \"0 8px\",\r\n }}\r\n />\r\n <span\r\n style={{\r\n fontWeight: 600,\r\n fontSize: \"14px\",\r\n maxWidth: 200,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {fileName || \"Document\"}\r\n </span>\r\n </div>\r\n\r\n {/* Center Group: Pagination */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className=\"hv-btn\"\r\n disabled={currentPage <= 1}\r\n onClick={handlePrev}\r\n >\r\n <ChevronLeft size={20} />\r\n </button>\r\n\r\n <div className=\"flex items-center gap-2 text-sm font-medium text-gray-600\">\r\n <input\r\n type=\"number\"\r\n className=\"w-12 text-center border rounded py-1 bg-gray-50 focus:bg-white focus:ring-2 focus:ring-indigo-500 outline-none transition-all\"\r\n value={currentPage}\r\n onChange={handleInput}\r\n min={1}\r\n max={pageCount}\r\n />\r\n <span className=\"text-gray-400\">/</span>\r\n <span>{pageCount}</span>\r\n </div>\r\n\r\n <button\r\n className=\"hv-btn\"\r\n disabled={currentPage >= pageCount}\r\n onClick={handleNext}\r\n >\r\n <ChevronRight size={20} />\r\n </button>\r\n </div>\r\n\r\n {/* Right Group: Layout & Signatures */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className={`hv-btn ${layout === \"single\" ? \"hv-btn-active text-indigo-600 bg-indigo-50\" : \"\"}`}\r\n onClick={() => onLayoutChange(\"single\")}\r\n title=\"Single Page View\"\r\n >\r\n <LayoutTemplate size={18} />\r\n </button>\r\n <button\r\n className={`hv-btn ${layout === \"side-by-side\" ? \"hv-btn-active text-indigo-600 bg-indigo-50\" : \"\"}`}\r\n onClick={() => onLayoutChange(\"side-by-side\")}\r\n title=\"Two Page View\"\r\n >\r\n <Grid2X2 size={18} />\r\n </button>\r\n\r\n <div\r\n className=\"hv-sep\"\r\n style={{\r\n width: 1,\r\n height: 24,\r\n background: \"var(--hv-border)\",\r\n margin: \"0 8px\",\r\n }}\r\n />\r\n\r\n {/* Signature Toggle Button */}\r\n <button\r\n className={`hv-btn hv-btn-primary ${props.showSignatures ? \"ring-2 ring-indigo-300\" : \"\"}`}\r\n onClick={props.onToggleSignatures}\r\n title=\"Sign Document\"\r\n >\r\n <PenLine size={18} className=\"mr-2\" />\r\n <span className=\"hidden sm:inline\">Sign</span>\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { Plus, Trash2, X } from \"lucide-react\";\r\nimport React, { useState, useRef } from \"react\";\r\nimport type { Signature } from \"../types\";\r\n\r\ninterface SignaturePanelProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSelectSignature: (sig: Signature) => void;\r\n}\r\n\r\nexport function SignaturePanel(props: SignaturePanelProps) {\r\n const { isOpen, onClose, onSelectSignature } = props;\r\n const [signatures, setSignatures] = useState<Signature[]>([]);\r\n const [showModal, setShowModal] = useState(false);\r\n\r\n // Drawing state\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const [isDrawing, setIsDrawing] = useState(false);\r\n\r\n // --- Modal Logic ---\r\n const openCreateModal = () => {\r\n setShowModal(true);\r\n setTimeout(() => {\r\n const canvas = canvasRef.current;\r\n if (canvas) {\r\n const ctx = canvas.getContext(\"2d\");\r\n ctx?.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n }, 100);\r\n };\r\n\r\n const saveSignature = () => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n\r\n const newSig: Signature = {\r\n id: Date.now().toString(),\r\n signatureImageUrl: canvas.toDataURL(\"image/png\"),\r\n signedBy: \"Me\",\r\n dateSigned: new Date().toISOString(),\r\n };\r\n\r\n setSignatures([...signatures, newSig]);\r\n setShowModal(false);\r\n onSelectSignature(newSig);\r\n };\r\n\r\n // --- Drawing Logic ---\r\n const startDraw = (e: React.MouseEvent | React.TouchEvent) => {\r\n setIsDrawing(true);\r\n draw(e);\r\n };\r\n const stopDraw = () => setIsDrawing(false);\r\n const draw = (e: React.MouseEvent | React.TouchEvent) => {\r\n if (!isDrawing || !canvasRef.current) return;\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n const rect = canvas.getBoundingClientRect();\r\n const clientX =\r\n \"touches\" in e ? e.touches[0].clientX : (e as React.MouseEvent).clientX;\r\n const clientY =\r\n \"touches\" in e ? e.touches[0].clientY : (e as React.MouseEvent).clientY;\r\n\r\n const x = clientX - rect.left;\r\n const y = clientY - rect.top;\r\n\r\n ctx.lineWidth = 2;\r\n ctx.lineCap = \"round\";\r\n ctx.lineTo(x, y);\r\n ctx.stroke();\r\n ctx.beginPath();\r\n ctx.moveTo(x, y);\r\n };\r\n\r\n return (\r\n <>\r\n {/* Right Sidebar */}\r\n <div\r\n className={`hv-sidebar hv-sidebar-right ${!isOpen ? \"collapsed\" : \"\"}`}\r\n style={{ width: isOpen ? \"280px\" : \"0\" }}\r\n >\r\n <div\r\n className=\"hv-sidebar-header\"\r\n style={{ justifyContent: \"space-between\", padding: \"12px 16px\" }}\r\n >\r\n <h3 style={{ margin: 0, fontSize: \"15px\", fontWeight: 600 }}>\r\n Signatures\r\n </h3>\r\n <button\r\n onClick={onClose}\r\n className=\"hv-btn\"\r\n style={{ padding: \"4px\", border: \"none\" }}\r\n >\r\n <X size={18} />\r\n </button>\r\n </div>\r\n\r\n <div className=\"hv-thumb-list\">\r\n <button\r\n onClick={openCreateModal}\r\n className=\"hv-btn\"\r\n style={{\r\n width: \"100%\",\r\n justifyContent: \"center\",\r\n border: \"2px dashed var(--hv-border)\",\r\n marginBottom: \"16px\",\r\n color: \"var(--hv-primary)\",\r\n }}\r\n >\r\n <Plus size={18} style={{ marginRight: \"8px\" }} />\r\n New Signature\r\n </button>\r\n\r\n {signatures.map((sig) => (\r\n <div\r\n key={sig.id}\r\n className=\"hv-thumb-item\"\r\n style={{\r\n position: \"relative\",\r\n padding: \"12px\",\r\n background: \"var(--hv-bg)\",\r\n borderRadius: \"8px\",\r\n border: \"1px solid var(--hv-border)\",\r\n }}\r\n onClick={() => onSelectSignature(sig)}\r\n >\r\n <img\r\n src={sig.signatureImageUrl}\r\n alt=\"Signature\"\r\n style={{ height: \"40px\", objectFit: \"contain\" }}\r\n />\r\n <div\r\n style={{\r\n fontSize: \"11px\",\r\n color: \"var(--hv-muted)\",\r\n marginTop: \"4px\",\r\n textAlign: \"center\",\r\n }}\r\n >\r\n {new Date(sig.dateSigned).toLocaleDateString()}\r\n </div>\r\n\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setSignatures(signatures.filter((s) => s.id !== sig.id));\r\n }}\r\n className=\"hv-btn\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"4px\",\r\n right: \"4px\",\r\n padding: \"4px\",\r\n color: \"#ef4444\",\r\n border: \"none\",\r\n background: \"white\",\r\n }}\r\n >\r\n <Trash2 size={12} />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* --- MODAL FIX: Using hv-modal classes --- */}\r\n {showModal && (\r\n <div className=\"hv-modal-overlay\">\r\n <div\r\n className=\"hv-modal\"\r\n style={{ width: \"450px\", maxWidth: \"90vw\" }}\r\n >\r\n {/* Modal Header */}\r\n <div\r\n style={{\r\n padding: \"16px 24px\",\r\n borderBottom: \"1px solid var(--hv-border)\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <h3 style={{ margin: 0, fontSize: \"18px\", fontWeight: 600 }}>\r\n Draw Signature\r\n </h3>\r\n <button\r\n onClick={() => setShowModal(false)}\r\n className=\"hv-btn\"\r\n style={{ border: \"none\" }}\r\n >\r\n <X size={20} />\r\n </button>\r\n </div>\r\n\r\n {/* Modal Body (Canvas) */}\r\n <div\r\n style={{\r\n padding: \"24px\",\r\n background: \"#f9fafb\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n background: \"white\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: \"8px\",\r\n overflow: \"hidden\",\r\n boxShadow: \"inset 0 2px 4px 0 rgba(0,0,0,0.05)\",\r\n }}\r\n >\r\n <canvas\r\n ref={canvasRef}\r\n width={400}\r\n height={200}\r\n style={{\r\n display: \"block\",\r\n cursor: \"crosshair\",\r\n touchAction: \"none\",\r\n }}\r\n onMouseDown={startDraw}\r\n onMouseUp={stopDraw}\r\n onMouseMove={draw}\r\n onTouchStart={startDraw}\r\n onTouchEnd={stopDraw}\r\n onTouchMove={draw}\r\n />\r\n </div>\r\n <p\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"var(--hv-muted)\",\r\n marginTop: \"8px\",\r\n }}\r\n >\r\n Sign above using your mouse or finger\r\n </p>\r\n </div>\r\n\r\n {/* Modal Footer */}\r\n <div\r\n style={{\r\n padding: \"16px 24px\",\r\n borderTop: \"1px solid var(--hv-border)\",\r\n display: \"flex\",\r\n justifyContent: \"flex-end\",\r\n gap: \"12px\",\r\n }}\r\n >\r\n <button\r\n onClick={() => {\r\n const ctx = canvasRef.current?.getContext(\"2d\");\r\n ctx?.clearRect(0, 0, 400, 200);\r\n }}\r\n className=\"hv-btn\"\r\n >\r\n Clear\r\n </button>\r\n <button onClick={saveSignature} className=\"hv-btn hv-btn-primary\">\r\n Create & Use\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n"],"mappings":"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","names":["import_react","DOMPurify","MarkdownIt","mammoth","import_react","import_jsx_runtime","SpreadsheetEditor","_","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","JSZip","import_react","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/components/DocumentViewer.tsx","../src/editors/RichTextEditor.tsx","../src/utils/sanitize.ts","../src/editors/SpreadsheetEditor.tsx","../src/renderers/ImageRenderer.tsx","../src/renderers/PdfRenderer.tsx","../src/renderers/PptxRenderer.tsx","../src/utils/fileSource.ts","../src/components/ThumbnailsSidebar.tsx","../src/components/Toolbar.tsx","../src/components/SignaturePanel.tsx"],"sourcesContent":["export { DocumentViewer } from './components/DocumentViewer';\nexport type { DocumentViewerProps, DocumentMode, PageLayout, Signature, SupportedFileType, DocumentViewerSaveMeta } from './types';\n","\"use client\";\r\n\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { RichTextEditor } from \"../editors/RichTextEditor\";\r\nimport { SpreadsheetEditor } from \"../editors/SpreadsheetEditor\";\r\nimport { ImageRenderer } from \"../renderers/ImageRenderer\";\r\nimport { PdfRenderer } from \"../renderers/PdfRenderer\";\r\nimport { PptxRenderer } from \"../renderers/PptxRenderer\";\r\nimport type {\r\n DocumentMode,\r\n DocumentViewerProps,\r\n SupportedFileType,\r\n Signature, // Import Signature from here\r\n} from \"../types\";\r\nimport { resolveSource } from \"../utils/fileSource\";\r\n\r\n// Components\r\nimport { ThumbnailsSidebar } from \"./ThumbnailsSidebar\";\r\nimport { Toolbar } from \"./Toolbar\";\r\nimport { SignaturePanel } from \"./SignaturePanel\";\r\n\r\nexport function DocumentViewer(props: DocumentViewerProps) {\r\n // --- State & Config ---\r\n const mode: DocumentMode = props.mode ?? \"view\";\r\n const theme = props.theme ?? \"light\";\r\n\r\n // Layout State\r\n const [layout, setLayout] = useState<\"single\" | \"side-by-side\">(\r\n props.defaultLayout ?? \"single\",\r\n );\r\n const [showThumbnails, setShowThumbnails] = useState(\r\n props.defaultShowThumbnails ?? true,\r\n );\r\n const [showSignatures, setShowSignatures] = useState(false); // [2] New State for Right Sidebar\r\n\r\n // Data Loading State\r\n const [resolved, setResolved] = useState<{\r\n fileType: SupportedFileType;\r\n fileName: string;\r\n url?: string;\r\n arrayBuffer?: ArrayBuffer;\r\n } | null>(null);\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string>(\"\");\r\n\r\n // Viewer Context (Page Counts, etc)\r\n const [pageCount, setPageCount] = useState(1);\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [thumbnails, setThumbnails] = useState<string[]>([]);\r\n\r\n // --- Effects ---\r\n\r\n // 1. Resolve File Source\r\n useEffect(() => {\r\n let active = true;\r\n\r\n const loadFile = async () => {\r\n setLoading(true);\r\n setError(\"\");\r\n setResolved(null);\r\n\r\n try {\r\n if (mode === \"create\") {\r\n // Handle creation mode\r\n setResolved({\r\n fileType: (props.fileType ?? \"docx\") as SupportedFileType,\r\n fileName: props.fileName ?? \"Untitled\",\r\n });\r\n } else {\r\n // Handle view/edit mode\r\n const res = await resolveSource({\r\n fileUrl: props.fileUrl,\r\n base64: props.base64,\r\n blob: props.blob,\r\n fileName: props.fileName,\r\n fileType: props.fileType,\r\n });\r\n if (active) setResolved(res);\r\n }\r\n } catch (err: any) {\r\n if (active) setError(err.message || \"Failed to load document\");\r\n } finally {\r\n if (active) setLoading(false);\r\n }\r\n };\r\n\r\n loadFile();\r\n return () => {\r\n active = false;\r\n };\r\n }, [props.fileUrl, props.base64, props.blob, mode]);\r\n\r\n // --- Signature Handler [3] ---\r\n const handleSignatureSelect = (sig: Signature) => {\r\n // Return value to user via prop if available\r\n if (props.onSign) {\r\n props.onSign(sig);\r\n }\r\n\r\n // Logic to place signature on document would go here\r\n console.log(\"Signature selected:\", sig);\r\n\r\n // Optional: Auto-close sidebar after selection\r\n // setShowSignatures(false);\r\n };\r\n\r\n // --- Render Helpers ---\r\n\r\n const renderContent = () => {\r\n if (error) {\r\n return (\r\n <div className=\"hv-error-banner\">\r\n <strong>Error loading document</strong>\r\n <p>{error}</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (loading || !resolved) {\r\n return (\r\n <div className=\"hv-loader\">\r\n <div className=\"hv-spinner\" />\r\n <span>Loading Document...</span>\r\n </div>\r\n );\r\n }\r\n\r\n const commonProps = {\r\n arrayBuffer: resolved.arrayBuffer,\r\n fileName: resolved.fileName,\r\n fileType: resolved.fileType,\r\n layout,\r\n currentPage,\r\n onPageCount: setPageCount,\r\n onCurrentPageChange: setCurrentPage,\r\n onThumbs: setThumbnails,\r\n };\r\n\r\n switch (resolved.fileType) {\r\n case \"pdf\":\r\n return <PdfRenderer url={resolved.url} {...commonProps} />;\r\n\r\n case \"docx\":\r\n case \"doc\":\r\n case \"rtf\":\r\n case \"txt\":\r\n case \"md\":\r\n return <RichTextEditor mode={mode} {...commonProps} />;\r\n\r\n case \"xlsx\":\r\n case \"csv\":\r\n case \"xls\":\r\n return <SpreadsheetEditor mode={mode} {...commonProps} />;\r\n\r\n case \"pptx\":\r\n case \"ppt\":\r\n return <PptxRenderer {...commonProps} />;\r\n\r\n case \"jpg\":\r\n case \"jpeg\":\r\n case \"png\":\r\n case \"gif\":\r\n case \"bmp\":\r\n case \"svg\":\r\n return <ImageRenderer {...commonProps} fileType={resolved.fileType} />;\r\n\r\n default:\r\n return (\r\n <div className=\"hv-error-banner\">\r\n Unsupported file type: {resolved.fileType}\r\n </div>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"hv-root\" data-hv-theme={theme}>\r\n {/* 1. Toolbar */}\r\n <Toolbar\r\n fileName={resolved?.fileName}\r\n pageCount={pageCount}\r\n currentPage={currentPage}\r\n onPageChange={setCurrentPage}\r\n layout={layout}\r\n onLayoutChange={setLayout}\r\n // Left Sidebar (Thumbnails)\r\n showThumbnails={showThumbnails}\r\n onToggleThumbnails={() => setShowThumbnails(!showThumbnails)}\r\n // Right Sidebar (Signatures) - [4] Replaced Download with Signature Toggle\r\n showSignatures={showSignatures}\r\n onToggleSignatures={() => setShowSignatures(!showSignatures)}\r\n disableSigning={props.disableSigning}\r\n />\r\n\r\n <div className=\"hv-shell\">\r\n {/* 2. Left Sidebar (Thumbnails) */}\r\n <ThumbnailsSidebar\r\n isOpen={showThumbnails}\r\n thumbnails={thumbnails}\r\n currentPage={currentPage}\r\n onSelectPage={setCurrentPage}\r\n />\r\n\r\n {/* 3. Main Stage */}\r\n <main className=\"hv-main\">{renderContent()}</main>\r\n\r\n {/* 4. Right Sidebar (Signatures) - [5] Added Component */}\r\n <SignaturePanel\r\n isOpen={showSignatures}\r\n onClose={() => setShowSignatures(false)}\r\n onSelectSignature={handleSignatureSelect}\r\n externalSignatures={props.signatures}\r\n onSignRequest={props.onSignRequest}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport mammoth from \"mammoth\";\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport MarkdownIt from \"markdown-it\";\r\nimport type { DocumentMode, SupportedFileType } from \"../types\";\r\nimport { sanitizeHtml } from \"../utils/sanitize\";\r\n\r\ninterface RichTextEditorProps {\r\n mode: DocumentMode;\r\n arrayBuffer?: ArrayBuffer;\r\n fileName: string;\r\n // We need fileType to know how to parse (md vs docx)\r\n fileType?: SupportedFileType;\r\n layout: \"single\" | \"side-by-side\";\r\n currentPage: number;\r\n onPageCount: (n: number) => void;\r\n onCurrentPageChange: (p: number) => void;\r\n onThumbs: (thumbs: string[]) => void;\r\n}\r\n\r\nexport function RichTextEditor(props: RichTextEditorProps) {\r\n const editorRef = useRef<HTMLDivElement>(null);\r\n const [contentHtml, setContentHtml] = useState<string>(\"\");\r\n const [loading, setLoading] = useState(false);\r\n\r\n // Initialize Markdown parser once\r\n const mdParser = useRef(new MarkdownIt({ html: true, linkify: true }));\r\n\r\n useEffect(() => {\r\n const loadDoc = async () => {\r\n if (!props.arrayBuffer) return;\r\n setLoading(true);\r\n\r\n try {\r\n // 1. Handle DOCX\r\n if (props.fileName.endsWith(\".docx\") || props.fileType === \"docx\") {\r\n const result = await mammoth.convertToHtml({\r\n arrayBuffer: props.arrayBuffer,\r\n });\r\n setContentHtml(sanitizeHtml(result.value));\r\n }\r\n // 2. Handle Markdown / Text\r\n else {\r\n // Decode the buffer to string\r\n const decoder = new TextDecoder(\"utf-8\");\r\n const text = decoder.decode(props.arrayBuffer);\r\n\r\n if (props.fileName.endsWith(\".md\") || props.fileType === \"md\") {\r\n // Render Markdown to HTML\r\n const html = mdParser.current.render(text);\r\n setContentHtml(sanitizeHtml(html));\r\n } else {\r\n // Plain text: wrap in pre/p\r\n setContentHtml(\r\n `<pre style=\"white-space: pre-wrap; font-family: monospace;\">${text}</pre>`,\r\n );\r\n }\r\n }\r\n\r\n props.onPageCount(1);\r\n } catch (err) {\r\n console.error(\"Doc Conversion failed\", err);\r\n setContentHtml(\"<p style='color:red'>Error parsing document.</p>\");\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n loadDoc();\r\n }, [props.arrayBuffer, props.fileName, props.fileType]);\r\n\r\n return (\r\n <div className=\"hv-view-single\">\r\n <div className=\"hv-page-container\">\r\n {loading ? (\r\n <div className=\"p-12 text-center text-gray-400\">\r\n Processing text...\r\n </div>\r\n ) : (\r\n <div\r\n ref={editorRef}\r\n className=\"hv-docx-content\"\r\n contentEditable={props.mode === \"edit\" || props.mode === \"create\"}\r\n dangerouslySetInnerHTML={{ __html: contentHtml }}\r\n suppressContentEditableWarning\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import DOMPurify from 'dompurify';\n\n/**\n * Sanitize HTML using DOMPurify for safe rendering.\n * @param html - The HTML string to sanitize\n * @returns Safe HTML string\n */\nexport function sanitizeHtml(html: string): string {\n // DOMPurify is safe to call in the browser. For SSR, callers should only run after mount.\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: ['target', 'rel'],\n });\n}\n","\"use client\";\n\nimport React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from \"react\";\nimport * as XLSX from \"xlsx\";\nimport type { DocumentMode, SupportedFileType } from \"../types\";\n\nexport interface SpreadsheetEditorHandle {\n save: (exportPdf?: boolean) => Promise<void>;\n}\n\ninterface SpreadsheetEditorProps {\n mode: DocumentMode;\n fileName: string;\n arrayBuffer?: ArrayBuffer;\n layout?: \"single\" | \"side-by-side\";\n onSave?: (base64: string, meta: any) => void;\n}\n\nexport const SpreadsheetEditor = forwardRef<\n SpreadsheetEditorHandle,\n SpreadsheetEditorProps\n>(function SpreadsheetEditor(props, ref) {\n const readonly = props.mode === \"view\";\n const [data, setData] = useState<string[][]>([]);\n const [cols, setCols] = useState<string[]>([]);\n\n useEffect(() => {\n if (!props.arrayBuffer) return;\n\n try {\n const wb = XLSX.read(props.arrayBuffer, { type: \"array\" });\n const wsName = wb.SheetNames[0];\n const ws = wb.Sheets[wsName];\n\n const jsonData = XLSX.utils.sheet_to_json(ws, {\n header: 1,\n defval: \"\",\n }) as string[][];\n\n const minRows = 40;\n const minCols = 15;\n\n const rows = Math.max(minRows, jsonData.length);\n const colCount = Math.max(minCols, jsonData[0]?.length || 0);\n\n const normalized = Array.from({ length: rows }, (_, r) => {\n const row = jsonData[r] || [];\n return Array.from({ length: colCount }, (_, c) =>\n row[c] !== undefined && row[c] !== null ? String(row[c]) : \"\",\n );\n });\n\n setData(normalized);\n\n const headers = Array.from({ length: colCount }, (_, i) => {\n let letter = \"\";\n let temp = i;\n while (temp >= 0) {\n letter = String.fromCharCode((temp % 26) + 65) + letter;\n temp = Math.floor(temp / 26) - 1;\n }\n return letter;\n });\n setCols(headers);\n } catch (e) {\n console.error(\"Spreadsheet load error:\", e);\n }\n }, [props.arrayBuffer]);\n\n async function save(exportPdf?: boolean) {\n if (!props.onSave) return;\n const ws = XLSX.utils.aoa_to_sheet(data);\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws, \"Sheet1\");\n const out = XLSX.write(wb, { type: \"array\", bookType: \"xlsx\" });\n\n const bytes = new Uint8Array(out);\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n props.onSave(btoa(binary), {\n fileName: props.fileName,\n fileType: \"xlsx\",\n exportedAsPdf: !!exportPdf,\n });\n }\n\n useImperativeHandle(ref, () => ({ save }));\n\n return (\n <div className=\"hv-view-single\">\n <div\n className=\"hv-page-container\"\n style={{\n width: \"auto\",\n maxWidth: \"95vw\",\n minWidth: \"800px\",\n padding: 0,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* Toolbar / Formula Bar */}\n <div\n style={{\n background: \"#f8f9fa\",\n borderBottom: \"1px solid #e2e8f0\",\n padding: \"8px 16px\",\n fontSize: \"12px\",\n color: \"#64748b\",\n display: \"flex\",\n gap: \"12px\",\n flexShrink: 0,\n }}\n >\n <span>fx</span>\n <div\n style={{\n background: \"white\",\n border: \"1px solid #cbd5e1\",\n flex: 1,\n height: \"18px\",\n borderRadius: \"2px\",\n }}\n />\n </div>\n\n {/* Main Grid Container */}\n <div\n style={{\n overflow: \"auto\",\n // FIX: Dynamic height ensures bottom isn't cut off on small screens\n maxHeight: \"calc(100vh - 140px)\",\n minHeight: \"400px\",\n position: \"relative\",\n // FIX: Padding prevents border clipping (first row/col edges)\n padding: \"1px\",\n }}\n >\n <table\n style={{\n borderCollapse: \"collapse\",\n minWidth: \"100%\",\n tableLayout: \"fixed\",\n }}\n >\n <thead>\n <tr>\n {/* Corner Cell */}\n <th\n style={{\n width: \"40px\",\n background: \"#f1f5f9\",\n border: \"1px solid #cbd5e1\",\n position: \"sticky\",\n top: 0,\n left: 0,\n zIndex: 30, // Increased zIndex\n }}\n />\n\n {/* Column Headers */}\n {cols.map((col, i) => (\n <th\n key={i}\n style={{\n minWidth: \"100px\",\n background: \"#f1f5f9\",\n border: \"1px solid #cbd5e1\",\n color: \"#475569\",\n fontSize: \"11px\",\n fontWeight: 600,\n padding: \"4px\",\n position: \"sticky\",\n top: 0,\n zIndex: 20, // Increased zIndex\n }}\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row, r) => (\n <tr key={r}>\n {/* Row Header (1, 2, 3...) */}\n <td\n style={{\n background: \"#f1f5f9\",\n border: \"1px solid #cbd5e1\",\n textAlign: \"center\",\n fontSize: \"11px\",\n color: \"#64748b\",\n position: \"sticky\",\n left: 0,\n zIndex: 20, // Increased zIndex to stay above cells\n }}\n >\n {r + 1}\n </td>\n\n {/* Cells */}\n {row.map((cell, c) => (\n <td\n key={c}\n contentEditable={!readonly}\n suppressContentEditableWarning\n onBlur={(e) => {\n const val = e.currentTarget.innerText;\n setData((prev) => {\n const next = [...prev];\n next[r] = [...next[r]];\n next[r][c] = val;\n return next;\n });\n }}\n style={{\n border: \"1px solid #e2e8f0\",\n padding: \"4px 8px\",\n fontSize: \"13px\",\n color: \"#1e293b\",\n minWidth: \"100px\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n outline: \"none\",\n zIndex: 1,\n }}\n >\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n );\n});\n","\"use client\";\r\n\r\nimport React, { useEffect, useMemo, useState } from \"react\";\r\nimport type { SupportedFileType } from \"../types\";\r\n\r\n/**\r\n * Image renderer for DocumentViewer.\r\n * Supports PNG, JPG, SVG, etc. with zoom controls.\r\n */\r\nexport function ImageRenderer({\r\n arrayBuffer,\r\n fileType,\r\n fileName,\r\n}: {\r\n /** Image file as ArrayBuffer (optional) */\r\n arrayBuffer?: ArrayBuffer;\r\n /** File type (e.g. 'png', 'jpg', 'svg') */\r\n fileType: SupportedFileType;\r\n /** File name for display */\r\n fileName: string;\r\n}) {\r\n const [zoom, setZoom] = useState(1);\r\n const url = useMemo(() => {\r\n if (!arrayBuffer) {\r\n return undefined;\r\n }\r\n const mime =\r\n fileType === \"svg\"\r\n ? \"image/svg+xml\"\r\n : fileType === \"png\"\r\n ? \"image/png\"\r\n : \"image/jpeg\";\r\n return URL.createObjectURL(new Blob([arrayBuffer], { type: mime }));\r\n }, [arrayBuffer, fileType]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (url) {\r\n URL.revokeObjectURL(url);\r\n }\r\n };\r\n }, [url]);\r\n\r\n return (\r\n <div className=\"flex flex-col h-full bg-gray-50\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-6 py-4 bg-white border-b border-gray-200\">\r\n <h2 className=\"text-sm font-medium text-gray-700 truncate max-w-md\">\r\n {fileName}\r\n </h2>\r\n\r\n {/* Zoom Controls */}\r\n <div className=\"flex items-center gap-3 bg-gray-100 rounded-lg p-1\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setZoom((z) => Math.max(0.25, z - 0.25))}\r\n className=\"w-9 h-9 flex items-center justify-center rounded-md bg-white hover:bg-gray-50 text-gray-700 transition-all shadow-sm hover:shadow\"\r\n aria-label=\"Zoom out\"\r\n >\r\n <svg\r\n className=\"w-4 h-4\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M20 12H4\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <span className=\"text-sm font-semibold text-gray-700 min-w-[3.5rem] text-center px-2\">\r\n {Math.round(zoom * 100)}%\r\n </span>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setZoom((z) => Math.min(4, z + 0.25))}\r\n className=\"w-9 h-9 flex items-center justify-center rounded-md bg-white hover:bg-gray-50 text-gray-700 transition-all shadow-sm hover:shadow\"\r\n aria-label=\"Zoom in\"\r\n >\r\n <svg\r\n className=\"w-4 h-4\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M12 4v16m8-8H4\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Image Container */}\r\n <div className=\"flex-1 overflow-auto flex items-center justify-center p-8\">\r\n {!arrayBuffer && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto mb-3 rounded-full bg-gray-200 flex items-center justify-center\">\r\n <svg\r\n className=\"w-8 h-8 text-gray-400\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n </div>\r\n <p className=\"text-sm text-gray-500\">No image data provided</p>\r\n </div>\r\n )}\r\n\r\n {arrayBuffer && !url && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto mb-3 rounded-full bg-red-100 flex items-center justify-center\">\r\n <svg\r\n className=\"w-8 h-8 text-red-500\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\r\n />\r\n </svg>\r\n </div>\r\n <p className=\"text-sm text-gray-600\">Failed to load image</p>\r\n </div>\r\n )}\r\n\r\n {url && (\r\n <div\r\n style={{ transform: `scale(${zoom})` }}\r\n className=\"transition-transform duration-200 origin-center\"\r\n >\r\n <img\r\n src={url}\r\n alt={fileName}\r\n style={{ transform: `scale(${zoom})` }}\r\n className=\"max-w-full h-auto rounded-lg shadow-lg transition-transform duration-200\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n getDocument,\r\n GlobalWorkerOptions,\r\n type PDFDocumentProxy,\r\n} from \"pdfjs-dist\";\r\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport type { PageLayout } from \"../types\";\r\n\r\n// FIX 1: Updated version to match the error message (4.10.38)\r\nconst PDF_WORKER_URL =\r\n \"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/4.10.38/pdf.worker.min.mjs\";\r\n\r\ninterface PdfRendererProps {\r\n url?: string;\r\n arrayBuffer?: ArrayBuffer;\r\n layout: PageLayout;\r\n currentPage: number;\r\n onPageCount: (n: number) => void;\r\n onCurrentPageChange: (p: number) => void;\r\n onThumbs: (thumbs: string[]) => void;\r\n}\r\n\r\nexport function PdfRenderer(props: PdfRendererProps) {\r\n const { url, arrayBuffer, layout, currentPage } = props;\r\n const [doc, setDoc] = useState<PDFDocumentProxy | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n // Ensure worker is set up\r\n if (!GlobalWorkerOptions.workerSrc) {\r\n GlobalWorkerOptions.workerSrc = PDF_WORKER_URL;\r\n }\r\n\r\n let active = true;\r\n\r\n const loadPdf = async () => {\r\n // If no source, do nothing\r\n if (!url && !arrayBuffer) return;\r\n\r\n setError(null);\r\n\r\n try {\r\n // FIX 2: Clone the ArrayBuffer!\r\n // PDF.js transfers the buffer to the worker, which \"detaches\" (empties) the original.\r\n // We pass a slice (copy) so the original data in DocumentViewer remains valid.\r\n const dataSource = arrayBuffer\r\n ? { data: arrayBuffer.slice(0) }\r\n : { url: url! };\r\n\r\n const loadingTask = getDocument(dataSource);\r\n\r\n const pdf = await loadingTask.promise;\r\n\r\n if (active) {\r\n setDoc(pdf);\r\n props.onPageCount(pdf.numPages);\r\n generateThumbnails(pdf);\r\n }\r\n } catch (err: any) {\r\n // Quietly handle errors (e.g. password protected files)\r\n console.error(\"PDF Load Error:\", err);\r\n if (active) setError(err.message || \"Failed to load PDF\");\r\n }\r\n };\r\n\r\n loadPdf();\r\n return () => {\r\n active = false;\r\n };\r\n }, [url, arrayBuffer]); // Re-run if file changes\r\n\r\n const generateThumbnails = async (pdf: PDFDocumentProxy) => {\r\n try {\r\n const thumbs: string[] = [];\r\n const num = Math.min(pdf.numPages, 5);\r\n for (let i = 1; i <= num; i++) {\r\n const page = await pdf.getPage(i);\r\n const viewport = page.getViewport({ scale: 0.2 });\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = viewport.width;\r\n canvas.height = viewport.height;\r\n\r\n const ctx = canvas.getContext(\"2d\");\r\n if (ctx) {\r\n await page.render({ canvasContext: ctx, viewport }).promise;\r\n thumbs.push(canvas.toDataURL());\r\n }\r\n }\r\n props.onThumbs(thumbs);\r\n } catch (e) {\r\n /* ignore */\r\n }\r\n };\r\n\r\n const pagesToRender = useMemo(() => {\r\n if (!doc) return [];\r\n const p = Math.max(1, Math.min(currentPage, doc.numPages));\r\n if (layout === \"side-by-side\" && doc.numPages > 1) {\r\n if (p === 1) return [1];\r\n const left = p % 2 === 0 ? p : p - 1;\r\n return left + 1 <= doc.numPages ? [left, left + 1] : [left];\r\n }\r\n return [p];\r\n }, [doc, currentPage, layout]);\r\n\r\n if (error) {\r\n return (\r\n <div\r\n className=\"hv-page-container\"\r\n style={{ padding: \"32px\", textAlign: \"center\", color: \"#dc2626\" }}\r\n >\r\n <strong>Error loading PDF</strong>\r\n <p className=\"text-sm mt-2\">{error}</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={`hv-doc-scroll ${layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"}`}\r\n >\r\n {pagesToRender.map((page) => (\r\n <PdfPage key={page} doc={doc} pageNum={page} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction PdfPage({\r\n doc,\r\n pageNum,\r\n}: {\r\n doc: PDFDocumentProxy | null;\r\n pageNum: number;\r\n}) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n\r\n useEffect(() => {\r\n if (!doc || !canvasRef.current) return;\r\n let active = true;\r\n\r\n const render = async () => {\r\n try {\r\n const page = await doc.getPage(pageNum);\r\n if (!active) return;\r\n\r\n const scale = 1.5; // High fidelity\r\n const viewport = page.getViewport({ scale });\r\n const canvas = canvasRef.current!;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n canvas.width = viewport.width;\r\n canvas.height = viewport.height;\r\n\r\n canvas.style.width = `${viewport.width / scale}px`;\r\n canvas.style.height = `${viewport.height / scale}px`;\r\n\r\n await page.render({ canvasContext: ctx, viewport }).promise;\r\n } catch (e) {\r\n console.error(\"Page render error:\", e);\r\n }\r\n };\r\n render();\r\n return () => {\r\n active = false;\r\n };\r\n }, [doc, pageNum]);\r\n\r\n return (\r\n <div\r\n className=\"hv-page-container\"\r\n style={{\r\n minHeight: \"600px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n <canvas ref={canvasRef} className=\"hv-pdf-canvas\" />\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useMemo, useState } from \"react\";\r\nimport JSZip from \"jszip\";\r\nimport type { PageLayout } from \"../types\";\r\n\r\n// --- XML Parsing Helpers (Preserved from your original code) ---\r\nconst NS_P = \"http://schemas.openxmlformats.org/presentationml/2006/main\";\r\nconst NS_A = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\r\n\r\nfunction parseColor(solidFill: Element | null): string | undefined {\r\n if (!solidFill) return undefined;\r\n const srgbClr = solidFill.getElementsByTagNameNS(NS_A, \"srgbClr\")[0];\r\n if (srgbClr) {\r\n const val = srgbClr.getAttribute(\"val\");\r\n return val ? `#${val}` : undefined;\r\n }\r\n const schemeClr = solidFill.getElementsByTagNameNS(NS_A, \"schemeClr\")[0];\r\n if (schemeClr) {\r\n const val = schemeClr.getAttribute(\"val\");\r\n const colorMap: Record<string, string> = {\r\n tx1: \"#000000\",\r\n bg1: \"#FFFFFF\",\r\n tx2: \"#1F1F1F\",\r\n accent1: \"#4472C4\",\r\n accent2: \"#ED7D31\",\r\n accent3: \"#A5A5A5\",\r\n accent4: \"#FFC000\",\r\n accent5: \"#5B9BD5\",\r\n accent6: \"#70AD47\",\r\n };\r\n return colorMap[val || \"\"] || \"#000000\";\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction parseSlideXml(xml: string) {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(xml, \"application/xml\");\r\n\r\n let title: string | undefined;\r\n let titleColor: string | undefined;\r\n let bgColor: string | undefined;\r\n\r\n const body: Array<{\r\n text: string;\r\n color?: string;\r\n isBold?: boolean;\r\n isItalic?: boolean;\r\n }> = [];\r\n\r\n // Background\r\n const bgElements = doc.getElementsByTagNameNS(NS_P, \"bg\");\r\n if (bgElements.length > 0) {\r\n const bgPr = bgElements[0].getElementsByTagNameNS(NS_P, \"bgPr\")[0];\r\n if (bgPr) {\r\n const solidFill = bgPr.getElementsByTagNameNS(NS_A, \"solidFill\")[0];\r\n bgColor = parseColor(solidFill);\r\n }\r\n }\r\n\r\n // Shapes & Text\r\n const shapes = Array.from(doc.getElementsByTagNameNS(NS_P, \"sp\"));\r\n shapes.forEach((shape) => {\r\n const nvSpPr = shape.getElementsByTagNameNS(NS_P, \"nvSpPr\")[0];\r\n const cNvPr = nvSpPr?.getElementsByTagNameNS(NS_P, \"cNvPr\")[0];\r\n const name = cNvPr?.getAttribute(\"name\")?.toLowerCase() || \"\";\r\n\r\n const isTitle = name.includes(\"title\") || name.includes(\"header\");\r\n\r\n const txBody = shape.getElementsByTagNameNS(NS_P, \"txBody\")[0];\r\n if (!txBody) return;\r\n\r\n const paragraphs = Array.from(txBody.getElementsByTagNameNS(NS_A, \"p\"));\r\n paragraphs.forEach((p) => {\r\n const runs = Array.from(p.getElementsByTagNameNS(NS_A, \"r\"));\r\n runs.forEach((run) => {\r\n const textEl = run.getElementsByTagNameNS(NS_A, \"t\")[0];\r\n const text = textEl?.textContent?.trim() || \"\";\r\n if (!text) return;\r\n\r\n const rPr = run.getElementsByTagNameNS(NS_A, \"rPr\")[0];\r\n let color: string | undefined;\r\n let isBold = false;\r\n let isItalic = false;\r\n\r\n if (rPr) {\r\n isBold = rPr.getAttribute(\"b\") === \"1\";\r\n isItalic = rPr.getAttribute(\"i\") === \"1\";\r\n color = parseColor(rPr.getElementsByTagNameNS(NS_A, \"solidFill\")[0]);\r\n }\r\n\r\n if (isTitle && !title) {\r\n title = text;\r\n titleColor = color;\r\n } else {\r\n body.push({ text, color, isBold, isItalic });\r\n }\r\n });\r\n });\r\n });\r\n\r\n return { title, titleColor, body, bgColor };\r\n}\r\n\r\n// --- Main Component ---\r\ninterface PptxRendererProps {\r\n arrayBuffer?: ArrayBuffer;\r\n fileName?: string;\r\n layout: PageLayout;\r\n currentPage: number;\r\n onCurrentPageChange: (p: number) => void;\r\n onPageCount: (n: number) => void;\r\n onThumbs: (thumbs: string[]) => void;\r\n}\r\n\r\nexport function PptxRenderer(props: PptxRendererProps) {\r\n const [slides, setSlides] = useState<any[]>([]);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!props.arrayBuffer) return;\r\n\r\n const loadPptx = async () => {\r\n try {\r\n const zip = await JSZip.loadAsync(props.arrayBuffer!);\r\n const slidePaths = Object.keys(zip.files)\r\n .filter((p) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(p))\r\n .sort((a, b) => {\r\n // Natural sort (slide1, slide2, slide10)\r\n const numA = parseInt(a.match(/\\d+/)![0]);\r\n const numB = parseInt(b.match(/\\d+/)![0]);\r\n return numA - numB;\r\n });\r\n\r\n const parsedSlides = [];\r\n for (const path of slidePaths) {\r\n const xml = await zip.files[path].async(\"string\");\r\n parsedSlides.push(parseSlideXml(xml));\r\n }\r\n\r\n setSlides(parsedSlides);\r\n props.onPageCount(parsedSlides.length);\r\n\r\n // Generate SVG Thumbs\r\n const thumbs = parsedSlides.map(\r\n (_, i) =>\r\n `data:image/svg+xml;charset=utf-8,${encodeURIComponent(\r\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"56\"><rect width=\"100%\" height=\"100%\" fill=\"#4f46e5\"/><text x=\"50%\" y=\"50%\" fill=\"white\" font-size=\"20\" text-anchor=\"middle\" dy=\".3em\">${i + 1}</text></svg>`,\r\n )}`,\r\n );\r\n props.onThumbs(thumbs);\r\n } catch (err: any) {\r\n setError(err.message || \"Failed to parse PPTX\");\r\n }\r\n };\r\n\r\n loadPptx();\r\n }, [props.arrayBuffer]);\r\n\r\n const pagesToShow = useMemo(() => {\r\n if (slides.length === 0) return [];\r\n const validPage = Math.max(1, Math.min(props.currentPage, slides.length));\r\n\r\n if (props.layout === \"side-by-side\" && slides.length > 1) {\r\n if (validPage === 1) return [1];\r\n const left = validPage % 2 === 0 ? validPage : validPage - 1;\r\n return [left, left + 1].filter((p) => p <= slides.length);\r\n }\r\n return [validPage];\r\n }, [slides.length, props.currentPage, props.layout]);\r\n\r\n if (error) return <div className=\"text-red-500 p-8 text-center\">{error}</div>;\r\n\r\n return (\r\n <div\r\n className={\r\n props.layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"\r\n }\r\n >\r\n {pagesToShow.map((p) => {\r\n const slide = slides[p - 1];\r\n if (!slide) return null;\r\n\r\n return (\r\n <div\r\n key={p}\r\n className=\"hv-page-container\"\r\n style={{\r\n width: \"960px\", // Standard HD slide width\r\n aspectRatio: \"16/9\",\r\n padding: \"48px\",\r\n backgroundColor: slide.bgColor || \"#ffffff\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\",\r\n position: \"relative\", // For absolute positioning if we added it later\r\n }}\r\n >\r\n {/* Slide Title */}\r\n {slide.title && (\r\n <h1\r\n style={{\r\n fontSize: \"42px\",\r\n marginBottom: \"32px\",\r\n fontWeight: \"bold\",\r\n color: slide.titleColor || \"#1a202c\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n {slide.title}\r\n </h1>\r\n )}\r\n\r\n {/* Slide Body */}\r\n <div\r\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"16px\" }}\r\n >\r\n {slide.body.map((item: any, i: number) => (\r\n <div\r\n key={i}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: \"12px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"8px\",\r\n height: \"8px\",\r\n background: item.color || \"#cbd5e1\",\r\n borderRadius: \"50%\",\r\n marginTop: \"12px\",\r\n flexShrink: 0,\r\n }}\r\n />\r\n <p\r\n style={{\r\n fontSize: \"24px\",\r\n color: item.color || \"#4a5568\",\r\n fontWeight: item.isBold ? \"bold\" : \"normal\",\r\n fontStyle: item.isItalic ? \"italic\" : \"normal\",\r\n margin: 0,\r\n }}\r\n >\r\n {item.text}\r\n </p>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Slide Footer Number */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n bottom: \"20px\",\r\n right: \"30px\",\r\n color: \"#cbd5e1\",\r\n fontWeight: \"bold\",\r\n }}\r\n >\r\n {p}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import type { SupportedFileType } from '../types';\n\n/**\n * Guess the file type from a file name or explicit type.\n * @param name - The file name (optional)\n * @param explicit - Explicit file type (optional)\n * @returns SupportedFileType\n */\nexport function guessFileType(\n name?: string,\n explicit?: SupportedFileType,\n): SupportedFileType {\n if (explicit) { return explicit; }\n const ext = (name?.split('.').pop() || '').toLowerCase();\n const allowed: SupportedFileType[] = [\n 'pdf',\n 'md',\n 'docx',\n 'xlsx',\n 'pptx',\n 'txt',\n 'png',\n 'jpg',\n 'svg',\n ];\n return (allowed as string[]).includes(ext)\n ? (ext as SupportedFileType)\n : 'txt';\n}\n\n/**\n * Convert an ArrayBuffer to a base64 string.\n * @param buf - The ArrayBuffer to convert\n * @returns base64-encoded string\n */\nexport function arrayBufferToBase64(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n let binary = '';\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunk));\n }\n return btoa(binary);\n}\n\n/**\n * Convert a base64 string to an ArrayBuffer.\n * @param b64 - The base64 string\n * @returns Promise<ArrayBuffer>\n */\nexport async function base64ToArrayBuffer(b64: string): Promise<ArrayBuffer> {\n const bin = atob(b64);\n const len = bin.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) { bytes[i] = bin.charCodeAt(i); }\n return bytes.buffer;\n}\n\n/**\n * Resolve a file source from a URL, base64, or Blob, with progress callback.\n * @param args - fileUrl, base64, or Blob, plus optional fileName, fileType, and onProgress\n * @returns Promise<{ fileType, fileName, arrayBuffer, url? }>\n */\nexport async function resolveSource(args: {\n fileUrl?: string;\n base64?: string;\n blob?: Blob;\n fileName?: string;\n fileType?: SupportedFileType;\n onProgress?: (loaded: number, total?: number) => void;\n}): Promise<{\n fileType: SupportedFileType;\n fileName: string;\n arrayBuffer: ArrayBuffer;\n url?: string;\n}> {\n const fileType = guessFileType(args.fileName, args.fileType);\n const fileName = args.fileName ?? `document.${fileType}`;\n\n if (args.blob) {\n const ab = await args.blob.arrayBuffer();\n const url = URL.createObjectURL(args.blob);\n return { fileType, fileName, arrayBuffer: ab, url };\n }\n\n if (args.base64) {\n const ab = await base64ToArrayBuffer(args.base64);\n return { fileType, fileName, arrayBuffer: ab };\n }\n\n if (!args.fileUrl) {\n throw new Error('No file source provided. Use fileUrl, blob, or base64.');\n }\n\n const res = await fetch(args.fileUrl);\n if (!res.ok) { throw new Error(`Failed to fetch file (${res.status})`); }\n\n const total = Number(res.headers.get('content-length') || '') || undefined;\n if (!res.body) {\n const ab = await res.arrayBuffer();\n args.onProgress?.(ab.byteLength, total);\n return { fileType, fileName, arrayBuffer: ab, url: args.fileUrl };\n }\n\n const reader = res.body.getReader();\n const chunks: Uint8Array[] = [];\n let loaded = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) { break; }\n if (value) {\n chunks.push(value);\n loaded += value.length;\n args.onProgress?.(loaded, total);\n }\n }\n const out = new Uint8Array(loaded);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.length;\n }\n return { fileType, fileName, arrayBuffer: out.buffer, url: args.fileUrl };\n}\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef } from \"react\";\r\n\r\ninterface ThumbnailsSidebarProps {\r\n isOpen: boolean;\r\n thumbnails: Array<string | undefined>; // Base64 strings\r\n currentPage: number;\r\n onSelectPage: (page: number) => void;\r\n}\r\n\r\nexport function ThumbnailsSidebar(props: ThumbnailsSidebarProps) {\r\n const { isOpen, thumbnails, currentPage, onSelectPage } = props;\r\n const activeRef = useRef<HTMLDivElement>(null);\r\n\r\n // Auto-scroll the sidebar to keep the current page thumbnail in view\r\n useEffect(() => {\r\n if (activeRef.current) {\r\n activeRef.current.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"nearest\",\r\n });\r\n }\r\n }, [currentPage, isOpen]);\r\n\r\n return (\r\n <div className={`hv-sidebar ${!isOpen ? \"collapsed\" : \"\"}`}>\r\n <div className=\"hv-thumb-list\">\r\n {thumbnails.map((src, index) => {\r\n const pageNum = index + 1;\r\n const isActive = pageNum === currentPage;\r\n\r\n return (\r\n <div\r\n key={pageNum}\r\n ref={isActive ? activeRef : null}\r\n className={`hv-thumb-item ${isActive ? \"active\" : \"\"}`}\r\n onClick={() => onSelectPage(pageNum)}\r\n >\r\n <div className=\"hv-thumb-preview\">\r\n {src ? (\r\n <img\r\n src={src}\r\n alt={`Page ${pageNum}`}\r\n className=\"hv-thumb-img\"\r\n />\r\n ) : (\r\n // Skeleton loader state for thumbnail\r\n <div className=\"w-full h-full bg-gray-100 animate-pulse flex items-center justify-center\">\r\n <span className=\"text-xs text-gray-300\">...</span>\r\n </div>\r\n )}\r\n </div>\r\n <span className=\"hv-thumb-label\">Page {pageNum}</span>\r\n </div>\r\n );\r\n })}\r\n\r\n {thumbnails.length === 0 && (\r\n <div className=\"text-center p-4 text-xs text-gray-400\">\r\n No previews available\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n ChevronLeft,\r\n ChevronRight,\r\n Grid2X2,\r\n LayoutTemplate,\r\n PanelLeftClose,\r\n PanelLeftOpen,\r\n PenLine, // Changed from Download\r\n PanelRightClose,\r\n PanelRightOpen,\r\n ZoomIn,\r\n ZoomOut,\r\n} from \"lucide-react\";\r\nimport React from \"react\";\r\n\r\ninterface ToolbarProps {\r\n fileName?: string;\r\n pageCount: number;\r\n currentPage: number;\r\n onPageChange: (page: number) => void;\r\n layout: \"single\" | \"side-by-side\";\r\n onLayoutChange: (layout: \"single\" | \"side-by-side\") => void;\r\n\r\n // Left Sidebar (Thumbnails)\r\n showThumbnails: boolean;\r\n onToggleThumbnails: () => void;\r\n\r\n // Right Sidebar (Signatures)\r\n showSignatures: boolean;\r\n onToggleSignatures: () => void;\r\n disableSigning?: boolean;\r\n}\r\n\r\nexport function Toolbar(props: ToolbarProps) {\r\n const {\r\n fileName,\r\n pageCount,\r\n currentPage,\r\n onPageChange,\r\n layout,\r\n onLayoutChange,\r\n } = props;\r\n\r\n const handlePrev = () => {\r\n if (currentPage > 1) onPageChange(currentPage - 1);\r\n };\r\n\r\n const handleNext = () => {\r\n if (currentPage < pageCount) onPageChange(currentPage + 1);\r\n };\r\n\r\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val = parseInt(e.target.value);\r\n if (!isNaN(val) && val >= 1 && val <= pageCount) {\r\n onPageChange(val);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"hv-toolbar\">\r\n {/* Left Group: Thumbnails & Title */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className={`hv-btn ${props.showThumbnails ? \"hv-btn-active\" : \"\"}`}\r\n onClick={props.onToggleThumbnails}\r\n title=\"Toggle Thumbnails\"\r\n >\r\n {props.showThumbnails ? (\r\n <PanelLeftClose size={20} />\r\n ) : (\r\n <PanelLeftOpen size={20} />\r\n )}\r\n </button>\r\n <div\r\n className=\"hv-sep\"\r\n style={{\r\n width: 1,\r\n height: 24,\r\n background: \"var(--hv-border)\",\r\n margin: \"0 8px\",\r\n }}\r\n />\r\n <span\r\n style={{\r\n fontWeight: 600,\r\n fontSize: \"14px\",\r\n maxWidth: 200,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {fileName || \"Document\"}\r\n </span>\r\n </div>\r\n\r\n {/* Center Group: Pagination */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className=\"hv-btn\"\r\n disabled={currentPage <= 1}\r\n onClick={handlePrev}\r\n >\r\n <ChevronLeft size={20} />\r\n </button>\r\n\r\n <div className=\"flex items-center gap-2 text-sm font-medium text-gray-600\">\r\n <input\r\n type=\"number\"\r\n className=\"w-12 text-center border rounded py-1 bg-gray-50 focus:bg-white focus:ring-2 focus:ring-indigo-500 outline-none transition-all\"\r\n value={currentPage}\r\n onChange={handleInput}\r\n min={1}\r\n max={pageCount}\r\n />\r\n <span className=\"text-gray-400\">/</span>\r\n <span>{pageCount}</span>\r\n </div>\r\n\r\n <button\r\n className=\"hv-btn\"\r\n disabled={currentPage >= pageCount}\r\n onClick={handleNext}\r\n >\r\n <ChevronRight size={20} />\r\n </button>\r\n </div>\r\n\r\n {/* Right Group: Layout & Signatures */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className={`hv-btn ${layout === \"single\" ? \"hv-btn-active text-indigo-600 bg-indigo-50\" : \"\"}`}\r\n onClick={() => onLayoutChange(\"single\")}\r\n title=\"Single Page View\"\r\n >\r\n <LayoutTemplate size={18} />\r\n </button>\r\n <button\r\n className={`hv-btn ${layout === \"side-by-side\" ? \"hv-btn-active text-indigo-600 bg-indigo-50\" : \"\"}`}\r\n onClick={() => onLayoutChange(\"side-by-side\")}\r\n title=\"Two Page View\"\r\n >\r\n <Grid2X2 size={18} />\r\n </button>\r\n\r\n <div\r\n className=\"hv-sep\"\r\n style={{\r\n width: 1,\r\n height: 24,\r\n background: \"var(--hv-border)\",\r\n margin: \"0 8px\",\r\n }}\r\n />\r\n\r\n {/* Signature Toggle Button */}\r\n {!props.disableSigning && (\r\n <button\r\n className={`hv-btn hv-btn-primary ${props.showSignatures ? \"ring-2 ring-indigo-300\" : \"\"}`}\r\n onClick={props.onToggleSignatures}\r\n title=\"Sign Document\"\r\n >\r\n <PenLine size={18} className=\"mr-2\" />\r\n <span className=\"hidden sm:inline\">Sign</span>\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { Plus, Trash2, X } from \"lucide-react\";\r\nimport React, { useState, useRef } from \"react\";\r\nimport type { Signature } from \"../types\";\r\n\r\ninterface SignaturePanelProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSelectSignature: (sig: Signature) => void;\r\n externalSignatures?: Signature[];\r\n onSignRequest?: () => Promise<Signature>;\r\n}\r\n\r\nexport function SignaturePanel(props: SignaturePanelProps) {\r\n const {\r\n isOpen,\r\n onClose,\r\n onSelectSignature,\r\n externalSignatures = [],\r\n onSignRequest,\r\n } = props;\r\n const [localSignatures, setLocalSignatures] = useState<Signature[]>([]);\r\n const [showModal, setShowModal] = useState(false);\r\n\r\n // Combine external + local\r\n const signatures = [...externalSignatures, ...localSignatures];\r\n\r\n // Drawing state\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const [isDrawing, setIsDrawing] = useState(false);\r\n\r\n // --- Modal Logic ---\r\n const handleCreateClick = async () => {\r\n if (onSignRequest) {\r\n try {\r\n const newSig = await onSignRequest();\r\n if (newSig) {\r\n // If the user provides a signature, we can choose to add it to local list\r\n // so it appears in the list here.\r\n // Note: If the parent manages state driven by \"externalSignatures\",\r\n // this might duplicate if we also add it locally.\r\n // However, typically onSignRequest implies external control.\r\n // Let's assume onSignRequest returns the signature and we should add it local\r\n // for immediate use, UNLESS the parent updates externalSignatures.\r\n // To be safe and simple: Add to local.\r\n setLocalSignatures((prev) => [...prev, newSig]);\r\n onSelectSignature(newSig);\r\n }\r\n } catch (err) {\r\n console.error(\"Custom sign request failed\", err);\r\n }\r\n } else {\r\n openCreateModal();\r\n }\r\n };\r\n\r\n const openCreateModal = () => {\r\n setShowModal(true);\r\n setTimeout(() => {\r\n const canvas = canvasRef.current;\r\n if (canvas) {\r\n const ctx = canvas.getContext(\"2d\");\r\n ctx?.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n }, 100);\r\n };\r\n\r\n const saveSignature = () => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n\r\n const newSig: Signature = {\r\n id: Date.now().toString(),\r\n signatureImageUrl: canvas.toDataURL(\"image/png\"),\r\n signedBy: \"Me\",\r\n dateSigned: new Date().toISOString(),\r\n };\r\n\r\n setLocalSignatures([...localSignatures, newSig]);\r\n setShowModal(false);\r\n onSelectSignature(newSig);\r\n };\r\n\r\n // --- Drawing Logic ---\r\n const startDraw = (e: React.MouseEvent | React.TouchEvent) => {\r\n setIsDrawing(true);\r\n draw(e);\r\n };\r\n const stopDraw = () => setIsDrawing(false);\r\n const draw = (e: React.MouseEvent | React.TouchEvent) => {\r\n if (!isDrawing || !canvasRef.current) return;\r\n const canvas = canvasRef.current;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n const rect = canvas.getBoundingClientRect();\r\n const clientX =\r\n \"touches\" in e ? e.touches[0].clientX : (e as React.MouseEvent).clientX;\r\n const clientY =\r\n \"touches\" in e ? e.touches[0].clientY : (e as React.MouseEvent).clientY;\r\n\r\n const x = clientX - rect.left;\r\n const y = clientY - rect.top;\r\n\r\n ctx.lineWidth = 2;\r\n ctx.lineCap = \"round\";\r\n ctx.lineTo(x, y);\r\n ctx.stroke();\r\n ctx.beginPath();\r\n ctx.moveTo(x, y);\r\n };\r\n\r\n return (\r\n <>\r\n {/* Right Sidebar */}\r\n <div\r\n className={`hv-sidebar hv-sidebar-right ${!isOpen ? \"collapsed\" : \"\"}`}\r\n style={{ width: isOpen ? \"280px\" : \"0\" }}\r\n >\r\n <div\r\n className=\"hv-sidebar-header\"\r\n style={{ justifyContent: \"space-between\", padding: \"12px 16px\" }}\r\n >\r\n <h3 style={{ margin: 0, fontSize: \"15px\", fontWeight: 600 }}>\r\n Signatures\r\n </h3>\r\n <button\r\n onClick={onClose}\r\n className=\"hv-btn\"\r\n style={{ padding: \"4px\", border: \"none\" }}\r\n >\r\n <X size={18} />\r\n </button>\r\n </div>\r\n\r\n <div className=\"hv-thumb-list\">\r\n <button\r\n onClick={handleCreateClick}\r\n className=\"hv-btn\"\r\n style={{\r\n width: \"100%\",\r\n justifyContent: \"center\",\r\n border: \"2px dashed var(--hv-border)\",\r\n marginBottom: \"16px\",\r\n color: \"var(--hv-primary)\",\r\n }}\r\n >\r\n <Plus size={18} style={{ marginRight: \"8px\" }} />\r\n New Signature\r\n </button>\r\n\r\n {signatures.map((sig, idx) => {\r\n const isLocal = localSignatures.some((s) => s.id === sig.id);\r\n // If it's not local, we assume it's external, so we might want to disable delete\r\n // or handle it differently.\r\n // For now, only show delete for local items to avoid state mismatch.\r\n const showDelete = isLocal;\r\n\r\n return (\r\n <div\r\n key={sig.id || idx}\r\n className=\"hv-thumb-item\"\r\n style={{\r\n position: \"relative\",\r\n padding: \"12px\",\r\n background: \"var(--hv-bg)\",\r\n borderRadius: \"8px\",\r\n border: \"1px solid var(--hv-border)\",\r\n }}\r\n onClick={() => onSelectSignature(sig)}\r\n >\r\n <img\r\n src={sig.signatureImageUrl}\r\n alt=\"Signature\"\r\n style={{ height: \"40px\", objectFit: \"contain\" }}\r\n />\r\n <div\r\n style={{\r\n fontSize: \"11px\",\r\n color: \"var(--hv-muted)\",\r\n marginTop: \"4px\",\r\n textAlign: \"center\",\r\n }}\r\n >\r\n {sig.signedBy || \"User\"} •{\" \"}\r\n {new Date(sig.dateSigned).toLocaleDateString()}\r\n {sig.comment && (\r\n <div className=\"text-xs text-gray-500 mt-1 italic\">\r\n {sig.comment}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {showDelete && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setLocalSignatures(\r\n localSignatures.filter((s) => s.id !== sig.id),\r\n );\r\n }}\r\n className=\"hv-btn\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"4px\",\r\n right: \"4px\",\r\n padding: \"4px\",\r\n color: \"#ef4444\",\r\n border: \"none\",\r\n background: \"white\",\r\n }}\r\n >\r\n <Trash2 size={12} />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n\r\n {/* --- MODAL FIX: Using hv-modal classes --- */}\r\n {showModal && (\r\n <div className=\"hv-modal-overlay\">\r\n <div\r\n className=\"hv-modal\"\r\n style={{ width: \"450px\", maxWidth: \"90vw\" }}\r\n >\r\n {/* Modal Header */}\r\n <div\r\n style={{\r\n padding: \"16px 24px\",\r\n borderBottom: \"1px solid var(--hv-border)\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <h3 style={{ margin: 0, fontSize: \"18px\", fontWeight: 600 }}>\r\n Draw Signature\r\n </h3>\r\n <button\r\n onClick={() => setShowModal(false)}\r\n className=\"hv-btn\"\r\n style={{ border: \"none\" }}\r\n >\r\n <X size={20} />\r\n </button>\r\n </div>\r\n\r\n {/* Modal Body (Canvas) */}\r\n <div\r\n style={{\r\n padding: \"24px\",\r\n background: \"#f9fafb\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n background: \"white\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: \"8px\",\r\n overflow: \"hidden\",\r\n boxShadow: \"inset 0 2px 4px 0 rgba(0,0,0,0.05)\",\r\n }}\r\n >\r\n <canvas\r\n ref={canvasRef}\r\n width={400}\r\n height={200}\r\n style={{\r\n display: \"block\",\r\n cursor: \"crosshair\",\r\n touchAction: \"none\",\r\n }}\r\n onMouseDown={startDraw}\r\n onMouseUp={stopDraw}\r\n onMouseMove={draw}\r\n onTouchStart={startDraw}\r\n onTouchEnd={stopDraw}\r\n onTouchMove={draw}\r\n />\r\n </div>\r\n <p\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"var(--hv-muted)\",\r\n marginTop: \"8px\",\r\n }}\r\n >\r\n Sign above using your mouse or finger\r\n </p>\r\n </div>\r\n\r\n {/* Modal Footer */}\r\n <div\r\n style={{\r\n padding: \"16px 24px\",\r\n borderTop: \"1px solid var(--hv-border)\",\r\n display: \"flex\",\r\n justifyContent: \"flex-end\",\r\n gap: \"12px\",\r\n }}\r\n >\r\n <button\r\n onClick={() => {\r\n const ctx = canvasRef.current?.getContext(\"2d\");\r\n ctx?.clearRect(0, 0, 400, 200);\r\n }}\r\n className=\"hv-btn\"\r\n >\r\n Clear\r\n </button>\r\n <button onClick={saveSignature} className=\"hv-btn hv-btn-primary\">\r\n Create & Use\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n"],"mappings":"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","names":["import_react","DOMPurify","MarkdownIt","mammoth","import_react","import_jsx_runtime","SpreadsheetEditor","_","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","JSZip","import_react","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime"]}