@zerohive/hive-viewer 0.2.3 → 0.2.4

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/components/DocumentViewer.tsx","../src/editors/RichTextEditor.tsx","../src/utils/sanitize.ts","../src/editors/SpreadsheetEditor.tsx","../src/utils/fileSource.ts","../src/renderers/ImageRenderer.tsx","../src/renderers/PdfRenderer.tsx","../src/renderers/PptxRenderer.tsx","../src/utils/locale.ts","../src/components/SignaturePanel.tsx","../src/components/ThumbnailsSidebar.tsx","../src/components/Toolbar.tsx"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { RichTextEditor, type RichTextEditorHandle } from '../editors/RichTextEditor';\nimport { SpreadsheetEditor, type SpreadsheetEditorHandle } from '../editors/SpreadsheetEditor';\nimport { ImageRenderer } from '../renderers/ImageRenderer';\nimport { PdfRenderer } from '../renderers/PdfRenderer';\nimport { PptxRenderer } from '../renderers/PptxRenderer';\nimport type { DocumentMode, DocumentViewerProps, PageLayout, Signature, SupportedFileType } from '../types';\nimport { resolveSource } from '../utils/fileSource';\nimport { defaultLocale } from '../utils/locale';\nimport { SignaturePanel } from './SignaturePanel';\nimport { ThumbnailsSidebar, type Thumbnail } from './ThumbnailsSidebar';\nimport { Toolbar } from './Toolbar';\n\ninterface SigPlacement { page: number; x: number; y: number; w: number; h: number; signatureImageUrl: string }\n\ntype EditorHandle = (RichTextEditorHandle | SpreadsheetEditorHandle) & { save: (exportPdf?: boolean) => Promise<void> };\n\nexport function DocumentViewer(props: DocumentViewerProps) {\n const mode: DocumentMode = props.mode ?? 'view';\n const theme = props.theme ?? 'light';\n const locale = useMemo(() => ({ ...defaultLocale, ...(props.locale ?? {}) }), [props.locale]);\n\n const [layout, setLayout] = useState<PageLayout>(props.defaultLayout ?? 'single');\n const [showThumbnails, setShowThumbnails] = useState(true);\n const [showSignatures, setShowSignatures] = useState(true);\n const [headerFooterEnabled, setHeaderFooterEnabled] = useState(true);\n\n const allowSigning = props.allowSigning ?? false;\n const [signingBusy, setSigningBusy] = useState(false);\n\n const [resolved, setResolved] = useState<{ fileType: SupportedFileType; fileName: string; url?: string; arrayBuffer?: ArrayBuffer } | null>(null);\n const [error, setError] = useState<string>('');\n const [pageCount, setPageCount] = useState(1);\n const [currentPage, setCurrentPage] = useState(1);\n const [thumbs, setThumbs] = useState<Array<string | undefined>>([]);\n\n const [localSignatures, setLocalSignatures] = useState<Signature[]>(props.signatures ?? []);\n useEffect(() => setLocalSignatures(props.signatures ?? []), [props.signatures]);\n\n const [sigPlacements, setSigPlacements] = useState<SigPlacement[]>([]);\n const [armedSignatureUrl, setArmedSignatureUrl] = useState<string | null>(null);\n\n const editorRef = useRef<EditorHandle | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n setError('');\n setResolved(null);\n setThumbs([]);\n setPageCount(1);\n setCurrentPage(1);\n setSigPlacements([]);\n setArmedSignatureUrl(null);\n\n if (mode === 'create') {\n const ft = (props.fileType ?? 'docx') as SupportedFileType;\n setResolved({ fileType: ft, fileName: props.fileName ?? `Untitled.${ft}` });\n return;\n }\n\n try {\n const res = await resolveSource({\n fileUrl: props.fileUrl,\n base64: props.base64,\n blob: props.blob,\n fileName: props.fileName,\n fileType: props.fileType,\n });\n if (cancelled) { return; }\n setResolved({ fileType: res.fileType, fileName: res.fileName, url: res.url, arrayBuffer: res.arrayBuffer });\n } catch (e) {\n if (cancelled) { return; }\n setError(e instanceof Error ? e.message : String(e));\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [mode, props.fileUrl, props.base64, props.blob, props.fileName, props.fileType]);\n\n const thumbnails: Thumbnail[] = useMemo(() => {\n const n = Math.max(1, pageCount);\n return Array.from({ length: n }, (_, i) => ({\n id: `p-${i + 1}`,\n label: `${locale['thumbnails.page'] ?? 'Page'} ${i + 1}`,\n dataUrl: thumbs[i],\n }));\n }, [pageCount, thumbs, locale]);\n\n async function handleSignRequest() {\n if (!allowSigning || signingBusy || !props.onSignRequest) { return; }\n setSigningBusy(true);\n try {\n const sig = await props.onSignRequest();\n setLocalSignatures((prev: Signature[]) => [...prev, sig]);\n setArmedSignatureUrl(sig.signatureImageUrl);\n } finally {\n setSigningBusy(false);\n }\n }\n\n function placeSignature(p: { page: number; x: number; y: number; w: number; h: number }) {\n if (!armedSignatureUrl) { return; }\n setSigPlacements((prev: SigPlacement[]) => [...prev, { ...p, signatureImageUrl: armedSignatureUrl }]);\n setArmedSignatureUrl(null);\n }\n\n async function handleSave(exportPdf?: boolean) {\n if (editorRef.current) {\n await editorRef.current.save(!!exportPdf);\n return;\n }\n if (!resolved?.arrayBuffer) { return; }\n const b64 = arrayBufferToBase64(resolved.arrayBuffer);\n props.onSave?.(b64, { fileName: resolved.fileName, fileType: resolved.fileType, annotations: { sigPlacements } });\n }\n\n const canSave = mode === 'edit' || mode === 'create';\n const canExportPdf = (mode === 'edit' || mode === 'create') && (resolved?.fileType === 'docx' || resolved?.fileType === 'md' || resolved?.fileType === 'txt' || resolved?.fileType === 'xlsx');\n\n return (\n <div className={`hv-root`} data-hv-theme={theme}>\n <Toolbar\n locale={locale}\n mode={mode}\n fileType={resolved?.fileType}\n layout={layout}\n onChangeLayout={setLayout}\n showThumbnails={showThumbnails}\n onToggleThumbnails={() => setShowThumbnails((v: boolean) => !v)}\n showSignatures={showSignatures}\n onToggleSignatures={() => setShowSignatures((v: boolean) => !v)}\n onSign={() => void handleSignRequest()}\n allowSigning={allowSigning}\n signingDisabled={signingBusy || !props.onSignRequest}\n canSave={canSave}\n onSave={() => void handleSave(false)}\n canExportPdf={canExportPdf}\n onExportPdf={() => void handleSave(true)}\n headerFooterEnabled={headerFooterEnabled}\n showHeaderFooterToggle={(props.enableHeaderFooterToggle ?? true) && mode === 'create'}\n onToggleHeaderFooter={() => setHeaderFooterEnabled((v: boolean) => !v)}\n />\n\n {error ? (\n <div className=\"hv-error\" role=\"alert\">\n <div className=\"hv-error-title\">{locale['error.title'] ?? 'Error'}</div>\n <div className=\"hv-error-body\">{error}</div>\n </div>\n ) : null}\n\n {!resolved && !error ? <div className=\"hv-loading\" aria-busy=\"true\">{locale.loading ?? 'Loading…'}</div> : null}\n\n {resolved ? (\n <div className=\"hv-shell\">\n {mode !== 'create' ? (\n <ThumbnailsSidebar\n locale={locale}\n thumbnails={thumbnails}\n currentPage={currentPage}\n collapsed={!showThumbnails}\n onToggle={() => setShowThumbnails((v: boolean) => !v)}\n onSelectPage={setCurrentPage}\n />\n ) : null}\n\n <main className=\"hv-main\">\n {resolved.fileType === 'pdf' ? (\n <PdfRenderer\n url={resolved.url}\n arrayBuffer={resolved.arrayBuffer}\n layout={layout}\n currentPage={currentPage}\n onCurrentPageChange={setCurrentPage}\n onPageCount={(n) => {\n setPageCount(n);\n setThumbs((prev) => (prev.length === n ? prev : Array.from({ length: n }, (_, i) => prev[i])));\n }}\n onThumbs={(t) => setThumbs(t)}\n signatureStamp={armedSignatureUrl ? { imageUrl: armedSignatureUrl, armed: true, onPlaced: placeSignature } : undefined}\n />\n ) : null}\n\n {resolved.fileType === 'docx' || resolved.fileType === 'md' || resolved.fileType === 'txt' ? (\n <RichTextEditor\n ref={editorRef as any}\n mode={mode}\n fileType={resolved.fileType}\n fileName={resolved.fileName}\n arrayBuffer={resolved.arrayBuffer}\n headerComponent={props.headerComponent}\n footerComponent={props.footerComponent}\n headerFooterEnabled={headerFooterEnabled}\n locale={locale}\n signatures={localSignatures}\n signaturePlacements={sigPlacements}\n onPageCount={(n) => { setPageCount(n); setThumbs((prev) => (prev.length === n ? prev : Array.from({ length: n }, (_, i) => prev[i]))); }}\n onSave={(b64, meta) => props.onSave?.(b64, meta)}\n armedSignatureUrl={armedSignatureUrl}\n onPlaceSignature={placeSignature}\n />\n ) : null}\n\n {resolved.fileType === 'xlsx' ? (\n <SpreadsheetEditor\n ref={editorRef as any}\n mode={mode}\n fileName={resolved.fileName}\n arrayBuffer={resolved.arrayBuffer}\n locale={locale}\n onSave={(b64, meta) => props.onSave?.(b64, meta)}\n />\n ) : null}\n\n {resolved.fileType === 'pptx' ? (\n <PptxRenderer\n arrayBuffer={resolved.arrayBuffer}\n layout={layout}\n currentPage={currentPage}\n onCurrentPageChange={setCurrentPage}\n onSlideCount={(n) => {\n setPageCount(n);\n setThumbs((prev) => (prev.length === n ? prev : Array.from({ length: n }, (_, i) => prev[i])));\n }}\n onThumbs={(t) => setThumbs(t)}\n />\n ) : null}\n\n {resolved.fileType === 'png' || resolved.fileType === 'jpg' || resolved.fileType === 'svg' ? (\n <ImageRenderer arrayBuffer={resolved.arrayBuffer} fileType={resolved.fileType} fileName={resolved.fileName} />\n ) : null}\n </main>\n\n {mode !== 'create' && localSignatures.length ? (\n <SignaturePanel\n locale={locale}\n signatures={localSignatures}\n collapsed={!showSignatures}\n onToggle={() => setShowSignatures((v: boolean) => !v)}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction arrayBufferToBase64(ab: ArrayBuffer): string {\n const bytes = new Uint8Array(ab);\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","'use client';\n\nimport html2canvas from 'html2canvas';\nimport mammoth from 'mammoth';\n// Do not statically import html-to-docx; use dynamic import for browser compatibility\nimport MarkdownIt from 'markdown-it';\nimport React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { DocumentMode, Signature, SupportedFileType } from '../types';\nimport { arrayBufferToBase64 } from '../utils/fileSource';\nimport { sanitizeHtml } from '../utils/sanitize';\n\nconst PAGE_H = 1122; // virtual A4\n\nexport interface RichTextEditorHandle {\n save: (exportPdf?: boolean) => Promise<void>;\n requestThumbnail: (index: number) => Promise<string | undefined>;\n}\n\nexport const RichTextEditor = forwardRef<\n RichTextEditorHandle,\n {\n mode: DocumentMode;\n fileType: 'docx' | 'md' | 'txt';\n fileName: string;\n arrayBuffer?: ArrayBuffer;\n locale: Record<string, string>;\n headerComponent?: React.ReactNode;\n footerComponent?: React.ReactNode;\n headerFooterEnabled: boolean;\n signatures: Signature[];\n signaturePlacements: Array<{\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n signatureImageUrl: string;\n }>;\n armedSignatureUrl: string | null;\n onPlaceSignature: (p: {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n }) => void;\n onSave: (\n b64: string,\n meta: {\n fileName: string;\n fileType: SupportedFileType;\n exportedAsPdf?: boolean;\n annotations?: unknown;\n },\n ) => void;\n onPageCount: (n: number) => void;\n }\n>((props, ref) => {\n const readOnly = props.mode === 'view';\n const md = useMemo(\n () => new MarkdownIt({ html: false, linkify: true, breaks: true }),\n [],\n );\n const scrollerRef = useRef<HTMLDivElement | null>(null);\n const editorRef = useRef<HTMLDivElement | null>(null);\n const captureRef = useRef<HTMLDivElement | null>(null);\n\n const [html, setHtml] = useState('<p><br/></p>');\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n if (props.mode === 'create') {\n setHtml('<p><br/></p>');\n return;\n }\n if (!props.arrayBuffer) { return; }\n if (props.fileType === 'docx') {\n const res = await mammoth.convertToHtml({\n arrayBuffer: props.arrayBuffer,\n });\n if (!cancelled) { setHtml(sanitizeHtml(res.value || '<p><br/></p>')); }\n } else {\n const text = new TextDecoder().decode(props.arrayBuffer);\n if (props.fileType === 'md') { setHtml(sanitizeHtml(md.render(text))); }\n else { setHtml(`<pre>${escapeHtml(text)}</pre>`); }\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [props.arrayBuffer, props.fileType, props.mode, md]);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) { return; }\n const recompute = () =>\n props.onPageCount(Math.max(1, Math.ceil(el.scrollHeight / PAGE_H)));\n recompute();\n const ro = new ResizeObserver(recompute);\n ro.observe(el);\n return () => ro.disconnect();\n }, [html, props.headerFooterEnabled]);\n\n function exec(cmd: string) {\n if (readOnly) { return; }\n document.execCommand(cmd);\n }\n\n function onClick(e: React.MouseEvent<HTMLDivElement>) {\n if (!props.armedSignatureUrl) { return; }\n const scroller = scrollerRef.current;\n if (!scroller) { return; }\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const absY = scroller.scrollTop + (e.clientY - rect.top);\n const page = Math.max(1, Math.floor(absY / PAGE_H) + 1);\n const pageTop = (page - 1) * PAGE_H;\n const x = (e.clientX - rect.left) / rect.width;\n const y = (absY - pageTop) / PAGE_H;\n props.onPlaceSignature({ page, x, y, w: 0.25, h: 0.1 });\n }\n\n async function requestThumbnail(index: number): Promise<string | undefined> {\n const scroller = scrollerRef.current;\n const capture = captureRef.current;\n if (!scroller || !capture) { return undefined; }\n const old = scroller.scrollTop;\n scroller.scrollTop = index * PAGE_H;\n await new Promise((r) => requestAnimationFrame(() => r(null)));\n try {\n const canvas = await html2canvas(capture, {\n backgroundColor: null,\n scale: 0.25,\n useCORS: true,\n });\n return canvas.toDataURL('image/png');\n } catch {\n return undefined;\n } finally {\n scroller.scrollTop = old;\n }\n }\n\n async function save(exportPdf?: boolean) {\n const inner = editorRef.current?.innerHTML ?? html;\n const stitched = `<!doctype html><html><head><meta charset=\"utf-8\" /></head><body>${inner}</body></html>`;\n\n if (exportPdf) {\n // client-side: return print-ready HTML as base64\n const b64 = btoa(unescape(encodeURIComponent(stitched)));\n props.onSave(b64, {\n fileName: replaceExt(props.fileName, 'html'),\n fileType: 'txt',\n exportedAsPdf: true,\n annotations: { signaturePlacements: props.signaturePlacements },\n });\n return;\n }\n\n if (props.fileType === 'docx') {\n // Use API route for DOCX export (browser-safe)\n try {\n const response = await fetch('/api/export-docx', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n html: stitched,\n fileName: replaceExt(props.fileName, 'docx'),\n }),\n });\n if (!response.ok) { throw new Error('Failed to generate DOCX'); }\n const blob = await response.blob();\n // Download the file directly\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = replaceExt(props.fileName, 'docx');\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n window.URL.revokeObjectURL(url);\n a.remove();\n }, 100);\n } catch (err) {\n alert(\n 'DOCX export failed: ' +\n (err instanceof Error ? err.message : String(err)),\n );\n }\n return;\n }\n\n const text = editorRef.current?.innerText ?? '';\n const b64 = btoa(unescape(encodeURIComponent(text)));\n props.onSave(b64, {\n fileName: replaceExt(props.fileName, props.fileType),\n fileType: props.fileType,\n annotations: { signaturePlacements: props.signaturePlacements },\n });\n }\n\n useImperativeHandle(ref, () => ({ save, requestThumbnail }));\n\n return (\n <div className=\"hv-doc\">\n <div className=\"hv-ribbon\" role=\"toolbar\">\n <button\n className=\"hv-btn\"\n onClick={() => exec('bold')}\n disabled={readOnly}\n >\n B\n </button>\n <button\n className=\"hv-btn\"\n onClick={() => exec('italic')}\n disabled={readOnly}\n >\n I\n </button>\n <button\n className=\"hv-btn\"\n onClick={() => exec('underline')}\n disabled={readOnly}\n >\n U\n </button>\n {props.armedSignatureUrl ? (\n <div className=\"hv-hint\">Click to place signature</div>\n ) : null}\n </div>\n\n <div className=\"hv-scroll\" ref={scrollerRef} onClick={onClick}>\n <div className=\"hv-pageStage\" ref={captureRef}>\n {props.headerFooterEnabled && props.headerComponent ? (\n <div className=\"hv-letterhead\">{props.headerComponent}</div>\n ) : null}\n\n <div\n ref={editorRef}\n className={readOnly ? 'hv-editor hv-editor--ro' : 'hv-editor'}\n contentEditable={!readOnly}\n suppressContentEditableWarning\n onInput={() => setHtml(editorRef.current?.innerHTML ?? '')}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n\n {props.headerFooterEnabled && props.footerComponent ? (\n <div className=\"hv-letterhead hv-letterhead--footer\">\n {props.footerComponent}\n </div>\n ) : null}\n\n {props.mode === 'create' && props.signatures.length ? (\n <div className=\"hv-signatures-inline\">\n {props.signatures.map((s, i) => (\n <div key={i} className=\"hv-sign-inline\">\n <img\n src={s.signatureImageUrl}\n alt=\"\"\n className=\"hv-sign-img\"\n />\n <div>\n <div className=\"hv-sign-name\">{s.signedBy}</div>\n <div className=\"hv-sign-date\">\n {new Date(s.dateSigned).toLocaleString()}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n});\n\nfunction replaceExt(name: string, ext: string) {\n const base = name.includes('.') ? name.slice(0, name.lastIndexOf('.')) : name;\n return `${base}.${ext}`;\n}\n\nfunction escapeHtml(s: string) {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\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, { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';\nimport * as XLSX from 'xlsx';\nimport type { DocumentMode, SupportedFileType } from '../types';\nimport { arrayBufferToBase64 } from '../utils/fileSource';\n\nexport interface SpreadsheetEditorHandle {\n save: (exportPdf?: boolean) => Promise<void>;\n requestThumbnails: (index: number) => Promise<void>;\n}\n\nexport const SpreadsheetEditor = forwardRef<SpreadsheetEditorHandle, {\n mode: DocumentMode;\n fileName: string;\n arrayBuffer?: ArrayBuffer;\n locale: Record<string, string>;\n onSave: (base64: string, meta: { fileName: string; fileType: SupportedFileType; exportedAsPdf?: boolean }) => void;\n}>(function SpreadsheetEditor(props, ref) {\n const readonly = props.mode === 'view';\n const [grid, setGrid] = useState<string[][]>(() => Array.from({ length: 30 }, () => Array.from({ length: 12 }, () => '')));\n\n useEffect(() => {\n if (!props.arrayBuffer) { return; }\n try {\n const wb = XLSX.read(props.arrayBuffer, { type: 'array' });\n const name = wb.SheetNames[0];\n const ws = wb.Sheets[name];\n const aoa = XLSX.utils.sheet_to_json(ws, { header: 1, raw: true }) as any[][];\n const rows = Math.max(30, aoa.length);\n const cols = Math.max(12, Math.max(...aoa.map((r) => (r?.length ?? 0)), 0));\n const next = Array.from({ length: rows }, (_, r) => Array.from({ length: cols }, (_, c) => {\n const v = aoa[r]?.[c];\n return v == null ? '' : String(v);\n }));\n setGrid(next);\n } catch {\n // ignore\n }\n }, [props.arrayBuffer]);\n\n async function save(exportPdf?: boolean) {\n const ws = XLSX.utils.aoa_to_sheet(grid);\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' }) as ArrayBuffer;\n const b64 = arrayBufferToBase64(out);\n props.onSave(b64, { fileName: ensureExt(props.fileName, 'xlsx'), fileType: 'xlsx', exportedAsPdf: !!exportPdf });\n }\n\n useImperativeHandle(ref, () => ({\n save,\n requestThumbnails: async () => undefined,\n }));\n\n const cols = useMemo(() => Array.from({ length: grid[0]?.length ?? 0 }, (_, i) => String.fromCharCode(65 + (i % 26))), [grid]);\n\n return (\n <div className=\"hv-sheet\">\n <div className=\"hv-sheetbar\">\n <div className=\"hv-sheetbar-title\">{props.fileName}</div>\n {!readonly ? <button className=\"hv-btn\" type=\"button\" onClick={() => void save(false)}>{props.locale['toolbar.save'] ?? 'Save'}</button> : null}\n </div>\n <div className=\"hv-sheetgrid\" role=\"table\" aria-label=\"Spreadsheet\">\n <div className=\"hv-sheetrow hv-sheetrow--header\" role=\"row\">\n <div className=\"hv-sheetcell hv-sheetcell--corner\" role=\"columnheader\" />\n {cols.map((c, i) => <div key={i} className=\"hv-sheetcell hv-sheetcell--header\" role=\"columnheader\">{c}</div>)}\n </div>\n {grid.map((row, r) => (\n <div key={r} className=\"hv-sheetrow\" role=\"row\">\n <div className=\"hv-sheetcell hv-sheetcell--header\" role=\"rowheader\">{r + 1}</div>\n {row.map((val, c) => (\n <div\n key={c}\n className=\"hv-sheetcell\"\n role=\"cell\"\n contentEditable={!readonly}\n suppressContentEditableWarning\n onInput={(e) => {\n const text = (e.currentTarget.textContent ?? '');\n setGrid((prev) => {\n const next = prev.map((rr) => rr.slice());\n next[r][c] = text;\n return next;\n });\n }}\n >{val}</div>\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n});\n\nfunction ensureExt(name: string, ext: string) {\n const base = name.includes('.') ? name.slice(0, name.lastIndexOf('.')) : name;\n return `${base}.${ext}`;\n}\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';\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport type { SupportedFileType } from '../types';\n\n/**\n * Image renderer for DocumentViewer.\n * Supports PNG, JPG, SVG, etc. with zoom controls.\n */\nexport function ImageRenderer({\n arrayBuffer,\n fileType,\n fileName,\n}: {\n /** Image file as ArrayBuffer (optional) */\n arrayBuffer?: ArrayBuffer;\n /** File type (e.g. 'png', 'jpg', 'svg') */\n fileType: SupportedFileType;\n /** File name for display */\n fileName: string;\n}) {\n const [zoom, setZoom] = useState(1);\n const url = useMemo(() => {\n if (!arrayBuffer) { return undefined; }\n const mime =\n fileType === 'svg'\n ? 'image/svg+xml'\n : fileType === 'png'\n ? 'image/png'\n : 'image/jpeg';\n return URL.createObjectURL(new Blob([arrayBuffer], { type: mime }));\n }, [arrayBuffer, fileType]);\n\n useEffect(() => {\n return () => {\n if (url) { URL.revokeObjectURL(url); }\n };\n }, [url]);\n\n return (\n <div className=\"hv-doc\">\n <div className=\"hv-mini-toolbar\">\n <div className=\"hv-title\">{fileName}</div>\n <div className=\"hv-spacer\" />\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => setZoom((z) => Math.max(0.25, z - 0.25))}\n >\n -\n </button>\n <div className=\"hv-zoom\">{Math.round(zoom * 100)}%</div>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => setZoom((z) => Math.min(4, z + 0.25))}\n >\n +\n </button>\n </div>\n <div className=\"hv-center\">\n {!arrayBuffer && (\n <div className=\"hv-error\">No image data provided.</div>\n )}\n {arrayBuffer && !url && (\n <div className=\"hv-error\">Failed to load image.</div>\n )}\n {url && (\n <img\n src={url}\n alt={fileName}\n style={{ transform: `scale(${zoom})` }}\n className=\"hv-image\"\n />\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport {\n getDocument,\n GlobalWorkerOptions,\n type PDFDocumentProxy,\n} from 'pdfjs-dist';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport type { PageLayout } from '../types';\n\n/**\n * PDF document renderer for DocumentViewer.\n * Handles loading, error, and signature placement.\n */\nexport function PdfRenderer(props: {\n /** PDF file URL (optional) */\n url?: string;\n /** PDF file as ArrayBuffer (optional) */\n arrayBuffer?: ArrayBuffer;\n /** Page layout mode */\n layout: PageLayout;\n /** Current page number (1-based) */\n currentPage: number;\n /** Callback when current page changes */\n onCurrentPageChange: (p: number) => void;\n /** Callback when page count is determined */\n onPageCount: (n: number) => void;\n /** Callback for thumbnail images */\n onThumbs: (thumbs: Array<string | undefined>) => void;\n /** Signature stamp for placement (optional) */\n signatureStamp?: {\n imageUrl: string;\n armed: boolean;\n onPlaced: (placement: {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n }) => void;\n };\n}) {\n const { url, arrayBuffer } = props;\n const [doc, setDoc] = useState<PDFDocumentProxy | null>(null);\n const [pageCount, setPageCount] = useState(0);\n const [rendered, setRendered] = useState<Map<number, HTMLCanvasElement>>(\n new Map(),\n );\n const [thumbs, setThumbs] = useState<Array<string | undefined>>([]);\n const [size, setSize] = useState({ w: 840, h: 1188 });\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n try {\n GlobalWorkerOptions.workerSrc = new URL(\n 'pdfjs-dist/build/pdf.worker.min.mjs',\n import .meta.url,\n ).toString();\n } catch {}\n }, []);\n\n useEffect(() => {\n let cancel = false;\n setError(null);\n setLoading(true);\n (async () => {\n setDoc(null);\n setRendered(new Map());\n setThumbs([]);\n if (!url && !arrayBuffer) {\n setError('No PDF source provided.');\n setLoading(false);\n return;\n }\n try {\n const task = getDocument(\n url ? { url, rangeChunkSize: 512 * 1024 } : { data: arrayBuffer! },\n );\n const pdf = await task.promise;\n if (cancel) { return; }\n setDoc(pdf);\n setPageCount(pdf.numPages);\n props.onPageCount(pdf.numPages);\n\n // Get first page to determine aspect ratio and main render size\n const p1 = await pdf.getPage(1);\n const base = p1.getViewport({ scale: 1 });\n const w = Math.min(980, Math.max(640, base.width));\n const s = w / base.width;\n const vp = p1.getViewport({ scale: s });\n setSize({ w: Math.round(vp.width), h: Math.round(vp.height) });\n\n // Generate all thumbnails up front\n const thumbWidth = 56; // px, matches CSS .hv-thumbimg\n const thumbsArr: Array<string | undefined> = [];\n for (let i = 1; i <= pdf.numPages; i++) {\n const page = await pdf.getPage(i);\n const pageBase = page.getViewport({ scale: 1 });\n const thumbScale = thumbWidth / pageBase.width;\n const thumbVp = page.getViewport({ scale: thumbScale });\n const thumbCanvas = document.createElement('canvas');\n thumbCanvas.width = Math.round(thumbVp.width);\n thumbCanvas.height = Math.round(thumbVp.height);\n const thumbCtx = thumbCanvas.getContext('2d', { alpha: false });\n if (thumbCtx) {\n await page.render({ canvasContext: thumbCtx, viewport: thumbVp })\n .promise;\n thumbsArr.push(thumbCanvas.toDataURL('image/png'));\n } else {\n thumbsArr.push(undefined);\n }\n }\n setThumbs(thumbsArr);\n } catch (e) {\n setError(\n 'Failed to load PDF. ' + (e instanceof Error ? e.message : ''),\n );\n } finally {\n setLoading(false);\n }\n })();\n return () => {\n cancel = true;\n };\n }, [url, arrayBuffer]);\n\n useEffect(() => {\n props.onThumbs(thumbs);\n }, [thumbs]);\n\n const pagesToShow = useMemo(() => {\n if (props.layout === 'side-by-side') {\n const left = props.currentPage;\n const right = Math.min(pageCount || left + 1, left + 1);\n return [left, right];\n }\n return [props.currentPage];\n }, [props.currentPage, props.layout, pageCount]);\n\n useEffect(() => {\n if (!doc) { return; }\n let cancel = false;\n (async () => {\n for (const p of pagesToShow) {\n if (rendered.has(p)) { continue; }\n try {\n const page = await doc.getPage(p);\n if (cancel) { return; }\n const base = page.getViewport({ scale: 1 });\n const vp = page.getViewport({ scale: size.w / base.width });\n const canvas = document.createElement('canvas');\n canvas.width = Math.round(vp.width);\n canvas.height = Math.round(vp.height);\n const ctx = canvas.getContext('2d', { alpha: false });\n if (!ctx) { continue; }\n await page.render({ canvasContext: ctx, viewport: vp }).promise;\n if (cancel) { return; }\n setRendered((prev) => {\n const next = new Map(prev);\n next.set(p, canvas);\n return next;\n });\n } catch {}\n }\n })();\n return () => {\n cancel = true;\n };\n }, [doc, pagesToShow, size.w, rendered]);\n\n function onWheel(e: React.WheelEvent) {\n if (!pageCount) { return; }\n if (Math.abs(e.deltaY) < 10) { return; }\n const dir = e.deltaY > 0 ? 1 : -1;\n const step = props.layout === 'side-by-side' ? 2 : 1;\n const next = Math.max(\n 1,\n Math.min(pageCount, props.currentPage + dir * step),\n );\n props.onCurrentPageChange(next);\n }\n\n function clickPlace(e: React.MouseEvent, page: number) {\n const stamp = props.signatureStamp;\n if (!stamp?.armed) { return; }\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const x = (e.clientX - rect.left) / rect.width;\n const y = (e.clientY - rect.top) / rect.height;\n stamp.onPlaced({ page, x, y, w: 0.22, h: 0.08 });\n }\n\n return (\n <div className=\"hv-doc\" ref={containerRef} onWheel={onWheel}>\n {!doc ? <div className=\"hv-loading\">Loading PDF…</div> : null}\n {doc ? (\n <div\n className={\n props.layout === 'side-by-side'\n ? 'hv-pages hv-pages--two'\n : 'hv-pages'\n }\n >\n {pagesToShow.map((p) => {\n const c = rendered.get(p);\n return (\n <div\n key={p}\n className=\"hv-page\"\n style={{ width: size.w, height: size.h }}\n onClick={(e) => clickPlace(e, p)}\n >\n {c ? (\n <canvas\n className=\"hv-canvas\"\n width={c.width}\n height={c.height}\n ref={(node) => {\n if (!node) { return; }\n const ctx = node.getContext('2d');\n if (ctx) { ctx.drawImage(c, 0, 0); }\n }}\n />\n ) : (\n <div className=\"hv-loading\">Rendering…</div>\n )}\n </div>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport JSZip from \"jszip\";\nimport type { PageLayout } from \"../types\";\n\ntype Slide = { index: number; text: string };\n\nfunction decodeXml(s: string): string {\n return s\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n}\n\nfunction extractText(xml: string) {\n return [...xml.matchAll(/<a:t>(.*?)<\\/a:t>/g)]\n .map((m) => decodeXml(m[1] || \"\"))\n .join(\" \")\n .trim();\n}\n\n/**\n * PowerPoint (.pptx) renderer for DocumentViewer.\n * Extracts and displays slide text, handles errors and loading.\n */\nexport function PptxRenderer(props: {\n /** PPTX file as ArrayBuffer (optional) */\n arrayBuffer?: ArrayBuffer;\n /** Page layout mode */\n layout: PageLayout;\n /** Current slide number (1-based) */\n currentPage: number;\n /** Callback when current slide changes */\n onCurrentPageChange: (p: number) => void;\n /** Callback when slide count is determined */\n onSlideCount: (n: number) => void;\n /** Callback for slide thumbnails */\n onThumbs: (thumbs: (string | undefined)[]) => void;\n}) {\n const [slides, setSlides] = useState<Slide[]>([]);\n const [thumbs, setThumbs] = useState<(string | undefined)[]>([]);\n\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n useEffect(() => {\n let cancel = false;\n setError(null);\n setLoading(true);\n (async () => {\n setSlides([]);\n setThumbs([]);\n if (!props.arrayBuffer) {\n setError(\"No PPTX source provided.\");\n setLoading(false);\n return;\n }\n try {\n // Load PPTX and extract slides (existing logic)\n const zip = await JSZip.loadAsync(props.arrayBuffer);\n const slidePaths = Object.keys(zip.files)\n .filter((p) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(p))\n .sort();\n const slidesOut: Slide[] = [];\n for (let i = 0; i < slidePaths.length; i++) {\n const xml = await zip.files[slidePaths[i]].async(\"string\");\n slidesOut.push({ index: i + 1, text: extractText(xml) });\n }\n if (cancel) return;\n setSlides(\n slidesOut.length ? slidesOut : [{ index: 1, text: \"(empty)\" }],\n );\n props.onSlideCount(slidesOut.length || 1);\n\n // Generate all thumbnails up front (SVG placeholder for now)\n const thumbWidth = 56;\n const thumbsArr: (string | undefined)[] = [];\n for (let i = 0; i < (slidesOut.length || 1); i++) {\n thumbsArr.push(\n `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgThumb(i + 1))}`,\n );\n }\n setThumbs(thumbsArr);\n } catch (e) {\n setSlides([\n { index: 1, text: \"Unable to render this .pptx in-browser.\" },\n ]);\n setThumbs([undefined]);\n setError(\n \"Failed to load PPTX. \" + (e instanceof Error ? e.message : \"\"),\n );\n } finally {\n setLoading(false);\n }\n })();\n return () => {\n cancel = true;\n };\n }, [props.arrayBuffer]);\n // (removed unreachable/duplicate code after useEffect)\n\n useEffect(() => {\n props.onThumbs(thumbs);\n }, [thumbs]);\n\n const pagesToShow = useMemo(() => {\n if (props.layout === \"side-by-side\")\n return [\n props.currentPage,\n Math.min(slides.length || props.currentPage + 1, props.currentPage + 1),\n ];\n return [props.currentPage];\n }, [props.currentPage, props.layout, slides.length]);\n\n return (\n <div className=\"hv-doc\">\n {loading && <div className=\"hv-loading\">Loading PPTX…</div>}\n {error && <div className=\"hv-error\">{error}</div>}\n {!loading && !error && (!slides || slides.length === 0) && (\n <div className=\"hv-error\">No slides to display.</div>\n )}\n {!error && slides && slides.length > 0 && (\n <div\n className={\n props.layout === \"side-by-side\"\n ? \"hv-pages hv-pages--two\"\n : \"hv-pages\"\n }\n >\n {pagesToShow.map((p) => {\n const s = slides[p - 1];\n return (\n <div\n key={p}\n className=\"hv-slide\"\n tabIndex={0}\n onFocus={() => props.onCurrentPageChange(p)}\n >\n <div className=\"hv-slide-title\">Slide {p}</div>\n <div className=\"hv-slide-text\">{s?.text || \"\"}</div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nfunction svgThumb(n: number) {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"180\" height=\"100\"><rect width=\"100%\" height=\"100%\" rx=\"12\" fill=\"#111827\"/><text x=\"50%\" y=\"54%\" font-size=\"18\" fill=\"#e5e7eb\" text-anchor=\"middle\">${n}</text></svg>`;\n}\n","/**\n * Default locale strings for the viewer UI.\n * You can override these by passing a `locale` prop to DocumentViewer.\n */\nexport const defaultLocale: Record<string, string> = {\n 'loading': 'Loading…',\n 'error.title': 'Error',\n 'toolbar.layout.single': 'Single page',\n 'toolbar.layout.two': 'Side-by-side',\n 'toolbar.thumbs': 'Thumbnails',\n 'toolbar.signatures': 'Signatures',\n 'toolbar.sign': 'Sign Document',\n 'toolbar.save': 'Save',\n 'toolbar.exportPdf': 'Export as PDF',\n 'thumbnails.title': 'Thumbnails',\n 'thumbnails.page': 'Page',\n 'signatures.title': 'Signatures',\n 'signatures.empty': 'No signatures',\n 'signatures.placeHint': 'Click on the document to place the signature.',\n 'a11y.viewer': 'Document viewer',\n 'a11y.ribbon': 'Ribbon',\n 'a11y.editor': 'Document editor',\n};\n","'use client';\n\nimport React from 'react';\nimport type { Signature } from '../types';\n\nexport function SignaturePanel(props: {\n locale: Record<string, string>;\n signatures: Signature[];\n collapsed: boolean;\n onToggle: () => void;\n}) {\n const title = props.locale['signatures.title'] ?? 'Signatures';\n return (\n <aside className={props.collapsed ? 'hv-side hv-side--collapsed' : 'hv-side'} aria-label={title}>\n <div className=\"hv-sidebar-header\">\n <button type=\"button\" className=\"hv-icon\" onClick={props.onToggle} aria-label={props.locale['toolbar.signatures'] ?? 'Signatures'}>\n ✍\n </button>\n <div className=\"hv-sidebar-title\">{title}</div>\n </div>\n <div className=\"hv-sidebar-body\">\n {props.signatures.map((s, idx) => (\n <div key={`${s.signedBy}-${s.dateSigned}-${idx}`} className=\"hv-signature-card\">\n <img src={s.signatureImageUrl} alt={`Signature by ${s.signedBy}`} className=\"hv-signature-img\" />\n <div className=\"hv-signature-meta\">\n <div className=\"hv-signature-name\">{s.signedBy}</div>\n <div className=\"hv-signature-date\">{new Date(s.dateSigned).toLocaleString()}</div>\n {s.comment ? <div className=\"hv-signature-comment\">{s.comment}</div> : null}\n </div>\n </div>\n ))}\n </div>\n </aside>\n );\n}\n","'use client';\n\nimport React from 'react';\n\nexport interface Thumbnail {\n id: string;\n label: string;\n dataUrl?: string;\n}\n\nexport function ThumbnailsSidebar(props: {\n locale: Record<string, string>;\n thumbnails: Thumbnail[];\n currentPage: number;\n collapsed: boolean;\n onToggle: () => void;\n onSelectPage: (p: number) => void;\n}) {\n const t = props.locale['thumbnails.title'] ?? 'Thumbnails';\n return (\n <aside className={props.collapsed ? 'hv-thumbs hv-thumbs--collapsed' : 'hv-thumbs'} aria-label={t}>\n <div className=\"hv-thumbs__header\">\n <button type=\"button\" className=\"hv-icon\" onClick={props.onToggle} aria-label={props.collapsed ? (props.locale['thumbnails.open'] ?? 'Open thumbnails') : (props.locale['thumbnails.close'] ?? 'Close thumbnails')}\n >{props.collapsed ? '▸' : '▾'}</button>\n {!props.collapsed ? <div className=\"hv-thumbs__title\">{t}</div> : null}\n </div>\n {!props.collapsed ? (\n <div className=\"hv-thumbs__list\" role=\"list\">\n {props.thumbnails.map((th, idx) => {\n const p = idx + 1;\n const active = p === props.currentPage;\n return (\n <button\n key={th.id}\n type=\"button\"\n role=\"listitem\"\n className={active ? 'hv-thumb hv-thumb--active' : 'hv-thumb'}\n onClick={() => props.onSelectPage(p)}\n aria-current={active ? 'page' : undefined}\n >\n <div className=\"hv-thumb__img\" aria-hidden>\n {th.dataUrl ? <img src={th.dataUrl} alt=\"\" /> : <div className=\"hv-thumb__placeholder\" />}\n </div>\n <div className=\"hv-thumb__label\">{th.label}</div>\n </button>\n );\n })}\n </div>\n ) : null}\n </aside>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport type { DocumentMode, PageLayout, SupportedFileType } from '../types';\n\nexport function Toolbar(props: {\n locale: Record<string, string>;\n mode: DocumentMode;\n fileType?: SupportedFileType;\n layout: PageLayout;\n onChangeLayout: (l: PageLayout) => void;\n showThumbnails: boolean;\n onToggleThumbnails: () => void;\n showSignatures: boolean;\n onToggleSignatures: () => void;\n allowSigning: boolean;\n signingDisabled: boolean;\n onSign: () => void;\n canSave: boolean;\n onSave: () => void;\n canExportPdf: boolean;\n onExportPdf: () => void;\n showHeaderFooterToggle: boolean;\n headerFooterEnabled: boolean;\n onToggleHeaderFooter: () => void;\n}) {\n const t = (k: string, fallback: string) => props.locale[k] ?? fallback;\n\n return (\n <div className=\"hv-toolbar\" role=\"toolbar\" aria-label={t('a11y.toolbar', 'Document toolbar')}>\n <div className=\"hv-toolbar__left\">\n <button type=\"button\" className=\"hv-btn\" onClick={props.onToggleThumbnails} aria-pressed={props.showThumbnails}>\n {t('toolbar.thumbs', 'Thumbnails')}\n </button>\n {props.mode !== 'create' && (\n <button type=\"button\" className=\"hv-btn\" onClick={props.onToggleSignatures} aria-pressed={props.showSignatures}>\n {t('toolbar.signatures', 'Signatures')}\n </button>\n )}\n <span className=\"hv-sep\" />\n <button type=\"button\" className={props.layout === 'single' ? 'hv-btn hv-btn--active' : 'hv-btn'} onClick={() => props.onChangeLayout('single')}>\n {t('toolbar.layout.single', 'Single')}\n </button>\n <button type=\"button\" className={props.layout === 'side-by-side' ? 'hv-btn hv-btn--active' : 'hv-btn'} onClick={() => props.onChangeLayout('side-by-side')}>\n {t('toolbar.layout.two', 'Two')}\n </button>\n </div>\n\n <div className=\"hv-toolbar__right\">\n {props.showHeaderFooterToggle && (\n <label className=\"hv-toggle\">\n <input type=\"checkbox\" checked={props.headerFooterEnabled} onChange={props.onToggleHeaderFooter} />\n <span>{t('toolbar.letterhead', 'Letterhead')}</span>\n </label>\n )}\n\n {props.allowSigning && (\n <button type=\"button\" className=\"hv-btn hv-btn--primary\" onClick={props.onSign} disabled={props.signingDisabled}>\n {t('toolbar.sign', 'Sign Document')}\n </button>\n )}\n\n {props.canExportPdf && (\n <button type=\"button\" className=\"hv-btn\" onClick={props.onExportPdf}>\n {t('toolbar.exportPdf', 'Export as PDF')}\n </button>\n )}\n {props.canSave && (\n <button type=\"button\" className=\"hv-btn hv-btn--primary\" onClick={props.onSave}>\n {t('toolbar.save', 'Save')}\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useMemo","useRef","useState","b64","forwardRef","useEffect","useImperativeHandle","useMemo","useState","jsx","jsxs","forwardRef","SpreadsheetEditor","useState","useEffect","cols","_","useImperativeHandle","useMemo","useEffect","useMemo","useState","jsx","jsxs","useEffect","useMemo","useRef","useState","jsx","jsxs","useEffect","useMemo","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useMemo","useState","useEffect","useRef","arrayBufferToBase64"]}
1
+ {"version":3,"sources":["../src/components/DocumentViewer.tsx","../src/editors/RichTextEditor.tsx","../src/utils/sanitize.ts","../src/editors/SpreadsheetEditor.tsx","../src/utils/fileSource.ts","../src/renderers/ImageRenderer.tsx","../src/renderers/PdfRenderer.tsx","../src/renderers/PptxRenderer.tsx","../src/utils/locale.ts","../src/components/SignaturePanel.tsx","../src/components/ThumbnailsSidebar.tsx","../src/components/Toolbar.tsx"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { RichTextEditor, type RichTextEditorHandle } from '../editors/RichTextEditor';\nimport { SpreadsheetEditor, type SpreadsheetEditorHandle } from '../editors/SpreadsheetEditor';\nimport { ImageRenderer } from '../renderers/ImageRenderer';\nimport { PdfRenderer } from '../renderers/PdfRenderer';\nimport { PptxRenderer } from '../renderers/PptxRenderer';\nimport type { DocumentMode, DocumentViewerProps, PageLayout, Signature, SupportedFileType } from '../types';\nimport { resolveSource } from '../utils/fileSource';\nimport { defaultLocale } from '../utils/locale';\nimport { SignaturePanel } from './SignaturePanel';\nimport { ThumbnailsSidebar, type Thumbnail } from './ThumbnailsSidebar';\nimport { Toolbar } from './Toolbar';\n\ninterface SigPlacement { page: number; x: number; y: number; w: number; h: number; signatureImageUrl: string }\n\ntype EditorHandle = (RichTextEditorHandle | SpreadsheetEditorHandle) & { save: (exportPdf?: boolean) => Promise<void> };\n\nexport function DocumentViewer(props: DocumentViewerProps) {\n const mode: DocumentMode = props.mode ?? 'view';\n const theme = props.theme ?? 'light';\n const locale = useMemo(() => ({ ...defaultLocale, ...(props.locale ?? {}) }), [props.locale]);\n\n const [layout, setLayout] = useState<PageLayout>(props.defaultLayout ?? 'single');\n const [showThumbnails, setShowThumbnails] = useState(true);\n const [showSignatures, setShowSignatures] = useState(true);\n const [headerFooterEnabled, setHeaderFooterEnabled] = useState(true);\n\n const allowSigning = props.allowSigning ?? false;\n const [signingBusy, setSigningBusy] = useState(false);\n\n const [resolved, setResolved] = useState<{ fileType: SupportedFileType; fileName: string; url?: string; arrayBuffer?: ArrayBuffer } | null>(null);\n const [error, setError] = useState<string>('');\n const [pageCount, setPageCount] = useState(1);\n const [currentPage, setCurrentPage] = useState(1);\n const [thumbs, setThumbs] = useState<Array<string | undefined>>([]);\n\n const [localSignatures, setLocalSignatures] = useState<Signature[]>(props.signatures ?? []);\n useEffect(() => setLocalSignatures(props.signatures ?? []), [props.signatures]);\n\n const [sigPlacements, setSigPlacements] = useState<SigPlacement[]>([]);\n const [armedSignatureUrl, setArmedSignatureUrl] = useState<string | null>(null);\n\n const editorRef = useRef<EditorHandle | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n setError('');\n setResolved(null);\n setThumbs([]);\n setPageCount(1);\n setCurrentPage(1);\n setSigPlacements([]);\n setArmedSignatureUrl(null);\n\n if (mode === 'create') {\n const ft = (props.fileType ?? 'docx') as SupportedFileType;\n setResolved({ fileType: ft, fileName: props.fileName ?? `Untitled.${ft}` });\n return;\n }\n\n try {\n const res = await resolveSource({\n fileUrl: props.fileUrl,\n base64: props.base64,\n blob: props.blob,\n fileName: props.fileName,\n fileType: props.fileType,\n });\n if (cancelled) { return; }\n setResolved({ fileType: res.fileType, fileName: res.fileName, url: res.url, arrayBuffer: res.arrayBuffer });\n } catch (e) {\n if (cancelled) { return; }\n setError(e instanceof Error ? e.message : String(e));\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [mode, props.fileUrl, props.base64, props.blob, props.fileName, props.fileType]);\n\n const thumbnails: Thumbnail[] = useMemo(() => {\n const n = Math.max(1, pageCount);\n return Array.from({ length: n }, (_, i) => ({\n id: `p-${i + 1}`,\n label: `${locale['thumbnails.page'] ?? 'Page'} ${i + 1}`,\n dataUrl: thumbs[i],\n }));\n }, [pageCount, thumbs, locale]);\n\n async function handleSignRequest() {\n if (!allowSigning || signingBusy || !props.onSignRequest) { return; }\n setSigningBusy(true);\n try {\n const sig = await props.onSignRequest();\n setLocalSignatures((prev: Signature[]) => [...prev, sig]);\n setArmedSignatureUrl(sig.signatureImageUrl);\n } finally {\n setSigningBusy(false);\n }\n }\n\n function placeSignature(p: { page: number; x: number; y: number; w: number; h: number }) {\n if (!armedSignatureUrl) { return; }\n setSigPlacements((prev: SigPlacement[]) => [...prev, { ...p, signatureImageUrl: armedSignatureUrl }]);\n setArmedSignatureUrl(null);\n }\n\n async function handleSave(exportPdf?: boolean) {\n if (editorRef.current) {\n await editorRef.current.save(!!exportPdf);\n return;\n }\n if (!resolved?.arrayBuffer) { return; }\n const b64 = arrayBufferToBase64(resolved.arrayBuffer);\n props.onSave?.(b64, { fileName: resolved.fileName, fileType: resolved.fileType, annotations: { sigPlacements } });\n }\n\n const canSave = mode === 'edit' || mode === 'create';\n const canExportPdf = (mode === 'edit' || mode === 'create') && (resolved?.fileType === 'docx' || resolved?.fileType === 'md' || resolved?.fileType === 'txt' || resolved?.fileType === 'xlsx');\n\n return (\n <div className={`hv-root`} data-hv-theme={theme}>\n <Toolbar\n locale={locale}\n mode={mode}\n fileType={resolved?.fileType}\n layout={layout}\n onChangeLayout={setLayout}\n showThumbnails={showThumbnails}\n onToggleThumbnails={() => setShowThumbnails((v: boolean) => !v)}\n showSignatures={showSignatures}\n onToggleSignatures={() => setShowSignatures((v: boolean) => !v)}\n onSign={() => void handleSignRequest()}\n allowSigning={allowSigning}\n signingDisabled={signingBusy || !props.onSignRequest}\n canSave={canSave}\n onSave={() => void handleSave(false)}\n canExportPdf={canExportPdf}\n onExportPdf={() => void handleSave(true)}\n headerFooterEnabled={headerFooterEnabled}\n showHeaderFooterToggle={(props.enableHeaderFooterToggle ?? true) && mode === 'create'}\n onToggleHeaderFooter={() => setHeaderFooterEnabled((v: boolean) => !v)}\n />\n\n {error ? (\n <div className=\"hv-error\" role=\"alert\">\n <div className=\"hv-error-title\">{locale['error.title'] ?? 'Error'}</div>\n <div className=\"hv-error-body\">{error}</div>\n </div>\n ) : null}\n\n {!resolved && !error ? <div className=\"hv-loading\" aria-busy=\"true\">{locale.loading ?? 'Loading…'}</div> : null}\n\n {resolved ? (\n <div className=\"hv-shell\">\n {mode !== 'create' ? (\n <ThumbnailsSidebar\n locale={locale}\n thumbnails={thumbnails}\n currentPage={currentPage}\n collapsed={!showThumbnails}\n onToggle={() => setShowThumbnails((v: boolean) => !v)}\n onSelectPage={setCurrentPage}\n />\n ) : null}\n\n <main className=\"hv-main\">\n {resolved.fileType === 'pdf' ? (\n <PdfRenderer\n url={resolved.url}\n arrayBuffer={resolved.arrayBuffer}\n layout={layout}\n currentPage={currentPage}\n onCurrentPageChange={setCurrentPage}\n onPageCount={(n) => {\n setPageCount(n);\n setThumbs((prev) => (prev.length === n ? prev : Array.from({ length: n }, (_, i) => prev[i])));\n }}\n onThumbs={(t) => setThumbs(t)}\n signatureStamp={armedSignatureUrl ? { imageUrl: armedSignatureUrl, armed: true, onPlaced: placeSignature } : undefined}\n />\n ) : null}\n\n {resolved.fileType === 'docx' || resolved.fileType === 'md' || resolved.fileType === 'txt' ? (\n <RichTextEditor\n ref={editorRef as any}\n mode={mode}\n fileType={resolved.fileType}\n fileName={resolved.fileName}\n arrayBuffer={resolved.arrayBuffer}\n headerComponent={props.headerComponent}\n footerComponent={props.footerComponent}\n headerFooterEnabled={headerFooterEnabled}\n locale={locale}\n signatures={localSignatures}\n signaturePlacements={sigPlacements}\n onPageCount={(n) => { setPageCount(n); setThumbs((prev) => (prev.length === n ? prev : Array.from({ length: n }, (_, i) => prev[i]))); }}\n onSave={(b64, meta) => props.onSave?.(b64, meta)}\n armedSignatureUrl={armedSignatureUrl}\n onPlaceSignature={placeSignature}\n />\n ) : null}\n\n {resolved.fileType === 'xlsx' ? (\n <SpreadsheetEditor\n ref={editorRef as any}\n mode={mode}\n fileName={resolved.fileName}\n arrayBuffer={resolved.arrayBuffer}\n locale={locale}\n onSave={(b64, meta) => props.onSave?.(b64, meta)}\n />\n ) : null}\n\n {resolved.fileType === 'pptx' ? (\n <PptxRenderer\n arrayBuffer={resolved.arrayBuffer}\n layout={layout}\n currentPage={currentPage}\n onCurrentPageChange={setCurrentPage}\n onSlideCount={(n) => {\n setPageCount(n);\n setThumbs((prev) => (prev.length === n ? prev : Array.from({ length: n }, (_, i) => prev[i])));\n }}\n onThumbs={(t) => setThumbs(t)}\n />\n ) : null}\n\n {resolved.fileType === 'png' || resolved.fileType === 'jpg' || resolved.fileType === 'svg' ? (\n <ImageRenderer arrayBuffer={resolved.arrayBuffer} fileType={resolved.fileType} fileName={resolved.fileName} />\n ) : null}\n </main>\n\n {mode !== 'create' && localSignatures.length ? (\n <SignaturePanel\n locale={locale}\n signatures={localSignatures}\n collapsed={!showSignatures}\n onToggle={() => setShowSignatures((v: boolean) => !v)}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction arrayBufferToBase64(ab: ArrayBuffer): string {\n const bytes = new Uint8Array(ab);\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","'use client';\n\nimport html2canvas from 'html2canvas';\nimport mammoth from 'mammoth';\n// Do not statically import html-to-docx; use dynamic import for browser compatibility\nimport MarkdownIt from 'markdown-it';\nimport React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { DocumentMode, Signature, SupportedFileType } from '../types';\nimport { arrayBufferToBase64 } from '../utils/fileSource';\nimport { sanitizeHtml } from '../utils/sanitize';\n\nconst PAGE_H = 1122; // virtual A4\n\nexport interface RichTextEditorHandle {\n save: (exportPdf?: boolean) => Promise<void>;\n requestThumbnail: (index: number) => Promise<string | undefined>;\n}\n\nexport const RichTextEditor = forwardRef<\n RichTextEditorHandle,\n {\n mode: DocumentMode;\n fileType: 'docx' | 'md' | 'txt';\n fileName: string;\n arrayBuffer?: ArrayBuffer;\n locale: Record<string, string>;\n headerComponent?: React.ReactNode;\n footerComponent?: React.ReactNode;\n headerFooterEnabled: boolean;\n signatures: Signature[];\n signaturePlacements: Array<{\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n signatureImageUrl: string;\n }>;\n armedSignatureUrl: string | null;\n onPlaceSignature: (p: {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n }) => void;\n onSave: (\n b64: string,\n meta: {\n fileName: string;\n fileType: SupportedFileType;\n exportedAsPdf?: boolean;\n annotations?: unknown;\n },\n ) => void;\n onPageCount: (n: number) => void;\n }\n>((props, ref) => {\n const readOnly = props.mode === 'view';\n const md = useMemo(\n () => new MarkdownIt({ html: false, linkify: true, breaks: true }),\n [],\n );\n const scrollerRef = useRef<HTMLDivElement | null>(null);\n const editorRef = useRef<HTMLDivElement | null>(null);\n const captureRef = useRef<HTMLDivElement | null>(null);\n\n const [html, setHtml] = useState('<p><br/></p>');\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n if (props.mode === 'create') {\n setHtml('<p><br/></p>');\n return;\n }\n if (!props.arrayBuffer) { return; }\n if (props.fileType === 'docx') {\n const res = await mammoth.convertToHtml({\n arrayBuffer: props.arrayBuffer,\n });\n if (!cancelled) { setHtml(sanitizeHtml(res.value || '<p><br/></p>')); }\n } else {\n const text = new TextDecoder().decode(props.arrayBuffer);\n if (props.fileType === 'md') { setHtml(sanitizeHtml(md.render(text))); }\n else { setHtml(`<pre>${escapeHtml(text)}</pre>`); }\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [props.arrayBuffer, props.fileType, props.mode, md]);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) { return; }\n const recompute = () =>\n props.onPageCount(Math.max(1, Math.ceil(el.scrollHeight / PAGE_H)));\n recompute();\n const ro = new ResizeObserver(recompute);\n ro.observe(el);\n return () => ro.disconnect();\n }, [html, props.headerFooterEnabled]);\n\n function exec(cmd: string) {\n if (readOnly) { return; }\n document.execCommand(cmd);\n }\n\n function onClick(e: React.MouseEvent<HTMLDivElement>) {\n if (!props.armedSignatureUrl) { return; }\n const scroller = scrollerRef.current;\n if (!scroller) { return; }\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const absY = scroller.scrollTop + (e.clientY - rect.top);\n const page = Math.max(1, Math.floor(absY / PAGE_H) + 1);\n const pageTop = (page - 1) * PAGE_H;\n const x = (e.clientX - rect.left) / rect.width;\n const y = (absY - pageTop) / PAGE_H;\n props.onPlaceSignature({ page, x, y, w: 0.25, h: 0.1 });\n }\n\n async function requestThumbnail(index: number): Promise<string | undefined> {\n const scroller = scrollerRef.current;\n const capture = captureRef.current;\n if (!scroller || !capture) { return undefined; }\n const old = scroller.scrollTop;\n scroller.scrollTop = index * PAGE_H;\n await new Promise((r) => requestAnimationFrame(() => r(null)));\n try {\n const canvas = await html2canvas(capture, {\n backgroundColor: null,\n scale: 0.25,\n useCORS: true,\n });\n return canvas.toDataURL('image/png');\n } catch {\n return undefined;\n } finally {\n scroller.scrollTop = old;\n }\n }\n\n async function save(exportPdf?: boolean) {\n const inner = editorRef.current?.innerHTML ?? html;\n const stitched = `<!doctype html><html><head><meta charset=\"utf-8\" /></head><body>${inner}</body></html>`;\n\n if (exportPdf) {\n // client-side: return print-ready HTML as base64\n const b64 = btoa(unescape(encodeURIComponent(stitched)));\n props.onSave(b64, {\n fileName: replaceExt(props.fileName, 'html'),\n fileType: 'txt',\n exportedAsPdf: true,\n annotations: { signaturePlacements: props.signaturePlacements },\n });\n return;\n }\n\n if (props.fileType === 'docx') {\n // Use API route for DOCX export (browser-safe)\n try {\n const response = await fetch('/api/export-docx', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n html: stitched,\n fileName: replaceExt(props.fileName, 'docx'),\n }),\n });\n if (!response.ok) { throw new Error('Failed to generate DOCX'); }\n const blob = await response.blob();\n // Download the file directly\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = replaceExt(props.fileName, 'docx');\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n window.URL.revokeObjectURL(url);\n a.remove();\n }, 100);\n } catch (err) {\n alert(\n 'DOCX export failed: ' +\n (err instanceof Error ? err.message : String(err)),\n );\n }\n return;\n }\n\n const text = editorRef.current?.innerText ?? '';\n const b64 = btoa(unescape(encodeURIComponent(text)));\n props.onSave(b64, {\n fileName: replaceExt(props.fileName, props.fileType),\n fileType: props.fileType,\n annotations: { signaturePlacements: props.signaturePlacements },\n });\n }\n\n useImperativeHandle(ref, () => ({ save, requestThumbnail }));\n\n return (\n <div className=\"hv-doc\">\n <div className=\"hv-ribbon\" role=\"toolbar\">\n <button\n className=\"hv-btn\"\n onClick={() => exec('bold')}\n disabled={readOnly}\n >\n B\n </button>\n <button\n className=\"hv-btn\"\n onClick={() => exec('italic')}\n disabled={readOnly}\n >\n I\n </button>\n <button\n className=\"hv-btn\"\n onClick={() => exec('underline')}\n disabled={readOnly}\n >\n U\n </button>\n {props.armedSignatureUrl ? (\n <div className=\"hv-hint\">Click to place signature</div>\n ) : null}\n </div>\n\n <div className=\"hv-scroll\" ref={scrollerRef} onClick={onClick}>\n <div className=\"hv-pageStage\" ref={captureRef}>\n {props.headerFooterEnabled && props.headerComponent ? (\n <div className=\"hv-letterhead\">{props.headerComponent}</div>\n ) : null}\n\n <div\n ref={editorRef}\n className={readOnly ? 'hv-editor hv-editor--ro' : 'hv-editor'}\n contentEditable={!readOnly}\n suppressContentEditableWarning\n onInput={() => setHtml(editorRef.current?.innerHTML ?? '')}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n\n {props.headerFooterEnabled && props.footerComponent ? (\n <div className=\"hv-letterhead hv-letterhead--footer\">\n {props.footerComponent}\n </div>\n ) : null}\n\n {props.mode === 'create' && props.signatures.length ? (\n <div className=\"hv-signatures-inline\">\n {props.signatures.map((s, i) => (\n <div key={i} className=\"hv-sign-inline\">\n <img\n src={s.signatureImageUrl}\n alt=\"\"\n className=\"hv-sign-img\"\n />\n <div>\n <div className=\"hv-sign-name\">{s.signedBy}</div>\n <div className=\"hv-sign-date\">\n {new Date(s.dateSigned).toLocaleString()}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n});\n\nfunction replaceExt(name: string, ext: string) {\n const base = name.includes('.') ? name.slice(0, name.lastIndexOf('.')) : name;\n return `${base}.${ext}`;\n}\n\nfunction escapeHtml(s: string) {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\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, { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';\nimport * as XLSX from 'xlsx';\nimport type { DocumentMode, SupportedFileType } from '../types';\nimport { arrayBufferToBase64 } from '../utils/fileSource';\n\nexport interface SpreadsheetEditorHandle {\n save: (exportPdf?: boolean) => Promise<void>;\n requestThumbnails: (index: number) => Promise<void>;\n}\n\nexport const SpreadsheetEditor = forwardRef<SpreadsheetEditorHandle, {\n mode: DocumentMode;\n fileName: string;\n arrayBuffer?: ArrayBuffer;\n locale: Record<string, string>;\n onSave: (base64: string, meta: { fileName: string; fileType: SupportedFileType; exportedAsPdf?: boolean }) => void;\n}>(function SpreadsheetEditor(props, ref) {\n const readonly = props.mode === 'view';\n const [grid, setGrid] = useState<string[][]>(() => Array.from({ length: 30 }, () => Array.from({ length: 12 }, () => '')));\n\n useEffect(() => {\n if (!props.arrayBuffer) { return; }\n try {\n const wb = XLSX.read(props.arrayBuffer, { type: 'array' });\n const name = wb.SheetNames[0];\n const ws = wb.Sheets[name];\n const aoa = XLSX.utils.sheet_to_json(ws, { header: 1, raw: true }) as any[][];\n const rows = Math.max(30, aoa.length);\n const cols = Math.max(12, Math.max(...aoa.map((r) => (r?.length ?? 0)), 0));\n const next = Array.from({ length: rows }, (_, r) => Array.from({ length: cols }, (_, c) => {\n const v = aoa[r]?.[c];\n return v == null ? '' : String(v);\n }));\n setGrid(next);\n } catch {\n // ignore\n }\n }, [props.arrayBuffer]);\n\n async function save(exportPdf?: boolean) {\n const ws = XLSX.utils.aoa_to_sheet(grid);\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' }) as ArrayBuffer;\n const b64 = arrayBufferToBase64(out);\n props.onSave(b64, { fileName: ensureExt(props.fileName, 'xlsx'), fileType: 'xlsx', exportedAsPdf: !!exportPdf });\n }\n\n useImperativeHandle(ref, () => ({\n save,\n requestThumbnails: async () => undefined,\n }));\n\n const cols = useMemo(() => Array.from({ length: grid[0]?.length ?? 0 }, (_, i) => String.fromCharCode(65 + (i % 26))), [grid]);\n\n return (\n <div className=\"hv-sheet\">\n <div className=\"hv-sheetbar\">\n <div className=\"hv-sheetbar-title\">{props.fileName}</div>\n {!readonly ? <button className=\"hv-btn\" type=\"button\" onClick={() => void save(false)}>{props.locale['toolbar.save'] ?? 'Save'}</button> : null}\n </div>\n <div className=\"hv-sheetgrid\" role=\"table\" aria-label=\"Spreadsheet\">\n <div className=\"hv-sheetrow hv-sheetrow--header\" role=\"row\">\n <div className=\"hv-sheetcell hv-sheetcell--corner\" role=\"columnheader\" />\n {cols.map((c, i) => <div key={i} className=\"hv-sheetcell hv-sheetcell--header\" role=\"columnheader\">{c}</div>)}\n </div>\n {grid.map((row, r) => (\n <div key={r} className=\"hv-sheetrow\" role=\"row\">\n <div className=\"hv-sheetcell hv-sheetcell--header\" role=\"rowheader\">{r + 1}</div>\n {row.map((val, c) => (\n <div\n key={c}\n className=\"hv-sheetcell\"\n role=\"cell\"\n contentEditable={!readonly}\n suppressContentEditableWarning\n onInput={(e) => {\n const text = (e.currentTarget.textContent ?? '');\n setGrid((prev) => {\n const next = prev.map((rr) => rr.slice());\n next[r][c] = text;\n return next;\n });\n }}\n >{val}</div>\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n});\n\nfunction ensureExt(name: string, ext: string) {\n const base = name.includes('.') ? name.slice(0, name.lastIndexOf('.')) : name;\n return `${base}.${ext}`;\n}\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';\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport type { SupportedFileType } from '../types';\n\n/**\n * Image renderer for DocumentViewer.\n * Supports PNG, JPG, SVG, etc. with zoom controls.\n */\nexport function ImageRenderer({\n arrayBuffer,\n fileType,\n fileName,\n}: {\n /** Image file as ArrayBuffer (optional) */\n arrayBuffer?: ArrayBuffer;\n /** File type (e.g. 'png', 'jpg', 'svg') */\n fileType: SupportedFileType;\n /** File name for display */\n fileName: string;\n}) {\n const [zoom, setZoom] = useState(1);\n const url = useMemo(() => {\n if (!arrayBuffer) { return undefined; }\n const mime =\n fileType === 'svg'\n ? 'image/svg+xml'\n : fileType === 'png'\n ? 'image/png'\n : 'image/jpeg';\n return URL.createObjectURL(new Blob([arrayBuffer], { type: mime }));\n }, [arrayBuffer, fileType]);\n\n useEffect(() => {\n return () => {\n if (url) { URL.revokeObjectURL(url); }\n };\n }, [url]);\n\n return (\n <div className=\"hv-doc\">\n <div className=\"hv-mini-toolbar\">\n <div className=\"hv-title\">{fileName}</div>\n <div className=\"hv-spacer\" />\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => setZoom((z) => Math.max(0.25, z - 0.25))}\n >\n -\n </button>\n <div className=\"hv-zoom\">{Math.round(zoom * 100)}%</div>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => setZoom((z) => Math.min(4, z + 0.25))}\n >\n +\n </button>\n </div>\n <div className=\"hv-center\">\n {!arrayBuffer && (\n <div className=\"hv-error\">No image data provided.</div>\n )}\n {arrayBuffer && !url && (\n <div className=\"hv-error\">Failed to load image.</div>\n )}\n {url && (\n <img\n src={url}\n alt={fileName}\n style={{ transform: `scale(${zoom})` }}\n className=\"hv-image\"\n />\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n getDocument,\n GlobalWorkerOptions,\n type PDFDocumentProxy,\n} from \"pdfjs-dist\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { PageLayout } from \"../types\";\n\n/**\n * PDF document renderer for DocumentViewer.\n * Handles loading, error, and signature placement.\n */\nexport function PdfRenderer(props: {\n /** PDF file URL (optional) */\n url?: string;\n /** PDF file as ArrayBuffer (optional) */\n arrayBuffer?: ArrayBuffer;\n /** Page layout mode */\n layout: PageLayout;\n /** Current page number (1-based) */\n currentPage: number;\n /** Callback when current page changes */\n onCurrentPageChange: (p: number) => void;\n /** Callback when page count is determined */\n onPageCount: (n: number) => void;\n /** Callback for thumbnail images */\n onThumbs: (thumbs: Array<string | undefined>) => void;\n /** Signature stamp for placement (optional) */\n signatureStamp?: {\n imageUrl: string;\n armed: boolean;\n onPlaced: (placement: {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n }) => void;\n };\n}) {\n const { url, arrayBuffer } = props;\n const [doc, setDoc] = useState<PDFDocumentProxy | null>(null);\n const [pageCount, setPageCount] = useState(0);\n const [rendered, setRendered] = useState<Map<number, HTMLCanvasElement>>(\n new Map(),\n );\n const [thumbs, setThumbs] = useState<Array<string | undefined>>([]);\n const [size, setSize] = useState({ w: 840, h: 1188 });\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n try {\n GlobalWorkerOptions.workerSrc = new URL(\n \"pdfjs-dist/build/pdf.worker.min.mjs\",\n import.meta.url,\n ).toString();\n } catch {}\n }, []);\n\n useEffect(() => {\n let cancel = false;\n setError(null);\n setLoading(true);\n (async () => {\n setDoc(null);\n setRendered(new Map());\n setThumbs([]);\n if (!url && !arrayBuffer) {\n setError(\"No PDF source provided.\");\n setLoading(false);\n return;\n }\n try {\n const task = getDocument(\n url ? { url, rangeChunkSize: 512 * 1024 } : { data: arrayBuffer! },\n );\n const pdf = await task.promise;\n if (cancel) {\n return;\n }\n setDoc(pdf);\n setPageCount(pdf.numPages);\n props.onPageCount(pdf.numPages);\n\n // Get first page to determine aspect ratio and main render size\n const p1 = await pdf.getPage(1);\n const base = p1.getViewport({ scale: 1 });\n const w = Math.min(980, Math.max(640, base.width));\n const s = w / base.width;\n const vp = p1.getViewport({ scale: s });\n setSize({ w: Math.round(vp.width), h: Math.round(vp.height) });\n\n // Generate all thumbnails up front\n const thumbWidth = 56; // px, matches CSS .hv-thumbimg\n const thumbsArr: Array<string | undefined> = [];\n for (let i = 1; i <= pdf.numPages; i++) {\n const page = await pdf.getPage(i);\n const pageBase = page.getViewport({ scale: 1 });\n const thumbScale = thumbWidth / pageBase.width;\n const thumbVp = page.getViewport({ scale: thumbScale });\n const thumbCanvas = document.createElement(\"canvas\");\n thumbCanvas.width = Math.round(thumbVp.width);\n thumbCanvas.height = Math.round(thumbVp.height);\n const thumbCtx = thumbCanvas.getContext(\"2d\", { alpha: false });\n if (thumbCtx) {\n await page.render({ canvasContext: thumbCtx, viewport: thumbVp })\n .promise;\n thumbsArr.push(thumbCanvas.toDataURL(\"image/png\"));\n } else {\n thumbsArr.push(undefined);\n }\n }\n setThumbs(thumbsArr);\n } catch (e) {\n setError(\n \"Failed to load PDF. \" + (e instanceof Error ? e.message : \"\"),\n );\n } finally {\n setLoading(false);\n }\n })();\n return () => {\n cancel = true;\n };\n }, [url, arrayBuffer]);\n\n useEffect(() => {\n props.onThumbs(thumbs);\n }, [thumbs]);\n\n const pagesToShow = useMemo(() => {\n if (props.layout === \"side-by-side\" && pageCount > 1) {\n const left = Math.max(1, Math.min(props.currentPage, pageCount));\n const right = Math.max(1, Math.min(left + 1, pageCount));\n return left === right ? [left] : [left, right];\n }\n return [Math.max(1, Math.min(props.currentPage, pageCount))];\n }, [props.currentPage, props.layout, pageCount]);\n\n useEffect(() => {\n if (!doc) {\n return;\n }\n let cancel = false;\n (async () => {\n for (const p of pagesToShow) {\n if (rendered.has(p)) {\n continue;\n }\n try {\n const page = await doc.getPage(p);\n if (cancel) {\n return;\n }\n const base = page.getViewport({ scale: 1 });\n const vp = page.getViewport({ scale: size.w / base.width });\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.round(vp.width);\n canvas.height = Math.round(vp.height);\n const ctx = canvas.getContext(\"2d\", { alpha: false });\n if (!ctx) {\n continue;\n }\n await page.render({ canvasContext: ctx, viewport: vp }).promise;\n if (cancel) {\n return;\n }\n setRendered((prev) => {\n const next = new Map(prev);\n next.set(p, canvas);\n return next;\n });\n } catch {}\n }\n })();\n return () => {\n cancel = true;\n };\n }, [doc, pagesToShow, size.w, rendered]);\n\n function onWheel(e: React.WheelEvent) {\n if (!pageCount) {\n return;\n }\n if (Math.abs(e.deltaY) < 10) {\n return;\n }\n const dir = e.deltaY > 0 ? 1 : -1;\n const step = props.layout === \"side-by-side\" ? 2 : 1;\n const next = Math.max(\n 1,\n Math.min(pageCount, props.currentPage + dir * step),\n );\n props.onCurrentPageChange(next);\n }\n\n function clickPlace(e: React.MouseEvent, page: number) {\n const stamp = props.signatureStamp;\n if (!stamp?.armed) {\n return;\n }\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const x = (e.clientX - rect.left) / rect.width;\n const y = (e.clientY - rect.top) / rect.height;\n stamp.onPlaced({ page, x, y, w: 0.22, h: 0.08 });\n }\n\n return (\n <div className=\"hv-doc\" ref={containerRef} onWheel={onWheel}>\n {!doc ? <div className=\"hv-loading\">Loading PDF…</div> : null}\n {doc ? (\n <div\n className={\n props.layout === \"side-by-side\"\n ? \"hv-pages hv-pages--two\"\n : \"hv-pages\"\n }\n >\n {pagesToShow.map((p) => {\n const c = rendered.get(p);\n return (\n <div\n key={p}\n className=\"hv-page\"\n style={{ width: size.w, height: size.h }}\n onClick={(e) => clickPlace(e, p)}\n >\n {c ? (\n <canvas\n className=\"hv-canvas\"\n width={c.width}\n height={c.height}\n ref={(node) => {\n if (!node) {\n return;\n }\n const ctx = node.getContext(\"2d\");\n if (ctx) {\n ctx.drawImage(c, 0, 0);\n }\n }}\n />\n ) : (\n <div className=\"hv-loading\">Rendering…</div>\n )}\n </div>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport JSZip from \"jszip\";\nimport type { PageLayout } from \"../types\";\n\ntype Slide = { index: number; text: string };\n\nfunction decodeXml(s: string): string {\n return s\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n}\n\nfunction extractText(xml: string) {\n return [...xml.matchAll(/<a:t>(.*?)<\\/a:t>/g)]\n .map((m) => decodeXml(m[1] || \"\"))\n .join(\" \")\n .trim();\n}\n\n/**\n * PowerPoint (.pptx) renderer for DocumentViewer.\n * Extracts and displays slide text, handles errors and loading.\n */\nexport function PptxRenderer(props: {\n /** PPTX file as ArrayBuffer (optional) */\n arrayBuffer?: ArrayBuffer;\n /** Page layout mode */\n layout: PageLayout;\n /** Current slide number (1-based) */\n currentPage: number;\n /** Callback when current slide changes */\n onCurrentPageChange: (p: number) => void;\n /** Callback when slide count is determined */\n onSlideCount: (n: number) => void;\n /** Callback for slide thumbnails */\n onThumbs: (thumbs: (string | undefined)[]) => void;\n}) {\n const [slides, setSlides] = useState<Slide[]>([]);\n const [thumbs, setThumbs] = useState<(string | undefined)[]>([]);\n\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n useEffect(() => {\n let cancel = false;\n setError(null);\n setLoading(true);\n (async () => {\n setSlides([]);\n setThumbs([]);\n if (!props.arrayBuffer) {\n setError(\"No PPTX source provided.\");\n setLoading(false);\n return;\n }\n try {\n // Load PPTX and extract slides (existing logic)\n const zip = await JSZip.loadAsync(props.arrayBuffer);\n const slidePaths = Object.keys(zip.files)\n .filter((p) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(p))\n .sort();\n const slidesOut: Slide[] = [];\n for (let i = 0; i < slidePaths.length; i++) {\n const xml = await zip.files[slidePaths[i]].async(\"string\");\n slidesOut.push({ index: i + 1, text: extractText(xml) });\n }\n if (cancel) return;\n setSlides(\n slidesOut.length ? slidesOut : [{ index: 1, text: \"(empty)\" }],\n );\n props.onSlideCount(slidesOut.length || 1);\n\n // Generate all thumbnails up front (SVG placeholder for now)\n const thumbWidth = 56;\n const thumbsArr: (string | undefined)[] = [];\n for (let i = 0; i < (slidesOut.length || 1); i++) {\n thumbsArr.push(\n `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgThumb(i + 1))}`,\n );\n }\n setThumbs(thumbsArr);\n } catch (e) {\n setSlides([\n { index: 1, text: \"Unable to render this .pptx in-browser.\" },\n ]);\n setThumbs([undefined]);\n setError(\n \"Failed to load PPTX. \" + (e instanceof Error ? e.message : \"\"),\n );\n } finally {\n setLoading(false);\n }\n })();\n return () => {\n cancel = true;\n };\n }, [props.arrayBuffer]);\n // (removed unreachable/duplicate code after useEffect)\n\n useEffect(() => {\n props.onThumbs(thumbs);\n }, [thumbs]);\n\n const pagesToShow = useMemo(() => {\n const total = slides.length;\n if (props.layout === \"side-by-side\" && total > 1) {\n const left = Math.max(1, Math.min(props.currentPage, total));\n const right = Math.max(1, Math.min(left + 1, total));\n return left === right ? [left] : [left, right];\n }\n return [Math.max(1, Math.min(props.currentPage, total))];\n }, [props.currentPage, props.layout, slides.length]);\n\n return (\n <div className=\"hv-doc\">\n {loading && <div className=\"hv-loading\">Loading PPTX…</div>}\n {error && <div className=\"hv-error\">{error}</div>}\n {!loading && !error && (!slides || slides.length === 0) && (\n <div className=\"hv-error\">No slides to display.</div>\n )}\n {!error && slides && slides.length > 0 && (\n <div\n className={\n props.layout === \"side-by-side\"\n ? \"hv-pages hv-pages--two\"\n : \"hv-pages\"\n }\n >\n {pagesToShow.map((p) => {\n const s = slides[p - 1];\n return (\n <div\n key={p}\n className=\"hv-slide\"\n tabIndex={0}\n onFocus={() => props.onCurrentPageChange(p)}\n >\n <div className=\"hv-slide-title\">Slide {p}</div>\n <div className=\"hv-slide-text\">{s?.text || \"\"}</div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nfunction svgThumb(n: number) {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"180\" height=\"100\"><rect width=\"100%\" height=\"100%\" rx=\"12\" fill=\"#111827\"/><text x=\"50%\" y=\"54%\" font-size=\"18\" fill=\"#e5e7eb\" text-anchor=\"middle\">${n}</text></svg>`;\n}\n","/**\n * Default locale strings for the viewer UI.\n * You can override these by passing a `locale` prop to DocumentViewer.\n */\nexport const defaultLocale: Record<string, string> = {\n 'loading': 'Loading…',\n 'error.title': 'Error',\n 'toolbar.layout.single': 'Single page',\n 'toolbar.layout.two': 'Side-by-side',\n 'toolbar.thumbs': 'Thumbnails',\n 'toolbar.signatures': 'Signatures',\n 'toolbar.sign': 'Sign Document',\n 'toolbar.save': 'Save',\n 'toolbar.exportPdf': 'Export as PDF',\n 'thumbnails.title': 'Thumbnails',\n 'thumbnails.page': 'Page',\n 'signatures.title': 'Signatures',\n 'signatures.empty': 'No signatures',\n 'signatures.placeHint': 'Click on the document to place the signature.',\n 'a11y.viewer': 'Document viewer',\n 'a11y.ribbon': 'Ribbon',\n 'a11y.editor': 'Document editor',\n};\n","\"use client\";\n\nimport React from \"react\";\nimport type { Signature } from \"../types\";\n\nexport function SignaturePanel(props: {\n locale: Record<string, string>;\n signatures: Signature[];\n collapsed: boolean;\n onToggle: () => void;\n}) {\n const title = props.locale[\"signatures.title\"] ?? \"Signatures\";\n // Deduplicate signatures by signedBy, dateSigned, and image URL\n const deduped = React.useMemo(() => {\n const seen = new Set();\n return props.signatures.filter((s) => {\n const key = `${s.signedBy}|${s.dateSigned}|${s.signatureImageUrl}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }, [props.signatures]);\n\n return (\n <aside\n className={props.collapsed ? \"hv-side hv-side--collapsed\" : \"hv-side\"}\n aria-label={title}\n >\n <div className=\"hv-sidebar-header\">\n <button\n type=\"button\"\n className=\"hv-icon\"\n onClick={props.onToggle}\n aria-label={props.locale[\"toolbar.signatures\"] ?? \"Signatures\"}\n >\n <span aria-hidden>✍</span>\n </button>\n <div className=\"hv-sidebar-title\">{title}</div>\n </div>\n <div className=\"hv-sidebar-body\">\n {deduped.length === 0 && (\n <div className=\"hv-signature-empty\" aria-live=\"polite\">\n {props.locale[\"signatures.empty\"] ?? \"No signatures yet.\"}\n </div>\n )}\n {deduped.map((s, idx) => (\n <div\n key={`${s.signedBy}-${s.dateSigned}-${s.signatureImageUrl}`}\n className=\"hv-signature-card\"\n tabIndex={0}\n aria-label={`Signature by ${s.signedBy}`}\n >\n <img\n src={s.signatureImageUrl}\n alt={\n props.locale[\"signatures.imgAlt\"]\n ? props.locale[\"signatures.imgAlt\"].replace(\n \"{name}\",\n s.signedBy,\n )\n : `Signature by ${s.signedBy}`\n }\n className=\"hv-signature-img\"\n />\n <div className=\"hv-signature-meta\">\n <div className=\"hv-signature-name\">{s.signedBy}</div>\n <div className=\"hv-signature-date\">\n {new Date(s.dateSigned).toLocaleString()}\n </div>\n {s.comment ? (\n <div className=\"hv-signature-comment\">{s.comment}</div>\n ) : null}\n </div>\n </div>\n ))}\n </div>\n </aside>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nexport interface Thumbnail {\n id: string;\n label: string;\n dataUrl?: string;\n}\n\nexport function ThumbnailsSidebar(props: {\n locale: Record<string, string>;\n thumbnails: Thumbnail[];\n currentPage: number;\n collapsed: boolean;\n onToggle: () => void;\n onSelectPage: (p: number) => void;\n}) {\n const t = props.locale[\"thumbnails.title\"] ?? \"Thumbnails\";\n return (\n <aside\n className={\n props.collapsed ? \"hv-thumbs hv-thumbs--collapsed\" : \"hv-thumbs\"\n }\n aria-label={t}\n >\n <div className=\"hv-thumbs-header\">\n <button\n type=\"button\"\n className=\"hv-thumbs-toggle\"\n onClick={props.onToggle}\n aria-label={\n props.collapsed\n ? (props.locale[\"thumbnails.open\"] ?? \"Open thumbnails\")\n : (props.locale[\"thumbnails.close\"] ?? \"Close thumbnails\")\n }\n >\n <span className=\"hv-thumbs-toggle-icon\">\n {props.collapsed ? \"▸\" : \"▾\"}\n </span>\n </button>\n {!props.collapsed && <div className=\"hv-thumbs-title\">{t}</div>}\n </div>\n {!props.collapsed && (\n <div className=\"hv-thumbs-list\" role=\"list\">\n {props.thumbnails.map((th, idx) => {\n const p = idx + 1;\n const active = p === props.currentPage;\n return (\n <button\n key={th.id}\n type=\"button\"\n role=\"listitem\"\n className={active ? \"hv-thumb hv-thumb--active\" : \"hv-thumb\"}\n onClick={() => props.onSelectPage(p)}\n aria-current={active ? \"page\" : undefined}\n tabIndex={0}\n >\n <div className=\"hv-thumb-img\" aria-hidden>\n {th.dataUrl ? (\n <img src={th.dataUrl} alt=\"\" />\n ) : (\n <div className=\"hv-thumb-placeholder\" />\n )}\n </div>\n <div className=\"hv-thumb-label\">{th.label}</div>\n </button>\n );\n })}\n </div>\n )}\n </aside>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { DocumentMode, PageLayout, SupportedFileType } from \"../types\";\n\nexport function Toolbar(props: {\n locale: Record<string, string>;\n mode: DocumentMode;\n fileType?: SupportedFileType;\n layout: PageLayout;\n onChangeLayout: (l: PageLayout) => void;\n showThumbnails: boolean;\n onToggleThumbnails: () => void;\n showSignatures: boolean;\n onToggleSignatures: () => void;\n allowSigning: boolean;\n signingDisabled: boolean;\n onSign: () => void;\n canSave: boolean;\n onSave: () => void;\n canExportPdf: boolean;\n onExportPdf: () => void;\n showHeaderFooterToggle: boolean;\n headerFooterEnabled: boolean;\n onToggleHeaderFooter: () => void;\n}) {\n const t = (k: string, fallback: string) => props.locale[k] ?? fallback;\n\n return (\n <div\n className=\"hv-toolbar\"\n role=\"toolbar\"\n aria-label={t(\"a11y.toolbar\", \"Document toolbar\")}\n >\n <div className=\"hv-toolbar__left gap-2\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={props.onToggleThumbnails}\n aria-pressed={props.showThumbnails}\n >\n {t(\"toolbar.thumbs\", \"Thumbnails\")}\n </button>\n {props.mode !== \"create\" && (\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={props.onToggleSignatures}\n aria-pressed={props.showSignatures}\n >\n {t(\"toolbar.signatures\", \"Signatures\")}\n </button>\n )}\n <span className=\"hv-sep\" />\n <button\n type=\"button\"\n className={\n props.layout === \"single\" ? \"hv-btn hv-btn--active\" : \"hv-btn\"\n }\n onClick={() => props.onChangeLayout(\"single\")}\n >\n {t(\"toolbar.layout.single\", \"Single\")}\n </button>\n <button\n type=\"button\"\n className={\n props.layout === \"side-by-side\" ? \"hv-btn hv-btn--active\" : \"hv-btn\"\n }\n onClick={() => props.onChangeLayout(\"side-by-side\")}\n >\n {t(\"toolbar.layout.two\", \"Two\")}\n </button>\n </div>\n\n <div className=\"hv-toolbar__right\">\n {props.showHeaderFooterToggle && (\n <label className=\"hv-toggle\">\n <input\n type=\"checkbox\"\n checked={props.headerFooterEnabled}\n onChange={props.onToggleHeaderFooter}\n />\n <span>{t(\"toolbar.letterhead\", \"Letterhead\")}</span>\n </label>\n )}\n\n {props.allowSigning && (\n <button\n type=\"button\"\n className=\"hv-btn hv-btn--primary\"\n onClick={props.onSign}\n disabled={props.signingDisabled}\n >\n {t(\"toolbar.sign\", \"Sign Document\")}\n </button>\n )}\n\n {props.canExportPdf && (\n <button type=\"button\" className=\"hv-btn\" onClick={props.onExportPdf}>\n {t(\"toolbar.exportPdf\", \"Export as PDF\")}\n </button>\n )}\n {props.canSave && (\n <button\n type=\"button\"\n className=\"hv-btn hv-btn--primary\"\n onClick={props.onSave}\n >\n {t(\"toolbar.save\", \"Save\")}\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useMemo","useRef","useState","b64","forwardRef","useEffect","useImperativeHandle","useMemo","useState","jsx","jsxs","forwardRef","SpreadsheetEditor","useState","useEffect","cols","_","useImperativeHandle","useMemo","useEffect","useMemo","useState","jsx","jsxs","useEffect","useMemo","useRef","useState","jsx","jsxs","useEffect","useMemo","useState","jsx","jsxs","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useMemo","useState","useEffect","useRef","arrayBufferToBase64"]}