@zerohive/hive-viewer 0.2.6 → 0.2.7
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.cjs +20 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +20 -39
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -39
- package/dist/styles.css +135 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -868,49 +868,46 @@ function Toolbar(props) {
|
|
|
868
868
|
role: "toolbar",
|
|
869
869
|
"aria-label": t("a11y.toolbar", "Document toolbar"),
|
|
870
870
|
children: [
|
|
871
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "hv-
|
|
871
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "hv-toolbar__group", children: [
|
|
872
872
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
873
873
|
"button",
|
|
874
874
|
{
|
|
875
|
-
|
|
876
|
-
className: "hv-btn text-sm",
|
|
875
|
+
className: `hv-btn ${props.showThumbnails ? "hv-btn--active" : ""}`,
|
|
877
876
|
onClick: props.onToggleThumbnails,
|
|
878
877
|
"aria-pressed": props.showThumbnails,
|
|
879
|
-
children:
|
|
878
|
+
children: "Thumbnails"
|
|
880
879
|
}
|
|
881
880
|
),
|
|
882
881
|
props.mode !== "create" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
883
882
|
"button",
|
|
884
883
|
{
|
|
885
|
-
|
|
886
|
-
className: "hv-btn text-sm",
|
|
884
|
+
className: `hv-btn ${props.showSignatures ? "hv-btn--active" : ""}`,
|
|
887
885
|
onClick: props.onToggleSignatures,
|
|
888
886
|
"aria-pressed": props.showSignatures,
|
|
889
|
-
children:
|
|
887
|
+
children: "Signatures"
|
|
890
888
|
}
|
|
891
|
-
)
|
|
892
|
-
|
|
889
|
+
)
|
|
890
|
+
] }),
|
|
891
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "hv-toolbar__group hv-segment", children: [
|
|
893
892
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
894
893
|
"button",
|
|
895
894
|
{
|
|
896
|
-
|
|
897
|
-
className: props.layout === "single" ? "hv-btn hv-btn--active text-sm" : "hv-btn text-sm",
|
|
895
|
+
className: `hv-btn ${props.layout === "single" ? "hv-btn--active" : ""}`,
|
|
898
896
|
onClick: () => props.onChangeLayout("single"),
|
|
899
|
-
children:
|
|
897
|
+
children: "Single page"
|
|
900
898
|
}
|
|
901
899
|
),
|
|
902
900
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
903
901
|
"button",
|
|
904
902
|
{
|
|
905
|
-
|
|
906
|
-
className: props.layout === "side-by-side" ? "hv-btn hv-btn--active text-sm" : "hv-btn text-sm",
|
|
903
|
+
className: `hv-btn ${props.layout === "side-by-side" ? "hv-btn--active" : ""}`,
|
|
907
904
|
onClick: () => props.onChangeLayout("side-by-side"),
|
|
908
|
-
children:
|
|
905
|
+
children: "Side-by-side"
|
|
909
906
|
}
|
|
910
907
|
)
|
|
911
908
|
] }),
|
|
912
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "hv-
|
|
913
|
-
props.showHeaderFooterToggle && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { className: "hv-
|
|
909
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "hv-toolbar__group hv-toolbar__actions", children: [
|
|
910
|
+
props.showHeaderFooterToggle && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { className: "hv-switch", children: [
|
|
914
911
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
915
912
|
"input",
|
|
916
913
|
{
|
|
@@ -919,36 +916,20 @@ function Toolbar(props) {
|
|
|
919
916
|
onChange: props.onToggleHeaderFooter
|
|
920
917
|
}
|
|
921
918
|
),
|
|
922
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", {
|
|
919
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "hv-switch__slider" }),
|
|
920
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "hv-switch__label", children: t("toolbar.letterhead", "Letterhead") })
|
|
923
921
|
] }),
|
|
924
922
|
props.allowSigning && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
925
923
|
"button",
|
|
926
924
|
{
|
|
927
|
-
|
|
928
|
-
className: "hv-btn hv-btn--primary text-sm",
|
|
925
|
+
className: "hv-btn hv-btn--primary",
|
|
929
926
|
onClick: props.onSign,
|
|
930
927
|
disabled: props.signingDisabled,
|
|
931
|
-
children:
|
|
932
|
-
}
|
|
933
|
-
),
|
|
934
|
-
props.canExportPdf && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
935
|
-
"button",
|
|
936
|
-
{
|
|
937
|
-
type: "button",
|
|
938
|
-
className: "hv-btn text-sm",
|
|
939
|
-
onClick: props.onExportPdf,
|
|
940
|
-
children: t("toolbar.exportPdf", "Export as PDF")
|
|
928
|
+
children: "Sign document"
|
|
941
929
|
}
|
|
942
930
|
),
|
|
943
|
-
props.
|
|
944
|
-
|
|
945
|
-
{
|
|
946
|
-
type: "button",
|
|
947
|
-
className: "hv-btn hv-btn--primary text-sm",
|
|
948
|
-
onClick: props.onSave,
|
|
949
|
-
children: t("toolbar.save", "Save")
|
|
950
|
-
}
|
|
951
|
-
)
|
|
931
|
+
props.canExportPdf && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { className: "hv-btn", onClick: props.onExportPdf, children: "Export PDF" }),
|
|
932
|
+
props.canSave && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { className: "hv-btn hv-btn--primary", onClick: props.onSave, children: "Save" })
|
|
952
933
|
] })
|
|
953
934
|
]
|
|
954
935
|
}
|
package/dist/index.cjs.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/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":["export { DocumentViewer } from './components/DocumentViewer';\nexport type { DocumentViewerProps, DocumentMode, PageLayout, Signature, SupportedFileType, DocumentViewerSaveMeta } from './types';\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n RichTextEditor,\n type RichTextEditorHandle,\n} from \"../editors/RichTextEditor\";\nimport {\n SpreadsheetEditor,\n type SpreadsheetEditorHandle,\n} from \"../editors/SpreadsheetEditor\";\nimport { ImageRenderer } from \"../renderers/ImageRenderer\";\nimport { PdfRenderer } from \"../renderers/PdfRenderer\";\nimport { PptxRenderer } from \"../renderers/PptxRenderer\";\nimport type {\n DocumentMode,\n DocumentViewerProps,\n DocumentViewerSaveMeta,\n PageLayout,\n Signature,\n SupportedFileType,\n} 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 {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n signatureImageUrl: string;\n}\n\ntype EditorHandle = (RichTextEditorHandle | SpreadsheetEditorHandle) & {\n save: (exportPdf?: boolean) => Promise<void>;\n};\n\nexport function DocumentViewer(props: DocumentViewerProps) {\n const mode: DocumentMode = props.mode ?? \"view\";\n const theme = props.theme ?? \"light\";\n const locale = useMemo(\n () => ({ ...defaultLocale, ...(props.locale ?? {}) }),\n [props.locale],\n );\n\n const [layout, setLayout] = useState<PageLayout>(\n props.defaultLayout ?? \"single\",\n );\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<{\n fileType: SupportedFileType;\n fileName: string;\n url?: string;\n arrayBuffer?: ArrayBuffer;\n } | 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[]>(\n props.signatures ?? [],\n );\n useEffect(\n () => setLocalSignatures(props.signatures ?? []),\n [props.signatures],\n );\n\n const [sigPlacements, setSigPlacements] = useState<SigPlacement[]>([]);\n const [armedSignatureUrl, setArmedSignatureUrl] = useState<string | null>(\n null,\n );\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({\n fileType: ft,\n fileName: props.fileName ?? `Untitled.${ft}`,\n });\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) {\n return;\n }\n setResolved({\n fileType: res.fileType,\n fileName: res.fileName,\n url: res.url,\n arrayBuffer: res.arrayBuffer,\n });\n } catch (e) {\n if (cancelled) {\n return;\n }\n setError(e instanceof Error ? e.message : String(e));\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [\n mode,\n props.fileUrl,\n props.base64,\n props.blob,\n props.fileName,\n props.fileType,\n ]);\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) {\n return;\n }\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: {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n }) {\n if (!armedSignatureUrl) {\n return;\n }\n setSigPlacements((prev: SigPlacement[]) => [\n ...prev,\n { ...p, signatureImageUrl: armedSignatureUrl },\n ]);\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) {\n return;\n }\n const b64 = arrayBufferToBase64(resolved.arrayBuffer);\n props.onSave?.(b64, {\n fileName: resolved.fileName,\n fileType: resolved.fileType,\n annotations: { sigPlacements },\n });\n }\n\n const canSave = mode === \"edit\" || mode === \"create\";\n const canExportPdf =\n (mode === \"edit\" || mode === \"create\") &&\n (resolved?.fileType === \"docx\" ||\n resolved?.fileType === \"md\" ||\n resolved?.fileType === \"txt\" ||\n 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={\n (props.enableHeaderFooterToggle ?? true) && mode === \"create\"\n }\n onToggleHeaderFooter={() => setHeaderFooterEnabled((v: boolean) => !v)}\n />\n\n {error ? (\n <div className=\"hv-error\" role=\"alert\">\n <div className=\"hv-error-title\">\n {locale[\"error.title\"] ?? \"Error\"}\n </div>\n <div className=\"hv-error-body\">{error}</div>\n </div>\n ) : null}\n\n {!resolved && !error ? (\n <div className=\"hv-loading\" aria-busy=\"true\">\n {locale.loading ?? \"Loading…\"}\n </div>\n ) : 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) =>\n prev.length === n\n ? prev\n : Array.from({ length: n }, (_, i) => prev[i]),\n );\n }}\n onThumbs={(t) => setThumbs(t)}\n signatureStamp={\n armedSignatureUrl\n ? {\n imageUrl: armedSignatureUrl,\n armed: true,\n onPlaced: placeSignature,\n }\n : undefined\n }\n />\n ) : null}\n\n {resolved.fileType === \"docx\" ||\n resolved.fileType === \"md\" ||\n 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: number) => {\n setPageCount(n);\n setThumbs((prev) =>\n prev.length === n\n ? prev\n : Array.from({ length: n }, (_, i) => prev[i]),\n );\n }}\n onSave={(b64: string, meta: DocumentViewerSaveMeta) =>\n props.onSave?.(b64, meta)\n }\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) =>\n prev.length === n\n ? prev\n : Array.from({ length: n }, (_, i) => prev[i]),\n );\n }}\n onThumbs={(t) => setThumbs(t)}\n />\n ) : null}\n\n {resolved.fileType === \"png\" ||\n resolved.fileType === \"jpg\" ||\n resolved.fileType === \"svg\" ? (\n <ImageRenderer\n arrayBuffer={resolved.arrayBuffer}\n fileType={resolved.fileType}\n fileName={resolved.fileName}\n />\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\";\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 { sanitizeHtml } from \"../utils/sanitize\";\n\nconst PAGE_H = 1122;\n\nexport interface RichTextEditorHandle {\n save: (exportPdf?: boolean) => Promise<void>;\n requestThumbnail: (index: number) => Promise<string | undefined>;\n}\n\nexport const RichTextEditor = forwardRef<RichTextEditorHandle, any>(\n (props, ref) => {\n const readOnly = props.mode === \"view\";\n\n const md = useMemo(\n () => new MarkdownIt({ html: false, linkify: true, breaks: true }),\n [],\n );\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<HTMLDivElement>(null);\n const captureRef = useRef<HTMLDivElement>(null);\n\n const initialized = useRef(false);\n\n /** ----------------------------------------\n * Load document ONCE\n * ---------------------------------------- */\n useEffect(() => {\n if (initialized.current) return;\n\n (async () => {\n if (props.mode === \"create\") {\n editorRef.current!.innerHTML = \"<p><br/></p>\";\n initialized.current = true;\n return;\n }\n\n if (!props.arrayBuffer) return;\n\n if (props.fileType === \"docx\") {\n const res = await mammoth.convertToHtml({\n arrayBuffer: props.arrayBuffer,\n });\n editorRef.current!.innerHTML = sanitizeHtml(\n res.value || \"<p><br/></p>\",\n );\n } else {\n const text = new TextDecoder().decode(props.arrayBuffer);\n editorRef.current!.innerHTML =\n props.fileType === \"md\"\n ? sanitizeHtml(md.render(text))\n : `<pre>${escapeHtml(text)}</pre>`;\n }\n\n initialized.current = true;\n })();\n }, [props.arrayBuffer, props.fileType, props.mode, md]);\n\n /** ----------------------------------------\n * Page count observer\n * ---------------------------------------- */\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n\n const recompute = () =>\n props.onPageCount(Math.max(1, Math.ceil(el.scrollHeight / PAGE_H)));\n\n recompute();\n const ro = new ResizeObserver(recompute);\n ro.observe(el);\n return () => ro.disconnect();\n }, [props.headerFooterEnabled]);\n\n function exec(cmd: string) {\n if (readOnly) return;\n document.execCommand(cmd);\n editorRef.current?.focus();\n }\n\n function onClickPage(e: React.MouseEvent) {\n if (!props.armedSignatureUrl) return;\n const scroller = scrollerRef.current;\n if (!scroller) return;\n\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const absY = scroller.scrollTop + (e.clientY - rect.top);\n const page = Math.floor(absY / PAGE_H) + 1;\n\n props.onPlaceSignature({\n page,\n x: (e.clientX - rect.left) / rect.width,\n y: (absY % PAGE_H) / PAGE_H,\n w: 0.25,\n h: 0.1,\n });\n }\n\n async function requestThumbnail(index: number) {\n const scroller = scrollerRef.current;\n const capture = captureRef.current;\n if (!scroller || !capture) return;\n\n const old = scroller.scrollTop;\n scroller.scrollTop = index * PAGE_H;\n await new Promise((r) => requestAnimationFrame(r));\n\n try {\n const canvas = await html2canvas(capture, {\n scale: 0.25,\n useCORS: true,\n });\n return canvas.toDataURL(\"image/png\");\n } finally {\n scroller.scrollTop = old;\n }\n }\n\n async function save(exportPdf?: boolean) {\n const html = editorRef.current?.innerHTML ?? \"\";\n const stitched = `<!doctype html><html><body>${html}</body></html>`;\n const b64 = btoa(unescape(encodeURIComponent(stitched)));\n\n props.onSave(b64, {\n fileName: props.fileName,\n fileType: props.fileType,\n exportedAsPdf: exportPdf,\n annotations: { signaturePlacements: props.signaturePlacements },\n });\n }\n\n useImperativeHandle(ref, () => ({\n save,\n requestThumbnail,\n }));\n\n return (\n <div className=\"hv-root\">\n <div className=\"hv-toolbar\">\n <button onClick={() => exec(\"bold\")} disabled={readOnly}>\n B\n </button>\n <button onClick={() => exec(\"italic\")} disabled={readOnly}>\n I\n </button>\n <button onClick={() => exec(\"underline\")} disabled={readOnly}>\n U\n </button>\n\n {props.armedSignatureUrl && (\n <span className=\"hv-hint\">Click page to place signature</span>\n )}\n </div>\n\n <div className=\"hv-scroll\" ref={scrollerRef} onClick={onClickPage}>\n <div className=\"hv-pageStage\" ref={captureRef}>\n <div\n ref={editorRef}\n className={`hv-editor ${readOnly ? \"ro\" : \"\"}`}\n contentEditable={!readOnly}\n suppressContentEditableWarning\n />\n </div>\n </div>\n </div>\n );\n },\n);\n\nfunction escapeHtml(s: string) {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\");\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(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/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 space-x-1\">\n <button\n type=\"button\"\n className=\"hv-btn text-sm\"\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 text-sm\"\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\"\n ? \"hv-btn hv-btn--active text-sm\"\n : \"hv-btn text-sm\"\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\"\n ? \"hv-btn hv-btn--active text-sm\"\n : \"hv-btn text-sm\"\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 text-sm\"\n onClick={props.onSign}\n disabled={props.signingDisabled}\n >\n {t(\"toolbar.sign\", \"Sign Document\")}\n </button>\n )}\n\n {props.canExportPdf && (\n <button\n type=\"button\"\n className=\"hv-btn text-sm\"\n onClick={props.onExportPdf}\n >\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 text-sm\"\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":["import_react","DOMPurify","MarkdownIt","mammoth","html2canvas","import_react","import_jsx_runtime","SpreadsheetEditor","cols","_","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","JSZip","import_react","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","arrayBufferToBase64"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../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":["export { DocumentViewer } from './components/DocumentViewer';\nexport type { DocumentViewerProps, DocumentMode, PageLayout, Signature, SupportedFileType, DocumentViewerSaveMeta } from './types';\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n RichTextEditor,\n type RichTextEditorHandle,\n} from \"../editors/RichTextEditor\";\nimport {\n SpreadsheetEditor,\n type SpreadsheetEditorHandle,\n} from \"../editors/SpreadsheetEditor\";\nimport { ImageRenderer } from \"../renderers/ImageRenderer\";\nimport { PdfRenderer } from \"../renderers/PdfRenderer\";\nimport { PptxRenderer } from \"../renderers/PptxRenderer\";\nimport type {\n DocumentMode,\n DocumentViewerProps,\n DocumentViewerSaveMeta,\n PageLayout,\n Signature,\n SupportedFileType,\n} 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 {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n signatureImageUrl: string;\n}\n\ntype EditorHandle = (RichTextEditorHandle | SpreadsheetEditorHandle) & {\n save: (exportPdf?: boolean) => Promise<void>;\n};\n\nexport function DocumentViewer(props: DocumentViewerProps) {\n const mode: DocumentMode = props.mode ?? \"view\";\n const theme = props.theme ?? \"light\";\n const locale = useMemo(\n () => ({ ...defaultLocale, ...(props.locale ?? {}) }),\n [props.locale],\n );\n\n const [layout, setLayout] = useState<PageLayout>(\n props.defaultLayout ?? \"single\",\n );\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<{\n fileType: SupportedFileType;\n fileName: string;\n url?: string;\n arrayBuffer?: ArrayBuffer;\n } | 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[]>(\n props.signatures ?? [],\n );\n useEffect(\n () => setLocalSignatures(props.signatures ?? []),\n [props.signatures],\n );\n\n const [sigPlacements, setSigPlacements] = useState<SigPlacement[]>([]);\n const [armedSignatureUrl, setArmedSignatureUrl] = useState<string | null>(\n null,\n );\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({\n fileType: ft,\n fileName: props.fileName ?? `Untitled.${ft}`,\n });\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) {\n return;\n }\n setResolved({\n fileType: res.fileType,\n fileName: res.fileName,\n url: res.url,\n arrayBuffer: res.arrayBuffer,\n });\n } catch (e) {\n if (cancelled) {\n return;\n }\n setError(e instanceof Error ? e.message : String(e));\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [\n mode,\n props.fileUrl,\n props.base64,\n props.blob,\n props.fileName,\n props.fileType,\n ]);\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) {\n return;\n }\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: {\n page: number;\n x: number;\n y: number;\n w: number;\n h: number;\n }) {\n if (!armedSignatureUrl) {\n return;\n }\n setSigPlacements((prev: SigPlacement[]) => [\n ...prev,\n { ...p, signatureImageUrl: armedSignatureUrl },\n ]);\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) {\n return;\n }\n const b64 = arrayBufferToBase64(resolved.arrayBuffer);\n props.onSave?.(b64, {\n fileName: resolved.fileName,\n fileType: resolved.fileType,\n annotations: { sigPlacements },\n });\n }\n\n const canSave = mode === \"edit\" || mode === \"create\";\n const canExportPdf =\n (mode === \"edit\" || mode === \"create\") &&\n (resolved?.fileType === \"docx\" ||\n resolved?.fileType === \"md\" ||\n resolved?.fileType === \"txt\" ||\n 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={\n (props.enableHeaderFooterToggle ?? true) && mode === \"create\"\n }\n onToggleHeaderFooter={() => setHeaderFooterEnabled((v: boolean) => !v)}\n />\n\n {error ? (\n <div className=\"hv-error\" role=\"alert\">\n <div className=\"hv-error-title\">\n {locale[\"error.title\"] ?? \"Error\"}\n </div>\n <div className=\"hv-error-body\">{error}</div>\n </div>\n ) : null}\n\n {!resolved && !error ? (\n <div className=\"hv-loading\" aria-busy=\"true\">\n {locale.loading ?? \"Loading…\"}\n </div>\n ) : 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) =>\n prev.length === n\n ? prev\n : Array.from({ length: n }, (_, i) => prev[i]),\n );\n }}\n onThumbs={(t) => setThumbs(t)}\n signatureStamp={\n armedSignatureUrl\n ? {\n imageUrl: armedSignatureUrl,\n armed: true,\n onPlaced: placeSignature,\n }\n : undefined\n }\n />\n ) : null}\n\n {resolved.fileType === \"docx\" ||\n resolved.fileType === \"md\" ||\n 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: number) => {\n setPageCount(n);\n setThumbs((prev) =>\n prev.length === n\n ? prev\n : Array.from({ length: n }, (_, i) => prev[i]),\n );\n }}\n onSave={(b64: string, meta: DocumentViewerSaveMeta) =>\n props.onSave?.(b64, meta)\n }\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) =>\n prev.length === n\n ? prev\n : Array.from({ length: n }, (_, i) => prev[i]),\n );\n }}\n onThumbs={(t) => setThumbs(t)}\n />\n ) : null}\n\n {resolved.fileType === \"png\" ||\n resolved.fileType === \"jpg\" ||\n resolved.fileType === \"svg\" ? (\n <ImageRenderer\n arrayBuffer={resolved.arrayBuffer}\n fileType={resolved.fileType}\n fileName={resolved.fileName}\n />\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\";\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 { sanitizeHtml } from \"../utils/sanitize\";\n\nconst PAGE_H = 1122;\n\nexport interface RichTextEditorHandle {\n save: (exportPdf?: boolean) => Promise<void>;\n requestThumbnail: (index: number) => Promise<string | undefined>;\n}\n\nexport const RichTextEditor = forwardRef<RichTextEditorHandle, any>(\n (props, ref) => {\n const readOnly = props.mode === \"view\";\n\n const md = useMemo(\n () => new MarkdownIt({ html: false, linkify: true, breaks: true }),\n [],\n );\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<HTMLDivElement>(null);\n const captureRef = useRef<HTMLDivElement>(null);\n\n const initialized = useRef(false);\n\n /** ----------------------------------------\n * Load document ONCE\n * ---------------------------------------- */\n useEffect(() => {\n if (initialized.current) return;\n\n (async () => {\n if (props.mode === \"create\") {\n editorRef.current!.innerHTML = \"<p><br/></p>\";\n initialized.current = true;\n return;\n }\n\n if (!props.arrayBuffer) return;\n\n if (props.fileType === \"docx\") {\n const res = await mammoth.convertToHtml({\n arrayBuffer: props.arrayBuffer,\n });\n editorRef.current!.innerHTML = sanitizeHtml(\n res.value || \"<p><br/></p>\",\n );\n } else {\n const text = new TextDecoder().decode(props.arrayBuffer);\n editorRef.current!.innerHTML =\n props.fileType === \"md\"\n ? sanitizeHtml(md.render(text))\n : `<pre>${escapeHtml(text)}</pre>`;\n }\n\n initialized.current = true;\n })();\n }, [props.arrayBuffer, props.fileType, props.mode, md]);\n\n /** ----------------------------------------\n * Page count observer\n * ---------------------------------------- */\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n\n const recompute = () =>\n props.onPageCount(Math.max(1, Math.ceil(el.scrollHeight / PAGE_H)));\n\n recompute();\n const ro = new ResizeObserver(recompute);\n ro.observe(el);\n return () => ro.disconnect();\n }, [props.headerFooterEnabled]);\n\n function exec(cmd: string) {\n if (readOnly) return;\n document.execCommand(cmd);\n editorRef.current?.focus();\n }\n\n function onClickPage(e: React.MouseEvent) {\n if (!props.armedSignatureUrl) return;\n const scroller = scrollerRef.current;\n if (!scroller) return;\n\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const absY = scroller.scrollTop + (e.clientY - rect.top);\n const page = Math.floor(absY / PAGE_H) + 1;\n\n props.onPlaceSignature({\n page,\n x: (e.clientX - rect.left) / rect.width,\n y: (absY % PAGE_H) / PAGE_H,\n w: 0.25,\n h: 0.1,\n });\n }\n\n async function requestThumbnail(index: number) {\n const scroller = scrollerRef.current;\n const capture = captureRef.current;\n if (!scroller || !capture) return;\n\n const old = scroller.scrollTop;\n scroller.scrollTop = index * PAGE_H;\n await new Promise((r) => requestAnimationFrame(r));\n\n try {\n const canvas = await html2canvas(capture, {\n scale: 0.25,\n useCORS: true,\n });\n return canvas.toDataURL(\"image/png\");\n } finally {\n scroller.scrollTop = old;\n }\n }\n\n async function save(exportPdf?: boolean) {\n const html = editorRef.current?.innerHTML ?? \"\";\n const stitched = `<!doctype html><html><body>${html}</body></html>`;\n const b64 = btoa(unescape(encodeURIComponent(stitched)));\n\n props.onSave(b64, {\n fileName: props.fileName,\n fileType: props.fileType,\n exportedAsPdf: exportPdf,\n annotations: { signaturePlacements: props.signaturePlacements },\n });\n }\n\n useImperativeHandle(ref, () => ({\n save,\n requestThumbnail,\n }));\n\n return (\n <div className=\"hv-root\">\n <div className=\"hv-toolbar\">\n <button onClick={() => exec(\"bold\")} disabled={readOnly}>\n B\n </button>\n <button onClick={() => exec(\"italic\")} disabled={readOnly}>\n I\n </button>\n <button onClick={() => exec(\"underline\")} disabled={readOnly}>\n U\n </button>\n\n {props.armedSignatureUrl && (\n <span className=\"hv-hint\">Click page to place signature</span>\n )}\n </div>\n\n <div className=\"hv-scroll\" ref={scrollerRef} onClick={onClickPage}>\n <div className=\"hv-pageStage\" ref={captureRef}>\n <div\n ref={editorRef}\n className={`hv-editor ${readOnly ? \"ro\" : \"\"}`}\n contentEditable={!readOnly}\n suppressContentEditableWarning\n />\n </div>\n </div>\n </div>\n );\n },\n);\n\nfunction escapeHtml(s: string) {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\");\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(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/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 {/* LEFT */}\n <div className=\"hv-toolbar__group\">\n <button\n className={`hv-btn ${props.showThumbnails ? \"hv-btn--active\" : \"\"}`}\n onClick={props.onToggleThumbnails}\n aria-pressed={props.showThumbnails}\n >\n Thumbnails\n </button>\n\n {props.mode !== \"create\" && (\n <button\n className={`hv-btn ${props.showSignatures ? \"hv-btn--active\" : \"\"}`}\n onClick={props.onToggleSignatures}\n aria-pressed={props.showSignatures}\n >\n Signatures\n </button>\n )}\n </div>\n\n {/* CENTER */}\n <div className=\"hv-toolbar__group hv-segment\">\n <button\n className={`hv-btn ${props.layout === \"single\" ? \"hv-btn--active\" : \"\"}`}\n onClick={() => props.onChangeLayout(\"single\")}\n >\n Single page\n </button>\n <button\n className={`hv-btn ${props.layout === \"side-by-side\" ? \"hv-btn--active\" : \"\"}`}\n onClick={() => props.onChangeLayout(\"side-by-side\")}\n >\n Side-by-side\n </button>\n </div>\n\n {/* RIGHT */}\n <div className=\"hv-toolbar__group hv-toolbar__actions\">\n {props.showHeaderFooterToggle && (\n <label className=\"hv-switch\">\n <input\n type=\"checkbox\"\n checked={props.headerFooterEnabled}\n onChange={props.onToggleHeaderFooter}\n />\n <span className=\"hv-switch__slider\" />\n <span className=\"hv-switch__label\">\n {t(\"toolbar.letterhead\", \"Letterhead\")}\n </span>\n </label>\n )}\n\n {props.allowSigning && (\n <button\n className=\"hv-btn hv-btn--primary\"\n onClick={props.onSign}\n disabled={props.signingDisabled}\n >\n Sign document\n </button>\n )}\n\n {props.canExportPdf && (\n <button className=\"hv-btn\" onClick={props.onExportPdf}>\n Export PDF\n </button>\n )}\n\n {props.canSave && (\n <button className=\"hv-btn hv-btn--primary\" onClick={props.onSave}>\n Save\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","DOMPurify","MarkdownIt","mammoth","html2canvas","import_react","import_jsx_runtime","SpreadsheetEditor","cols","_","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","JSZip","import_react","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","arrayBufferToBase64"]}
|